diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..0bbf9fa8 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.git +.idea +.vagrant +coverage +design +e2e_coverage +Vagrantfile +Procfile diff --git a/Dockerfile b/Dockerfile index 25f20cb9..6b145fd1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,17 @@ # Build: -# docker build -t tellform -f ./Dockerfile . +# docker build -t tellform-prod -f ./Dockerfile-production . # # Run: -# docker run -it tellform +# docker run -it tellform-prod + FROM phusion/baseimage:0.9.19 MAINTAINER David Baldwynn -# 3000 = TellForm server, 35729 = livereload, 8080 = node-inspector -EXPOSE 3000 35729 8080 - -# Set development environment as default -ENV NODE_ENV development -ENV BASE_URL tellform.dev -ENV PORT 3000 - # Install Utilities -RUN apt-get update -q \ +RUN apt-get update -q \ && apt-get install -yqq \ curl \ ant \ - default-jdk \ git \ gcc \ make \ @@ -37,34 +29,31 @@ RUN sudo apt-get install -yq nodejs \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* -# Install MEAN.JS Prerequisites -RUN npm install --quiet -g grunt bower && npm cache clean +# Install NPM Global Libraries +RUN npm install --quiet -g grunt bower pm2 && npm cache clean -RUN mkdir -p /opt/tellform/public/lib WORKDIR /opt/tellform +RUN mkdir -p /opt/tellform/public/lib + +# Add bower.json +COPY bower.json /opt/tellform/bower.json +COPY .bowerrc /opt/tellform/.bowerrc + +COPY ./process.yml /opt/tellform/process.yml +COPY ./app /opt/tellform/app +COPY ./public /opt/tellform/public +COPY ./config /opt/tellform/config +COPY ./gruntfile.js /opt/tellform/gruntfile.js +COPY ./server.js /opt/tellform/server.js +COPY ./scripts/create_admin.js /opt/tellform/scripts/create_admin.js # Copies the local package.json file to the container # and utilities docker container cache to not needing to rebuild # and install node_modules/ everytime we build the docker, but only # when the local package.json file changes. # Add npm package.json -COPY package.json /opt/tellform/package.json -RUN npm install +COPY ./package.json /opt/tellform/package.json +RUN npm install --only=production --quiet -# Add bower.json -COPY bower.json /opt/tellform/bower.json -COPY .bowerrc /opt/tellform/.bowerrc - -COPY ./app /opt/tellform/app -COPY ./public /opt/tellform/public -COPY ./config /opt/tellform/config -COPY ./gruntfile.js /opt/tellform/gruntfile.js -COPY ./server.js /opt/tellform/server.js -COPY ./.env /opt/tellform/.env -COPY ./scripts/create_admin.js /opt/tellform/scripts/create_admin.js - -# Run Development TellForm server -COPY ./dev_entrypoint.sh /dev_entrypoint.sh -RUN chmod +x /dev_entrypoint.sh - -ENTRYPOINT ["/dev_entrypoint.sh"] \ No newline at end of file +# Run TellForm server +CMD ["node", "server.js"] diff --git a/Dockerfile-production b/Dockerfile-production deleted file mode 100644 index 9876021d..00000000 --- a/Dockerfile-production +++ /dev/null @@ -1,71 +0,0 @@ -# Build: -# docker build -t tellform-prod -f ./Dockerfile-production . -# -# Run: -# docker run -it tellform-prod - -FROM phusion/baseimage:0.9.19 -MAINTAINER David Baldwynn - -# 4545 = TellForm server -EXPOSE 4545 - -# Set development environment as default -ENV NODE_ENV production -ENV PORT 4545 -ENV BASE_URL tellform.com - -# Install Utilities -RUN apt-get update -q \ - && apt-get install -yqq \ - curl \ - ant \ - default-jdk \ - git \ - gcc \ - make \ - build-essential \ - libkrb5-dev \ - python \ - sudo \ - apt-utils \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -# Install nodejs -RUN curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - -RUN sudo apt-get install -yq nodejs \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -# Install MEAN.JS Prerequisites -RUN npm install --quiet -g grunt bower pm2 && npm cache clean - -RUN mkdir -p /opt/tellform/public/lib -WORKDIR /opt/tellform - -# Copies the local package.json file to the container -# and utilities docker container cache to not needing to rebuild -# and install node_modules/ everytime we build the docker, but only -# when the local package.json file changes. -# Add npm package.json -COPY package.json /opt/tellform/package.json -RUN npm install --production -RUN mv ./node_modules ./node_modules.tmp && mv ./node_modules.tmp ./node_modules && npm install - -# Add bower.json -COPY bower.json /opt/tellform/bower.json -COPY .bowerrc /opt/tellform/.bowerrc - -COPY ./app /opt/tellform/app -COPY ./public /opt/tellform/public -COPY ./config /opt/tellform/config -COPY ./gruntfile.js /opt/tellform/gruntfile.js -COPY ./server.js /opt/tellform/server.js -COPY ./.env /opt/tellform/.env -COPY ./scripts/create_admin.js /opt/tellform/scripts/create_admin.js - -RUN grunt build - -# Run TellForm server -CMD ["pm2-docker","process.yml"] diff --git a/README.md b/README.md index 42f5e735..39e5b3a9 100755 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -TellForm 2.0.0 +TellForm 2.1.0 ======== [![Build Status](https://travis-ci.org/tellform/tellform.svg?branch=master)](https://travis-ci.org/tellform/tellform) -![Project Status](https://img.shields.io/badge/status-2.0.0-green.svg) +![Project Status](https://img.shields.io/badge/status-2.1.0-green.svg) [![Code Climate](https://codeclimate.com/github/whitef0x0/tellform/badges/gpa.svg)](https://codeclimate.com/github/whitef0x0/tellform) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3491e86eb7194308b8fc80711d736ede)](https://www.codacy.com/app/david-baldwin/tellform?utm_source=github.com&utm_medium=referral&utm_content=whitef0x0/tellform&utm_campaign=Badge_Grade) [![Gitter](https://badges.gitter.im/whitef0x0/tellform.svg)](https://gitter.im/whitef0x0/tellform?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) @@ -18,6 +18,7 @@ TellForm 2.0.0 - [Quickstart](#quickstart) - [Deploying with Docker](#deploying-with-docker) - [Testing your Application](#testing-your-application) +- [Advanced Configuration](#configuration) - [Where to Get Help](#where-to-get-help) - [Sponsors](#sponsors) - [Backers](#backers) @@ -166,6 +167,39 @@ To calculate your client-side test coverage with Istanbul, run the coverage task $ grunt coverage:client ``` +## Configuration + +TellForm's configuration is done with environment variables. To set an option for TellForm, open/create your .env file and set add `ENV_VAR=somevalue` to set the ENV_VAR variable to the value `somevalue`. + +| Property | Valid Values | Default Value | Description | Required? | +|-------------------------|--------------------------------------------------------|----------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|--------------------------------------------| +| NODE_ENV | "development", "production", "test" or "secure" | development | Set which version of the app you want to run (either secure/SSL, dev, prod or test) | No | +| SESSION_SECRET | Any string | CHANGE_ME_PLEASE | Value used to compute session hash | No | +| BASE_URL | A valid URL | localhost:3000 | URL where the admin panel will live | Yes | +| MONGODB_URI | A valid MongoDB URI | localhost/mean | URI of the MONGODB server/db that your server will use | Yes | +| REDIS_URL | A valid Redis URI | redis://127.0.0.1:6379 | URI of the Redis instance that your server will use | Only if ENABLE_CLUSTER_MODE=TRUE | +| SOCKET_PORT | A valid port number from 0 - 65535 | 20523 | Port that your SocketIO server will bind to | No | +| SOCKET_URL | A valid URL | ws.tellform.com | Url that your SocketIO server will bind to | No | +| SIGNUP_DISABLED | "TRUE" or "FALSE" | FALSE | Set this flag to disable signups. | No | +| SUBDOMAINS_DISABLED | "TRUE" or "FALSE" | FALSE | Set this flag to disable subdomains. (Useful if hosting behind an uncontrolled domain or without a wildcard SSL cert) | No | +| ENABLE_CLUSTER_MODE | "TRUE" or "FALSE" | FALSE | Disable support for running TellForm with pm2's cluster mode. Disabling this allows you to not run a Redis instance. | No | +| MAILER_EMAIL_ID | A string | N/A | Username credential for the SMTP MAIL service used to send signup/verification/lost password emails. | Yes | +| MAILER_PASSWORD | A string | | Password credential for the SMTP MAIL service used to send signup/verification/lost password emails. | Yes | +| MAILER_FROM | A valid email | noreply@tellform.com | Email address that all mail should be sent from. | No | +| MAILER_SERVICE_PROVIDER | A service from https://nodemailer.com/smtp/well-known/ | | A "well-known" email service that is supported by nodemail. If MAILER_SMTP_HOST is enabled, this is ignored. | Only if MAILER_SMTP_HOST is not set | +| MAILER_SMTP_HOST | A valid URL | | URL to the SMTP server of your choice | Only if MAILER_SERVICE_PROVIDER is not set | +| MAILER_SMTP_PORT | A valid port number from 0 - 65535 | | Port of the SMTP server of your choice. | Only if MAILER_SMTP_HOST is set | +| MAILER_SMTP_SECURE | "TRUE" or "FALSE" | FALSE | Boolean that enables/disables SSL support for your SMTP client. | Only if MAILER_SMTP_HOST is set | +| CREATE_ADMIN | "TRUE" or "FALSE" | FALSE | Setting this variable will create a admin user on startup with credentials as specified below | No | +| ADMIN_EMAIL | A valid email | admin@admin.com | Email of generated admin user | No | +| ADMIN_USERNAME | A string | root | Username of generated admin user | No | +| ADMIN_PASSWORD | A string | root | Password of generated admin user | No | +| APP_NAME | A string | TellForm | Sets the property of your webapp. | No | +| APP_DESC | A string | Opensource form builder alternative to TypeForm | Sets the,property of your webapp. | No | +| APP_KEYWORDS | A comma-seperated list of phrases/words | typeform, pdfs, forms, opensource, formbuilder, google forms, nodejs | Sets the value of the <meta> description attribute. | No | +| RAVEN_DSN | A valid Sentry.io DSN | N/A | Set this to your Sentry.io Public DSN to enable remote logging | No | +| GOOGLE_ANALYTICS_ID | A valid Google Analytics ID | N/A | Set this to your GA id to enable GA tracking on your TellForm instance | No | + ## Where to get help [Gitter Chat](https://gitter.im/whitef0x0/tellform) diff --git a/app/controllers/core.server.controller.js b/app/controllers/core.server.controller.js index e6297edf..914e652e 100755 --- a/app/controllers/core.server.controller.js +++ b/app/controllers/core.server.controller.js @@ -15,7 +15,7 @@ exports.index = function(req, res) { exports.form = function(req, res) { //Allow form to be embedded - res.set('X-Frame-Options', 'GOFORIT'); + res.removeHeader('X-Frame-Options'); res.render('form', { user: req.user || null, diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js index 267ede19..383b0dc1 100644 --- a/app/controllers/forms.server.controller.js +++ b/app/controllers/forms.server.controller.js @@ -57,7 +57,6 @@ exports.createSubmission = function(req, res) { } var submission = new FormSubmission({ form: req.body._id, - title: req.body.title, form_fields: req.body.form_fields, timeElapsed: timeElapsed, percentageComplete: req.body.percentageComplete, @@ -66,7 +65,6 @@ exports.createSubmission = function(req, res) { device: req.body.device }); - submission.save(function(err, submission){ if (err) { console.error(err.message); @@ -120,9 +118,10 @@ exports.listSubmissions = function(req, res) { * Create a new form */ exports.create = function(req, res) { + debugger; if(!req.body.form){ - return res.status(400).send({ + return res.status(401).send({ message: 'Invalid Input' }); } @@ -131,13 +130,14 @@ exports.create = function(req, res) { form.admin = req.user._id; form.save(function(err) { + debugger; if (err) { - return res.status(405).send({ + return res.status(500).send({ message: errorHandler.getErrorMessage(err) }); } - res.json(form); + return res.json(form); }); }; @@ -186,7 +186,7 @@ var readForRender = exports.readForRender = function(req, res) { delete newForm.__v; delete newForm.created; - if(!newForm.startPage.showStart){ + if(newForm.startPage && !newForm.startPage.showStart){ delete newForm.startPage; } @@ -197,20 +197,31 @@ var readForRender = exports.readForRender = function(req, res) { * Update a form */ exports.update = function(req, res) { + var form = req.form; var updatedForm = req.body.form; + if(form.form_fields === undefined){ + form.form_fields = []; + } - delete updatedForm.__v; - delete updatedForm.created; + if(form.analytics === undefined){ + form.analytics = { + visitors: [], + gaCode: '' + } + } if (req.body.changes) { var formChanges = req.body.changes; formChanges.forEach(function (change) { - diff.applyChange(form, true, change); + diff.applyChange(form._doc, true, change); }); } else { - //Unless we have 'admin' privileges, updating form admin is disabled + + delete updatedForm.__v; + delete updatedForm.created; + //Unless we have 'admin' privileges, updating the form's admin is disabled if(updatedForm && req.user.roles.indexOf('admin') === -1) { delete updatedForm.admin; } @@ -222,7 +233,7 @@ exports.update = function(req, res) { //Do this so we can create duplicate fields var checkForValidId = new RegExp('^[0-9a-fA-F]{24}$'); - for(var i=0; i<req.body.form.form_fields.length; i++){ + for(var i=0; i < req.body.form.form_fields.length; i++){ var field = req.body.form.form_fields[i]; if(!checkForValidId.exec(field._id+'')){ delete field._id; @@ -233,7 +244,7 @@ exports.update = function(req, res) { form.save(function(err, savedForm) { if (err) { - res.status(405).send({ + res.status(500).send({ message: errorHandler.getErrorMessage(err) }); } else { @@ -333,8 +344,7 @@ exports.formByIDFast = function(req, res, next, id) { } Form.findById(id) .lean() - .cache() - .select('emailNotifications title language form_fields startPage endPage hideFooter isLive design analytics.gaCode emailNotifications') + .select('title language form_fields startPage endPage hideFooter isLive design analytics.gaCode') .exec(function(err, form) { if (err) { return next(err); diff --git a/app/controllers/users/users.authentication.server.controller.js b/app/controllers/users/users.authentication.server.controller.js index 57a4abbc..91d1d745 100755 --- a/app/controllers/users/users.authentication.server.controller.js +++ b/app/controllers/users/users.authentication.server.controller.js @@ -8,7 +8,16 @@ var errorHandler = require('../errors.server.controller'), passport = require('passport'), config = require('../../../config/config'), User = mongoose.model('User'), - tokgen = require('../../libs/tokenGenerator'); + tokgen = require('../../libs/tokenGenerator'), + fs = require('fs'); + +require.extensions['.html'] = function (module, filename) { + module.exports = fs.readFileSync(filename, 'utf8'); +}; + +var welcomeEmail = require("../../views/welcome.email.view.html"); +var verificationEmail = require("../../views/verification.email.view.html"); + var nev = require('email-verification')(mongoose); @@ -26,16 +35,15 @@ var config_nev = function () { transportOptions: config.mailer.options, verifyMailOptions: { from: config.mailer.from, - subject: 'Confirm your account', - html: '<p>Please verify your account by clicking <a href="http://${URL}">this link</a>. If you are unable to do so, copy and ' + - 'paste the following link into your browser:</p><p>${URL}</p>', + subject: '✔ Activate your new TellForm account!', + html: verificationEmail, text: 'Please verify your account by clicking the following link, or by copying and pasting it into your browser: ${URL}' }, confirmMailOptions: { from: config.mailer.from, - subject: 'Account successfully verified!', - html: '<p>Your account has been successfully verified.</p>', + subject: '✔ Welcome to {{app.title}}!', + html: welcomeEmail, text: 'Your account has been successfully verified.' }, verifySendMailCallback: function(err, info) { diff --git a/app/controllers/users/users.password.server.controller.js b/app/controllers/users/users.password.server.controller.js index a9f2596e..1eff3a0b 100755 --- a/app/controllers/users/users.password.server.controller.js +++ b/app/controllers/users/users.password.server.controller.js @@ -18,7 +18,7 @@ var smtpTransport = nodemailer.createTransport(config.mailer.options); /** * Forgot for reset password (forgot POST) */ -exports.forgot = function(req, res, next) { +exports.forgot = function(req, res) { async.waterfall([ // Generate random token function(done) { @@ -81,22 +81,33 @@ exports.forgot = function(req, res, next) { subject: 'Password Reset', html: emailHTML }; - smtpTransport.sendMail(mailOptions, function(err) { - if (!err) { - res.send({ - message: 'An email has been sent to ' + user.email + ' with further instructions.' - }); - } else { - return res.status(400).send({ - message: 'Failure sending email' - }); - } - done(err); + var userEmail = user.email; + var user = userEmail.split('@')[0]; + var domain = userEmail.split('@')[1]; + + var obfuscatedUser = user.substring(0, 1) + user.substring(1).replace(/./g, '*'); + var domainName = domain.split('.')[0]; + var tld = domain.split('.')[1]; + + var obfuscatedDomainName = domainName.replace(/./g, '*'); + var obfuscatedEmail = obfuscatedUser + '@' + obfuscatedDomainName + '.' + tld; + + smtpTransport.sendMail(mailOptions, function(err) { + done(err, obfuscatedEmail); + }); + } + ], function(err, obfuscatedEmail) { + if (err) { + console.log(err); + return res.status(400).send({ + message: 'Couldn\'t send reset password email due to internal server errors. Please contact support at team@tellform.com.' + }); + } else { + return res.send({ + message: 'An email has been sent to ' + obfuscatedEmail + ' with further instructions.' }); } - ], function(err) { - if (err) return next(err); }); }; diff --git a/app/libs/timestamp.server.plugin.js b/app/libs/timestamp.server.plugin.js new file mode 100644 index 00000000..084e2c1b --- /dev/null +++ b/app/libs/timestamp.server.plugin.js @@ -0,0 +1,39 @@ +'use strict'; + +// Plugin +module.exports = function timestamp (schema, options) { + options || (options = {}) + + // Options + var fields = {} + , createdPath = options.createdPath || 'created' + , modifiedPath = options.modifiedPath || 'modified' + , useVirtual = (options.useVirtual !== undefined) + ? options.useVirtual + : true + + // Add paths to schema if not present + if (!schema.paths[createdPath]) { + fields[modifiedPath] = { type: Date } + } + if (useVirtual) { + // Use the ObjectID for extracting the created time + schema.virtual(createdPath).get(function () { + return new Date(this._id.generationTime * 1000) + }) + } else { + if (!schema.paths[createdPath]) { + fields[createdPath] = { + type: Date + , default: Date.now + } + } + } + schema.add(fields) + + // Update the modified timestamp on save + schema.pre('save', function (next) { + this[modifiedPath] = new Date + next() + }) +} \ No newline at end of file diff --git a/app/models/form.server.model.js b/app/models/form.server.model.js index 570d4714..3252489c 100644 --- a/app/models/form.server.model.js +++ b/app/models/form.server.model.js @@ -6,7 +6,7 @@ var mongoose = require('mongoose'), Schema = mongoose.Schema, _ = require('lodash'), - mUtilities = require('mongoose-utilities'), + timeStampPlugin = require('../libs/timestamp.server.plugin'), async = require('async'), Random = require('random-js'), mt = Random.engines.mt19937(); @@ -292,7 +292,7 @@ FormSchema.virtual('analytics.fields').get(function () { return fieldDropoffs; }); -FormSchema.plugin(mUtilities.timestamp, { +FormSchema.plugin(timeStampPlugin, { createdPath: 'created', modifiedPath: 'lastModified', useVirtual: false @@ -313,7 +313,6 @@ FormSchema.pre('save', function (next) { this.language = 'de'; break; default: - this.language = 'en'; break; } next(); @@ -345,54 +344,55 @@ FormSchema.pre('save', function (next) { var that = this; var _original; - async.series([function(cb) { - that.constructor - .findOne({_id: that._id}).exec(function (err, original) { - if (err) { - return cb(err); - } else if (!original){ - return next(); - } else { - _original = original; - return cb(null); - } - }); - }, - function(cb) { - if(that.form_fields && that.isModified('form_fields') && formFieldsAllHaveIds(that.toObject().form_fields)){ + async.series([ + function(cb) { + that.constructor + .findOne({_id: that._id}).exec(function (err, original) { + if (err) { + return cb(err); + } else if (!original){ + return next(); + } else { + _original = original; + return cb(null); + } + }); + }, + function(cb) { + if(that.form_fields && that.isModified('form_fields') && formFieldsAllHaveIds(that.toObject().form_fields)){ - var current_form = that.toObject(), - old_form_fields = _original.toObject().form_fields, - new_ids = _.map(_.map(current_form.form_fields, 'globalId'), function(id){ return ''+id;}), - old_ids = _.map(_.map(old_form_fields, 'globalId'), function(id){ return ''+id;}), - deletedIds = getDeletedIndexes(old_ids, new_ids); + var current_form = that.toObject(), + old_form_fields = _original.toObject().form_fields, + new_ids = _.map(_.map(current_form.form_fields, 'globalId'), function(id){ return ''+id;}), + old_ids = _.map(_.map(old_form_fields, 'globalId'), function(id){ return ''+id;}), + deletedIds = getDeletedIndexes(old_ids, new_ids); - //Check if any form_fileds were deleted - if( deletedIds.length > 0 ){ + //Check if any form_fileds were deleted + if( deletedIds.length > 0 ){ - var modifiedSubmissions = []; + var modifiedSubmissions = []; - async.forEachOfSeries(deletedIds, - function (deletedIdIndex, key, cb_id) { + async.forEachOfSeries(deletedIds, + function (deletedIdIndex, key, cb_id) { - var deleted_id = old_ids[deletedIdIndex]; - //Find FormSubmissions that contain field with _id equal to 'deleted_id' - FormSubmission. - find({ form: that, form_fields: {$elemMatch: {globalId: deleted_id} } }). - exec(function(err, submissions){ - if(err) { - return cb_id(err); - } + var deleted_id = old_ids[deletedIdIndex]; + //Find FormSubmissions that contain field with _id equal to 'deleted_id' + FormSubmission. + find({ form: that, form_fields: {$elemMatch: {globalId: deleted_id} } }). + exec(function(err, submissions){ + if(err) { + return cb_id(err); + } - //Preserve fields that have at least one submission - if (submissions.length) { - //Add submissions - modifiedSubmissions.push.apply(modifiedSubmissions, submissions); - } + //Preserve fields that have at least one submission + if (submissions.length) { + //Add submissions + modifiedSubmissions.push.apply(modifiedSubmissions, submissions); + } - return cb_id(null); - }); - }, + return cb_id(null); + }); + }, function (err) { if(err){ console.error(err.message); @@ -434,17 +434,20 @@ FormSchema.pre('save', function (next) { }, function (err) { return cb(err); }); - } - ); + }); + } else { + return cb(null); + } } else { return cb(null); } - } else { - return cb(null); } - }], - function(err, results){ - next(err); + ], + function(err){ + if(err){ + return next(err); + } + next(); }); }); diff --git a/app/models/form_field.server.model.js b/app/models/form_field.server.model.js index 71704614..31f96e71 100644 --- a/app/models/form_field.server.model.js +++ b/app/models/form_field.server.model.js @@ -5,13 +5,11 @@ */ var mongoose = require('mongoose'), util = require('util'), - mUtilities = require('mongoose-utilities'), + timeStampPlugin = require('../libs/timestamp.server.plugin'), _ = require('lodash'), Schema = mongoose.Schema, - LogicJumpSchema = require('./logic_jump.server.model'); - -const UIDGenerator = require('uid-generator'); -const uidgen3 = new UIDGenerator(256, UIDGenerator.BASE62); + LogicJumpSchema = require('./logic_jump.server.model'), + tokgen = require('../libs/tokenGenerator'); var FieldOptionSchema = new Schema({ option_id: { @@ -76,8 +74,7 @@ function BaseFieldSchema(){ }, title: { type: String, - trim: true, - required: 'Field Title cannot be blank' + trim: true }, description: { type: String, @@ -106,7 +103,6 @@ function BaseFieldSchema(){ }, fieldType: { type: String, - required: true, enum: [ 'textfield', 'date', @@ -134,7 +130,7 @@ function BaseFieldSchema(){ fieldValue: Schema.Types.Mixed }); - this.plugin(mUtilities.timestamp, { + this.plugin(timeStampPlugin, { createdPath: 'created', modifiedPath: 'lastModified', useVirtual: false @@ -196,11 +192,8 @@ FormFieldSchema.pre('validate', function(next) { //LogicJump Save FormFieldSchema.pre('save', function(next) { - if(this.logicJump && this.logicJump.fieldA) { - if(this.logicJump.jumpTo === '') delete this.logicJump.jumpTo; - } if(!this.globalId){ - this.globalId = uidgen3.generateSync(); + this.globalId = tokgen(); } next(); }); diff --git a/app/models/form_submission.server.model.js b/app/models/form_submission.server.model.js index e2029e4e..a3505f3a 100644 --- a/app/models/form_submission.server.model.js +++ b/app/models/form_submission.server.model.js @@ -5,17 +5,13 @@ */ var mongoose = require('mongoose'), Schema = mongoose.Schema, - mUtilities = require('mongoose-utilities'), + timeStampPlugin = require('../libs/timestamp.server.plugin'), FieldSchema = require('./form_field.server.model.js'); /** * Form Submission Schema */ var FormSubmissionSchema = new Schema({ - title: { - type: String - }, - form_fields: [FieldSchema], form: { @@ -58,6 +54,19 @@ FormSubmissionSchema.pre('save', function (next) { if(this.form_fields[i].fieldType === 'dropdown'){ this.form_fields[i].fieldValue = this.form_fields[i].fieldValue.option_value; } + + delete form_fields[i].validFieldTypes; + delete form_fields[i].disabled; + delete form_fields[i].required; + delete form_fields[i].isSubmission; + delete form_fields[i].title; + delete form_fields[i].fieldOptions; + delete form_fields[i].ratingOptions; + delete form_fields[i].logicJump; + delete form_fields[i].description; + delete form_fields[i].created; + delete form_fields[i].lastModified; + delete form_fields[i].deletePreserved; } next(); }); @@ -68,6 +77,17 @@ FormSubmissionSchema.path('form_fields', { form_fields[i].isSubmission = true; form_fields[i]._id = new mongoose.mongo.ObjectID(); + delete form_fields[i].validFieldTypes; + delete form_fields[i].disabled; + delete form_fields[i].required; + delete form_fields[i].isSubmission; + delete form_fields[i].title; + delete form_fields[i].fieldOptions; + delete form_fields[i].ratingOptions; + delete form_fields[i].logicJump; + delete form_fields[i].description; + delete form_fields[i].created; + delete form_fields[i].lastModified; delete form_fields[i].deletePreserved; } @@ -75,7 +95,7 @@ FormSubmissionSchema.path('form_fields', { } }); -FormSubmissionSchema.plugin(mUtilities.timestamp, { +FormSubmissionSchema.plugin(timeStampPlugin, { createdPath: 'created', modifiedPath: 'lastModified', useVirtual: false diff --git a/app/models/logic_jump.server.model.js b/app/models/logic_jump.server.model.js index c8d39b82..0226aad8 100644 --- a/app/models/logic_jump.server.model.js +++ b/app/models/logic_jump.server.model.js @@ -44,6 +44,10 @@ var LogicJumpSchema = new Schema({ jumpTo: { type: Schema.Types.ObjectId, ref: 'FormField' + }, + enabled: { + type: Schema.Types.Boolean, + default: false } }, schemaOptions); diff --git a/app/models/user.server.model.js b/app/models/user.server.model.js index a22f53d4..98e2d613 100755 --- a/app/models/user.server.model.js +++ b/app/models/user.server.model.js @@ -7,8 +7,7 @@ var mongoose = require('mongoose'), Schema = mongoose.Schema, crypto = require('crypto'), config = require('../../config/config'), - fs = require('fs-extra'), - mUtilities = require('mongoose-utilities'), + timeStampPlugin = require('../libs/timestamp.server.plugin'), path = require('path'), querystring = require('querystring'), nodemailer = require('nodemailer'); @@ -143,7 +142,7 @@ UserSchema.virtual('displayName').get(function () { return this.firstName + ' ' + this.lastName; }); -UserSchema.plugin(mUtilities.timestamp, { +UserSchema.plugin(timeStampPlugin, { createdPath: 'created', modifiedPath: 'lastModified', useVirtual: false diff --git a/app/routes/users.server.routes.js b/app/routes/users.server.routes.js index 06b5b0f3..f99ddc95 100755 --- a/app/routes/users.server.routes.js +++ b/app/routes/users.server.routes.js @@ -34,34 +34,7 @@ module.exports = function(app) { app.route('/auth/signout').get(users.signout); app.route('/auth/genkey').get(users.requiresLogin, users.generateAPIKey); - - // // Setting the facebook oauth routes - // app.route('/auth/facebook').get(passport.authenticate('facebook', { - // scope: ['email'] - // })); - // app.route('/auth/facebook/callback').get(users.oauthCallback('facebook')); - - // // Setting the twitter oauth routes - // app.route('/auth/twitter').get(passport.authenticate('twitter')); - // app.route('/auth/twitter/callback').get(users.oauthCallback('twitter')); - - // // Setting the google oauth routes - // app.route('/auth/google').get(passport.authenticate('google', { - // scope: [ - // 'https://www.googleapis.com/auth/userinfo.profile', - // 'https://www.googleapis.com/auth/userinfo.email' - // ] - // })); - // app.route('/auth/google/callback').get(users.oauthCallback('google')); - - // // Setting the linkedin oauth routes - // app.route('/auth/linkedin').get(passport.authenticate('linkedin')); - // app.route('/auth/linkedin/callback').get(users.oauthCallback('linkedin')); - - // // Setting the github oauth routes - // app.route('/auth/github').get(passport.authenticate('github')); - // app.route('/auth/github/callback').get(users.oauthCallback('github')); - + // Finish by binding the user middleware app.param('userId', users.userByID); }; diff --git a/app/sockets/analytics_service.js b/app/sockets/analytics_service.js index bb5f8ab2..993a0468 100644 --- a/app/sockets/analytics_service.js +++ b/app/sockets/analytics_service.js @@ -5,13 +5,14 @@ */ var mongoose = require('mongoose'), errorHandler = require('../controllers/errors.server.controller'), - Form = mongoose.model('Form'); + Form = mongoose.model('Form'), + request = require('request'); // Create the chat configuration module.exports = function (io, socket) { var visitorsData = {}; - var saveVisitorData = function (data, cb){ + var saveVisitorData = function (data, socket, cb){ Form.findById(data.formId, function(err, form) { if (err) { console.error(err); @@ -25,22 +26,25 @@ module.exports = function (io, socket) { timeElapsed: data.timeElapsed, isSubmitted: data.isSubmitted, language: data.language, - ipAddr: data.ipAddr, + ipAddr: '', deviceType: data.deviceType }; form.analytics.visitors.push(newVisitor); - form.save(function (formSaveErr) { - if (err) { - console.error(err); - throw new Error(errorHandler.getErrorMessage(formSaveErr)); - } - if(cb){ - return cb(); - } - }); + form.form_fields = form.form_fields.map(v => Object.assign({}, v, { fieldValue: null })); + + form.save(function (formSaveErr) { + if (err) { + console.error(err); + throw new Error(errorHandler.getErrorMessage(formSaveErr)); + } + + if(cb){ + return cb(); + } + }); }); }; @@ -50,6 +54,8 @@ module.exports = function (io, socket) { visitorsData[current_socket.id] = data; visitorsData[current_socket.id].socketId = current_socket.id; visitorsData[current_socket.id].isSaved = false; + + if (data.isSubmitted && !data.isSaved) { visitorsData[current_socket.id].isSaved = true; saveVisitorData(data, function() { @@ -71,3 +77,4 @@ module.exports = function (io, socket) { }); }); }; + diff --git a/app/tests/form.server.model.test.js b/app/tests/form.server.model.test.js index 697fe87e..573e631b 100644 --- a/app/tests/form.server.model.test.js +++ b/app/tests/form.server.model.test.js @@ -1,5 +1,7 @@ 'use strict'; +require('../../server.js'); + /** * Module dependencies. */ diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index c2f7cb4e..e1aa2654 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -1,5 +1,4 @@ 'use strict'; -process.env.NODE_ENV = 'test'; var should = require('should'), lodash = require('lodash'), @@ -19,8 +18,8 @@ var user, myForm, userSession; // Create user credentials var credentials = { - username: 'test1234', - email: 'test1234@test.com', + username: 'aeokjqjqkqaeoaoe', + email: 'aeoaekjqjqqjkoeoa@test.com', password: 'password' }; @@ -30,18 +29,17 @@ var credentials = { describe('Form Routes Unit tests', function() { beforeEach(function(done) { - // Create a new user user = new User({ firstName: 'Full', lastName: 'Name', - displayName: 'Full Name', email: credentials.email, username: credentials.username, password: credentials.password, provider: 'local' }); + // Save a user to the test db and create new Form user.save(function(err) { should.not.exist(err); @@ -65,10 +63,12 @@ describe('Form Routes Unit tests', function() { }); it(' > should not be able to create a Form if not logged in', function(done) { + userSession.post('/forms') .send({form: myForm}) .expect(401) .end(function(FormSaveErr, FormSaveRes) { + // Call the assertion callback done(FormSaveErr); }); @@ -153,7 +153,7 @@ describe('Form Routes Unit tests', function() { // Save a new Form authenticatedSession.post('/forms') .send({form: myForm}) - .expect(405) + .expect(500) .end(function(FormSaveErr, FormSaveRes) { // Handle Form save error if (FormSaveErr) { diff --git a/app/tests/form_submission.model.test.js b/app/tests/form_submission.model.test.js index de87d09f..f60e599e 100644 --- a/app/tests/form_submission.model.test.js +++ b/app/tests/form_submission.model.test.js @@ -168,7 +168,7 @@ describe('FormSubmission Model Unit Tests:', function() { }); it('should be able to find FormSubmission by $elemMatch on form_fields id', function(done){ - FormSubmission.findOne({ form: myForm._id, admin: user, form_fields: {$elemMatch: {_id: myForm.form_fields[0]._id} } }) + FormSubmission.findOne({ form: myForm._id, form_fields: {$elemMatch: {globalId: myForm.form_fields[0].globalId} } }) .exec(function(err, submission){ should.not.exist(err); should.exist(submission); diff --git a/app/tests/form_submission.routes.test.js b/app/tests/form_submission.routes.test.js index 9cde8744..13d5e780 100644 --- a/app/tests/form_submission.routes.test.js +++ b/app/tests/form_submission.routes.test.js @@ -21,7 +21,8 @@ var credentials, user; * Form routes tests */ describe('Form Submission Routes Unit tests', function() { - var FormObj, _Submission, submissionSession; + var FormObj, _Submission, submissionSession, _SubmissionBody + beforeEach(function(done) { @@ -60,15 +61,43 @@ describe('Form Submission Routes Unit tests', function() { if (formSaveErr) done(formSaveErr); _Submission = { - form_fields: [ - {'fieldType':'textfield', 'title':'First Name', 'fieldValue': 'David'}, - {'fieldType':'checkbox', 'title':'nascar', 'fieldValue': true}, - {'fieldType':'checkbox', 'title':'hockey', 'fieldValue': false} - ], form: form._id, - admin: user._id, + form_fields: [ + {'fieldType':'textfield', 'title':'First Name', 'fieldValue': 'David', _id: '', isSubmission: false, deletePreserved: false}, + {'fieldType':'checkbox', 'title':'nascar', 'fieldValue': true, _id: '', isSubmission: false, deletePreserved: true}, + {'fieldType':'checkbox', 'title':'hockey', 'fieldValue': false, _id: '', isSubmission: false, deletePreserved: false} + ], percentageComplete: 100, - timeElapsed: 11.55 + timeElapsed: 11.55, + ipAddr: '123.233.232.232', + geoLocation: { + Country: 'Canada', + City: 'Vancouver' + }, + device:{ + type: 'Mobile', + name: 'iPhone' + } + }; + + _SubmissionBody ={ + _id: form._id, + form_fields: [ + {'fieldType':'textfield', 'title':'First Name', 'fieldValue': 'David', _id: '', isSubmission: false, deletePreserved: false}, + {'fieldType':'checkbox', 'title':'nascar', 'fieldValue': true, _id: '', isSubmission: false, deletePreserved: true}, + {'fieldType':'checkbox', 'title':'hockey', 'fieldValue': false, _id: '', isSubmission: false, deletePreserved: false} + ], + percentageComplete: 100, + timeElapsed: 11.55, + ipAddr: '123.233.232.232', + geoLocation: { + Country: 'Canada', + City: 'Vancouver' + }, + device:{ + type: 'Mobile', + name: 'iPhone' + } }; FormObj = form; @@ -86,12 +115,11 @@ describe('Form Submission Routes Unit tests', function() { //Create Submission submissionSession.post('/forms/' + FormObj._id) - .send(_Submission) + .send(_SubmissionBody) .expect(200) .end(function(err, res) { should.not.exist(err); - done(); }); }); @@ -99,7 +127,7 @@ describe('Form Submission Routes Unit tests', function() { it(' > should be able to get Form Submissions if signed in', function(done) { //Create Submission submissionSession.post('/forms/' + FormObj._id) - .send(_Submission) + .send(_SubmissionBody) .expect(200) .end(function(err, res) { diff --git a/app/tests/libs/timestamp.server.plugin.test.js b/app/tests/libs/timestamp.server.plugin.test.js new file mode 100644 index 00000000..2901fe72 --- /dev/null +++ b/app/tests/libs/timestamp.server.plugin.test.js @@ -0,0 +1,70 @@ +// Dependencies +var util = require('util') + , assert = require('assert') + , mongoose = require('mongoose') + , timestamp = require('../../libs/timestamp.server.plugin') + , Schema = mongoose.Schema + , ObjectId = Schema.ObjectId + +// Run tests +describe('Timestamp', function () { + describe('#default()', function () { + var FooSchema = new Schema() + FooSchema.plugin(timestamp) + var FooModel = mongoose.model('timeFoo', FooSchema) + , bar = new FooModel() + + before(function () { + FooModel.remove(function (err) { + assert.strictEqual(err, null) + }) + }) + + it('should have custom properties', function (done) { + assert.strictEqual(typeof FooSchema.virtuals.created, 'object') + assert.strictEqual(typeof FooSchema.paths.modified, 'object') + done() + }) + + it('should create the default attributes', function (done) { + bar.save(function (err, doc) { + assert.strictEqual(err, null) + assert.strictEqual(util.isDate(doc.created), true) + assert.strictEqual(util.isDate(doc.modified), true) + done() + }) + }) + }) + + describe('#custom()', function () { + var FooSchema = new Schema() + FooSchema.plugin(timestamp, { + createdPath: 'oh' + , modifiedPath: 'hai' + , useVirtual: false + }) + var BarModel = mongoose.model('timeBar', FooSchema) + , bar = new BarModel() + + before(function () { + BarModel.remove(function (err) { + assert.strictEqual(err, null) + }) + }) + + it('should have custom properties', function (done) { + assert.strictEqual(typeof FooSchema.paths.oh, 'object') + assert.strictEqual(typeof FooSchema.paths.hai, 'object') + done() + }) + + it('should create custom attributes', function (done) { + bar.save(function (err, doc) { + assert.strictEqual(err, null) + assert.strictEqual(util.isDate(doc.oh), true) + assert.strictEqual(util.isDate(doc.hai), true) + done() + }) + }) + }) +}) \ No newline at end of file diff --git a/app/views/form.server.view.html b/app/views/form.server.view.html index b07466ed..be1bd664 100644 --- a/app/views/form.server.view.html +++ b/app/views/form.server.view.html @@ -76,11 +76,6 @@ <script src="/static/lib/jquery/dist/jquery.min.js" type="text/javascript"></script> - <script type="text/javascript"> - $(window).on("load", function() { - $(".loader").fadeOut("slow"); - }); - </script> <link rel="stylesheet" href="/static/lib/font-awesome/css/font-awesome.min.css"> <link rel="stylesheet" href="/static/lib/bootstrap/dist/css/bootstrap.min.css"> diff --git a/app/views/templates/reset-password-confirm-email.server.view.html b/app/views/templates/reset-password-confirm-email.server.view.html index bfbcb157..4654ff1f 100755 --- a/app/views/templates/reset-password-confirm-email.server.view.html +++ b/app/views/templates/reset-password-confirm-email.server.view.html @@ -1,13 +1,64 @@ <!DOCTYPE html> -<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> -<head> -</head> -<body> - <p>Dear {{name}},</p> - <p></p> - <p>This is a confirmation that the password for your account has just been changed</p> - <br> - <br> - <p>The {{appName}} Support Team</p> -</body> -</html> +<html> + <head>@import url(//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&subset=latin,latin-ext); + <style> + a { + color: #007ee6; + text-decoration: none; + } + </style> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> + </head> + <body style="padding: 0; width: 100% !important; -webkit-text-size-adjust: 100%; margin: 0; -ms-text-size-adjust: 100%;" marginheight="0" marginwidth="0"> + <center> + <table cellpadding="8" cellspacing="0" style="*width: 540px; padding: 0; width: 100% !important; background: #ffffff; margin: 0; background-color: #ffffff;" border="0"> + <tr> + <td valign="top"> + <table cellpadding="0" cellspacing="0" style="border-radius: 6px; -webkit-border-radius: 6px; border: 1px #c0c0c0 solid; -moz-border-radius: 6px;" border="0" align="center"> + <tr> + <td colspan="3" height="6"></td> + </tr> + <tr> + <td> + <table cellpadding="0" cellspacing="0" style="line-height: 25px;" border="0" align="center"> + <tr> + <td colspan="3" height="30"></td> + </tr> + <tr> + <td width="36"></td> + <td width="454" align="left" style="color: #444444; border-collapse: collapse; font-size: 11pt; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; max-width: 454px;" valign="top"> + <p>Hello there!</p> + <p>This is a courtesy message to confirm that your password was just changed.</p> + <p>Thanks so much for using our services! If you have any questions, or suggestions, please feel free to email us here at <a href="mailto:team@tellform.com">team@tellform.com</a>.</p> + <p> - The {{appName}} team</p> + </td> + <td width="36"></td> + </tr> + <tr> + <td colspan="3" height="36"></td> + </tr> + </table> + </td> + </tr> + </table> + <table cellpadding="0" cellspacing="0" align="center" border="0"> + <tr> + <td height="10"></td> + </tr> + <tr> + <td style="padding: 0; border-collapse: collapse;"> + <table cellpadding="0" cellspacing="0" align="center" border="0"> + <tr style="color: #c0c0c0; font-size: 11px; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; -webkit-text-size-adjust: none;"> + <td width="400" align="left"></td> + <td width="128" align="right">© TellForm 2017</td> + </tr> + </table> + </td> + </tr> + </table> + </td> + </tr> + </table> + </center> + </body> +</html> \ No newline at end of file diff --git a/app/views/templates/reset-password-email.server.view.html b/app/views/templates/reset-password-email.server.view.html index 4869dfd8..98e8beb0 100755 --- a/app/views/templates/reset-password-email.server.view.html +++ b/app/views/templates/reset-password-email.server.view.html @@ -1,18 +1,66 @@ <!DOCTYPE html> -<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> -<head> -</head> -<body> - <p>Dear {{name}},</p> - <br> - <p> - You have requested to have your password reset for your account at {{appName}} - </p> - <p>Please visit this url to reset your password:</p> - <p>{{url}}</p> - <strong>If you didn't make this request, you can ignore this email.</strong> - <br> - <br> - <p>The {{appName}} Support Team</p> -</body> -</html> +<html> + <head>@import url(//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&subset=latin,latin-ext); + <style> + a { + color: #007ee6; + text-decoration: none; + } + </style> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> + </head> + <body style="padding: 0; width: 100% !important; -webkit-text-size-adjust: 100%; margin: 0; -ms-text-size-adjust: 100%;" marginheight="0" marginwidth="0"> + <center> + <table cellpadding="8" cellspacing="0" style="*width: 540px; padding: 0; width: 100% !important; background: #ffffff; margin: 0; background-color: #ffffff;" border="0"> + <tr> + <td valign="top"> + <table cellpadding="0" cellspacing="0" style="border-radius: 6px; -webkit-border-radius: 6px; border: 1px #c0c0c0 solid; -moz-border-radius: 6px;" border="0" align="center"> + <tr> + <td colspan="3" height="6"></td> + </tr> + <tr> + <td> + <table cellpadding="0" cellspacing="0" style="line-height: 25px;" border="0" align="center"> + <tr> + <td colspan="3" height="30"></td> + </tr> + <tr> + <td width="36"></td> + <td width="454" align="left" style="color: #444444; border-collapse: collapse; font-size: 11pt; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; max-width: 454px;" valign="top"> + <p>Hello there!</p> + <p>Here is a special link that will allow you to reset your password. Please note it will expire in one hour for your protection:</p> + <p><a href="{{url}}">Reset Your Password</a></p> + <p>If you did not request this, please ignore this email and your password will remain unchanged.</p> + <p>Thanks so much for using our services! If you have any questions, or suggestions, please feel free to email us here at <a href="mailto:team@tellform.com">team@tellform.com</a>.</p> + <p> - The {{appName}} team</p> + </td> + <td width="36"></td> + </tr> + <tr> + <td colspan="3" height="36"></td> + </tr> + </table> + </td> + </tr> + </table> + <table cellpadding="0" cellspacing="0" align="center" border="0"> + <tr> + <td height="10"></td> + </tr> + <tr> + <td style="padding: 0; border-collapse: collapse;"> + <table cellpadding="0" cellspacing="0" align="center" border="0"> + <tr style="color: #c0c0c0; font-size: 11px; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; -webkit-text-size-adjust: none;"> + <td width="400" align="left"></td> + <td width="128" align="right">© TellForm 2017</td> + </tr> + </table> + </td> + </tr> + </table> + </td> + </tr> + </table> + </center> + </body> +</html> \ No newline at end of file diff --git a/app/views/templates/verify-account-email.server.view.html b/app/views/templates/verify-account-email.server.view.html deleted file mode 100644 index 5611ec4c..00000000 --- a/app/views/templates/verify-account-email.server.view.html +++ /dev/null @@ -1,71 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> -<html> - <head> - <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> - </head> - <body style="padding: 0; width: 100% !important; -webkit-text-size-adjust: 100%; margin: 0; -ms-text-size-adjust: 100%;" marginheight="0" marginwidth="0"> - <center> - <table cellpadding="8" cellspacing="0" style="*width: 540px; padding: 0; width: 100% !important; background: #ffffff; margin: 0; background-color: #ffffff;" border="0"> - <tr> - <td valign="top"> - <table cellpadding="0" cellspacing="0" style="border-radius: 6px; -webkit-border-radius: 6px; border: 1px #c0c0c0 solid; -moz-border-radius: 6px;" border="0" align="center"> - <tr> - <td colspan="3" height="6"></td> - </tr> - <tr> - <td> - <table cellpadding="0" cellspacing="0" style="line-height: 25px;" border="0" align="center"> - <tr> - <td colspan="3" height="30"></td> - </tr> - <tr> - <td width="36"></td> - <td width="454" align="left" style="color: #444444; border-collapse: collapse; font-size: 11pt; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; max-width: 454px;" valign="top"> - //- ----------------------------------------------------------------------------------- - //- Only Edit Here - //- ----------------------------------------------------------------------------------- - p Hello {{name}}! - p - | Welcome to {{appName}}! Here is a special link to activate your new account: - p - a(href='${URL}') Activate my account - p - | Thanks so much for using our services! If you have any questions, or suggestions, please feel free to email us here at  - a(href='mailto:{{contactEmail}}') {{contactEmail}} - | . - p   - The {{appName}} team - //- ---------------------------------------------------------------------------------- - - </td> - <td width="36"></td> - </tr> - <tr> - <td colspan="3" height="36"></td> - </tr> - </table> - </td> - </tr> - </table> - <table cellpadding="0" cellspacing="0" align="center" border="0"> - <tr> - <td height="10"></td> - </tr> - <tr> - <td style="padding: 0; border-collapse: collapse;"> - <table cellpadding="0" cellspacing="0" align="center" border="0"> - <tr style="color: #c0c0c0; font-size: 11px; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; -webkit-text-size-adjust: none;"></tr> - <td width="400" align="left"> - <td width="128" align="right">© </td> - </td> - </table> - </td> - </tr> - </table> - </td> - </tr> - </table> - </center> - </body> -</html> - - diff --git a/app/views/verification.email.view.html b/app/views/verification.email.view.html new file mode 100644 index 00000000..e582340d --- /dev/null +++ b/app/views/verification.email.view.html @@ -0,0 +1,65 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> +<head> + @import url(//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&subset=latin,latin-ext); + <style> + a { + color: #007ee6; + text-decoration: none; + } + </style> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> +</head> + <body style="padding: 0; width: 100% !important; -webkit-text-size-adjust: 100%; margin: 0; -ms-text-size-adjust: 100%;" marginheight="0" marginwidth="0"> + <center> + <table cellpadding="8" cellspacing="0" style="*width: 540px; padding: 0; width: 100% !important; background: #ffffff; margin: 0; background-color: #ffffff;" border="0"> + <tr> + <td valign="top"> + <table cellpadding="0" cellspacing="0" style="border-radius: 6px; -webkit-border-radius: 6px; border: 1px #c0c0c0 solid; -moz-border-radius: 6px;" border="0" align="center"> + <tr> + <td colspan="3" height="6"></td> + </tr> + <tr> + <td> + <table cellpadding="0" cellspacing="0" style="line-height: 25px;" border="0" align="center"> + <tr> + <td colspan="3" height="30"></td> + </tr> + <tr> + <td width="36"></td> + <td width="454" align="left" style="color: #444444; border-collapse: collapse; font-size: 11pt; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; max-width: 454px;" valign="top"> + <p>Hello there!</p> + <p>Welcome to TellForm! Here is a special link to activate your new account:</p> + <p><a href="https://${URL}">Activate my account</a></p> + <p>Thanks so much for using our services! If you have any questions, or suggestions, please feel free to email us here at <a href="mailto:team@tellform.com">team@tellform.com</a>.</p> + <p> - The TellForm team</p> + </td> + <td width="36"></td> + </tr> + <tr> + <td colspan="3" height="36"></td> + </tr> + </table> + </td> + </tr> + </table> + <table cellpadding="0" cellspacing="0" align="center" border="0"> + <tr> + <td height="10"></td> + </tr> + <tr> + <td style="padding: 0; border-collapse: collapse;"> + <table cellpadding="0" cellspacing="0" align="center" border="0"> + <tr style="color: #c0c0c0; font-size: 11px; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; -webkit-text-size-adjust: none;"> + <td width="400" align="left"></td> + <td width="128" align="right">© TellForm 2017</td> + </tr> + </table> + </td> + </tr> + </table> + </td> + </tr> + </table> + </center> + </body> +</head> diff --git a/app/views/welcome.email.view.html b/app/views/welcome.email.view.html new file mode 100644 index 00000000..b69702f5 --- /dev/null +++ b/app/views/welcome.email.view.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<html> + <head>@import url(//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&subset=latin,latin-ext); + <style> + a { + color: #007ee6; + text-decoration: none; + } + </style> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> + </head> + <body style="padding: 0; width: 100% !important; -webkit-text-size-adjust: 100%; margin: 0; -ms-text-size-adjust: 100%;" marginheight="0" marginwidth="0"> + <center> + <table cellpadding="8" cellspacing="0" style="*width: 540px; padding: 0; width: 100% !important; background: #ffffff; margin: 0; background-color: #ffffff;" border="0"> + <tr> + <td valign="top"> + <table cellpadding="0" cellspacing="0" style="border-radius: 6px; -webkit-border-radius: 6px; border: 1px #c0c0c0 solid; -moz-border-radius: 6px;" border="0" align="center"> + <tr> + <td colspan="3" height="6"></td> + </tr> + <tr> + <td> + <table cellpadding="0" cellspacing="0" style="line-height: 25px;" border="0" align="center"> + <tr> + <td colspan="3" height="30"></td> + </tr> + <tr> + <td width="36"></td> + <td width="454" align="left" style="color: #444444; border-collapse: collapse; font-size: 11pt; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; max-width: 454px;" valign="top"> + <p>Hello there!</p> + <p>We would like to welcome you as our newest member!</p> + <p>Thanks so much for using TellForm! If you have any questions, or suggestions, please feel free to email us here at <a href="mailto:team@tellform.com">team@tellform.com</a>.</p> + <p> - The TellForm team</p> + </td> + <td width="36"></td> + </tr> + <tr> + <td colspan="3" height="36"></td> + </tr> + </table> + </td> + </tr> + </table> + <table cellpadding="0" cellspacing="0" align="center" border="0"> + <tr> + <td height="10"></td> + </tr> + <tr> + <td style="padding: 0; border-collapse: collapse;"> + <table cellpadding="0" cellspacing="0" align="center" border="0"> + <tr style="color: #c0c0c0; font-size: 11px; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; -webkit-text-size-adjust: none;"> + <td width="400" align="left"></td> + <td width="128" align="right">© TellForm 2017</td> + </tr> + </table> + </td> + </tr> + </table> + </td> + </tr> + </table> + </center> + </body> +</html> diff --git a/config/env/all.js b/config/env/all.js index 2651bae1..7e12b09e 100755 --- a/config/env/all.js +++ b/config/env/all.js @@ -8,25 +8,52 @@ module.exports = { keywords: process.env.APP_KEYWORDS || 'typeform, pdfs, forms, opensource, formbuilder, google forms, nodejs' }, db: { - uri: 'mongodb://'+ (process.env.DB_PORT_27017_TCP_ADDR || process.env.DB_HOST || 'localhost')+'/mean', + uri: process.env.MONGOLAB_URI || process.env.MONGODB_URI || 'mongodb://'+ (process.env.DB_PORT_27017_TCP_ADDR || '127.0.0.1') + '/mean', options: { user: '', pass: '' } }, + + + admin:{ + email: process.env.ADMIN_EMAIL || 'admin@admin.com', + username: process.env.ADMIN_USERNAME || 'root', + password: process.env.ADMIN_PASSWORD || 'root', + }, + + redisUrl: process.env.REDIS_URL || 'redis://127.0.0.1:6379', port: process.env.PORT || 3000, socketPort: process.env.SOCKET_PORT || 20523, + socketPortExternallyVisible: (process.env.SOCKET_PORT_EXTERN_VISIBLE === 'TRUE'), templateEngine: 'swig', - reCAPTCHA_Key: process.env.reCAPTCHA_KEY || '', - - signupDisabled: (process.env.SIGNUP_DISABLED === 'TRUE'), + signupDisabled: (process.env.SIGNUP_DISABLED === 'TRUE'), enableClusterMode: (process.env.ENABLE_CLUSTER_MODE === 'TRUE'), - baseUrl: '', + baseUrl: process.env.BASE_URL || 'localhost:3000', tempUserCollection: 'temporary_users', + mailer: { + from: process.env.MAILER_FROM || 'testing@'+process.env.SPARKPOST_SANDBOX_DOMAIN || 'no-reply@tellform.com', + options: process.env.MAILER_SMTP_HOST ? { //Uses custom SMTP if MAILER_SMTP_HOST is set + host: process.env.MAILER_SMTP_HOST || '', + port: process.env.MAILER_SMTP_PORT || 465, + secure: process.env.MAILER_SMTP_SECURE || true, + auth: { + user: process.env.MAILER_EMAIL_ID || '', + pass: process.env.MAILER_PASSWORD || '' + } + } : { + service: process.env.MAILER_SERVICE_PROVIDER || '', + auth: { + user: process.env.MAILER_EMAIL_ID || '', + pass: process.env.MAILER_PASSWORD || '' + } + } + }, + subdomainsDisabled: (process.env.SUBDOMAINS_DISABLED === 'TRUE'), //Sentry DSN Client Key @@ -52,17 +79,6 @@ module.exports = { // To set the cookie in a specific domain uncomment the following // setting: }, - - /* - * Upload Configuration - */ - //Global upload path - uploadPath : 'uploads/', - //PDF storage path - pdfUploadPath: 'uploads/pdfs/', - //Temp files storage path - tmpUploadPath: 'uploads/tmp/', - // The session cookie name sessionName: 'connect.sid', log: { diff --git a/config/env/development.js b/config/env/development.js index 7771b6e0..a44816a7 100755 --- a/config/env/development.js +++ b/config/env/development.js @@ -4,7 +4,7 @@ module.exports = { baseUrl: process.env.BASE_URL || 'http://localhost:5000', port: process.env.PORT || 5000, db: { - uri: 'mongodb://'+( process.env.DB_PORT_27017_TCP_ADDR || process.env.DB_HOST || '0.0.0.0') +'/mean', + uri: process.env.MONGODB_URI || 'mongodb://'+( process.env.DB_PORT_27017_TCP_ADDR || '127.0.0.1') +'/mean', options: { user: '', pass: '' @@ -16,31 +16,6 @@ module.exports = { // Stream defaults to process.stdout // Uncomment to enable logging to a log on the file system }, - facebook: { - clientID: process.env.FACEBOOK_ID || 'APP_ID', - clientSecret: process.env.FACEBOOK_SECRET || 'APP_SECRET', - callbackURL: '/auth/facebook/callback' - }, - twitter: { - clientID: process.env.TWITTER_KEY || 'CONSUMER_KEY', - clientSecret: process.env.TWITTER_SECRET || 'CONSUMER_SECRET', - callbackURL: '/auth/twitter/callback' - }, - google: { - clientID: process.env.GOOGLE_ID || 'APP_ID', - clientSecret: process.env.GOOGLE_SECRET || 'APP_SECRET', - callbackURL: '/auth/google/callback' - }, - linkedin: { - clientID: process.env.LINKEDIN_ID || 'APP_ID', - clientSecret: process.env.LINKEDIN_SECRET || 'APP_SECRET', - callbackURL: '/auth/linkedin/callback' - }, - github: { - clientID: process.env.GITHUB_ID || 'APP_ID', - clientSecret: process.env.GITHUB_SECRET || 'APP_SECRET', - callbackURL: '/auth/github/callback' - }, mailer: { from: process.env.MAILER_FROM || 'no-reply@tellform.com', options: process.env.MAILER_SMTP_HOST ? { //Uses custom SMTP if MAILER_SMTP_HOST is set diff --git a/config/env/production.js b/config/env/production.js index 110fd1f4..6519fd73 100755 --- a/config/env/production.js +++ b/config/env/production.js @@ -3,10 +3,11 @@ module.exports = { baseUrl: process.env.BASE_URL || process.env.HEROKU_APP_NAME + '.herokuapp.com' || 'tellform.com', db: { - uri: process.env.MONGODB_URI || process.env.MONGOHQ_URL || process.env.MONGOLAB_URI || 'mongodb://' + (process.env.DB_1_PORT_27017_TCP_ADDR || '0.0.0.0') + '/mean', + uri: process.env.MONGODB_URI || process.env.MONGOHQ_URL || process.env.MONGOLAB_URI || 'mongodb://' + (process.env.DB_PORT_27017_TCP_ADDR || '127.0.0.1') + '/mean', }, port: process.env.PORT || 5000, socketUrl: process.env.SOCKET_URL || 'ws.tellform.com', + socketPortExternallyVisible: (process.env.SOCKET_PORT_EXTERN_VISIBLE === 'TRUE' || !process.env.SOCKET_PORT_EXTERN_VISIBLE), //socketPortExternallyVisible set to true in production config by default socketPort: process.env.SOCKET_PORT || 20523, log: { // Can specify one of 'combined', 'common', 'dev', 'short', 'tiny' @@ -31,48 +32,5 @@ module.exports = { css: 'public/dist/application.min.css', js: 'public/dist/application.min.js', form_js: 'public/dist/form-application.min.js' - }, - facebook: { - clientID: process.env.FACEBOOK_ID || 'APP_ID', - clientSecret: process.env.FACEBOOK_SECRET || 'APP_SECRET', - callbackURL: '/auth/facebook/callback' - }, - twitter: { - clientID: process.env.TWITTER_KEY || 'CONSUMER_KEY', - clientSecret: process.env.TWITTER_SECRET || 'CONSUMER_SECRET', - callbackURL: '/auth/twitter/callback' - }, - google: { - clientID: process.env.GOOGLE_ID || 'APP_ID', - clientSecret: process.env.GOOGLE_SECRET || 'APP_SECRET', - callbackURL: '/auth/google/callback' - }, - linkedin: { - clientID: process.env.LINKEDIN_ID || 'APP_ID', - clientSecret: process.env.LINKEDIN_SECRET || 'APP_SECRET', - callbackURL: '/auth/linkedin/callback' - }, - github: { - clientID: process.env.GITHUB_ID || 'APP_ID', - clientSecret: process.env.GITHUB_SECRET || 'APP_SECRET', - callbackURL: '/auth/github/callback' - }, - mailer: { - from: process.env.MAILER_FROM || 'testing@'+process.env.SPARKPOST_SANDBOX_DOMAIN || 'no-reply@tellform.com', - options: process.env.MAILER_SMTP_HOST ? { //Uses custom SMTP if MAILER_SMTP_HOST is set - host: process.env.MAILER_SMTP_HOST || '', - port: process.env.MAILER_SMTP_PORT || 465, - secure: process.env.MAILER_SMTP_SECURE || true, - auth: { - user: process.env.MAILER_EMAIL_ID || '', - pass: process.env.MAILER_PASSWORD || '' - } - } : { - service: process.env.MAILER_SERVICE_PROVIDER || '', - auth: { - user: process.env.MAILER_EMAIL_ID || '', - pass: process.env.MAILER_PASSWORD || '' - } - } } }; diff --git a/config/env/secure.js b/config/env/secure.js index 4c6a584f..db1c2bdb 100755 --- a/config/env/secure.js +++ b/config/env/secure.js @@ -4,7 +4,7 @@ module.exports = { baseUrl: 'https://forms.polydaic.com', port: 8443, db: { - uri: process.env.MONGOHQ_URL || process.env.MONGOLAB_URI || 'mongodb://localhost/mean', + uri: process.env.MONGOHQ_URL || process.env.MONGOLAB_URI || process.env.MONGODB_URI || 'mongodb://127.0.0.1/mean', options: { user: '', pass: '' @@ -33,37 +33,12 @@ module.exports = { maxAge: 7200, // To set the cookie in a specific domain uncomment the following // setting: - domain: 'forms.polydaic.com' + domain: process.env.BASE_URL || 'localhost:3000' }, assets: { css: 'public/dist/application.min.css', js: 'public/dist/application.min.js' }, - facebook: { - clientID: process.env.FACEBOOK_ID || 'APP_ID', - clientSecret: process.env.FACEBOOK_SECRET || 'APP_SECRET', - callbackURL: 'https://localhost:443/auth/facebook/callback' - }, - twitter: { - clientID: process.env.TWITTER_KEY || 'CONSUMER_KEY', - clientSecret: process.env.TWITTER_SECRET || 'CONSUMER_SECRET', - callbackURL: 'https://localhost:443/auth/twitter/callback' - }, - google: { - clientID: process.env.GOOGLE_ID || 'APP_ID', - clientSecret: process.env.GOOGLE_SECRET || 'APP_SECRET', - callbackURL: 'https://localhost:443/auth/google/callback' - }, - linkedin: { - clientID: process.env.LINKEDIN_ID || 'APP_ID', - clientSecret: process.env.LINKEDIN_SECRET || 'APP_SECRET', - callbackURL: 'https://localhost:443/auth/linkedin/callback' - }, - github: { - clientID: process.env.GITHUB_ID || 'APP_ID', - clientSecret: process.env.GITHUB_SECRET || 'APP_SECRET', - callbackURL: 'https://localhost:443/auth/github/callback' - }, mailer: { from: process.env.MAILER_FROM || '', options: process.env.MAILER_SMTP_HOST ? { //Uses custom SMTP if MAILER_SMTP_HOST is set diff --git a/config/env/test.js b/config/env/test.js index 29e4e821..c6731236 100755 --- a/config/env/test.js +++ b/config/env/test.js @@ -25,31 +25,6 @@ module.exports = { sessionCookie: { maxAge: 24 * 60 * 60 * 1000 // 24 hours }, - facebook: { - clientID: process.env.FACEBOOK_ID || 'APP_ID', - clientSecret: process.env.FACEBOOK_SECRET || 'APP_SECRET', - callbackURL: '/auth/facebook/callback' - }, - twitter: { - clientID: process.env.TWITTER_KEY || 'CONSUMER_KEY', - clientSecret: process.env.TWITTER_SECRET || 'CONSUMER_SECRET', - callbackURL: '/auth/twitter/callback' - }, - google: { - clientID: process.env.GOOGLE_ID || 'APP_ID', - clientSecret: process.env.GOOGLE_SECRET || 'APP_SECRET', - callbackURL: '/auth/google/callback' - }, - linkedin: { - clientID: process.env.LINKEDIN_ID || 'APP_ID', - clientSecret: process.env.LINKEDIN_SECRET || 'APP_SECRET', - callbackURL: '/auth/linkedin/callback' - }, - github: { - clientID: process.env.GITHUB_ID || 'APP_ID', - clientSecret: process.env.GITHUB_SECRET || 'APP_SECRET', - callbackURL: '/auth/github/callback' - }, mailer: { from: process.env.MAILER_FROM || 'MAILER_FROM', options: process.env.MAILER_SMTP_HOST ? { //Uses custom SMTP if MAILER_SMTP_HOST is set diff --git a/config/express.js b/config/express.js index 1569a012..a3e84670 100755 --- a/config/express.js +++ b/config/express.js @@ -3,7 +3,7 @@ /** * Module dependencies. */ -var fs = require('fs-extra'), +var fs = require('fs'), https = require('https'), express = require('express'), morgan = require('morgan'), @@ -17,22 +17,13 @@ var fs = require('fs-extra'), passport = require('passport'), raven = require('raven'), MongoStore = require('connect-mongo')(session), - flash = require('connect-flash'), config = require('./config'), consolidate = require('consolidate'), path = require('path'), - device = require('express-device'), client = new raven.Client(config.DSN); var mongoose = require('mongoose'); -var cacheOpts = { - max:100000, - maxAge:1000*60 -}; - -require('mongoose-cache').install(mongoose, cacheOpts); - /** * Configure Socket.io */ @@ -63,7 +54,7 @@ module.exports = function(db) { app.locals.subdomainsDisabled = config.subdomainsDisabled; - if(config.socketPort && process.env.NODE_ENV !== 'production'){ + if(config.socketPortExternallyVisible){ app.locals.socketPort = config.socketPort; } else { app.locals.socketPort = ''; @@ -246,12 +237,6 @@ module.exports = function(db) { app.use(passport.initialize()); app.use(passport.session()); - // setup express-device - app.use(device.capture({ parseUserAgent: true })); - - // connect flash for flash messages - app.use(flash()); - // Globbing routing files config.getGlobbedFiles('./app/routes/**/*.js').forEach(function(routePath) { require(path.resolve(routePath))(app); @@ -295,16 +280,16 @@ module.exports = function(db) { // Log it client.captureError(err); - /*if(process.env.NODE_ENV === 'production'){ + if(process.env.NODE_ENV === 'production'){ res.status(500).render('500', { - error: 'Internal Server Error' - }); - } else {*/ + error: 'Internal Server Error' + }); + } else { // Error page res.status(500).render('500', { error: err.stack }); - //} + } }); // Assume 404 since no middleware responded diff --git a/config/socket.io.js b/config/socket.io.js index 443e1c2e..9500d538 100644 --- a/config/socket.io.js +++ b/config/socket.io.js @@ -13,7 +13,12 @@ module.exports = function (app, db) { if(config.enableClusterMode){ var redis = require('socket.io-redis'); - io.adapter(redis( process.env.REDIS_URL || { host: process.env.REDIS_DB_PORT_6379_TCP_ADDR || '127.0.0.1' , port: process.env.REDIS_DB_PORT_6379_TCP_PORT || 6379 })); + if( process.env.REDIS_DB_PORT_6379_TCP_ADDR ){ + io.adapter(redis({ host: process.env.REDIS_DB_PORT_6379_TCP_ADDR || '127.0.0.1' , port: process.env.REDIS_DB_PORT_6379_TCP_PORT || 6379 })); + + } else { + io.adapter(redis( config.redisUrl )); + } } // Add an event listener to the 'connection' event io.on('connection', function (socket) { @@ -23,4 +28,4 @@ module.exports = function (app, db) { }); return server; -}; \ No newline at end of file +}; diff --git a/config/strategies/facebook.js b/config/strategies/facebook.js deleted file mode 100755 index 34ddc68f..00000000 --- a/config/strategies/facebook.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -/** - * Module dependencies. - */ -var passport = require('passport'), - FacebookStrategy = require('passport-facebook').Strategy, - config = require('../config'), - users = require('../../app/controllers/users.server.controller'); - -module.exports = function() { - // Use facebook strategy - passport.use(new FacebookStrategy({ - clientID: config.facebook.clientID, - clientSecret: config.facebook.clientSecret, - callbackURL: config.facebook.callbackURL, - passReqToCallback: true - }, - function(req, accessToken, refreshToken, profile, done) { - // Set the provider data and include tokens - var providerData = profile._json; - providerData.accessToken = accessToken; - providerData.refreshToken = refreshToken; - - // Create the user OAuth profile - var providerUserProfile = { - firstName: profile.name.givenName, - lastName: profile.name.familyName, - displayName: profile.displayName, - email: profile.emails[0].value, - username: profile.username, - provider: 'facebook', - providerIdentifierField: 'id', - providerData: providerData - }; - - // Save the user OAuth profile - users.saveOAuthUserProfile(req, providerUserProfile, done); - } - )); -}; diff --git a/config/strategies/github.js b/config/strategies/github.js deleted file mode 100755 index f10a413e..00000000 --- a/config/strategies/github.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -/** - * Module dependencies. - */ -var passport = require('passport'), - GithubStrategy = require('passport-github').Strategy, - config = require('../config'), - users = require('../../app/controllers/users.server.controller'); - -module.exports = function() { - // Use github strategy - passport.use(new GithubStrategy({ - clientID: config.github.clientID, - clientSecret: config.github.clientSecret, - callbackURL: config.github.callbackURL, - passReqToCallback: true - }, - function(req, accessToken, refreshToken, profile, done) { - // Set the provider data and include tokens - var providerData = profile._json; - providerData.accessToken = accessToken; - providerData.refreshToken = refreshToken; - - // Create the user OAuth profile - var displayName = profile.displayName.trim(); - var iSpace = displayName.indexOf(' '); // index of the whitespace following the firstName - var firstName = iSpace !== -1 ? displayName.substring(0, iSpace) : displayName; - var lastName = iSpace !== -1 ? displayName.substring(iSpace + 1) : ''; - - var providerUserProfile = { - firstName: firstName, - lastName: lastName, - displayName: displayName, - email: profile.emails[0].value, - username: profile.username, - provider: 'github', - providerIdentifierField: 'id', - providerData: providerData - }; - - // Save the user OAuth profile - users.saveOAuthUserProfile(req, providerUserProfile, done); - } - )); -}; diff --git a/config/strategies/google.js b/config/strategies/google.js deleted file mode 100755 index 8044ed4e..00000000 --- a/config/strategies/google.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -/** - * Module dependencies. - */ -var passport = require('passport'), - GoogleStrategy = require('passport-google-oauth').OAuth2Strategy, - config = require('../config'), - users = require('../../app/controllers/users.server.controller'); - -module.exports = function() { - // Use google strategy - passport.use(new GoogleStrategy({ - clientID: config.google.clientID, - clientSecret: config.google.clientSecret, - callbackURL: config.google.callbackURL, - passReqToCallback: true - }, - function(req, accessToken, refreshToken, profile, done) { - // Set the provider data and include tokens - var providerData = profile._json; - providerData.accessToken = accessToken; - providerData.refreshToken = refreshToken; - - // Create the user OAuth profile - var providerUserProfile = { - firstName: profile.name.givenName, - lastName: profile.name.familyName, - displayName: profile.displayName, - email: profile.emails[0].value, - username: profile.username, - provider: 'google', - providerIdentifierField: 'id', - providerData: providerData - }; - - // Save the user OAuth profile - users.saveOAuthUserProfile(req, providerUserProfile, done); - } - )); -}; diff --git a/config/strategies/linkedin.js b/config/strategies/linkedin.js deleted file mode 100755 index 1ee5b3f5..00000000 --- a/config/strategies/linkedin.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -/** - * Module dependencies. - */ -var passport = require('passport'), - LinkedInStrategy = require('passport-linkedin').Strategy, - config = require('../config'), - users = require('../../app/controllers/users.server.controller'); - -module.exports = function() { - // Use linkedin strategy - passport.use(new LinkedInStrategy({ - consumerKey: config.linkedin.clientID, - consumerSecret: config.linkedin.clientSecret, - callbackURL: config.linkedin.callbackURL, - passReqToCallback: true, - profileFields: ['id', 'first-name', 'last-name', 'email-address'] - }, - function(req, accessToken, refreshToken, profile, done) { - // Set the provider data and include tokens - var providerData = profile._json; - providerData.accessToken = accessToken; - providerData.refreshToken = refreshToken; - - // Create the user OAuth profile - var providerUserProfile = { - firstName: profile.name.givenName, - lastName: profile.name.familyName, - displayName: profile.displayName, - email: profile.emails[0].value, - username: profile.username, - provider: 'linkedin', - providerIdentifierField: 'id', - providerData: providerData - }; - - // Save the user OAuth profile - users.saveOAuthUserProfile(req, providerUserProfile, done); - } - )); -}; diff --git a/config/strategies/twitter.js b/config/strategies/twitter.js deleted file mode 100755 index 5dcc93f4..00000000 --- a/config/strategies/twitter.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -/** - * Module dependencies. - */ -var passport = require('passport'), - TwitterStrategy = require('passport-twitter').Strategy, - config = require('../config'), - users = require('../../app/controllers/users.server.controller'); - -module.exports = function() { - // Use twitter strategy - passport.use(new TwitterStrategy({ - consumerKey: config.twitter.clientID, - consumerSecret: config.twitter.clientSecret, - callbackURL: config.twitter.callbackURL, - passReqToCallback: true - }, - function(req, token, tokenSecret, profile, done) { - // Set the provider data and include tokens - var providerData = profile._json; - providerData.token = token; - providerData.tokenSecret = tokenSecret; - - // Create the user OAuth profile - var displayName = profile.displayName.trim(); - var iSpace = displayName.indexOf(' '); // index of the whitespace following the firstName - var firstName = iSpace !== -1 ? displayName.substring(0, iSpace) : displayName; - var lastName = iSpace !== -1 ? displayName.substring(iSpace + 1) : ''; - - var providerUserProfile = { - firstName: firstName, - lastName: lastName, - displayName: displayName, - username: profile.username, - provider: 'twitter', - providerIdentifierField: 'id_str', - providerData: providerData - }; - - // Save the user OAuth profile - users.saveOAuthUserProfile(req, providerUserProfile, done); - } - )); -}; diff --git a/design/screenshots/color-pallette.jpg b/design/screenshots/color-pallette.jpg deleted file mode 100644 index 828c45a0..00000000 Binary files a/design/screenshots/color-pallette.jpg and /dev/null differ diff --git a/design/tellform_mascot.png b/design/tellform_mascot.png new file mode 100644 index 00000000..030bcd57 Binary files /dev/null and b/design/tellform_mascot.png differ diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 7e016e4d..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,22 +0,0 @@ -version: "3" -services: - tellform: - build: - context: ./ - dockerfile: dockerfile - image: tellform - ports: - - 3000:3000 - links: - - tellform-redis:redis-db - - tellform-mongo:db - env_file: - - .env - tellform-redis: - image: redis - ports: - - 6379 - tellform-mongo: - image: mongo - ports: - - 27017 diff --git a/docs/example_formfields.json b/docs/example_formfields.json deleted file mode 100644 index 2cb6b475..00000000 --- a/docs/example_formfields.json +++ /dev/null @@ -1,96 +0,0 @@ - [ - [{ - "fieldType": "textfield", - "fieldValue": "snthsnth", - "_id": "55aec5d284bae1a1996210bd", - "disabled": false, - "fieldOptions": [], - "description": "", - "title": "Short Text2", - "lastModified": "2015-07-21T22:21:06.653Z", - "created": "2015-07-21T22:21:06.653Z", - "$$hashKey": "02J" - }, { - "fieldType": "textfield", - "fieldValue": "duieedi", - "_id": "55aec5b084bae1a1996210b4", - "disabled": false, - "fieldOptions": [], - "description": "", - "title": "Last Name", - "lastModified": "2015-07-21T22:20:32.053Z", - "created": "2015-07-21T22:20:32.053Z", - "$$hashKey": "02K" - }], - - [{ - "fieldType": "textfield", - "fieldValue": "snthsnth", - "_id": "55aec5d284bae1a1996210bd", - "disabled": false, - "fieldOptions": [], - "description": "", - "title": "Short Text2", - "lastModified": "2015-07-21T22:21:06.653Z", - "created": "2015-07-21T22:21:06.653Z", - "$$hashKey": "02J" - }, { - "fieldType": "textfield", - "fieldValue": "duieedi", - "_id": "55aec5b084bae1a1996210b4", - "disabled": false, - "fieldOptions": [], - "description": "", - "title": "Last Name", - "lastModified": "2015-07-21T22:20:32.053Z", - "created": "2015-07-21T22:20:32.053Z", - "$$hashKey": "02K" - }], - [{ - "fieldType": "textfield", - "fieldValue": "snthsnth", - "_id": "55aec5d284bae1a1996210bd", - "disabled": false, - "fieldOptions": [], - "description": "", - "title": "Short Text2", - "lastModified": "2015-07-21T22:21:06.653Z", - "created": "2015-07-21T22:21:06.653Z", - "$$hashKey": "02J" - }, { - "fieldType": "textfield", - "fieldValue": "duieedi", - "_id": "55aec5b084bae1a1996210b4", - "disabled": false, - "fieldOptions": [], - "description": "", - "title": "Last Name", - "lastModified": "2015-07-21T22:20:32.053Z", - "created": "2015-07-21T22:20:32.053Z", - "$$hashKey": "02K" - }], - [{ - "fieldType": "textfield", - "fieldValue": "snthsnth", - "_id": "55aec5d284bae1a1996210bd", - "disabled": false, - "fieldOptions": [], - "description": "", - "title": "Short Text2", - "lastModified": "2015-07-21T22:21:06.653Z", - "created": "2015-07-21T22:21:06.653Z", - "$$hashKey": "02J" - }, { - "fieldType": "textfield", - "fieldValue": "duieedi", - "_id": "55aec5b084bae1a1996210b4", - "disabled": false, - "fieldOptions": [], - "description": "", - "title": "Last Name", - "lastModified": "2015-07-21T22:20:32.053Z", - "created": "2015-07-21T22:20:32.053Z", - "$$hashKey": "02K" - }] - - ] \ No newline at end of file diff --git a/docs/example_submission_data.json b/docs/example_submission_data.json deleted file mode 100644 index 9e2f9a0c..00000000 --- a/docs/example_submission_data.json +++ /dev/null @@ -1,758 +0,0 @@ -[ - { - "_id": "56450d120761e9d7d68d3543", - "lastModified": "2015-11-12T22:05:06.380Z", - "fdfData": null, - "admin": "55d270df2749c1ceb47c0f8b", - "form": "5644dde5507b2572635dcd50", - "title": "Sample Form", - "timeElapsed": 11.925, - "percentageComplete": 75, - "__v": 0, - "created": "2015-11-12T22:05:06.378Z", - "form_fields": [ - { - "_id": "5644e0d5507b2572635dcd56", - "fieldValue": "", - "fieldType": "statement", - "title": "Statement2", - "lastModified": "2015-11-12T18:56:21.730Z", - "created": "2015-11-12T18:56:21.660Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": true, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.769Z", - "title": "Short Text2", - "fieldType": "textfield", - "fieldValue": "first", - "_id": "5644dde7507b2572635dcd51", - "created": "2015-11-12T18:43:51.290Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.770Z", - "title": "Short Text3", - "fieldType": "textfield", - "fieldValue": "first", - "_id": "5644dde7507b2572635dcd52", - "created": "2015-11-12T18:43:51.977Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.771Z", - "title": "Paragraph Text2", - "fieldType": "textarea", - "fieldValue": "first", - "_id": "5644ddea507b2572635dcd54", - "created": "2015-11-12T18:43:54.594Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.771Z", - "title": "Rating2", - "fieldType": "rating", - "fieldValue": 1, - "_id": "5644e0d4507b2572635dcd55", - "created": "2015-11-12T18:56:20.324Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - } - ] - }, - { - "_id": "56450d1d0761e9d7d68d3544", - "lastModified": "2015-11-12T22:05:17.806Z", - "fdfData": null, - "admin": "55d270df2749c1ceb47c0f8b", - "form": "5644dde5507b2572635dcd50", - "title": "Sample Form", - "timeElapsed": 10.301, - "percentageComplete": 75, - "__v": 0, - "created": "2015-11-12T22:05:17.805Z", - "form_fields": [ - { - "_id": "5644e0d5507b2572635dcd56", - "fieldValue": "", - "fieldType": "statement", - "title": "Statement2", - "lastModified": "2015-11-12T18:56:21.730Z", - "created": "2015-11-12T18:56:21.660Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": true, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.769Z", - "title": "Short Text2", - "fieldType": "textfield", - "fieldValue": "second", - "_id": "5644dde7507b2572635dcd51", - "created": "2015-11-12T18:43:51.290Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.770Z", - "title": "Short Text3", - "fieldType": "textfield", - "fieldValue": "second", - "_id": "5644dde7507b2572635dcd52", - "created": "2015-11-12T18:43:51.977Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.771Z", - "title": "Paragraph Text2", - "fieldType": "textarea", - "fieldValue": "second", - "_id": "5644ddea507b2572635dcd54", - "created": "2015-11-12T18:43:54.594Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.771Z", - "title": "Rating2", - "fieldType": "rating", - "fieldValue": 3, - "_id": "5644e0d4507b2572635dcd55", - "created": "2015-11-12T18:56:20.324Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - } - ] - }, - { - "_id": "56450d260761e9d7d68d3545", - "lastModified": "2015-11-12T22:05:26.874Z", - "fdfData": null, - "admin": "55d270df2749c1ceb47c0f8b", - "form": "5644dde5507b2572635dcd50", - "title": "Sample Form", - "timeElapsed": 7.975, - "percentageComplete": 75, - "__v": 0, - "created": "2015-11-12T22:05:26.874Z", - "form_fields": [ - { - "_id": "5644e0d5507b2572635dcd56", - "fieldValue": "", - "fieldType": "statement", - "title": "Statement2", - "lastModified": "2015-11-12T18:56:21.730Z", - "created": "2015-11-12T18:56:21.660Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": true, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.769Z", - "title": "Short Text2", - "fieldType": "textfield", - "fieldValue": "third", - "_id": "5644dde7507b2572635dcd51", - "created": "2015-11-12T18:43:51.290Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.770Z", - "title": "Short Text3", - "fieldType": "textfield", - "fieldValue": "third", - "_id": "5644dde7507b2572635dcd52", - "created": "2015-11-12T18:43:51.977Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.771Z", - "title": "Paragraph Text2", - "fieldType": "textarea", - "fieldValue": "third", - "_id": "5644ddea507b2572635dcd54", - "created": "2015-11-12T18:43:54.594Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.771Z", - "title": "Rating2", - "fieldType": "rating", - "fieldValue": 2, - "_id": "5644e0d4507b2572635dcd55", - "created": "2015-11-12T18:56:20.324Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - } - ] - }, - { - "_id": "56450d320761e9d7d68d3546", - "lastModified": "2015-11-12T22:05:38.717Z", - "fdfData": null, - "admin": "55d270df2749c1ceb47c0f8b", - "form": "5644dde5507b2572635dcd50", - "title": "Sample Form", - "timeElapsed": 10.47, - "percentageComplete": 75, - "__v": 0, - "created": "2015-11-12T22:05:38.716Z", - "form_fields": [ - { - "_id": "5644e0d5507b2572635dcd56", - "fieldValue": "", - "fieldType": "statement", - "title": "Statement2", - "lastModified": "2015-11-12T18:56:21.730Z", - "created": "2015-11-12T18:56:21.660Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": true, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.769Z", - "title": "Short Text2", - "fieldType": "textfield", - "fieldValue": "fourth", - "_id": "5644dde7507b2572635dcd51", - "created": "2015-11-12T18:43:51.290Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.770Z", - "title": "Short Text3", - "fieldType": "textfield", - "fieldValue": "fourth", - "_id": "5644dde7507b2572635dcd52", - "created": "2015-11-12T18:43:51.977Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.771Z", - "title": "Paragraph Text2", - "fieldType": "textarea", - "fieldValue": "fourth", - "_id": "5644ddea507b2572635dcd54", - "created": "2015-11-12T18:43:54.594Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - }, - { - "lastModified": "2015-11-12T21:30:20.771Z", - "title": "Rating2", - "fieldType": "rating", - "fieldValue": 2, - "_id": "5644e0d4507b2572635dcd55", - "created": "2015-11-12T18:56:20.324Z", - "validFieldTypes": [ - "textfield", - "date", - "email", - "link", - "legal", - "url", - "textarea", - "statement", - "welcome", - "thankyou", - "file", - "dropdown", - "scale", - "rating", - "radio", - "checkbox", - "hidden", - "yes_no", - "natural", - "number" - ], - "deletePreserved": false, - "disabled": false, - "required": true, - "fieldOptions": [], - "description": "" - } - ] - } -] \ No newline at end of file diff --git a/docs/form_update_process.md b/docs/form_update_process.md deleted file mode 100644 index 37132b36..00000000 --- a/docs/form_update_process.md +++ /dev/null @@ -1,22 +0,0 @@ -##First Form Auto-Update - -1. Added field CLIENT -time: 2553 - -2. Finding form SERVER -time: 2841 - -3. Update form CLIENT -time: 2870 - -4.Updated form SERVER -time: 2863 - - -##Second Form Auto-Update - -1. Added field CLIENT -time: 2755 - -2. Finding form SERVER -time: 2898 \ No newline at end of file diff --git a/docs/readme_logos/do_logo.png b/docs/readme_logos/do_logo.png deleted file mode 100755 index ee98b493..00000000 Binary files a/docs/readme_logos/do_logo.png and /dev/null differ diff --git a/docs/readme_logos/roost_logo.png b/docs/readme_logos/roost_logo.png deleted file mode 100644 index ee4a5ac3..00000000 Binary files a/docs/readme_logos/roost_logo.png and /dev/null differ diff --git a/docs/readme_logos/sentry_logo.png b/docs/readme_logos/sentry_logo.png deleted file mode 100644 index 89ef4f1d..00000000 Binary files a/docs/readme_logos/sentry_logo.png and /dev/null differ diff --git a/docs/readme_logos/sparkpost_logo.png b/docs/readme_logos/sparkpost_logo.png deleted file mode 100644 index d1732c0e..00000000 Binary files a/docs/readme_logos/sparkpost_logo.png and /dev/null differ diff --git a/docs/readme_logos/statuspage_logo.png b/docs/readme_logos/statuspage_logo.png deleted file mode 100644 index 5da28109..00000000 Binary files a/docs/readme_logos/statuspage_logo.png and /dev/null differ diff --git a/docs/readme_logos/stickermule_logo.png b/docs/readme_logos/stickermule_logo.png deleted file mode 100644 index c5f61e8c..00000000 Binary files a/docs/readme_logos/stickermule_logo.png and /dev/null differ diff --git a/docs/setup_sentry_server.md b/docs/setup_sentry_server.md deleted file mode 100644 index 5b30903d..00000000 --- a/docs/setup_sentry_server.md +++ /dev/null @@ -1,249 +0,0 @@ -#Installing Sentry Server - -### Before You Begin -Make sure you understand what sentry server does. You can view documentation for sentry server [here](https://sentry.readthedocs.org/). This document was written for a server running *Ubuntu 14.04 LTS server* (we used Azure). - - -### Prerequisites -Make sure you have these installed: -* apt-get -* python2.7 -* vim - - - -### Installation Steps -1. Add non-root user. - ``` - sudo adduser sentry - sudo adduser sentry sudo - ``` - -2. Update all apt-get packages - ``` - sudo apt-get update - sudo apt-get dist-upgrade - sudo apt-get autoremove - sudo apt-get install libxml2-dev libxslt1-dev libffi-dev libpq-dev python-dev - sudo reboot - ``` - -3. Install easy_install and pip - ``` - wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python - sudo easy_install pip - ``` - -4. Install virtualenv and lmxl - ``` - sudo pip install virtualenv - sudo pip install lxml - ``` - -5. Install Sentry and Setup - ``` - # make server directory - mkdir ~/SentryServer; cd ~/SentryServer; - # make virtualenv - virtualenv ./ - #activate virtualenv - source ./bin/activate - - # install sentry and its postgresql dependencies - pip install -U sentry[postgres] - ``` - -6. Install postgresql - ``` - # install postgres - sudo apt-get install postgresql postgresql-contrib libpq-dev - - # install postgres adminpack - sudo -u postgres psql - CREATE EXTENSION "adminpack"; - \q - ``` - -7. Setup postgresql DB - ``` - # change postgres password & create database - sudo passwd postgres - sudo su - postgres - psql -d template1 -c "ALTER USER postgres WITH PASSWORD 'changeme';" - createdb sentry - createuser sentry_user --pwprompt - psql -d template1 -U postgres - GRANT ALL PRIVILEGES ON DATABASE sentry to sentry_user; - \q - exit - ``` - -8. Setup Sentry Configuration - ``` - # initialize conf file - sentry init - - #edit sentry configuration - vim ~/.sentry/sentry.conf.py - ``` - - The following are the contents of my sentry.conf.py file (replace name, user and password with your that of your DB) - - ``` - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': 'sentry', - 'USER': 'sentry_user', - 'PASSWORD': 'your_password', - 'HOST': 'localhost', - } - } - # No trailing slash! - SENTRY_URL_PREFIX = 'http://sentry.example.com' - - SENTRY_WEB_HOST = '0.0.0.0' - SENTRY_WEB_PORT = 9000 - SENTRY_WEB_OPTIONS = { - 'workers': 3, # the number of gunicorn workers - 'secure_scheme_headers': {'X-FORWARDED-PROTO': 'https'}, # detect HTTPS mode from X-Forwarded-Proto header - } - - #CONFIGURE REDIS - SENTRY_REDIS_OPTIONS = { - 'hosts': { - 0: { - 'host': '127.0.0.1', - 'port': 6379, - 'timeout': 3, - #'password': 'redis auth password' - } - } - } - - #CONFIGURE OUTGOING MAIL - EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' - EMAIL_USE_TLS = True - EMAIL_HOST = 'smtp.gmail.com' - EMAIL_PORT = 587 - EMAIL_HOST_USER = 'your_gmail_username@gmail.com' - EMAIL_HOST_PASSWORD = 'your_gmail_password' - DEFAULT_FROM_EMAIL = 'testing@testing.com - ``` - -9. Setup Database and Start Sentry - ``` - #install and run redis-server - wget http://download.redis.io/releases/redis-stable.tar.gz - tar xzf redis-stable.tar.gz - cd redis-stable - make - make test - sudo make install - cd utils - sudo ./install_server.sh - - #Go back to app directory - cd ~/SentryServer - sudo service redis_6379 start - - # set up databse - sentry upgrade - - # let's try it out! - sentry start - ``` - -10. Install nginx - - ``` - # install nginx - sudo apt-get install nginx - - # remove the default symbolic link - sudo rm /etc/nginx/sites-enabled/default - - # create a new blank config, and make a symlink to it - sudo touch /etc/nginx/sites-available/sentry - cd /etc/nginx/sites-enabled - sudo ln -s ../sites-available/sentry - - # edit the nginx configuration file - sudo vim /etc/nginx/sites-available/sentry - ``` - *Here are the contents of my nginx file:* - ``` - server { - # listen on port 80 - listen 80; - - # for requests to these domains - server_name yourdomain.com www.yourdomain.com; - - # keep logs in these files - access_log /var/log/nginx/sentry.access.log; - error_log /var/log/nginx/sentry.error.log; - - # You need this to allow users to upload large files - # See http://wiki.nginx.org/HttpCoreModule#client_max_body_size - # I'm not sure where it goes, so I put it in twice. It works. - client_max_body_size 0; - - location / { - proxy_pass http://localhost:9000; - proxy_redirect off; - - proxy_read_timeout 5m; - - # make sure these HTTP headers are set properly - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - } - ``` - -11. Start the worker processes - ``` - # restart nginx - sudo nginx -t - sudo service nginx reload - - #start sentry - sentry celery worker -B - ``` - -12. Install and Configure supervisord - ``` - pip install supervisord - sudo echo_supervisord_conf > ~/SentryServer/etc/supervisord.conf - - #Edit yuour supervisord Config - vim /etc/supervisord.conf - ``` - - Configuration file should look like this - ``` - [program:sentry-web] - directory=~/SentryServer/ - command=~/SentryServer/bin/sentry start - autostart=true - autorestart=true - redirect_stderr=true - stdout_logfile=syslog - stderr_logfile=syslog - - [program:sentry-worker] - directory=~/SentryServer/ - command=~/SentryServer/bin/sentry celery worker -B - autostart=true - autorestart=true - redirect_stderr=true - stdout_logfile=syslog - stderr_logfile=syslog - ``` - -13. Run Server (with supervisord) - ``` - supervisord - ``` diff --git a/docs/ux_flows.md b/docs/ux_flows.md deleted file mode 100644 index 847b2853..00000000 --- a/docs/ux_flows.md +++ /dev/null @@ -1,29 +0,0 @@ -UX of Updating Forms -==================== - -##Form Updating - - Action: Update Configuration - 1. User clicks on Form from FormList page (visits form admin page) - 2. User clicks on "Configure Form" Tab - 3. User changes inputs in form page - 4. Save Button is Pressed - 5. Loading/Busy Indicator fills the screen - 6. Loading/Busy Indicator exits the screen - 7. Configuration page is shown with updated settings - - - Action: Add Form Field - 1. User clicks on Form from FormList page - 2. User clicks on a Tab in "AddField" column - 3. Loading/Busy Indicator fills the screen - 4. Loading/Busy Indicator exits the screen - - - Action: Edit Form Field Title - 1. User clicks on Form from FormList page (visits form admin page) - 2. User clicks on a current Form Input accordion (must be either the name or the caret) - 3. The clicked accordion (the one interacted with in Step#2) expands - 4. User clicks on 'Question Title' text input (aka focuses on said text input) - 5. User starts typing in text input - 6. User defocuses/clicks off of text input - 7. Loading/Busy Indicator fills the screen - 8. Loading/Busy Indicator exits the screen - 9. Field Accordion heading is updated diff --git a/gruntfile.js b/gruntfile.js index 7fb0d3bc..efa55746 100755 --- a/gruntfile.js +++ b/gruntfile.js @@ -28,10 +28,10 @@ module.exports = function(grunt) { clientViews: ['public/modules/**/*.html', 'public/form_modules/forms/base/**/*.html', '!public/modules/forms/base/**/*.html',], clientJS: ['public/js/*.js', 'public/form_modules/**/*.js', 'public/modules/**/*.js'], - clientCSS: ['public/modules/**/*.css', 'public/form_modules/**/*.css', '!public/modules/**/demo/**/*.css', '!public/modules/**/dist/**/*.css'], + clientCSS: ['public/modules/**/*.css'], serverTests: ['app/tests/**/*.js'], - clientTests: ['public/modules/**/tests/*.js', '!public/modules/**/demo/**/*.js', '!public/modules/**/dist/**/*.js', '!public/modules/**/node_modules/**/*.js'] + clientTests: ['public/modules/**/tests/*.js'] }; watchFiles.allTests = watchFiles.serverTests.concat(watchFiles.clientTests); @@ -127,19 +127,6 @@ module.exports = function(grunt) { } } }, - 'closure-compiler': { - vendor_file: { - closurePath: './scripts', - js: 'public/dist/vendor_forms_uglified.js', - jsOutputFile: 'public/dist/vendor.min.js', - maxBuffer: 10000000000, - options: { - warning_level: 'QUIET', - compilation_level: 'SIMPLE_OPTIMIZATIONS', - language_in: 'ECMASCRIPT5' - } - } - }, cssmin: { combine: { files: { @@ -157,19 +144,6 @@ module.exports = function(grunt) { } } }, - 'node-inspector': { - custom: { - options: { - 'web-port': 1337, - 'web-host': 'localhost', - 'debug-port': 5858, - 'save-live-edit': true, - 'no-preload': true, - 'stack-trace-limit': 50, - 'hidden': [] - } - } - }, ngAnnotate: { production: { files: { @@ -180,28 +154,26 @@ module.exports = function(grunt) { }, concurrent: { default: ['nodemon', 'watch'], - debug: ['nodemon', 'watch', 'node-inspector'], + debug: ['nodemon', 'watch'], options: { logConcurrentOutput: true, limit: 10 } }, env: { + src: '.env', + test: { NODE_ENV: 'test', - src: '.env' }, secure: { NODE_ENV: 'secure', - src: '/opt/deploy/.env' }, production: { NODE_ENV: 'production', - src: '/opt/deploy/.env' }, dev: { NODE_ENV: 'development', - src: '.env' } }, mochaTest: { @@ -211,7 +183,7 @@ module.exports = function(grunt) { quiet: false, require: 'server.js', ui: 'bdd', - debug: true + debug: false } }, karma: { diff --git a/package.json b/package.json index 0dda7145..ff9c9acf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "TellForm", "description": "Opensource alternative to TypeForm", - "version": "2.0.0", + "version": "2.1.0", "homepage": "https://github.com/whitef0x0/tellform", "authors": [ "David Baldwynn <polydaic@gmail.com> (http://baldwynn.me)" @@ -13,8 +13,8 @@ "url": "https://github.com/whitef0x0/tellform.git" }, "engines": { - "node": "6.11.2", - "npm": "3.10.10" + "node": "6.x.x", + "npm": "3.x.x" }, "scripts": { "addcontrib": "all-contributors add", @@ -22,82 +22,55 @@ "start": "npm run version && grunt", "test": "npm run version && grunt test", "postinstall": "bower install --config.interactive=false; grunt build;", - "init": "node scripts/setup.js", - "version": "check-node-version --package" + "init": "node scripts/setup.js" }, "dependencies": { "async": "^1.4.2", - "async-boolean-expression-evaluator": "^1.1.1", "bcrypt": "^0.8.7", - "bcrypt-nodejs": "0.0.3", "body-parser": "~1.14.1", "bower": "~1.6.5", "chalk": "^1.1.3", - "check-node-version": "^2.1.0", "compression": "~1.6.0", "connect": "^3.4.1", - "connect-flash": "~0.1.1", "connect-mongo": "~0.8.2", "consolidate": "~0.13.1", "cookie-parser": "~1.4.0", "deep-diff": "^0.3.4", "dotenv": "^2.0.0", "email-verification": "~0.4.1", - "envfile": "^2.0.1", "express": "~4.13.3", - "express-device": "~0.4.2", "express-session": "~1.12.1", - "forever": "~0.15.1", - "fs-extra": "~0.26.2", "glob": "^7.0.3", - "google-cdn": "^1.1.0", "grunt": "~0.4.1", - "grunt-cli": "~0.1.13", "grunt-concurrent": "~2.3.0", "grunt-contrib-csslint": "~1.0.0", "grunt-contrib-cssmin": "~1.0.1", "grunt-contrib-jshint": "~1.0.0", "grunt-contrib-uglify": "~0.11.0", - "grunt-contrib-watch": "~0.6.1", "grunt-env": "~0.4.1", "grunt-html2js": "~0.3.5", - "grunt-karma": "~0.12.1", - "grunt-newer": "~1.1.1", "grunt-ng-annotate": "~1.0.1", - "grunt-node-inspector": "~0.4.1", - "grunt-nodemon": "~0.4.0", "helmet": "3.5.0", - "inquirer": "^1.0.2", "jit-grunt": "^0.9.1", "lodash": "^4.17.4", "main-bower-files": "~2.9.0", "method-override": "~2.3.0", "mkdirp": "^0.5.1", "mongoose": "~4.4.19", - "mongoose-cache": "^0.1.5", - "mongoose-utilities": "~0.1.1", "morgan": "~1.8.1", - "multer": "^1.3.0", "nodemailer": "~4.0.0", - "nodemailer-sendgrid-transport": "^0.2.0", - "nodemailer-sparkpost-transport": "^1.0.0", "passport": "~0.3.0", "passport-anonymous": "^1.0.1", - "passport-facebook": "~2.0.0", - "passport-github": "~1.0.0", - "passport-google-oauth": "~0.2.0", - "passport-linkedin": "~1.0.0", "passport-local": "~1.0.0", "passport-localapikey-update": "^0.5.0", - "passport-twitter": "~1.0.2", "path-exists": "^2.1.0", "prerender-node": "^2.2.1", "random-js": "^1.0.8", "raven": "^0.9.0", + "request": "^2.83.0", "socket.io": "^1.4.6", "socket.io-redis": "^1.0.0", "swig": "~1.4.1", - "uid-generator": "^0.1.1", "uuid-token-generator": "^0.5.0", "wildcard-subdomains": "github:tellform/wildcard-subdomains", "winston": "^2.3.1", @@ -109,7 +82,7 @@ "coveralls": "^2.11.4", "cross-spawn": "^5.0.0", "del": "^2.2.2", - "email-verification": "github:tellform/node-email-verification", + "grunt-cli": "~0.1.13", "grunt-closure-compiler": "0.0.21", "grunt-contrib-concat": "^1.0.1", "grunt-contrib-copy": "^1.0.0", @@ -117,7 +90,11 @@ "grunt-execute": "^0.2.2", "grunt-mocha-istanbul": "^3.0.1", "grunt-mocha-test": "~0.12.1", + "grunt-contrib-watch": "~0.6.1", + "grunt-newer": "~1.1.1", "grunt-usemin": "^3.1.1", + "grunt-karma": "~0.12.1", + "grunt-nodemon": "~0.4.0", "grunt-wiredep": "^3.0.1", "istanbul": "^0.4.0", "jasmine-core": "^2.4.1", @@ -130,11 +107,9 @@ "karma-mocha-reporter": "^1.1.1", "karma-ng-html2js-preprocessor": "^0.2.0", "karma-phantomjs-launcher": "^1.0.4", - "mailosaur": "^1.0.1", "mocha": "^3.1.2", "mocha-lcov-reporter": "^1.0.0", "nightwatch": "^0.9.8", - "node-mandrill": "^1.0.1", "phantomjs": "^1.9.18", "selenium-server": "^3.0.1", "should": "~7.1.1", diff --git a/public/dist/application.js b/public/dist/application.js index 73cb2fe2..57c66bcb 100644 --- a/public/dist/application.js +++ b/public/dist/application.js @@ -84,11 +84,11 @@ angular.module('TellForm.templates', []).run(['$templateCache', function($templa " <button type=\"submit\" ng-click=\"removeCurrentForm()\" class=\"btn btn-block btn-danger\" ng-disabled=\"myform.title != deleteConfirm\">\n" + " {{ 'I_UNDERSTAND' | translate }}\n" + " </button>\n" + - " </div></script><div class=\"page-header row\" style=\"padding-bottom: 1em\"><div class=\"col-xs-10 col-sm-8\"><h1 class=\"hidden-sm hidden-xs\" data-ng-bind=myform.title style=\"margin-bottom: 0px\"></h1><h2 class=\"hidden-md hidden-lg\" data-ng-bind=myform.title style=\"margin-bottom: 0px\"></h2></div><div class=\"col-xs-1 col-sm-2\"><small class=pull-right><button class=\"btn btn-danger\" ng-click=openDeleteModal()><i class=\"fa fa-trash-o\"></i> <span class=\"show-sm hidden-lg hidden-md hidden-xs\">{{ 'DELETE_FORM_SM' | translate}}</span> <span class=\"hidden-xs hidden-sm\">{{ 'DELETE_FORM_MD' | translate}}</span></button></small></div><div class=\"col-xs-1 col-sm-2\"><small class=pull-right><a class=\"btn btn-secondary view-form-btn\" href={{actualFormURL}}><span class=\"hidden-xs hidden-sm\">{{ 'VIEW' | translate }} <span ng-show=myform.isLive>{{ 'LIVE' | translate }}</span> <span ng-hide=myform.isLive>{{ 'PREVIEW' | translate }}</span></span> <i class=\"status-light status-light-on fa fa-dot-circle-o\" ng-if=myform.isLive></i> <i class=\"status-light status-light-off fa fa-dot-circle-o\" ng-if=!myform.isLive></i></a></small></div></div><div class=row><div class=col-xs-12><uib-tabset active=activePill vertical=true type=pills><uib-tab index=0 heading=\"{{ 'CREATE_TAB' | translate }}\"><edit-form-directive myform=myform></edit-form-directive></uib-tab><uib-tab ng-repeat=\"tab in tabData\" index={{$index+1}} heading={{tab.heading}}><div class=row data-ng-include=\"'/static/modules/forms/admin/views/adminTabs/'+tab.templateName+'.html'\"></div></uib-tab><uib-tab index=2 heading=\"{{ 'ANALYZE_TAB' | translate }}\"><edit-submissions-form-directive myform=myform user=myform.admin></edit-submissions-form-directive></uib-tab><uib-tab ng-if=tabData heading=\"{{ 'SHARE_TAB' | translate }}\" index={{tabData.length}}><div class=config-form><div class=row><div class=col-sm-12><uib-tabset active=activePill vertical=true type=pills><uib-tab index=0 heading=\"{{ 'SHARE_YOUR_FORM' | translate }}\"><div class=row><div class=col-sm-12>{{ 'TELLFORM_URL' | translate }}</div><div class=\"col-sm-8 form-input\"><span ngclipboard data-clipboard-target=#copyURL><input id=copyURL ng-value=actualFormURL class=\"form-control ng-pristine ng-untouched ng-valid\"></span></div><div class=col-sm-4><button class=\"btn btn btn-secondary view-form-btn\" ngclipboard data-clipboard-target=#copyURL>{{ 'COPY' | translate }} <i class=\"fa fa-clipboard\" aria-hidden=true></i></button></div></div></uib-tab><uib-tab index=1 heading=\"{{ 'EMBED_YOUR_FORM' | translate }}\"><div class=row><div class=col-sm-12>{{ 'COPY_AND_PASTE' | translate }}</div><div class=\"col-sm-8 form-input\"><span ngclipboard data-clipboard-target=#copyEmbedded><textarea id=copyEmbedded class=\"form-control ng-pristine ng-untouched ng-valid\" style=\"min-height:200px; width:100%; background-color: #FFFFCC; color: #30313F\">\n" + + " </div></script><div class=\"page-header row\" style=\"padding-bottom: 1em\"><div class=\"col-xs-10 col-sm-8\"><h1 class=\"hidden-sm hidden-xs\" data-ng-bind=myform.title style=\"margin-bottom: 0px\"></h1><h2 class=\"hidden-md hidden-lg\" data-ng-bind=myform.title style=\"margin-bottom: 0px\"></h2></div><div class=\"col-xs-1 col-sm-2\"><small class=pull-right><button class=\"btn btn-danger\" ng-click=openDeleteModal()><i class=\"fa fa-trash-o\"></i> <span class=\"show-sm hidden-lg hidden-md hidden-xs\">{{ 'DELETE_FORM_SM' | translate}}</span> <span class=\"hidden-xs hidden-sm\">{{ 'DELETE_FORM_MD' | translate}}</span></button></small></div><div class=\"col-xs-1 col-sm-2\"><small class=pull-right><a class=\"btn btn-secondary view-form-btn\" href={{actualFormURL}}><span class=\"hidden-xs hidden-sm\">{{ 'VIEW' | translate }} <span ng-show=myform.isLive>{{ 'LIVE' | translate }}</span> <span ng-hide=myform.isLive>{{ 'PREVIEW' | translate }}</span></span> <i class=\"status-light status-light-on fa fa-dot-circle-o\" ng-if=myform.isLive></i> <i class=\"status-light status-light-off fa fa-dot-circle-o\" ng-if=!myform.isLive></i></a></small></div></div><div class=row><div class=col-xs-12><uib-tabset active=activePill vertical=true type=pills><uib-tab index=0 heading=\"{{ 'CREATE_TAB' | translate }}\" select=deactivateDesignTab()><edit-form-directive myform=myform></edit-form-directive></uib-tab><uib-tab ng-repeat=\"tab in tabData\" index={{$index+1}} heading={{tab.heading}} select=deactivateDesignTab()><div class=row data-ng-include=\"'/static/modules/forms/admin/views/adminTabs/'+tab.templateName+'.html'\"></div></uib-tab><uib-tab index=2 heading=\"{{ 'ANALYZE_TAB' | translate }}\" select=deactivateDesignTab()><edit-submissions-form-directive myform=myform user=myform.admin></edit-submissions-form-directive></uib-tab><uib-tab ng-if=tabData heading=\"{{ 'SHARE_TAB' | translate }}\" index={{tabData.length}} select=deactivateDesignTab()><div class=config-form><div class=row><div class=col-sm-12><uib-tabset active=activePill vertical=true type=pills><uib-tab index=0 heading=\"{{ 'SHARE_YOUR_FORM' | translate }}\"><div class=row><div class=col-sm-12>{{ 'TELLFORM_URL' | translate }}</div><div class=\"col-sm-8 form-input\"><span ngclipboard data-clipboard-target=#copyURL><input id=copyURL ng-value=actualFormURL class=\"form-control ng-pristine ng-untouched ng-valid\"></span></div><div class=col-sm-4><button class=\"btn btn btn-secondary view-form-btn\" ngclipboard data-clipboard-target=#copyURL>{{ 'COPY' | translate }} <i class=\"fa fa-clipboard\" aria-hidden=true></i></button></div></div></uib-tab><uib-tab index=1 heading=\"{{ 'EMBED_YOUR_FORM' | translate }}\"><div class=row><div class=col-sm-12>{{ 'COPY_AND_PASTE' | translate }}</div><div class=\"col-sm-8 form-input\"><span ngclipboard data-clipboard-target=#copyEmbedded><textarea id=copyEmbedded class=\"form-control ng-pristine ng-untouched ng-valid\" style=\"min-height:200px; width:100%; background-color: #FFFFCC; color: #30313F\">\n" + " <!-- {{ 'CHANGE_WIDTH_AND_HEIGHT' | translate }} -->\n" + " <iframe id=iframe src={{actualFormURL}} style=width:100%;height:500px></iframe>\n" + " <div style=\"font-family: Sans-Serif;font-size: 12px;color: #999;opacity: 0.5; padding-top: 5px\">{{ 'POWERED_BY' | translate }} <a href=https://www.tellform.com style=\"color: #999\" target=_blank>TellForm</a></div>\n" + - " </textarea></span></div><div class=col-sm-4><button class=\"btn btn btn-secondary view-form-btn\" ngclipboard data-clipboard-target=#copyEmbedded>{{ 'COPY' | translate }} <i class=\"fa fa-clipboard\" aria-hidden=true></i></button></div></div></uib-tab></uib-tabset></div></div></div></uib-tab><uib-tab ng-if=\"tabData && myform.form_fields.length\" heading=\"{{ 'DESIGN_TAB' | translate }}\" index={{tabData.length}}+1><div class=\"config-form design container\"><div class=row><div class=\"col-sm-4 col-xs-12\"><div class=\"row field\"><div class=\"field-title col-sm-5\"><h5>{{ 'BACKGROUND_COLOR' | translate }}</h5></div><div class=\"field-input col-sm-6\"><input class=form-control colorpicker=hex ng-model=myform.design.colors.backgroundColor ng-pattern=\"/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\" ng-style=\"{ 'background-color': myform.design.colors.backgroundColor }\"></div></div><div class=\"row field\"><div class=\"field-title col-sm-5\"><h5>{{ 'QUESTION_TEXT_COLOR' | translate }}</h5></div><div class=\"field-input col-sm-6\"><input class=form-control colorpicker=hex ng-model=myform.design.colors.questionColor ng-pattern=\"/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\" ng-style=\"{ 'background-color': myform.design.colors.questionColor }\"></div></div><div class=\"row field\"><div class=\"field-title col-sm-5\"><h5>{{ 'ANSWER_TEXT_COLOR' | translate }}</h5></div><div class=\"field-input col-sm-6\"><input class=form-control colorpicker=hex ng-model=myform.design.colors.answerColor ng-pattern=\"/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\" ng-style=\"{ 'background-color': myform.design.colors.answerColor }\"></div></div><div class=\"row field\"><div class=\"field-title col-sm-5\"><h5>{{ 'BTN_BACKGROUND_COLOR' | translate }}</h5></div><div class=\"field-input col-sm-6\"><input class=form-control colorpicker=hex ng-model=myform.design.colors.buttonColor ng-pattern=\"/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\" ng-style=\"{ 'background-color': myform.design.colors.buttonColor }\"></div></div><div class=\"row field\"><div class=\"field-title col-sm-5\"><h5>{{ 'BTN_TEXT_COLOR' | translate }}</h5></div><div class=\"field-input col-sm-6\"><input class=form-control colorpicker=hex ng-model=myform.design.colors.buttonTextColor ng-pattern=\"/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\" ng-style=\"{ 'background-color': myform.design.colors.buttonTextColor }\"></div></div></div><div class=\"col-sm-8 hidden-xs\"><div class=public-form ng-style=\"{ 'background-color': myform.design.colors.backgroundColor }\"><iframe id=iframe ng-if=!!formURL ng-src=\"{{formURL | trustSrc}}\" style=\"border: none; box-shadow: 0px 0px 10px 0px grey; overflow: hidden; height: 400px; width: 90%; position: absolute\"></iframe></div></div></div><div class=row><div class=\"col-sm-offset-4 col-sm-2\"><button class=\"btn btn-signup btn-rounded\" type=button ng-click=\"update(false, myform, false, false, null)\"><i class=\"icon-arrow-left icon-white\"></i>{{ 'SAVE_CHANGES' | translate }}</button></div><div class=col-sm-1><button class=\"btn btn-secondary btn-rounded\" type=button ng-click=resetForm()><i class=\"icon-eye-open icon-white\"></i>{{ 'CANCEL' | translate }}</button></div></div></div></uib-tab></uib-tabset></div></div></section>"); + " </textarea></span></div><div class=col-sm-4><button class=\"btn btn btn-secondary view-form-btn\" ngclipboard data-clipboard-target=#copyEmbedded>{{ 'COPY' | translate }} <i class=\"fa fa-clipboard\" aria-hidden=true></i></button></div></div></uib-tab></uib-tabset></div></div></div></uib-tab><uib-tab class=design-tab ng-if=\"tabData && myform.form_fields.length\" heading=\"{{ 'DESIGN_TAB' | translate }}\" index={{tabData.length}}+1 select=activateDesignTab()><div class=\"config-form design container\"><div class=row><div class=\"col-sm-4 col-xs-12\"><div class=\"row field\"><div class=\"field-title col-sm-5\"><h5>{{ 'BACKGROUND_COLOR' | translate }}</h5></div><div class=\"field-input col-sm-6\"><input class=form-control colorpicker=hex ng-model=myform.design.colors.backgroundColor ng-pattern=\"/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\" ng-style=\"{ 'background-color': myform.design.colors.backgroundColor }\"></div></div><div class=\"row field\"><div class=\"field-title col-sm-5\"><h5>{{ 'QUESTION_TEXT_COLOR' | translate }}</h5></div><div class=\"field-input col-sm-6\"><input class=form-control colorpicker=hex ng-model=myform.design.colors.questionColor ng-pattern=\"/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\" ng-style=\"{ 'background-color': myform.design.colors.questionColor }\"></div></div><div class=\"row field\"><div class=\"field-title col-sm-5\"><h5>{{ 'ANSWER_TEXT_COLOR' | translate }}</h5></div><div class=\"field-input col-sm-6\"><input class=form-control colorpicker=hex ng-model=myform.design.colors.answerColor ng-pattern=\"/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\" ng-style=\"{ 'background-color': myform.design.colors.answerColor }\"></div></div><div class=\"row field\"><div class=\"field-title col-sm-5\"><h5>{{ 'BTN_BACKGROUND_COLOR' | translate }}</h5></div><div class=\"field-input col-sm-6\"><input class=form-control colorpicker=hex ng-model=myform.design.colors.buttonColor ng-pattern=\"/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\" ng-style=\"{ 'background-color': myform.design.colors.buttonColor }\"></div></div><div class=\"row field\"><div class=\"field-title col-sm-5\"><h5>{{ 'BTN_TEXT_COLOR' | translate }}</h5></div><div class=\"field-input col-sm-6\"><input class=form-control colorpicker=hex ng-model=myform.design.colors.buttonTextColor ng-pattern=\"/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\" ng-style=\"{ 'background-color': myform.design.colors.buttonTextColor }\"></div></div></div><div class=\"col-sm-8 hidden-xs\" ng-if=designTabActive><div class=public-form ng-style=\"{ 'background-color': myform.design.colors.backgroundColor }\"><iframe id=iframe ng-if=!!formURL ng-src=\"{{formURL | trustSrc}}\" style=\"border: none; box-shadow: 0px 0px 10px 0px grey; overflow: hidden; height: 400px; width: 90%; position: absolute\"></iframe></div></div></div><div class=row><div class=\"col-sm-offset-4 col-sm-2\"><button class=\"btn btn-signup btn-rounded\" type=button ng-click=\"updateDesign(false, myform, false, false)\"><i class=\"icon-arrow-left icon-white\"></i>{{ 'SAVE_CHANGES' | translate }}</button></div><div class=col-sm-1><button class=\"btn btn-secondary btn-rounded\" type=button ng-click=resetForm()><i class=\"icon-eye-open icon-white\"></i>{{ 'CANCEL' | translate }}</button></div></div></div></uib-tab></uib-tabset></div></div></section>"); $templateCache.put("modules/forms/admin/views/list-forms.client.view.html", "<header data-ng-include=\"'/static/modules/core/views/header.client.view.html'\"></header><section class=overlay ng-if=showCreateModal ng-click=closeCreateModal()></section><script type=text/ng-template id=deleteModalListForms.html><div class=\"modal-header\">\n" + " <h2 class=\"modal-title hidden-md hidden-lg\">{{ 'ARE_YOU_SURE' | translate }}</h2>\n" + @@ -108,7 +108,7 @@ angular.module('TellForm.templates', []).run(['$templateCache', function($templa " <button type=\"submit\" ng-click=\"deleteForm()\" class=\"btn btn-block btn-danger\" ng-disabled=\"content.currFormTitle != deleteConfirm\">\n" + " {{ 'I_UNDERSTAND' | translate }}\n" + " </button>\n" + - " </div></script><section data-ng-controller=\"ListFormsController as ctrl\" data-ng-init=findAll() class=container><br><div class=row><div ng-click=openCreateModal() class=\"col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item create-new\"><div class=\"title-row col-xs-12\"><h4 class=\"fa fa-plus fa-6\"></h4></div><div class=\"col-xs-12 details-row\"><small class=list-group-item-text>{{ 'CREATE_A_NEW_FORM' | translate }}</small></div></div><form name=forms.createForm class=\"col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item create-new new-form\" ng-if=showCreateModal><div class=\"title-row row\"><div class=\"col-xs-5 field-title text-left\">{{ 'NAME' | translate }}</div><div class=\"col-xs-12 field-input\"><input name=title required ng-model=formTitle ng-pattern=languageRegExp ng-minlength=4 style=\"color:black\"></div></div><div class=\"details-row row\"><div class=\"col-xs-5 field-title text-left\">{{ 'LANGUAGE' | translate }}</div><div class=\"col-xs-12 field-input\"><div class=\"button custom-select\"><select style=color:black name=language required ng-model=formLanguage ng-init=\"formLanguage = user.language\"><option ng-repeat=\"language in languages\" value={{language}}>{{language}}</option></select></div></div></div><div class=\"details-row submit row\"><div class=\"col-xs-12 field-title text-center\"><button class=\"btn btn-primary\" ng-disabled=forms.createForm.$invalid ng-click=createNewForm()>{{ 'CREATE_FORM' | translate }}</button></div></div></form><div data-ng-repeat=\"form in myforms\" class=\"col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item container\" ng-class=\"{'paused': !form.isLive}\"><div class=row><span class=pull-right><i style=cursor:pointer class=\"fa fa-trash-o\" ng-click=openDeleteModal($index)></i> <i style=cursor:pointer class=\"fa fa-files-o\" ng-click=duplicateForm($index)></i></span></div><div class=row><a data-ng-href=#!/forms/{{form._id}}/admin/create class=\"title-row col-xs-12\"><h4 class=list-group-item-heading data-ng-bind=form.title></h4></a><div class=\"col-xs-12 responses-row\"><small class=list-group-item-text><span>{{ form.numberOfResponses }} {{ 'RESPONSES' | translate }}</span></small><br><br><small ng-if=!form.isLive class=list-group-item-text><span>{{ 'FORM_PAUSED' | translate }}</span></small></div></div></div></div></section>"); + " </div></script><section class=container><br><div class=row><div ng-click=openCreateModal() class=\"col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item create-new\"><div class=\"title-row col-xs-12\"><h4 class=\"fa fa-plus fa-6\"></h4></div><div class=\"col-xs-12 details-row\"><small class=list-group-item-text>{{ 'CREATE_A_NEW_FORM' | translate }}</small></div></div><form name=forms.createForm class=\"col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item create-new new-form\" ng-if=showCreateModal><div class=\"title-row row\"><div class=\"col-xs-5 field-title text-left\">{{ 'NAME' | translate }}</div><div class=\"col-xs-12 field-input\"><input name=title required ng-model=formTitle ng-pattern=languageRegExp ng-minlength=4 style=\"color:black\"></div></div><div class=\"details-row row\"><div class=\"col-xs-5 field-title text-left\">{{ 'LANGUAGE' | translate }}</div><div class=\"col-xs-12 field-input\"><div class=\"button custom-select\"><select style=color:black name=language required ng-model=formLanguage ng-init=\"formLanguage = user.language\"><option ng-repeat=\"language in languages\" value={{language}}>{{language}}</option></select></div></div></div><div class=\"details-row submit row\"><div class=\"col-xs-12 field-title text-center\"><button class=\"btn btn-primary\" ng-disabled=forms.createForm.$invalid ng-click=createNewForm()>{{ 'CREATE_FORM' | translate }}</button></div></div></form><div data-ng-repeat=\"form in myforms\" class=\"col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item container\" ng-class=\"{'paused': !form.isLive}\" ng-clkc=\"goToWithId('viewForm.create', form._id)\"><div class=row><span class=pull-right><i style=cursor:pointer class=\"fa fa-trash-o\" ng-click=openDeleteModal($index)></i> <i style=cursor:pointer class=\"fa fa-files-o\" ng-click=duplicateForm($index)></i></span></div><div class=row><a data-ng-href=#!/forms/{{form._id}}/admin/create class=\"title-row col-xs-12\"><h4 class=list-group-item-heading data-ng-bind=form.title></h4></a><div class=\"col-xs-12 responses-row\"><small class=list-group-item-text><span>{{ form.numberOfResponses }} {{ 'RESPONSES' | translate }}</span></small><br><br><small ng-if=!form.isLive class=list-group-item-text><span>{{ 'FORM_PAUSED' | translate }}</span></small></div></div></div></div></section>"); $templateCache.put("modules/forms/admin/views/adminTabs/analyze.html", "<edit-submissions-form-directive myform=myform user=user></edit-submissions-form-directive>"); $templateCache.put("modules/forms/admin/views/adminTabs/configure.html", @@ -414,34 +414,34 @@ angular.module('TellForm.templates', []).run(['$templateCache', function($templa "\n" + " <div class=\"row\"><br></div>\n" + "\n" + - " <div class=\"row description\" ng-hide=\"showRatingOptions(field)\">\n" + + " <div class=\"row description\" ng-hide=\"showRatingOptions()\">\n" + " <div class=\"col-md-12 bold\">{{ 'QUESTION_DESCRIPTION' | translate }}</div>\n" + " <div class=\"col-md-12\">\n" + " <textarea type=\"text\" class=\"form-control\" ng-model=\"field.description\" name=\"description{{field._id}}\"value=\"{{field.description}}\"></textarea>\n" + " </div>\n" + " </div>\n" + "\n" + - " <div class=\"row\" ng-show=\"showAddOptions(field)\"><br></div>\n" + - " <div class=\"row options\" ng-if=\"showAddOptions(field)\">\n" + + " <div class=\"row\" ng-show=\"showAddOptions()\"><br></div>\n" + + " <div class=\"row options\" ng-if=\"showAddOptions()\">\n" + " <div class=\"col-md-4 col-xs-12\">{{ 'OPTIONS' | translate }}</div>\n" + " <div class=\"col-md-8 col-xs-12\">\n" + " <div ng-repeat=\"option in field.fieldOptions track by option.option_id\" class=\"row\">\n" + " <input type=\"text\" name=\"{{option.option_value}}{{field._id}}\" ng-model=\"option.option_value\" class=\"col-xs-5\">\n" + "\n" + - " <a class=\"btn btn-danger btn-mini right\" type=\"button\" ng-click=\"deleteOption(field, option)\" class=\"col-xs-3\">\n" + + " <a class=\"btn btn-danger btn-mini right\" type=\"button\" ng-click=\"deleteOption(option)\" class=\"col-xs-3\">\n" + " <i class=\"fa fa-trash-o\"></i>\n" + " </a>\n" + " </div>\n" + " <div class=\"row\">\n" + - " <button class=\"btn btn-primary btn-small col-md-offset-0 col-md-6 col-sm-4 col-sm-offset-4 col-xs-6 col-xs-offset-6\" type=\"button\" ng-click=\"addOption(field)\">\n" + + " <button class=\"btn btn-primary btn-small col-md-offset-0 col-md-6 col-sm-4 col-sm-offset-4 col-xs-6 col-xs-offset-6\" type=\"button\" ng-click=\"addOption()\">\n" + " <i class=\"icon-plus icon-white\"></i> {{ 'ADD_OPTION' | translate }}\n" + " </button>\n" + " </div>\n" + " </div>\n" + " </div>\n" + "\n" + - " <div class=\"row\" ng-show=\"showRatingOptions(field)\"><br></div>\n" + - " <div class=\"row\" ng-if=\"showRatingOptions(field)\">\n" + + " <div class=\"row\" ng-show=\"showRatingOptions()\"><br></div>\n" + + " <div class=\"row\" ng-if=\"showRatingOptions()\">\n" + " <div class=\"col-md-9 col-sm-9\">{{ 'NUM_OF_STEPS' | translate }}</div>\n" + " <div class=\"col-md-3 col-sm-3\">\n" + " <input style=\"width:100%\" type=\"number\"\n" + @@ -485,7 +485,7 @@ angular.module('TellForm.templates', []).run(['$templateCache', function($templa " <div class=\"col-md-4 col-xs-12 field-input\">{{ 'LOGIC_JUMP' | translate }}</div>\n" + " <div class=\"col-md-8 col-xs-12 field-input\">\n" + " <label class=\"switch-light switch-holo\" onclick=\"\">\n" + - " <input type=\"checkbox\" ng-model=\"showLogicJump\">\n" + + " <input type=\"checkbox\" ng-model=\"field.logicJump.enabled\">\n" + " <span>\n" + " <span> {{ 'OFF' | translate }}</span>\n" + " <span> {{ 'ON' | translate }}</span>\n" + @@ -494,7 +494,7 @@ angular.module('TellForm.templates', []).run(['$templateCache', function($templa " </label>\n" + " </div>\n" + " </div>\n" + - " <div class=\"row question\" ng-if=\"!!showLogicJump\">\n" + + " <div class=\"row question\" ng-if=\"field.logicJump.enabled\"\">\n" + " <div class=\"col-md-4 col-sm-12\">\n" + "\n" + " <b> {{ 'IF_THIS_FIELD' | translate }} </b>\n" + @@ -585,14 +585,14 @@ angular.module('TellForm.templates', []).run(['$templateCache', function($templa " </div>\n" + "\n" + " <div class=\"preview-field-panel col-md-6 hidden-sm hidden-xs\">\n" + - " <form class=\"public-form\"ss>\n" + + " <form class=\"public-form\">\n" + " <field-directive field=\"field\" validate=\"false\" class=\"preview-field\">\n" + " </field-directive>\n" + " </form>\n" + " </div>\n" + " </div>\n" + "\n" + - " </div></script><div class=\"col-xs-2 col-sm-4 add-field\"><div class=\"row add-field-title\"><h3 class=\"col-md-12 hidden-sm hidden-xs\">{{ 'ADD_FIELD_LG' | translate }}</h3><h4 class=\"col-sm-12 hidden-xs hidden-md hidden-lg\">{{ 'ADD_FIELD_MD' | translate }}</h4><h5 class=\"col-xs-12 hidden-sm hidden-md hidden-lg\">{{ 'ADD_FIELD_SM' | translate }}</h5></div><div class=\"panel-group row\" class=draggable ng-model=addField.types><div class=\"col-xs-12 col-sm-12 col-md-6\" ng-repeat=\"type in addField.types\" style=padding-top:7.5px><div class=\"panel panel-default\" style=background-color:#f5f5f5><div class=panel-heading ng-click=\"addNewField(false, type.name)\" style=\"cursor: pointer; font-size:12px; padding-left: 10px; padding-right: 10px\"><span><field-icon-directive type-name={{type.name}}></field-icon-directive></span> <span class=hidden-xs style=padding-left:0.3em>{{type.value}}</span></div></div></div></div></div><div class=\"col-xs-10 col-sm-8 current-fields\"><div class=row ng-if=myform.startPage.showStart><div class=col-sm-12><div class=\"panel panel-default startPage\" ng-click=openEditStartPageModal()><div class=panel-heading><h4 class=text-center>{{ 'WELCOME_SCREEN' | translate }}</h4></div></div></div></div><div class=row><div class=col-sm-12><hr></div></div><div class=\"row dropzoneContainer\"><div class=\"panel-group dropzone col-xs-12\" ui-sortable=sortableOptions ng-model=myform.form_fields><div class=\"col-xs-12 field-row\" ng-repeat=\"field in myform.form_fields track by $id($index)\" ng-if=!field.deletePreserved><div class=col-xs-10><div class=\"panel panel-default\" ng-click=openEditModal(field)><div class=panel-heading><div class=row><span class=col-xs-1 ng-switch=field.fieldType><field-icon-directive type-name={{field.fieldType}}></field-icon-directive></span> <span class=col-xs-11>{{field.title}} <span ng-show=field.required>*</span></span></div></div></div></div><div class=\"col-xs-1 box\"><div class=\"panel tool-panel panel-default\"><div class=panel-heading style=\"padding: 10px 10px\" ng-click=deleteField($index)><span class=text-center><a href=\"\" class=\"fa fa-trash-o\"></a></span></div></div></div><div class=\"col-xs-1 box\"><div class=\"panel tool-panel panel-default\"><div class=panel-heading style=\"padding: 10px 10px\" ng-click=duplicateField($index)><span class=text-center><a href=\"\" class=\"fa fa-files-o\"></a></span></div></div></div></div><div class=\"col-xs-12 field-row\"><div class=col-xs-12 style=\"padding-right: 5px\"><div class=\"panel panel-default\" style=\"border-style: dashed; border-color: #a9a9a9\"><div class=panel-heading><h4 class=\"panel-title text-center\" style=\"color: #a9a9a9\">{{ 'CLICK_FIELDS_FOOTER' | translate }}</h4></div></div></div></div><hr></div></div><div class=row ng-if=myform.endPage.showEnd><div class=col-sm-12><div class=\"panel panel-default startPage\" ng-click=openEditEndPageModal()><div class=panel-heading><h4 class=text-center>{{ 'END_SCREEN' | translate }}</h4></div></div></div></div></div></form>"); + " </div></script><div class=\"col-xs-2 col-sm-4 add-field\"><div class=\"row add-field-title\"><h3 class=\"col-md-12 hidden-sm hidden-xs\">{{ 'ADD_FIELD_LG' | translate }}</h3><h4 class=\"col-sm-12 hidden-xs hidden-md hidden-lg\">{{ 'ADD_FIELD_MD' | translate }}</h4><h5 class=\"col-xs-12 hidden-sm hidden-md hidden-lg\">{{ 'ADD_FIELD_SM' | translate }}</h5></div><div class=\"panel-group row\" class=draggable ng-model=addField.types><div class=\"col-xs-12 col-sm-12 col-md-6\" ng-repeat=\"type in addField.types\" style=padding-top:7.5px><div class=\"panel panel-default\" style=background-color:#f5f5f5><div class=panel-heading ng-click=addNewField(type.name) style=\"cursor: pointer; font-size:12px; padding-left: 10px; padding-right: 10px\"><span><field-icon-directive type-name={{type.name}}></field-icon-directive></span> <span class=hidden-xs style=padding-left:0.3em>{{type.value}}</span></div></div></div></div></div><div class=\"col-xs-10 col-sm-8 current-fields\"><div class=row ng-if=myform.startPage.showStart><div class=col-sm-12><div class=\"panel panel-default startPage\" ng-click=openEditStartPageModal()><div class=panel-heading><h4 class=text-center>{{ 'WELCOME_SCREEN' | translate }}</h4></div></div></div></div><div class=row><div class=col-sm-12><hr></div></div><div class=\"row dropzoneContainer\"><div class=\"panel-group dropzone col-xs-12\" ui-sortable=sortableOptions ng-model=myform.form_fields><div class=\"col-xs-12 field-row\" ng-repeat=\"field in myform.form_fields track by $id($index)\" ng-if=!field.deletePreserved><div class=col-xs-10><div class=\"panel panel-default\" ng-click=\"openEditModal(field, true, $index)\"><div class=panel-heading><div class=row><span class=col-xs-1 ng-switch=field.fieldType><field-icon-directive type-name={{field.fieldType}}></field-icon-directive></span> <span class=col-xs-11>{{field.title}} <span ng-show=field.required>*</span></span></div></div></div></div><div class=\"col-xs-1 box\"><div class=\"panel tool-panel panel-default\"><div class=panel-heading style=\"padding: 10px 10px\" ng-click=deleteField($index)><span class=text-center><a href=\"\" class=\"fa fa-trash-o\"></a></span></div></div></div><div class=\"col-xs-1 box\"><div class=\"panel tool-panel panel-default\"><div class=panel-heading style=\"padding: 10px 10px\" ng-click=duplicateField($index)><span class=text-center><a href=\"\" class=\"fa fa-files-o\"></a></span></div></div></div></div><div class=\"col-xs-12 field-row\"><div class=col-xs-12 style=\"padding-right: 5px\"><div class=\"panel panel-default\" style=\"border-style: dashed; border-color: #a9a9a9\"><div class=panel-heading><h4 class=\"panel-title text-center\" style=\"color: #a9a9a9\">{{ 'CLICK_FIELDS_FOOTER' | translate }}</h4></div></div></div></div><hr></div></div><div class=row ng-if=myform.endPage.showEnd><div class=col-sm-12><div class=\"panel panel-default startPage\" ng-click=openEditEndPageModal()><div class=panel-heading><h4 class=text-center>{{ 'END_SCREEN' | translate }}</h4></div></div></div></div></div></form>"); $templateCache.put("modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html", "<div class=\"submissions-table container\"><div class=\"row text-center analytics\"><div class=\"col-xs-12 header-title\"><div class=col-xs-3>{{ 'TOTAL_VIEWS' | translate }}</div><div class=col-xs-3>{{ 'RESPONSES' | translate }}</div><div class=col-xs-3>{{ 'COMPLETION_RATE' | translate }}</div><div class=col-xs-3>{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div></div><div class=\"col-xs-12 header-numbers\"><div class=col-xs-3>{{myform.analytics.visitors.length}}</div><div class=col-xs-3>{{myform.analytics.submissions}}</div><div class=col-xs-3>{{myform.analytics.conversionRate | number:0}}%</div><div class=col-xs-3>{{ AverageTimeElapsed | secondsToDateTime | date:'mm:ss'}}</div></div><div class=\"col-xs-12 detailed-title\"><div class=col-xs-3>{{ 'DESKTOP_AND_LAPTOP' | translate }}</div><div class=col-xs-3>{{ 'TABLETS' | translate }}</div><div class=col-xs-3>{{ 'PHONES' | translate }}</div><div class=col-xs-3>{{ 'OTHER' | translate }}</div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.desktop.visits}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.tablet.visits}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.tablet.visits}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.other.visits}}</div></div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.desktop.responses}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.tablet.responses}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.phone.responses}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.other.responses}}</div></div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.desktop.completion}}%</div></div><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.tablet.completion}}%</div></div><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.phone.completion}}%</div></div><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.other.completion}}%</div></div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.desktop.average_time | secondsToDateTime | date:'mm:ss'}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.tablet.average_time | secondsToDateTime | date:'mm:ss'}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.phone.average_time | secondsToDateTime | date:'mm:ss'}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.other.average_time | secondsToDateTime | date:'mm:ss'}}</div></div></div><div class=\"col-xs-12 field-title-row\"><div class=col-xs-3><strong>{{ 'FIELD_TITLE' | translate }}</strong></div><div class=col-xs-3><strong>{{ 'FIELD_VIEWS' | translate }}</strong></div><div class=col-xs-3><strong>{{ 'FIELD_RESPONSES' | translate }}</strong></div><div class=col-xs-3><strong>{{ 'FIELD_DROPOFF' | translate }}</strong></div></div><div class=\"col-xs-12 field-detailed-row\" ng-repeat=\"fieldStats in myform.analytics.fields\"><div class=col-xs-3>{{fieldStats.field.title}}</div><div class=col-xs-3>{{fieldStats.totalViews}}</div><div class=col-xs-3>{{fieldStats.responses}}</div><div class=col-xs-3>{{fieldStats.continueRate}}%</div></div></div><br><div class=\"row table-tools\"><div class=col-xs-2><button class=\"btn btn-danger\" ng-click=deleteSelectedSubmissions() ng-disabled=!isAtLeastOneChecked();><i class=\"fa fa-trash-o\"></i> {{ 'DELETE_SELECTED' | translate }}</button></div><div class=\"col-xs-2 col-xs-offset-4 text-right\"><button class=\"btn btn-gray\" ng-click=\"exportSubmissions('xml')\"><small>{{ 'EXPORT_TO_EXCEL' | translate }}</small></button></div><div class=\"col-md-2 text-right\"><button class=\"btn btn-gray\" ng-click=\"exportSubmissions('csv')\"><small>{{ 'EXPORT_TO_CSV' | translate }}</small></button></div><div class=\"col-md-2 text-right\"><button class=\"btn btn-gray\" ng-click=\"exportSubmissions('json')\"><small>{{ 'EXPORT_TO_JSON' | translate }}</small></button></div></div><div class=\"row table-outer\"><div class=col-xs-12><table id=table-submission-data class=\"table table-striped table-hover table-condensed\"><thead><tr><th><input ng-model=table.masterChecker ng-change=toggleAllCheckers() type=\"checkbox\"></th><th>#</th><th data-ng-repeat=\"(key, value) in myform.form_fields track by $index\">{{value.title}}</th><th>{{ 'PERCENTAGE_COMPLETE' | translate }}</th><th>{{ 'TIME_ELAPSED' | translate }}</th><th>{{ 'DEVICE' | translate }}</th><th>{{ 'LOCATION' | translate }}</th><th>{{ 'IP_ADDRESS' | translate }}</th><th>{{ 'DATE_SUBMITTED' | translate }} (UTC)</th></tr></thead><tbody><tr data-ng-repeat=\"row in table.rows\" ng-click=rowClicked($index) ng-class=\"{selected: row.selected === true}\"><td><input ng-model=row.selected type=\"checkbox\"></td><th class=scope>{{$index+1}}</th><td data-ng-repeat=\"field in row.form_fields\">{{field.fieldValue}}</td><td>{{row.percentageComplete}}%</td><td>{{row.timeElapsed | secondsToDateTime | date:'mm:ss'}}</td><td>{{row.device.name}}, {{row.device.type}}</td><td>{{row.geoLocation.City}}, {{row.geoLocation.Country}}</td><td>{{row.ipAddr}}</td><td>{{row.created | date:'yyyy-MM-dd HH:mm:ss'}}</td></tr></tbody></table></div></div></div>"); $templateCache.put("modules/users/views/authentication/access-denied.client.view.html", @@ -604,7 +604,7 @@ angular.module('TellForm.templates', []).run(['$templateCache', function($templa $templateCache.put("modules/users/views/authentication/signup.client.view.html", "<section class=\"auth signup-view valign-wrapper\" data-ng-controller=AuthenticationController><div class=\"row valign\"><div class=\"col-md-12 text-center vcenter\" style=\"padding-bottom: 50px\"><img src=/static/modules/core/img/logo_white.svg height=100px></div><div class=\"col-xs-offset-3 col-xs-6 col-sm-offset-4 col-sm-4\"><form name=userForm data-ng-submit=signup() class=\"signin form-horizontal\" autocomplete=off><fieldset><div data-ng-show=error id=signup_errors class=text-center>{{'SIGNUP_ERROR_TEXT' | translate}}:<br><strong data-ng-bind=error></strong></div><div class=form-group><input id=username name=username class=form-control ng-pattern=languageRegExp ng-minlength=4 ng-model=credentials.username placeholder=\"{{ 'USERNAME_LABEL' | translate }}\" ng-minlength=4></div><div class=form-group><input type=email id=email name=email class=form-control ng-model=credentials.email placeholder=\"{{ 'EMAIL_LABEL' | translate }}\"></div><div class=form-group><input type=password id=password name=password class=form-control ng-model=credentials.password placeholder=\"{{ 'PASSWORD_LABEL' | translate }}\" ng-minlength=4></div><div class=\"text-center form-group\"><button type=submit class=\"btn btn-signup btn-rounded btn-block\">{{ 'SIGNUP_BTN' | translate }}</button></div></fieldset></form><div class=\"text-center forgot-password\"><a ui-sref=signin>{{ 'SIGN_IN_ACCOUNT_LINK' | translate }}</a></div></div></div></section>"); $templateCache.put("modules/users/views/password/forgot-password.client.view.html", - "<section class=\"auth valign-wrapper\" data-ng-controller=PasswordController><div class=\"row valign\"><div class=\"col-md-4 col-md-offset-4\"><div class=\"col-md-12 text-center\" style=\"padding-bottom: 50px\"><img src=/static/modules/core/img/logo_white.svg height=100px></div><div class=col-md-12><form data-ng-submit=askForPasswordReset() autocomplete=off><fieldset><div class=form-group><input id=username name=username class=form-control data-ng-model=credentials.username placeholder=\"{{ 'USERNAME_OR_EMAIL_LABEL' | translate }}\"></div><div class=\"text-center form-group\"><button type=submit class=\"btn btn-signup btn-rounded btn-block\">{{ 'PASSWORD_RESTORE_HEADER' | translate }}</button></div><div data-ng-show=error class=\"text-center text-danger\"><strong>{{error}}</strong></div><div data-ng-show=success class=\"text-center text-success\"><strong>{{success}}</strong></div></fieldset></form></div></div></div></section>"); + "<section class=\"auth valign-wrapper\" data-ng-controller=PasswordController><div class=\"row valign\"><div class=\"col-md-4 col-md-offset-4\"><div class=\"col-md-12 text-center\" style=\"padding-bottom: 50px\"><img src=/static/modules/core/img/logo_white.svg height=100px></div><div class=col-md-12><form data-ng-submit=askForPasswordReset() autocomplete=off><fieldset><div class=form-group><input id=username name=username class=form-control data-ng-model=credentials.username placeholder=\"{{ 'USERNAME_OR_EMAIL_LABEL' | translate }}\"></div><div class=\"text-center form-group\"><button type=submit class=\"btn btn-signup btn-rounded btn-block\">{{ 'PASSWORD_RESTORE_HEADER' | translate }}</button></div><div data-ng-show=error class=text-center><strong>Error: {{error}}</strong></div><div data-ng-show=success class=text-center><strong>{{success}}</strong></div></fieldset></form></div></div></div></section>"); $templateCache.put("modules/users/views/password/reset-password-invalid.client.view.html", "<section class=\"row text-center\"><h3 class=col-md-12>{{ 'PASSWORD_RESET_INVALID' | translate }}</h3><a href=/#!/password/forgot class=col-md-12>{{ 'ASK_FOR_NEW_PASSWORD' | translate }}</a></section>"); $templateCache.put("modules/users/views/password/reset-password-success.client.view.html", @@ -624,32 +624,34 @@ angular.module('TellForm.templates', []).run(['$templateCache', function($templa $templateCache.put("form_modules/forms/base/views/directiveViews/entryPage/startPage.html", "<div class=\"field row text-center\"><div class=\"col-xs-12 text-center\"><h1>{{pageData.introTitle}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-left\"><p style=color:#ddd>{{pageData.introParagraph}}</p></div></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in pageData.buttons\" class=text-center style=display:inline><button class=\"btn btn-info\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none; color: inherit\">{{button.text}}</a></button></p></div><div class=\"row form-actions\"><p class=\"col-xs-3 col-xs-offset-3 text-center\"><button class=\"btn btn-info\" type=button><a ng-click=exitpageData() style=\"color:white; font-size: 1.6em; text-decoration: none\">{{ 'CONTINUE_FORM' | translate }}</a></button></p></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/date.html", - "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=\"!field.required && !field.fieldValue\">{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div class=\"control-group input-append\"><input class=focusOn ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" ng-class=\"{ 'no-border': !!field.fieldValue }\" ui-date=dateOptions ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required placeholder=MM/DD/YYYY on-tab-key=nextField() on-tab-and-shift-key=prevField() ng-change=nextField()></div></div></div>"); + "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=\"!field.required && !field.fieldValue\">{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div class=\"control-group input-append\"><input class=focusOn ng-focus=\"setActiveField(field._id, null, false)\" ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" ng-class=\"{ 'no-border': !!field.fieldValue }\" ui-date=dateOptions ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required placeholder=MM/DD/YYYY on-tab-key=nextField() on-tab-and-shift-key=prevField() ng-change=nextField()></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/dropdown.html", - "<div class=\"field row dropdown\" ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><ui-select ng-model=field.fieldValue theme=selectize search-enabled=true search-by=option_value set-search-to-answer=true ng-required=field.required on-tab-and-shift-key=prevField() on-tab-key=nextField() ng-change=nextField()><ui-select-match placeholder=\"Type or select an option\"></ui-select-match><ui-select-choices repeat=\"option in field.fieldOptions | filter: $select.search\" ng-class=\"{'active': option.option_value === field.fieldValue }\"><span ng-bind-html=\"option.option_value | highlight: $select.search\"></span></ui-select-choices></ui-select></div></div><br>"); + "<div class=\"field row dropdown\" ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><ui-select ng-model=field.fieldValue ng-focus=\"setActiveField(field._id, null, false)\" theme=selectize search-enabled=true search-by=option_value set-search-to-answer=true ng-required=field.required on-tab-and-shift-key=prevField() on-tab-key=nextField() ng-change=nextField()><ui-select-match placeholder=\"Type or select an option\"></ui-select-match><ui-select-choices repeat=\"option in field.fieldOptions | filter: $select.search\" ng-class=\"{'active': option.option_value === field.fieldValue }\"><span ng-bind-html=\"option.option_value | highlight: $select.search\"></span></ui-select-choices></ui-select></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/hidden.html", "<input type=hidden>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/legal.html", "<div class=\"field row radio legal\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-valid-key=nextField()><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><br><p class=col-xs-12>{{field.description}}</p></div><div class=\"col-xs-12 field-input container\"><div class=row-fluid><label class=\"btn col-md-5 col-xs-12\" ng-class=\"{activeBtn: field.fieldValue == 'true'}\"><input class=focusOn ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" type=radio value=true ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter style=float:left>Y</div><span>{{ 'LEGAL_ACCEPT' | translate }}</span></label><label class=\"btn col-md-5 col-md-offset-1 col-xs-12\" ng-class=\"{activeBtn: field.fieldValue == 'false'}\"><input class=focusOn ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" type=radio value=false ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter style=float:left>N</div><span>{{ 'LEGAL_NO_ACCEPT' | translate }}</span></label></div></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/radio.html", - "<div class=\"field row radio\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-option field=field ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div ng-repeat=\"option in field.fieldOptions\" class=row-fluid><label class=\"btn col-md-4 col-xs-12 col-sm-12\" style=\"margin: 0.5em; padding-left:30px\" ng-class=\"{activeBtn: field.fieldValue == field.fieldOptions[$index].option_value}\"><div class=letter style=float:left>{{$index+1}}</div><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" type=radio class=focusOn value={{option.option_value}} ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"$root.nextField()\"> <span ng-bind=option.option_value></span></label></div></div></div><br>"); + "<div class=\"field row radio\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-option field=field ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div ng-repeat=\"option in field.fieldOptions\" class=row-fluid><label class=\"btn col-md-4 col-xs-12 col-sm-12\" style=\"margin: 0.5em; padding-left:30px\" ng-class=\"{activeBtn: field.fieldValue == field.fieldOptions[$index].option_value}\"><div class=letter style=float:left>{{$index+1}}</div><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" ng-focus=\"setActiveField(field._id, null, false)\" type=radio class=focusOn value={{option.option_value}} ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"$root.nextField()\"> <span ng-bind=option.option_value></span></label></div></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/rating.html", "<div class=\"textfield field row\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><input-stars max={{field.ratingOptions.steps}} ng-init=\"field.fieldValue = 1\" on-shape-click=true on-star-click=nextField() icon-full={{field.ratingOptions.shape}} icon-base=\"fa fa-3x\" icon-empty={{field.ratingOptions.shape}} ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() class=\"angular-input-stars focusOn\"></input-stars></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/statement.html", - "<div class=\"statement field row\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField()><div class=\"row field-title field-title\"><div class=col-xs-1><i class=\"fa fa-quote-left fa-1\"></i></div><h2 class=\"text-left col-xs-9\">{{field.title}}</h2><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"row field-title field-input\"><p class=col-xs-12 ng-if=field.description.length>{{field.description}}</p><br><div class=\"col-xs-offset-1 col-xs-11\"><button class=\"btn focusOn\">ng-style=\"{'font-size': '1.3em', 'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=\"nextField()\"> {{ 'CONTINUE' | translate }}</button></div></div></div>"); + "<div class=\"statement field row\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField()><div class=\"row field-title field-title\"><div class=col-xs-1><i class=\"fa fa-quote-left fa-1\"></i></div><h2 class=\"text-left col-xs-9\">{{field.title}}</h2><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"row field-title field-input\"><p class=col-xs-12 ng-if=field.description.length>{{field.description}}</p><br><div class=\"col-xs-offset-1 col-xs-11\"><button class=\"btn focusOn\" ng-style=\"{'font-size': '1.3em', 'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=nextField()>{{ 'CONTINUE' | translate }}</button></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/textarea.html", - "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><small>{{ 'NEWLINE' | translate }}</small><p><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><small style=font-size:0.6em>Press SHIFT+ENTER to add a newline</small><textarea class=\"textarea focusOn\" type=text ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-class=\"{ 'no-border': !!field.fieldValue }\" value={{field.fieldValue}} ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() style=\"border: none; border-left: lightgrey dashed 2px\">\n" + + "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><small>{{ 'NEWLINE' | translate }}</small><p><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><small style=font-size:0.6em>Press SHIFT+ENTER to add a newline</small><textarea class=\"textarea focusOn\" type=text ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-class=\"{ 'no-border': !!field.fieldValue }\" value={{field.fieldValue}} ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() style=\"border: none; border-left: lightgrey dashed 2px\">\n" + " </textarea></div></div><div><div class=\"btn btn-lg btn-default\" style=\"padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)\"><button ng-disabled=\"!field.fieldValue || forms.myForm.{{field.fieldType}}{{$index}}.$invalid\" ng-style=\"{'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=$root.nextField() class=\"btn col-sm-5 col-xs-5\">{{ 'OK' | translate }} <i class=\"fa fa-check\"></i></button><div class=\"col-sm-3 col-xs-6\" style=margin-top:0.2em><small style=\"color:#ddd; font-size:70%\">{{ 'ENTER' | translate }}</small></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/textfield.html", - "<div class=\"textfield field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title row-fluid\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=col-xs-12><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>({{ 'OPTIONAL' | translate }})</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" name={{field.fieldType}}{{index}} type={{input_type}} ng-pattern=validateRegex placeholder={{placeholder}} ng-class=\"{ 'no-border': !!field.fieldValue }\" class=\"focusOn text-field-input\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" value=field.fieldValue on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() ng-required=field.required aria-describedby=\"inputError2Status\"></div><div class=col-xs-12><div ng-show=\"forms.myForm.{{field.fieldType}}{{index}}.$invalid && !!forms.myForm.{{field.fieldType}}{{index}}.$viewValue \" class=\"alert alert-danger\" role=alert><span class=\"glyphicon glyphicon-exclamation-sign\" aria-hidden=true></span> <span class=sr-only>Error:</span> <span ng-if=\"field.fieldType == 'email'\">{{ 'ERROR_EMAIL_INVALID' | translate }}</span> <span ng-if=\"field.fieldType == 'number'\">{{ 'ERROR_NOT_A_NUMBER' | translate }}</span> <span ng-if=\"field.fieldType == 'link'\">{{ 'ERROR_URL_INVALID' | translate }}</span></div></div></div><div><div class=\"btn btn-lg btn-default\" style=\"padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)\"><button ng-disabled=\"!field.fieldValue || field.$invalid\" ng-style=\"{'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=nextField() class=\"btn col-sm-5 col-xs-5\">{{ 'OK' | translate }} <i class=\"fa fa-check\"></i></button><div class=\"col-xs-6 col-sm-3\" style=margin-top:0.2em><small style=\"color:#ddd; font-size:70%\">{{ 'ENTER' | translate }}</small></div></div></div>"); + "<div class=\"textfield field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title row-fluid\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=col-xs-12><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>({{ 'OPTIONAL' | translate }})</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" name={{field.fieldType}}{{index}} type={{input_type}} ng-pattern=validateRegex placeholder={{placeholder}} ng-class=\"{ 'no-border': !!field.fieldValue }\" class=\"focusOn text-field-input\" ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" value=field.fieldValue on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() ng-required=field.required aria-describedby=\"inputError2Status\"></div><div class=col-xs-12><div ng-show=\"forms.myForm.{{field.fieldType}}{{index}}.$invalid && !!forms.myForm.{{field.fieldType}}{{index}}.$viewValue \" class=\"alert alert-danger\" role=alert><span class=\"glyphicon glyphicon-exclamation-sign\" aria-hidden=true></span> <span class=sr-only>Error:</span> <span ng-if=\"field.fieldType == 'email'\">{{ 'ERROR_EMAIL_INVALID' | translate }}</span> <span ng-if=\"field.fieldType == 'number'\">{{ 'ERROR_NOT_A_NUMBER' | translate }}</span> <span ng-if=\"field.fieldType == 'link'\">{{ 'ERROR_URL_INVALID' | translate }}</span></div></div></div><div><div class=\"btn btn-lg btn-default\" ng-disabled=\"!field.fieldValue || field.$invalid\" style=\"padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)\"><button ng-disabled=\"!field.fieldValue || field.$invalid\" ng-style=\"{'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=nextField() class=\"btn col-sm-5 col-xs-5\">{{ 'OK' | translate }} <i class=\"fa fa-check\"></i></button><div class=\"col-xs-6 col-sm-3\" style=margin-top:0.2em><small style=\"color:#ddd; font-size:70%\">{{ 'ENTER' | translate }}</small></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/yes_no.html", - "<div class=\"field row radio\" ng-click=\"setActiveField(field._id, index, true)\" key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-tab-key=nextField() on-tab-and-shift-key=prevField() on-valid-key=nextField()><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=row><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=row>{{field.description}}</p></div><div class=\"col-xs-12 field-input\"><div class=row><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=true class=focusOn style=\"opacity: 0; margin-left: 0px\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'Y' | translate }}</div><span>{{ 'YES' | translate }}</span> <i ng-show=\"field.fieldValue === 'true'\" class=\"fa fa-check\" aria-hidden=true></i></label></div><div class=row style=\"margin-top: 10px\"><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=false style=\"opacity:0; margin-left:0px\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'N' | translate }}</div><span>{{ 'NO' | translate }}</span> <i ng-show=\"field.fieldValue === 'false'\" class=\"fa fa-check\" aria-hidden=true></i></label></div></div></div><br>"); + "<div class=\"field row radio\" ng-click=\"setActiveField(field._id, index, true)\" key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-tab-key=nextField() on-tab-and-shift-key=prevField() on-valid-key=nextField()><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=row><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=row>{{field.description}}</p></div><div class=\"col-xs-12 field-input\"><div class=row><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=true class=focusOn style=\"opacity: 0; margin-left: 0px\" ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'Y' | translate }}</div><span>{{ 'YES' | translate }}</span> <i ng-show=\"field.fieldValue === 'true'\" class=\"fa fa-check\" aria-hidden=true></i></label></div><div class=row style=\"margin-top: 10px\"><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=false style=\"opacity:0; margin-left:0px\" ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'N' | translate }}</div><span>{{ 'NO' | translate }}</span> <i ng-show=\"field.fieldValue === 'false'\" class=\"fa fa-check\" aria-hidden=true></i></label></div></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html", - "<section class=\"overlay submitform\" ng-if=\"!ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))\"></section><section class=\"overlay previewform submitform\" ng-if=\"ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))\"></section><div ng-show=\"!myform.submitted && myform.startPage.showStart\" class=form-submitted style=\"padding-top: 35vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; nont-size: 25px\" ng-style=\"{'color': form.design.colors.questionColor}\">{{myform.startPage.introTitle}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': form.design.colors.questionColor}\">{{myform.startPage.introParagraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=exitStartPage() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.startPage.introButtonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.startPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div><div class=form-fields ng-show=\"!myform.submitted && !myform.startPage.showStart\" ng-style=\"{ 'border-color': myform.design.colors.buttonTextColor }\"><div class=row><form name=forms.myForm novalidate class=\"submission-form col-sm-12 col-md-offset-1 col-md-10\"><div ng-repeat=\"field in myform.form_fields\" ng-if=!field.deletePreserved data-index={{$index}} data-id={{field._id}} ng-class=\"{activeField: selected._id == field._id }\" class=\"row field-directive\"><field-directive field=field design=myform.design index=$index forms=forms></field-directive></div></form></div><div class=\"row form-actions\" id=submit_field ng-class=\"{activeField: selected._id == 'submit_field' }\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor}\" style=\"border-top: 1px solid #ddd; margin-right: -13%; margin-left: -13%; margin-top: 30vh; height: 100vh\"><div class=\"col-xs-12 text-left\" style=\"background-color:#990000; color:white\" ng-if=forms.myForm.$invalid>{{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }}</div><button ng-if=!forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" v-busy=loading v-busy-label=\"Please wait\" v-pressable ng-disabled=\"loading || forms.myForm.$invalid\" ng-click=submitForm() on-enter-key=submitForm() on-enter-key-disabled=\"loading || forms.myForm.$invalid\" ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em\">{{ 'SUBMIT' | translate }}</button> <button ng-if=forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" ng-click=goToInvalid() on-enter-key=goToInvalid() on-enter-key-disabled=!forms.myForm.$invalid style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white\">{{ 'REVIEW' | translate }}</button><div class=\"col-sm-2 hidden-xs\" style=\"font-size: 75%; margin-top:3.25em\"><small>{{ 'ENTER' | translate }}</small></div></div><section ng-if=!myform.hideFooter class=\"navbar navbar-fixed-bottom\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor, 'padding-top': '15px', 'border-top': '2px '+ myform.design.colors.buttonTextColor +' solid', 'color':myform.design.colors.buttonTextColor}\"><div class=container-fluid><div class=row><div class=\"col-sm-5 col-md-6 col-xs-5\" ng-show=!myform.submitted><p class=lead>{{ 'ADVANCEMENT' | translate:translateAdvancementData }}</p></div><div class=\"col-md-6 col-md-offset-0 col-sm-offset-2 col-sm-3 col-xs-offset-1 col-xs-6 row\"><div class=\"col-md-4 col-md-offset-2 hidden-sm hidden-xs\"><a href=/#!/forms class=btn ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\">{{ 'CREATE_FORM' | translate }}</a></div><div class=\"col-md-4 col-sm-10 col-md-offset-0 col-sm-offset-2 col-xs-12 row\"><button class=\"btn btn-lg col-xs-6\" id=focusDownButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=nextField() ng-disabled=\"selected.index > myform.form_fields.length-1\"><i class=\"fa fa-chevron-down\"></i></button> <button class=\"btn btn-lg col-xs-6\" id=focusUpButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=prevField() ng-disabled=\"selected.index == 0\"><i class=\"fa fa-chevron-up\"></i></button></div></div></div></div></section></div><div ng-if=\"myform.submitted && !loading && !myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=\"field row text-center\" ng-style=\"{'color': myform.design.colors.questionColor}\"><div class=\"col-xs-12 col-sm-12 col-md-6 col-md-offset-3 text-center\">{{ 'FORM_SUCCESS' | translate }}</div></div><div class=\"row form-actions\"><p class=text-center><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{ 'BACK_TO_FORM' | translate }}</span></button></p></div></div><div ng-if=\"myform.submitted && !loading && myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; font-size: 25px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.title}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.paragraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.endPage.buttonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.endPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div>"); + "<div ng-show=\"!myform.submitted && myform.startPage.showStart\" class=form-submitted style=\"padding-top: 35vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; nont-size: 25px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.startPage.introTitle}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.startPage.introParagraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=exitStartPage() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.startPage.introButtonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.startPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div><div class=form-fields ng-show=\"!myform.submitted && !myform.startPage.showStart\" ng-style=\"{ 'border-color': myform.design.colors.buttonTextColor }\"><div class=\"row form-field-wrapper\"><form name=forms.myForm novalidate class=submission-form><div ng-repeat=\"field in myform.form_fields\" ng-if=!field.deletePreserved data-index={{$index}} data-id={{field._id}} ng-class=\"{activeField: selected._id == field._id }\" class=\"row field-directive\"><field-directive field=field design=myform.design index=$index forms=forms></field-directive></div><div class=\"row form-actions\" id=submit_field ng-class=\"{activeField: selected._id == 'submit_field' }\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor}\" style=\"border-top: 1px solid #ddd; margin-top: 30vh; height: 100vh; margin-left: 1%; margin-right: 1%\" on-tab-and-shift-key=prevField() on-tab-key=nextField() on-enter-key=submitForm()><div class=\"col-xs-12 text-left\" style=\"background-color:#990000; color:white\" ng-if=forms.myForm.$invalid>{{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }}</div><button ng-if=!forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" v-busy=loading v-busy-label=\"Please wait\" v-pressable ng-disabled=\"loading || forms.myForm.$invalid\" ng-click=submitForm() on-enter-key-disabled=\"loading || forms.myForm.$invalid\" ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em\">{{ 'SUBMIT' | translate }}</button> <button ng-if=forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" ng-click=goToInvalid() on-enter-key=goToInvalid() on-enter-key-disabled=!forms.myForm.$invalid style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white\">{{ 'REVIEW' | translate }}</button><div class=\"col-sm-2 hidden-xs\" style=\"font-size: 75%; margin-top:3.25em\"><small>{{ 'ENTER' | translate }}</small></div></div></form></div><section ng-if=!myform.hideFooter class=\"navbar navbar-fixed-bottom\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor, 'padding-top': '15px', 'border-top': '2px '+ myform.design.colors.buttonTextColor +' solid', 'color':myform.design.colors.buttonTextColor}\"><div class=container-fluid><div class=row><div class=\"col-sm-5 col-md-6 col-xs-5\" ng-show=!myform.submitted><p class=lead>{{ 'ADVANCEMENT' | translate:translateAdvancementData }}</p></div><div class=\"col-md-6 col-md-offset-0 col-sm-offset-2 col-sm-3 col-xs-offset-1 col-xs-6 row\"><div class=\"col-md-4 col-md-offset-2 hidden-sm hidden-xs\"><a href=/#!/forms class=btn ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\">{{ 'CREATE_FORM' | translate }}</a></div><div class=\"col-md-4 col-sm-10 col-md-offset-0 col-sm-offset-2 col-xs-12 row\"><button class=\"btn btn-lg col-xs-6\" id=focusDownButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=nextField() ng-disabled=\"selected.index > myform.form_fields.length-1\"><i class=\"fa fa-chevron-down\"></i></button> <button class=\"btn btn-lg col-xs-6\" id=focusUpButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=prevField() ng-disabled=\"selected.index == 0\"><i class=\"fa fa-chevron-up\"></i></button></div></div></div></div></section></div><div ng-if=\"myform.submitted && !loading && !myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=\"field row text-center\" ng-style=\"{'color': myform.design.colors.questionColor}\"><div class=\"col-xs-12 col-sm-12 col-md-6 col-md-offset-3 text-center\">{{ 'FORM_SUCCESS' | translate }}</div></div><div class=\"row form-actions\"><p class=text-center><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{ 'BACK_TO_FORM' | translate }}</span></button></p></div></div><div ng-if=\"myform.submitted && !loading && myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; font-size: 25px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.title}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.paragraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.endPage.buttonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.endPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div>"); + $templateCache.put("form_modules/forms/base/views/form-not-found.client.view.html", + "<script>$(\".loader\").fadeOut(\"slow\");</script><section class=\"public-form auth sigin-view valign-wrapper\"><div class=\"row valign\"><h3 class=\"col-md-12 text-center\">404 - Form Does not Exist</h3><div class=\"col-md-4 col-md-offset-4\"><div class=\"col-md-12 text-center\" style=\"padding-bottom: 50px\">The form you are trying to access does not exist. Sorry about that!</div></div></div></section>"); $templateCache.put("form_modules/forms/base/views/form-unauthorized.client.view.html", - "<section class=\"auth sigin-view valign-wrapper\"><div class=\"row valign\"><h3 class=\"col-md-12 text-center\">Not Authorized to Access Form</h3><div class=\"col-md-4 col-md-offset-4\"><div class=\"col-md-12 text-center\" style=\"padding-bottom: 50px\">The form you are trying to access is currently private and not accesible publically.<br>If you are the owner of the form, you can set it to \"Public\" in the \"Configuration\" panel in the form admin.</div></div></div></section>"); + "<script>$(\".loader\").fadeOut(\"slow\");</script><section class=\"public-form auth sigin-view valign-wrapper\"><div class=\"row valign\"><h3 class=\"col-md-12 text-center\">Not Authorized to Access Form</h3><div class=\"col-md-4 col-md-offset-4\"><div class=\"col-md-12 text-center\" style=\"padding-bottom: 50px\">The form you are trying to access is currently private and not accesible publically.<br>If you are the owner of the form, you can set it to \"Public\" in the \"Configuration\" panel in the form admin.</div></div></div></section>"); $templateCache.put("form_modules/forms/base/views/submit-form.client.view.html", - "<section class=public-form ng-style=\"{ 'background-color': myform.design.colors.backgroundColor }\"><submit-form-directive myform=myform></submit-form-directive></section><script ng-if=myform.analytics.gaCode>window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;\n" + + "<section class=public-form><submit-form-directive myform=myform></submit-form-directive></section><script ng-if=myform.analytics.gaCode>window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;\n" + " ga('create', '{{myform.analytics.gaCode}}', 'auto'); ga('send', 'pageview');</script><script ng-if=myform.analytics.gaCode src=https://www.google-analytics.com/analytics.js async defer></script>"); }]); @@ -1029,7 +1031,21 @@ angular.module('forms').config(['$stateProvider', $stateProvider. state('listForms', { url: '/forms', - templateUrl: 'modules/forms/admin/views/list-forms.client.view.html' + templateUrl: 'modules/forms/admin/views/list-forms.client.view.html', + resolve: { + Forms: 'GetForms', + myForms: ["GetForms", "$q", function (GetForms, $q) { + var deferred = $q.defer(); + + GetForms.query(function(forms){ + deferred.resolve(forms); + }); + + return deferred.promise; + }] + }, + controller: 'ListFormsController', + controllerAs: 'ctrl' }).state('submitForm', { url: '/forms/:formId', templateUrl: '/static/form_modules/forms/base/views/submit-form.client.view.html', @@ -1777,6 +1793,7 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo $scope.animationsEnabled = true; $scope.myform = myForm; $rootScope.saveInProgress = false; + $scope.oldForm = _.cloneDeep($scope.myform); CurrentForm.setForm($scope.myform); @@ -1803,13 +1820,23 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo } }; - $scope.tabData = [ + $scope.tabData = [ { heading: $filter('translate')('CONFIGURE_TAB'), templateName: 'configure' } ]; + $scope.designTabActive = false + + $scope.deactivateDesignTab = function(){ + $scope.designTabActive = false + } + + $scope.activateDesignTab = function(){ + $scope.designTabActive = true + } + $scope.setForm = function(form){ $scope.myform = form; }; @@ -1863,16 +1890,20 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo } }; - // Update existing Form - $scope.update = $rootScope.update = function(updateImmediately, data, isDiffed, refreshAfterUpdate, cb){ - refreshFrame(); + $scope.updateDesign = function(updateImmediately, data, shouldDiff, refreshAfterUpdate){ + $scope.update(updateImmediately, data, shouldDiff, refreshAfterUpdate, function(){ + refreshFrame(); + }); + } + // Update existing Form + $scope.update = $rootScope.update = function(updateImmediately, data, shouldDiff, refreshAfterUpdate, cb){ var continueUpdate = true; if(!updateImmediately){ continueUpdate = !$rootScope.saveInProgress; } - //Update form **if we are not currently updating** or if **shouldUpdateNow flag is set** + //Update form **if we are not in the middle of an update** or if **shouldUpdateNow flag is set** if(continueUpdate) { var err = null; @@ -1880,11 +1911,24 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo $rootScope.saveInProgress = true; } - if (isDiffed) { + if (shouldDiff) { + //Do this so we can create duplicate fields + var checkForValidId = new RegExp('^[0-9a-fA-F]{24}$'); + for(var i=0; i < $scope.myform.form_fields.length; i++){ + var field = $scope.myform.form_fields[i]; + if(!checkForValidId.exec(field._id+'')){ + delete $scope.myform.form_fields[i]._id; + delete $scope.myform.form_fields[i].id; + } + } + + var data = DeepDiff.diff($scope.oldForm, $scope.myform); + $scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {changes: data}) .then(function (response) { if (refreshAfterUpdate) { $rootScope.myform = $scope.myform = response.data; + $scope.oldForm = _.cloneDeep($scope.myform); } }).catch(function (response) { err = response.data; @@ -1907,6 +1951,22 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo delete dataToSend.submissions; } + if(dataToSend.visible_form_fields){ + delete dataToSend.visible_form_fields; + } + + if(dataToSend.analytics){ + delete dataToSend.analytics.visitors; + delete dataToSend.analytics.fields; + delete dataToSend.analytics.submissions; + delete dataToSend.analytics.views; + delete dataToSend.analytics.conversionRate; + } + + delete dataToSend.created; + delete dataToSend.lastModified; + delete dataToSend.__v; + $scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {form: dataToSend}) .then(function (response) { if (refreshAfterUpdate) { @@ -1935,12 +1995,13 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo 'use strict'; // Forms controller -angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope', '$stateParams', '$state', 'GetForms', 'CurrentForm', '$http', '$uibModal', - function($rootScope, $scope, $stateParams, $state, GetForms, CurrentForm, $http, $uibModal) { +angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope', '$stateParams', '$state', 'GetForms', 'CurrentForm', '$http', '$uibModal', 'myForms', + function($rootScope, $scope, $stateParams, $state, GetForms, CurrentForm, $http, $uibModal, myForms) { $scope = $rootScope; $scope.forms = {}; $scope.showCreateModal = false; + $scope.myforms = myForms $rootScope.languageRegExp = { regExp: /[@!#$%^&*()\-+={}\[\]|\\/'";:`.,~№?<>]+/i, @@ -1983,13 +2044,6 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope } }; - // Return all user's Forms - $scope.findAll = function() { - GetForms.query(function(_forms){ - $scope.myforms = _forms; - }); - }; - //Modal functions $scope.openCreateModal = function(){ if(!$scope.showCreateModal){ @@ -2084,6 +2138,7 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt } ]); + 'use strict'; angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormFields', '$uibModal', @@ -2109,7 +2164,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField forceHelperSize: true, forcePlaceholderSize: true, update: function(e, ui) { - $scope.update(false, $scope.myform, false, false, function(err){ + $scope.update(false, $scope.myform, true, false, function(err){ }); }, }; @@ -2117,7 +2172,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField /* ** EditModal Functions */ - $scope.openEditModal = function(curr_field){ + $scope.openEditModal = function(curr_field, isEdit, field_index){ $scope.editFieldModal = $uibModal.open({ animation: true, templateUrl: 'editFieldModal.html', @@ -2126,9 +2181,11 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField $scope.field = curr_field; $scope.showLogicJump = false; + $scope.isEdit = isEdit; + // decides whether field options block will be shown (true for dropdown and radio fields) $scope.showAddOptions = function (field){ - if(field.fieldType === 'dropdown' || field.fieldType === 'checkbox' || field.fieldType === 'radio'){ + if($scope.field.fieldType === 'dropdown' || $scope.field.fieldType === 'checkbox' || $scope.field.fieldType === 'radio'){ return true; } else { return false; @@ -2152,13 +2209,13 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField ]; // add new option to the field - $scope.addOption = function(currField){ - if(currField.fieldType === 'checkbox' || currField.fieldType === 'dropdown' || currField.fieldType === 'radio'){ - if(!currField.fieldOptions){ - currField.fieldOptions = []; + $scope.addOption = function(){ + if($scope.field.fieldType === 'checkbox' || $scope.field.fieldType === 'dropdown' || $scope.field.fieldType === 'radio'){ + if(!$scope.field.fieldOptions){ + $scope.field.fieldOptions = []; } - var lastOptionID = currField.fieldOptions.length+1; + var lastOptionID = $scope.field.fieldOptions.length+1; // new option's id @@ -2169,17 +2226,17 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; // put new option into fieldOptions array - currField.fieldOptions.push(newOption); + $scope.field.fieldOptions.push(newOption); } }; // delete particular option - $scope.deleteOption = function (currField, option){ - if(currField.fieldType === 'checkbox' || currField.fieldType === 'dropdown' || currField.fieldType === 'radio'){ - for(var i = 0; i < currField.fieldOptions.length; i++){ - if(currField.fieldOptions[i].option_id === option.option_id){ + $scope.deleteOption = function (option){ + if($scope.field.fieldType === 'checkbox' || $scope.field.fieldType === 'dropdown' || $scope.field.fieldType === 'radio'){ + for(var i = 0; i < $scope.field.fieldOptions.length; i++){ + if($scope.field.fieldOptions[i].option_id === option.option_id){ - currField.fieldOptions.splice(i, 1); + $scope.field.fieldOptions.splice(i, 1); break; } } @@ -2204,8 +2261,8 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; // decides whether field options block will be shown (true for dropdown and radio fields) - $scope.showRatingOptions = function (field){ - if(field.fieldType === 'rating'){ + $scope.showRatingOptions = function (){ + if($scope.field.fieldType === 'rating'){ return true; } else { return false; @@ -2213,11 +2270,16 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; $scope.saveField = function(){ + if($scope.isEdit){ + $scope.myform.form_fields[field_index] = $scope.field; + } else { + $scope.myform.form_fields.push(curr_field); + } - $scope.myform.form_fields.push(curr_field); - $scope.$parent.update(false, $scope.$parent.myform, false, true, function(){ + $scope.$parent.update(false, $scope.$parent.myform, true, true, function(){ $uibModalInstance.close(); }); + }; $scope.cancel = function(){ $uibModalInstance.close(); @@ -2270,7 +2332,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; $scope.saveStartPage = function(){ - $scope.$parent.update(false, $scope.$parent.myform, false, true, function(){ + $scope.$parent.update(false, $scope.$parent.myform, true, true, function(){ $uibModalInstance.close(); }); }; @@ -2282,7 +2344,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; /* - ** EditStartPageModal Functions + ** EditEndPageModal Functions */ $scope.openEditEndPageModal = function(){ $scope.editEndPageModal = $uibModal.open({ @@ -2325,7 +2387,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; $scope.saveEndPage = function(){ - $scope.$parent.update(false, $scope.$parent.myform, false, true, function(){ + $scope.$parent.update(false, $scope.$parent.myform, true, true, function(){ $uibModalInstance.close(); }); }; @@ -2353,7 +2415,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField ** Field CRUD Methods */ // Add a new field - $scope.addNewField = function(modifyForm, fieldType){ + $scope.addNewField = function(fieldType){ // increment lastAddedID counter $scope.addField.lastAddedID++; var fieldTitle = fieldType; @@ -2392,12 +2454,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }); } - if(modifyForm){ - //Add newField to form_fields array - $scope.myform.form_fields.push(newField); - } - - $scope.openEditModal(newField); + $scope.openEditModal(newField, false, $scope.myform.form_fields.length); }; // decides whether field options block will be shown (true for dropdown and radio fields) @@ -2466,27 +2523,10 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', rows: [] }; - var submissions = $scope.myform.submissions || []; - - //Iterate through form's submissions - for(var i = 0; i < submissions.length; i++){ - for(var x = 0; x < submissions[i].form_fields.length; x++){ - if(submissions[i].form_fields[x].fieldType === 'dropdown'){ - submissions[i].form_fields[x].fieldValue = submissions[i].form_fields[x].fieldValue.option_value; - } - //var oldValue = submissions[i].form_fields[x].fieldValue || ''; - //submissions[i].form_fields[x] = _.merge(defaultFormFields, submissions[i].form_fields); - //submissions[i].form_fields[x].fieldValue = oldValue; - } - submissions[i].selected = false; - } - - $scope.table.rows = submissions; - var initController = function(){ $http({ method: 'GET', - url: '/someUrl' + url: '/forms'+$scope.myform._id+'/submissions' }).then(function successCallback(response) { var defaultFormFields = _.cloneDeep($scope.myform.form_fields); @@ -2509,6 +2549,8 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', }); }; + initController(); + /* ** Analytics Functions @@ -3465,18 +3507,6 @@ ApplicationConfiguration.registerModule('view-form', [ deviceType = 'desktop'; } - $.ajaxSetup( { 'async': false } ); - var geoData = $.getJSON('https://freegeoip.net/json/').responseJSON; - $.ajaxSetup( { 'async': true } ); - - if(!geoData){ - geoData = { - ip: '', - city: '', - country_name: '' - }; - } - // Create a new message object var visitorData = { referrer: document.referrer, @@ -3486,11 +3516,8 @@ ApplicationConfiguration.registerModule('view-form', [ timeElapsed: timeElapsed, language: lang, deviceType: deviceType, - ipAddr: geoData.ip, - geoLocation: { - city: geoData.city, - country: geoData.country_name - } + ipAddr: null, + geoLocation: null }; Socket.emit('form-visitor-data', visitorData); @@ -3822,6 +3849,9 @@ angular.module('view-form').controller('SubmitFormController', [ '$scope', '$rootScope', '$state', '$translate', 'myForm', function($scope, $rootScope, $state, $translate, myForm) { $scope.myform = myForm; + + $(".loader").fadeOut("slow"); + document.body.style.background = myForm.design.colors.backgroundColor; $translate.use(myForm.language); } ]); @@ -3995,7 +4025,7 @@ angular.module('view-form').directive('onEnterKey', ['$rootScope', function($roo return { restrict: 'A', link: function($scope, $element, $attrs) { - $element.bind('keydown keypress', function(event) { + $element.bind('keyup keypress', function(event) { var keyCode = event.which || event.keyCode; @@ -4035,6 +4065,8 @@ angular.module('view-form').directive('onEnterKey', ['$rootScope', function($roo var keyCode = event.which || event.keyCode; if(keyCode === 9 && event.shiftKey) { + + console.log('onTabAndShiftKey'); event.preventDefault(); $rootScope.$apply(function() { $rootScope.$eval($attrs.onTabAndShiftKey); @@ -4083,8 +4115,8 @@ jsep.addBinaryOp('!begins', 10); jsep.addBinaryOp('ends', 10); jsep.addBinaryOp('!ends', 10); -angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCounter', '$filter', '$rootScope', 'SendVisitorData', '$translate', - function ($http, TimeCounter, $filter, $rootScope, SendVisitorData, $translate) { +angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCounter', '$filter', '$rootScope', 'SendVisitorData', '$translate', '$timeout', + function ($http, TimeCounter, $filter, $rootScope, SendVisitorData, $translate, $timeout) { return { templateUrl: 'form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html', restrict: 'E', @@ -4093,7 +4125,8 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun ispreview: '=' }, controller: ["$document", "$window", "$scope", function($document, $window, $scope){ - $scope.noscroll = false; + var NOSCROLL = false; + var FORM_ACTION_ID = 'submit_field'; $scope.forms = {}; //Don't start timer if we are looking at a design preview @@ -4133,99 +4166,64 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun TimeCounter.restartClock(); }; - //Fire event when window is scrolled - $window.onscroll = function(){ - $scope.scrollPos = document.body.scrollTop || document.documentElement.scrollTop || 0; - var elemBox = document.getElementsByClassName('activeField')[0].getBoundingClientRect(); - $scope.fieldTop = elemBox.top; - $scope.fieldBottom = elemBox.bottom; - - var field_id; - var field_index; - - if(!$scope.noscroll){ - //Focus on submit button - if( $scope.selected.index === $scope.myform.visible_form_fields.length-1 && $scope.fieldBottom < 200){ - field_index = $scope.selected.index+1; - field_id = 'submit_field'; - $scope.setActiveField(field_id, field_index, false); - } - //Focus on field above submit button - else if($scope.selected.index === $scope.myform.visible_form_fields.length){ - if($scope.fieldTop > 200){ - field_index = $scope.selected.index-1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); - } - } else if( $scope.fieldBottom < 0){ - field_index = $scope.selected.index+1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); - } else if ( $scope.selected.index !== 0 && $scope.fieldTop > 0) { - field_index = $scope.selected.index-1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); - } - $scope.$apply(); - } - }; - /* ** Field Controls */ var evaluateLogicJump = function(field){ var logicJump = field.logicJump; - if (logicJump.expressionString && logicJump.valueB && field.fieldValue) { - var parse_tree = jsep(logicJump.expressionString); - var left, right; + if(logicJump.enabled){ + if (logicJump.expressionString && logicJump.valueB && field.fieldValue) { + var parse_tree = jsep(logicJump.expressionString); + var left, right; - if(parse_tree.left.name === 'field'){ - left = field.fieldValue; - right = logicJump.valueB; - } else { - left = logicJump.valueB; - right = field.fieldValue; - } - - if(field.fieldType === 'number' || field.fieldType === 'scale' || field.fieldType === 'rating'){ - switch(parse_tree.operator) { - case '==': - return (parseInt(left) === parseInt(right)); - case '!==': - return (parseInt(left) !== parseInt(right)); - case '>': - return (parseInt(left) > parseInt(right)); - case '>=': - return (parseInt(left) > parseInt(right)); - case '<': - return (parseInt(left) < parseInt(right)); - case '<=': - return (parseInt(left) <= parseInt(right)); - default: - return false; + if(parse_tree.left.name === 'field'){ + left = field.fieldValue; + right = logicJump.valueB; + } else { + left = logicJump.valueB; + right = field.fieldValue; } - } else { - switch(parse_tree.operator) { - case '==': - return (left === right); - case '!==': - return (left !== right); - case 'contains': - return (left.indexOf(right) > -1); - case '!contains': - /* jshint -W018 */ - return !(left.indexOf(right) > -1); - case 'begins': - return left.startsWith(right); - case '!begins': - return !left.startsWith(right); - case 'ends': - return left.endsWith(right); - case '!ends': - return left.endsWith(right); - default: - return false; + + if(field.fieldType === 'number' || field.fieldType === 'scale' || field.fieldType === 'rating'){ + switch(parse_tree.operator) { + case '==': + return (parseInt(left) === parseInt(right)); + case '!==': + return (parseInt(left) !== parseInt(right)); + case '>': + return (parseInt(left) > parseInt(right)); + case '>=': + return (parseInt(left) > parseInt(right)); + case '<': + return (parseInt(left) < parseInt(right)); + case '<=': + return (parseInt(left) <= parseInt(right)); + default: + return false; + } + } else { + switch(parse_tree.operator) { + case '==': + return (left === right); + case '!==': + return (left !== right); + case 'contains': + return (left.indexOf(right) > -1); + case '!contains': + /* jshint -W018 */ + return !(left.indexOf(right) > -1); + case 'begins': + return left.startsWith(right); + case '!begins': + return !left.startsWith(right); + case 'ends': + return left.endsWith(right); + case '!ends': + return left.endsWith(right); + default: + return false; + } } } } @@ -4237,35 +4235,46 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun throw new Error('current active field is null'); } - if($scope.selected._id === 'submit_field') { + if($scope.selected._id === FORM_ACTION_ID) { return $scope.myform.form_fields.length - 1; } return $scope.selected.index; + }; + $scope.isActiveField = function(field){ + if($scope.selected._id === field._id) { + return true + } + return false; }; $scope.setActiveField = $rootScope.setActiveField = function(field_id, field_index, animateScroll) { - if($scope.selected === null || $scope.selected._id === field_id){ - //console.log('not scrolling'); - //console.log($scope.selected); - return; - } - //console.log('field_id: '+field_id); - //console.log('field_index: '+field_index); - //console.log($scope.selected); + if($scope.selected === null || (!field_id && field_index === null) ) { + return; + } + + if(!field_id){ + field_id = $scope.myform.visible_form_fields[field_index]._id; + } else if(field_index === null){ + field_index = $scope.myform.visible_form_fields.length - $scope.selected._id = field_id; - $scope.selected.index = field_index; - if(!field_index){ - for(var i=0; i<$scope.myform.visible_form_fields.length; i++){ + for(var i=0; i < $scope.myform.visible_form_fields.length; i++){ var currField = $scope.myform.visible_form_fields[i]; - if(field_id === currField._id){ - $scope.selected.index = i; + if(currField['_id'] == field_id){ + field_index = i; break; } } } + if($scope.selected._id === field_id){ + return; + } + + $scope.selected._id = field_id; + $scope.selected.index = field_index; + + var nb_valid = $filter('formValidity')($scope.myform); $scope.translateAdvancementData = { done: nb_valid, @@ -4274,10 +4283,10 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun }; if(animateScroll){ - $scope.noscroll=true; + NOSCROLL=true; setTimeout(function() { $document.scrollToElement(angular.element('.activeField'), -10, 200).then(function() { - $scope.noscroll = false; + NOSCROLL = false; setTimeout(function() { if (document.querySelectorAll('.activeField .focusOn').length) { //Handle default case @@ -4292,54 +4301,109 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun }); }); }); - } else { - setTimeout(function() { - if (document.querySelectorAll('.activeField .focusOn')[0]) { - //FIXME: DAVID: Figure out how to set focus without scroll movement in HTML Dom - document.querySelectorAll('.activeField .focusOn')[0].focus(); - } else if (document.querySelectorAll('.activeField input')[0]){ - document.querySelectorAll('.activeField input')[0].focus(); - } - }); - } - - //Only send analytics data if form has not been submitted - if(!$scope.myform.submitted){ - SendVisitorData.send($scope.myform, getActiveField(), TimeCounter.getTimeElapsed()); - } + } }; - $rootScope.nextField = $scope.nextField = function(){ - var currField = $scope.myform.visible_form_fields[$scope.selected.index]; - - if($scope.selected && $scope.selected.index > -1){ - //Jump to logicJump's destination if it is true - if(currField.logicJump && evaluateLogicJump(currField)){ - $rootScope.setActiveField(currField.logicJump.jumpTo, null, true); - } else { - var selected_index, selected_id; - if($scope.selected.index < $scope.myform.visible_form_fields.length-1){ - selected_index = $scope.selected.index+1; - selected_id = $scope.myform.visible_form_fields[selected_index]._id; - $rootScope.setActiveField(selected_id, selected_index, true); - } else if($scope.selected.index === $scope.myform.visible_form_fields.length-1) { - selected_index = $scope.selected.index+1; - selected_id = 'submit_field'; - $rootScope.setActiveField(selected_id, selected_index, true); - } + $scope.$watch('selected.index', function(oldValue, newValue){ + if(oldValue !== newValue && newValue < $scope.myform.form_fields.length){ + //Only send analytics data if form has not been submitted + if(!$scope.myform.submitted){ + console.log('SendVisitorData.send()'); + SendVisitorData.send($scope.myform, newValue, TimeCounter.getTimeElapsed()); } - } + } + }); + //Fire event when window is scrolled + $window.onscroll = function(){ + if(!NOSCROLL){ + + var scrollTop = $(window).scrollTop(); + var elemBox = document.getElementsByClassName('activeField')[0].getBoundingClientRect(); + var fieldTop = elemBox.top; + var fieldBottom = elemBox.bottom; + + var field_id, field_index; + var elemHeight = $('.activeField').height(); + + var submitSectionHeight = $('.form-actions').height(); + var maxScrollTop = $(document).height() - $(window).height(); + var fieldWrapperHeight = $('form_fields').height(); + + var selector = 'form > .field-directive:nth-of-type(' + String($scope.myform.visible_form_fields.length - 1)+ ')' + var fieldDirectiveHeight = $(selector).height() + var scrollPosition = maxScrollTop - submitSectionHeight - fieldDirectiveHeight*1.2; + + var fractionToJump = 0.9; + + //Focus on field above submit form button + if($scope.selected.index === $scope.myform.visible_form_fields.length){ + if(scrollTop < scrollPosition){ + field_index = $scope.selected.index-1; + $scope.setActiveField(null, field_index, false); + } + } + + //Focus on submit form button + else if($scope.selected.index === $scope.myform.visible_form_fields.length-1 && scrollTop > scrollPosition){ + field_index = $scope.selected.index+1; + $scope.setActiveField(FORM_ACTION_ID, field_index, false); + } + + //If we scrolled bellow the current field, move to next field + else if(fieldBottom < elemHeight * fractionToJump && $scope.selected.index < $scope.myform.visible_form_fields.length-1 ){ + field_index = $scope.selected.index+1; + $scope.setActiveField(null, field_index, false); + } + //If we scrolled above the current field, move to prev field + else if ( $scope.selected.index !== 0 && fieldTop > elemHeight * fractionToJump) { + field_index = $scope.selected.index-1; + $scope.setActiveField(null, field_index, false); + } + } + + $scope.$apply(); + }; + + $rootScope.nextField = $scope.nextField = function(){ + if($scope.selected && $scope.selected.index > -1){ + + if($scope.selected._id !== FORM_ACTION_ID){ + var currField = $scope.myform.visible_form_fields[$scope.selected.index]; + + //Jump to logicJump's destination if it is true + if(currField.logicJump && currField.logicJump.jumpTo && evaluateLogicJump(currField)){ + $scope.setActiveField(currField.logicJump.jumpTo, null, true); + } else if($scope.selected.index < $scope.myform.visible_form_fields.length-1){ + $scope.setActiveField(null, $scope.selected.index+1, true); + } else { + $scope.setActiveField(FORM_ACTION_ID, null, true); + } + } else { + //If we are at the submit actions page, go to the first field + $rootScope.setActiveField(null, 0, true); + } + } else { + //If selected is not defined go to the first field + $rootScope.setActiveField(null, 0, true); + } + }; $rootScope.prevField = $scope.prevField = function(){ + console.log('prevField'); + console.log($scope.selected); + var selected_index = $scope.selected.index - 1; if($scope.selected.index > 0){ - var selected_index = $scope.selected.index - 1; - var selected_id = $scope.myform.visible_form_fields[selected_index]._id; - $scope.setActiveField(selected_id, selected_index, true); + $scope.setActiveField(null, selected_index, true); } }; + $rootScope.goToInvalid = $scope.goToInvalid = function() { + var field_id = $('.row.field-directive .ng-invalid.focusOn, .row.field-directive .ng-untouched.focusOn:not(.ng-valid)').first().parents('.row.field-directive').first().attr('data-id'); + $scope.setActiveField(field_id, null, true); + }; + /* ** Form Display Functions */ @@ -4350,10 +4414,6 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun } }; - $rootScope.goToInvalid = $scope.goToInvalid = function() { - document.querySelectorAll('.ng-invalid.focusOn')[0].focus(); - }; - var getDeviceData = function(){ var md = new MobileDetect(window.navigator.userAgent); var deviceType = 'other'; @@ -4394,6 +4454,10 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun }; $rootScope.submitForm = $scope.submitForm = function() { + if($scope.forms.myForm.$invalid){ + $scope.goToInvalid(); + return; + } var _timeElapsed = TimeCounter.stopClock(); $scope.loading = true; diff --git a/public/dist/application.min.css b/public/dist/application.min.css index 755f1c6a..d5dfc184 100644 --- a/public/dist/application.min.css +++ b/public/dist/application.min.css @@ -1,4 +1,4 @@ .navbar,.navbar-nav,.navbar-nav>li{min-height:60px}.image-background,.opacity-background{position:fixed;height:100%;width:100%;top:0;left:0}.btn-rounded,.field-title-row,section.auth .btn{text-transform:uppercase}.form-item .title-row>.list-group-item-heading{color:#34628a}.form-item.paused .title-row>.list-group-item-heading,.form-item:hover .title-row>.list-group-item-heading{color:#fff}.form-item:hover .title-row{text-decoration:none}body{overflow-x:hidden;font-family:'Source Sans Pro',sans-serif;font-size:16px}.vcenter{display:inline-block;vertical-align:middle;float:none}.btn-rounded{border-radius:100px;font-size:14px;padding:10px 28px;margin:1em 2px 0;text-decoration:none!important}.current-fields .panel-heading a:hover,.current-fields .tool-panel.panel .panel-heading a:hover,.footer-basic-centered .footer-links a,.undecorated-link:hover{text-decoration:none}.btn-secondary{background:#DDD;color:#4c4c4c;border:2px solid #4c4c4c}.btn-secondary:hover{background:#cacaca;border-color:#cacaca}.navbar{padding:10px 0}.navbar-inverse{background-color:#3FA2F7;border:0;color:#fff!important}.navbar .navbar-brand{min-height:60px;padding:10px}.navbar-nav>li>a{padding-top:20px;color:#fff}.navbar-nav>li.active,.navbar-nav>li:hover{background-color:#4b7096}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:transparent;color:inherit;border:none}.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar li.dropdown a.dropdown-toggle:hover>*{color:#f9f9f9}.navbar-inverse .navbar-toggle{border:none}.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.dropdown-menu>li>a{color:#515151}section.hero-section{width:100%}section.hero-section .jumbotron{background-color:transparent;color:#fff}.image-background{z-index:-98;background-image:url(http://yourplaceandmine.ie/wp-content/uploads/2014/09/Daingean-meeting-048_13-1080x675.jpg);background-repeat:no-repeat;background-position:0 50%;background-size:cover}.opacity-background{background-color:#000;background-color:rgba(0,0,0,.5);z-index:-97}section.hero-section .jumbotron .signup-btn{background-color:#FA787E;border:none;font-size:2em;padding:.3em .9em;color:#fff}.footer-basic-centered{background-color:#292c2f;box-shadow:0 1px 1px 0 rgba(0,0,0,.12);box-sizing:border-box;width:100%;text-align:center;font:400 18px sans-serif;padding:45px;margin-top:80px}.footer-basic-centered .footer-company-motto{color:#8d9093;font-size:24px;margin:0}.footer-basic-centered .footer-company-name{color:#8f9296;font-size:14px;margin:0}.footer-basic-centered .footer-links{list-style:none;font-weight:700;color:#fff;padding:35px 0 23px;margin:0}.footer-basic-centered .footer-links a{display:inline-block;color:inherit}@media (max-width:600px){.footer-basic-centered{padding:35px}.footer-basic-centered .footer-company-motto{font-size:18px}.footer-basic-centered .footer-company-name{font-size:12px}.footer-basic-centered .footer-links{font-size:14px;padding:25px 0 20px}.footer-basic-centered .footer-links a{line-height:1.8}}/*! * "Fork me on GitHub" CSS ribbon v0.1.1 | MIT License * https://github.com/simonwhitaker/github-fork-ribbon-css -*/.github-fork-ribbon{position:absolute;padding:2px 0;background-color:#a00;background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,0)),to(rgba(0,0,0,.15)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-moz-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-ms-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-o-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:linear-gradient(to bottom,rgba(0,0,0,0),rgba(0,0,0,.15));-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);-moz-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);box-shadow:0 2px 3px 0 rgba(0,0,0,.5);font:700 13px "Helvetica Neue",Helvetica,Arial,sans-serif;z-index:9999;pointer-events:auto}.github-fork-ribbon a,.github-fork-ribbon a:hover{color:#fff;text-decoration:none;text-shadow:0 -1px rgba(0,0,0,.5);text-align:center;width:200px;line-height:20px;display:inline-block;padding:2px 0;border-width:1px 0;border-style:dotted;border-color:#fff;border-color:rgba(255,255,255,.7)}.github-fork-ribbon-wrapper{width:150px;height:150px;position:absolute;overflow:hidden;top:0;z-index:9998;pointer-events:none}.github-fork-ribbon-wrapper.fixed{position:fixed}.github-fork-ribbon-wrapper.left{left:0}.github-fork-ribbon-wrapper.right{right:0}.github-fork-ribbon-wrapper.left-bottom{position:fixed;top:inherit;bottom:0;left:0}.github-fork-ribbon-wrapper.right-bottom{position:fixed;top:inherit;bottom:0;right:0}.github-fork-ribbon-wrapper.right .github-fork-ribbon{top:42px;right:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.left .github-fork-ribbon{top:42px;left:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon{top:80px;left:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon{top:80px;right:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-select{position:relative;display:block;padding:0}.custom-select select{width:100%;margin:0;background:0 0;border:1px solid transparent;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1em;font-family:helvetica,sans-serif;font-weight:700;color:#444;padding:.6em 1.9em .5em .8em;line-height:1.3}.custom-select option,.modal-header{font-weight:400}.custom-select::after{content:"";position:absolute;width:9px;height:8px;top:50%;right:1em;margin-top:-4px;background-image:url(http://filamentgroup.com/files/select-arrow.png);background-repeat:no-repeat;background-size:100%;z-index:2;pointer-events:none}.custom-select:hover{border:1px solid #888}.custom-select select:focus{outline:0;box-shadow:0 0 1px 3px rgba(180,222,250,1);background-color:transparent;color:#222;border:1px solid #aaa}.custom-select::after,x:-o-prefocus{display:none}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.custom-select select::-ms-expand{display:none}.custom-select select:focus::-ms-value{background:0 0;color:#222}}.custom-select select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}.pull-top{display:inline-block;vertical-align:top;float:none}.nav.nav-pills.nav-stacked,div.tab-content{position:relative;min-height:1px;float:left}.box{padding:0 5px!important}.current-fields .field-row{padding:5px 0}.current-fields .panel{background-color:#f1f1f1;margin-top:0!important}.current-fields .panel:hover{background-color:#fff;cursor:pointer}.current-fields .panel.tool-panel{background-color:#fff}.current-fields .panel-heading{background-color:#f1f1f1;position:relative}.current-fields .panel-heading:hover{background-color:#fff;cursor:pointer}.current-fields .tool-panel.panel:hover{border-color:#9d9d9d;background-color:#eee;cursor:pointer}.current-fields .tool-panel.panel:hover .panel-heading{background-color:inherit;color:#000;cursor:pointer}.current-fields .tool-panel.panel .panel-heading{background-color:#fff;color:#9d9d9d}.current-fields .tool-panel.panel .panel-heading a{color:inherit}.nav.nav-pills.nav-stacked{width:16.66666667%;padding-right:15px}div.tab-content{width:83.33333333%;padding-top:0!important}.panel-default.startPage{border-style:dashed;border-color:#a9a9a9;border-width:3px}.busy-updating-wrapper{text-align:center;font-size:20px;position:fixed;bottom:0;right:55px;z-index:1}.busy-submitting-wrapper{position:fixed;top:50%;left:0;right:0;bottom:0}.dropzone h4.panel-title{height:17px;overflow:hidden}.container.admin-form{margin-top:70px}.edit-modal-window .modal-dialog{width:90%}.edit-modal-window .modal-body{padding:0}.edit-modal-window .edit-panel{background-color:#F1F1F1;padding:0 35px}.edit-modal-window .preview-field-panel{display:flex;flex-direction:column;justify-content:center}.edit-modal-window .preview-field-panel form{padding-right:20px}.edit-modal-window .preview-field{resize:vertical}.admin-form .ui-sortable-placeholder{visibility:visible!important;border:none;padding:1px;background:rgba(0,0,0,.5)!important}.config-form{max-width:100%}.config-form>.row{padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}div.config-form .row.field{padding-top:1.5em}div.config-form>.row>.container:nth-of-type(odd){border-right:1px #ddd solid}div.config-form.design>.row>.container:nth-of-type(odd){border-right:none}div.config-form .row>.field-input{padding-left:.1em}div.config-form .row>.field-input label{padding-left:1.3em;display:block}.admin-form>.page-header{padding-bottom:0;margin-bottom:40px}.admin-form>.page-header h1{margin-bottom:0;margin-top:0}.admin-form>.page-header>.col-xs-3{padding-top:1.4em}.admin-form .form-controls .row{padding:5px}.admin-form .page-header{border:none;margin-top:none;margin-bottom:none}.admin-form .tab-content{padding-top:3em}.submissions-table .table-outer.row{margin:1.5em 0 2em!important}.submissions-table .table-outer .col-xs-12{padding-left:0!important;border:1px solid #ddd;overflow-x:scroll;border-radius:3px}.submissions-table .table>thead>tr>th{min-width:8em}.submissions-table .table>tbody>tr.selected{background-color:#efefef}.admin-form .add-field{background-color:#ddd;padding:0 2%;border-radius:3px}.admin-form .add-field .col-xs-6{padding:.25em .4em}.admin-form .add-field .col-xs-6 .panel-heading{border-width:1px;border-style:solid;border-color:#bbb;border-radius:4px}.admin-form .oscar-field-select{margin:10px 0}.view-form-btn.span{padding-right:.6em}.status-light.status-light-off{color:#BE0000}.status-light.status-light-on{color:#3C0}.analytics .header-title{font-size:1em;color:#bab8b8}.analytics .header-numbers{font-size:4em;padding-bottom:.1em;margin-bottom:.5em;border-bottom:#fafafa solid 1px}.analytics .detailed-title{font-size:1.8em;margin-bottom:1.1em}.analytics .detailed-row{padding-bottom:.8em}.analytics .detailed-row .row{font-size:1.2em}.analytics .detailed-row .row.header{font-size:.8em;color:#bab8b8;text-transform:uppercase}.field-title-row{padding-top:2em;padding-bottom:1em;border-top:#fafafa solid 1px;font-size:1.2em;color:#bab8b8}.field-detailed-row{font-size:1.2em;padding-bottom:.3em}.table-tools{border-top:#fafafa solid 1px;padding-top:2.5em}.public-form.preview{border:none;box-shadow:0 0 10px 0 grey;overflow-y:scroll;overflow-x:hidden;height:400px;width:90%;position:absolute}.public-form input,.public-form textarea{background-color:#000;background-color:rgba(0,0,0,0);border:2px dashed #ddd!important}.public-form input:focus,.public-form textarea:focus{border:2px dashed #ddd!important;outline:0}section.content p.breakwords{word-break:break-all}.public-form .btn{border:1px solid #c6c6c6}.public-form .btn[type=submit]{font-size:1.5em;padding:.35em 1.2em}section.content>section>section.container{margin-top:70px}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;font-size:18px}.public-form .input-block{display:block;width:100%}.modal-footer input[type=text]{min-height:34px;padding:7px 8px;font-size:13px;color:#333;vertical-align:middle;background-color:#fff;background-repeat:no-repeat;background-position:right 8px center;border:1px solid #ccc;border-radius:3px;box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.modal-body>.modal-body-alert{color:#796620;background-color:#f8eec7;border-color:#f2e09a;margin:-16px -15px 15px;padding:10px 15px;border-style:solid;border-width:1px 0}div.form-fields{position:relative;padding-top:10%}.public-form .letter{position:relative;display:-moz-inline-stack;display:inline-block;vertical-align:top;zoom:1;width:16px;padding:0;height:17px;font-size:12px;line-height:19px;border:1px solid #000;border:1px solid rgba(0,0,0,.2);margin-right:7px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-align:center;font-weight:700}div.form-submitted>.field.row{padding-bottom:2%;margin-top:10%}div.form-submitted>.field.row>div{font-size:1.7em}form .accordion-edit{width:inherit}.ui-datepicker.ui-widget{z-index:99!important}form .row.field .field-number{margin-right:.5em}form .row.field{padding:1em 0 0;width:inherit}form .row.field>.field-title{margin-top:.5em;font-size:1.2em;padding-bottom:1.8em;width:inherit}form .row.field>.field-input{font-size:1.4em;color:#777}form.submission-form .row.field.statement>.field-title{font-size:1.7em}form.submission-form .row.field.statement>.field-input{font-size:1em;color:#ddd}form.submission-form .select.radio>.field-input input,form.submission-form .select>.field-input input{width:20%}form.submission-form .field.row.radio .btn.activeBtn{background-color:#000!important;background-color:rgba(0,0,0,.7)!important;color:#fff}form.submission-form .field.row.radio .btn{margin-right:1.2em}form.submission-form .select>.field-input .btn{text-align:left;margin-bottom:.7em}form.submission-form .select>.field-input .btn>span{font-size:1.1em}form .field-input>textarea{padding:.45em .9em;width:100%;line-height:160%}form .field-input>input.hasDatepicker{padding:.45em .9em;width:50%;line-height:160%}form .field-input>input.text-field-input{padding:.45em .9em;width:100%;line-height:160%}form .required-error{color:#ddd;font-size:.8em}form .row.field.dropdown>.field-input input{min-height:34px;border-width:0 0 2px;border-radius:5px}form .row.field.dropdown>.field-input input:focus{border:none}form .dropdown>.field-input .ui-select-choices-row-inner{border-radius:3px;margin:5px;padding:10px;background-color:#000;background-color:rgba(0,0,0,.05)}form .dropdown>.field-input .ui-select-choices-row-inner.active,form .dropdown>.field-input .ui-select-choices-row-inner.active:focus{background-color:#000;background-color:rgba(0,0,0,.1)}.current-fields .panel-body .row.description textarea,.current-fields .panel-body .row.question input[type=text]{width:100%}.current-fields .panel-body .row.options input[type=text]{width:80%}.ui-select-choices.ui-select-dropdown{top:2.5em!important}.ui-select-toggle{box-shadow:none!important;border:none!important}section.public-form{padding:0 10%}section.public-form .form-submitted{height:100vh}section.public-form .btn{border:1px solid}.form-item{border-radius:5px;text-align:center;width:180px;position:relative;height:215px;margin-bottom:45px}.form-item.paused{background-color:red;color:#fff}.form-item.paused:hover{background-color:#8b0000;color:#fff}.form-item.create-new input[type=text]{width:inherit;color:#000;border:none}.form-item.create-new{background-color:#3FA2F7;color:#fff}.form-item.create-new.new-form{background-color:#ff8383;z-index:11}.form-item.create-new.new-form:hover{background-color:#3079b5}.form-item.new-form input[type=text]{margin-top:.2em;width:inherit;color:#000;border:none;padding:.3em .6em}.form-item.new-form .custom-select{margin-top:.2em}.form-item.new-form .custom-select select{background-color:#fff}.form-item.new-form .details-row{margin-top:1em}.form-item.new-form .details-row.submit{margin-top:1.7em}.form-item.new-form .details-row.submit .btn{font-size:.95em}.form-item.new-form .title-row{margin-top:1em;top:0}.overlay{position:fixed;top:0;left:0;height:100%;width:100%;background-color:#000;background-color:rgba(0,0,0,.5);z-index:10}.overlay.submitform{background-color:#fff;background-color:rgba(256,256,256,.8)}.activeField,.activeField input{background-color:transparent}.field-directive{z-index:9;padding:10% 10% 10% 0;border:25px solid transparent;position:relative}.activeField{z-index:11;position:relative}.activeField.field-directive{display:inline-block;border-radius:7px;width:100%;border:25px solid transparent}h3.forms-list-title{color:#3FA2F7;font-weight:600;margin-bottom:3em}.form-item{color:#71AADD;background-color:#E4F1FD}.form-item:hover{background-color:#3FA2F7;color:#23527C}.form-item.create-new:hover{color:#fff;background-color:#515151}.form-item>.row.footer{position:absolute;bottom:0;left:30%}.form-item .title-row{position:relative;top:15px;padding-top:3em;padding-bottom:1em}.form-item .title-row h4{font-size:1.3em}.form-item.create-new .title-row{padding:0}.form-item.create-new .title-row h4{font-size:7em}.form-item .details-row{margin-top:3.2em}.form-item .details-row small{font-size:.6em}.form-item.create-new .details-row small{font-size:.95em}section.auth{padding:70px 0;position:absolute;min-height:100%;top:0;left:0;width:100%;color:#fff;background-color:#50B5C1;background:-moz-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#50B5C1),color-stop(100%,#6450A0));background:-webkit-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-o-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-ms-linear-gradient(137deg,#50B5C1 0,#6450A0 100%)}section.auth>h3{font-size:2em;font-weight:500}.valign-wrapper{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.valign-wrapper .valign{display:block;width:100%}section.auth a{color:#fff;text-decoration:underline}section.auth.signup-view>h3{font-size:3em;padding-bottom:.5em}section.auth form .field-input select{padding:.45em .9em;width:100%;background:0 0;font-size:16px;border:1px solid #ccc;min-height:34px}section.auth input{color:#4c4c4c}section.auth .btn{border-radius:100px;font-size:14px;padding:12px 28px;margin-top:1em}.btn-rounded.btn-signup{background-color:#FFD747;color:#896D0B;border:2px solid #FFD747}.btn-rounded.btn-signup:hover{color:#FFD747;background-color:#896D0B;border:2px solid #896D0B}.btn-rounded.btn-default{background-color:transparent;color:#fff;border:2px solid #fff}.btn-rounded.btn-default:focus,.btn-rounded.btn-default:hover{color:#6450A0;background-color:#fff;border-color:#fff}@media (min-width:992px){.nav-users{position:fixed}}.remove-account-container{display:inline-block;position:relative}.btn-remove-account{top:10px;right:10px;position:absolute}section.auth input.form-control{min-height:30px!important;border:none}input.form-control{height:auto;border-radius:4px;box-shadow:none;font-size:18px;padding:20px 10px}.btn{border:none} \ No newline at end of file +*/.github-fork-ribbon{position:absolute;padding:2px 0;background-color:#a00;background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,0)),to(rgba(0,0,0,.15)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-moz-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-ms-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-o-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:linear-gradient(to bottom,rgba(0,0,0,0),rgba(0,0,0,.15));-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);-moz-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);box-shadow:0 2px 3px 0 rgba(0,0,0,.5);font:700 13px "Helvetica Neue",Helvetica,Arial,sans-serif;z-index:9999;pointer-events:auto}.github-fork-ribbon a,.github-fork-ribbon a:hover{color:#fff;text-decoration:none;text-shadow:0 -1px rgba(0,0,0,.5);text-align:center;width:200px;line-height:20px;display:inline-block;padding:2px 0;border-width:1px 0;border-style:dotted;border-color:#fff;border-color:rgba(255,255,255,.7)}.github-fork-ribbon-wrapper{width:150px;height:150px;position:absolute;overflow:hidden;top:0;z-index:9998;pointer-events:none}.github-fork-ribbon-wrapper.fixed{position:fixed}.github-fork-ribbon-wrapper.left{left:0}.github-fork-ribbon-wrapper.right{right:0}.github-fork-ribbon-wrapper.left-bottom{position:fixed;top:inherit;bottom:0;left:0}.github-fork-ribbon-wrapper.right-bottom{position:fixed;top:inherit;bottom:0;right:0}.github-fork-ribbon-wrapper.right .github-fork-ribbon{top:42px;right:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.left .github-fork-ribbon{top:42px;left:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon{top:80px;left:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon{top:80px;right:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-select{position:relative;display:block;padding:0}.custom-select select{width:100%;margin:0;background:0 0;border:1px solid transparent;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1em;font-family:helvetica,sans-serif;font-weight:700;color:#444;padding:.6em 1.9em .5em .8em;line-height:1.3}.custom-select option,.modal-header{font-weight:400}.custom-select::after{content:"";position:absolute;width:9px;height:8px;top:50%;right:1em;margin-top:-4px;background-image:url(http://filamentgroup.com/files/select-arrow.png);background-repeat:no-repeat;background-size:100%;z-index:2;pointer-events:none}.custom-select:hover{border:1px solid #888}.custom-select select:focus{outline:0;box-shadow:0 0 1px 3px rgba(180,222,250,1);background-color:transparent;color:#222;border:1px solid #aaa}.custom-select::after,x:-o-prefocus{display:none}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.custom-select select::-ms-expand{display:none}.custom-select select:focus::-ms-value{background:0 0;color:#222}}.custom-select select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}.pull-top{display:inline-block;vertical-align:top;float:none}.nav.nav-pills.nav-stacked,div.tab-content{position:relative;min-height:1px;float:left}.box{padding:0 5px!important}.current-fields .field-row{padding:5px 0}.current-fields .panel{background-color:#f1f1f1;margin-top:0!important}.current-fields .panel:hover{background-color:#fff;cursor:pointer}.current-fields .panel.tool-panel{background-color:#fff}.current-fields .panel-heading{background-color:#f1f1f1;position:relative}.current-fields .panel-heading:hover{background-color:#fff;cursor:pointer}.current-fields .tool-panel.panel:hover{border-color:#9d9d9d;background-color:#eee;cursor:pointer}.current-fields .tool-panel.panel:hover .panel-heading{background-color:inherit;color:#000;cursor:pointer}.current-fields .tool-panel.panel .panel-heading{background-color:#fff;color:#9d9d9d}.current-fields .tool-panel.panel .panel-heading a{color:inherit}.nav.nav-pills.nav-stacked{width:16.66666667%;padding-right:15px}div.tab-content{width:83.33333333%;padding-top:0!important}.panel-default.startPage{border-style:dashed;border-color:#a9a9a9;border-width:3px}.busy-updating-wrapper{text-align:center;font-size:20px;position:fixed;bottom:0;right:55px;z-index:1}.busy-submitting-wrapper{position:fixed;top:50%;left:0;right:0;bottom:0}.dropzone h4.panel-title{height:17px;overflow:hidden}.container.admin-form{margin-top:70px}.edit-modal-window .modal-dialog{width:90%}.edit-modal-window .modal-body{padding:0}.edit-modal-window .edit-panel{background-color:#F1F1F1;padding:0 35px}.edit-modal-window .preview-field-panel{display:flex;flex-direction:column;justify-content:center}.edit-modal-window .preview-field-panel form{padding-right:20px}.edit-modal-window .preview-field{resize:vertical}.admin-form .ui-sortable-placeholder{visibility:visible!important;border:none;padding:1px;background:rgba(0,0,0,.5)!important}.config-form{max-width:100%}.config-form>.row{padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}div.config-form .row.field{padding-top:1.5em}div.config-form>.row>.container:nth-of-type(odd){border-right:1px #ddd solid}div.config-form.design>.row>.container:nth-of-type(odd){border-right:none}div.config-form .row>.field-input{padding-left:.1em}div.config-form .row>.field-input label{padding-left:1.3em;display:block}.admin-form>.page-header{padding-bottom:0;margin-bottom:40px}.admin-form>.page-header h1{margin-bottom:0;margin-top:0}.admin-form>.page-header>.col-xs-3{padding-top:1.4em}.admin-form .form-controls .row{padding:5px}.admin-form .page-header{border:none;margin-top:none;margin-bottom:none}.admin-form .tab-content{padding-top:3em}.submissions-table .table-outer.row{margin:1.5em 0 2em!important}.submissions-table .table-outer .col-xs-12{padding-left:0!important;border:1px solid #ddd;overflow-x:scroll;border-radius:3px}.submissions-table .table>thead>tr>th{min-width:8em}.submissions-table .table>tbody>tr.selected{background-color:#efefef}.admin-form .add-field{background-color:#ddd;padding:0 2%;border-radius:3px}.admin-form .add-field .col-xs-6{padding:.25em .4em}.admin-form .add-field .col-xs-6 .panel-heading{border-width:1px;border-style:solid;border-color:#bbb;border-radius:4px}.admin-form .oscar-field-select{margin:10px 0}.view-form-btn.span{padding-right:.6em}.status-light.status-light-off{color:#BE0000}.status-light.status-light-on{color:#3C0}.analytics .header-title{font-size:1em;color:#bab8b8}.analytics .header-numbers{font-size:4em;padding-bottom:.1em;margin-bottom:.5em;border-bottom:#fafafa solid 1px}.analytics .detailed-title{font-size:1.8em;margin-bottom:1.1em}.analytics .detailed-row{padding-bottom:.8em}.analytics .detailed-row .row{font-size:1.2em}.analytics .detailed-row .row.header{font-size:.8em;color:#bab8b8;text-transform:uppercase}.field-title-row{padding-top:2em;padding-bottom:1em;border-top:#fafafa solid 1px;font-size:1.2em;color:#bab8b8}.field-detailed-row{font-size:1.2em;padding-bottom:.3em}.table-tools{border-top:#fafafa solid 1px;padding-top:2.5em}.overlay{position:fixed;top:0;left:0;height:100%;width:100%;background-color:#000;background-color:rgba(0,0,0,.5);z-index:10}.overlay.submitform{background-color:#fff;background-color:rgba(256,256,256,.8)}.public-form.preview{border:none;box-shadow:0 0 10px 0 grey;overflow-y:scroll;overflow-x:hidden;height:400px;width:90%;position:absolute}.public-form input,.public-form textarea{background-color:#000;background-color:rgba(0,0,0,0);border-width:0}form .btn{border-color:grey}.public-form input.ng-untouched,.public-form input:focus,.public-form textarea.ng-untouched,.public-form textarea:focus{border-width:0 0 2px;border-color:rgba(246,255,181,.4);outline:0}.public-form input.ng-dirty,.public-form textarea.ng-dirty{border-width:0}.public-form input.empty,.public-form textarea.empty{border-width:0 0 2px;border-color:rgba(246,255,181,.4)}section.content p.breakwords{word-break:break-all}.public-form .btn[type=submit]{font-size:1.5em;padding:.35em 1.2em}section.content>section>section.container{margin-top:70px}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;font-size:18px}.public-form .input-block{display:block;width:100%}.modal-footer input[type=text]{min-height:34px;padding:7px 8px;font-size:13px;color:#333;vertical-align:middle;background-color:#fff;background-repeat:no-repeat;background-position:right 8px center;border:1px solid #ccc;border-radius:3px;box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.modal-body>.modal-body-alert{color:#796620;background-color:#f8eec7;border-color:#f2e09a;margin:-16px -15px 15px;padding:10px 15px;border-style:solid;border-width:1px 0}div.form-fields{position:relative;padding-top:10%}.public-form .letter{position:relative;display:-moz-inline-stack;display:inline-block;vertical-align:top;zoom:1;width:16px;padding:0;height:17px;font-size:12px;line-height:19px;border:1px solid #000;border:1px solid rgba(0,0,0,.2);margin-right:7px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-align:center;font-weight:700}div.form-submitted>.field.row{padding-bottom:2%;margin-top:10%}div.form-submitted>.field.row>div{font-size:1.7em}form .accordion-edit{width:inherit}.ui-datepicker.ui-widget{z-index:99!important}form .row.field .field-number{margin-right:.5em}form .row.field{padding:1em 0 0;width:inherit}form .row.field>.field-title{margin-top:.5em;font-size:1.2em;padding-bottom:.5em;width:inherit}form .row.field>.field-input{font-size:1.4em;color:#777}form.submission-form .row.field.statement>.field-title{font-size:1.7em}form.submission-form .row.field.statement>.field-input{font-size:1em;color:#ddd}form.submission-form .select.radio>.field-input input,form.submission-form .select>.field-input input{width:20%}form.submission-form .field.row.radio .btn.activeBtn{background-color:#000!important;background-color:rgba(0,0,0,.7)!important;color:#fff}form.submission-form .field.row.radio .btn{margin-right:1.2em}form.submission-form .select>.field-input .btn{text-align:left;margin-bottom:.7em}form.submission-form .select>.field-input .btn>span{font-size:1.1em}form .field-input>textarea{padding:.45em .9em;width:100%;line-height:160%}form .field-input>input.hasDatepicker{padding:.45em .9em;width:50%;line-height:160%}form .field-input>input.text-field-input{padding:.45em .9em;width:100%;line-height:160%}form .required-error{color:#ddd;font-size:.8em}form .row.field.dropdown>.field-input input{min-height:34px;border-width:0 0 2px;border-radius:5px}form .row.field.dropdown>.field-input input:focus{border:none}form .dropdown>.field-input .ui-select-choices-row-inner{border-radius:3px;margin:5px;padding:10px;background-color:#000;background-color:rgba(0,0,0,.05)}form .dropdown>.field-input .ui-select-choices-row-inner.active,form .dropdown>.field-input .ui-select-choices-row-inner.active:focus{background-color:#000;background-color:rgba(0,0,0,.1)}.current-fields .panel-body .row.description textarea,.current-fields .panel-body .row.question input[type=text]{width:100%}.current-fields .panel-body .row.options input[type=text]{width:80%}.ui-select-choices.ui-select-dropdown{top:2.5em!important}.ui-select-toggle{box-shadow:none!important;border:none!important}section.public-form field-directive .btn.btn-lg.btn-default{background:0 0}section.public-form field-directive .btn[disabled]{display:none}.form-item{border-radius:5px;text-align:center;width:180px;position:relative;height:215px;margin-bottom:45px}.form-item.paused{background-color:red;color:#fff}.form-item.paused:hover{background-color:#8b0000;color:#fff}.form-item.create-new input[type=text]{width:inherit;color:#000;border:none}.form-item.create-new{background-color:#3FA2F7;color:#fff}.form-item.create-new.new-form{background-color:#ff8383;z-index:11}.form-item.create-new.new-form:hover{background-color:#3079b5}.form-item.new-form input[type=text]{margin-top:.2em;width:inherit;color:#000;border:none;padding:.3em .6em}.form-item.new-form .custom-select{margin-top:.2em}.form-item.new-form .custom-select select{background-color:#fff}.form-item.new-form .details-row{margin-top:1em}.form-item.new-form .details-row.submit{margin-top:1.7em}.form-item.new-form .details-row.submit .btn{font-size:.95em}.form-item.new-form .title-row{margin-top:1em;top:0}.field-directive{opacity:.2;padding:2.5% 10%}.field-directive.activeField,.form-field-wrapper .form-actions.activeField{opacity:1}h3.forms-list-title{color:#3FA2F7;font-weight:600;margin-bottom:3em}.form-item{color:#71AADD;background-color:#E4F1FD}.form-item:hover{background-color:#3FA2F7;color:#23527C}.form-item.create-new:hover{color:#fff;background-color:#515151}.form-item>.row.footer{position:absolute;bottom:0;left:30%}.form-item .title-row{position:relative;top:15px;padding-top:3em;padding-bottom:1em}.form-item .title-row h4{font-size:1.3em}.form-item.create-new .title-row{padding:0}.form-item.create-new .title-row h4{font-size:7em}.form-item .details-row{margin-top:3.2em}.form-item .details-row small{font-size:.6em}.form-item.create-new .details-row small{font-size:.95em}section.auth{padding:70px 0;position:absolute;min-height:100%;top:0;left:0;width:100%;color:#fff;background-color:#50B5C1;background:-moz-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#50B5C1),color-stop(100%,#6450A0));background:-webkit-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-o-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-ms-linear-gradient(137deg,#50B5C1 0,#6450A0 100%)}section.auth>h3{font-size:2em;font-weight:500}.valign-wrapper{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.valign-wrapper .valign{display:block;width:100%}section.auth a{color:#fff;text-decoration:underline}section.auth.signup-view>h3{font-size:3em;padding-bottom:.5em}section.auth form .field-input select{padding:.45em .9em;width:100%;background:0 0;font-size:16px;border:1px solid #ccc;min-height:34px}section.auth input{color:#4c4c4c}section.auth .btn{border-radius:100px;font-size:14px;padding:12px 28px;margin-top:1em}.btn-rounded.btn-signup{background-color:#FFD747;color:#896D0B;border:2px solid #FFD747}.btn-rounded.btn-signup:hover{color:#FFD747;background-color:#896D0B;border:2px solid #896D0B}.btn-rounded.btn-default{background-color:transparent;color:#fff;border:2px solid #fff}.btn-rounded.btn-default:focus,.btn-rounded.btn-default:hover{color:#6450A0;background-color:#fff;border-color:#fff}@media (min-width:992px){.nav-users{position:fixed}}.remove-account-container{display:inline-block;position:relative}.btn-remove-account{top:10px;right:10px;position:absolute}section.auth input.form-control{min-height:30px!important;border:none}input.form-control{height:auto;border-radius:4px;box-shadow:none;font-size:18px;padding:20px 10px} \ No newline at end of file diff --git a/public/dist/application.min.js b/public/dist/application.min.js index a5c450a9..b97d8b0e 100644 --- a/public/dist/application.min.js +++ b/public/dist/application.min.js @@ -1,5 +1,5 @@ -"use strict";var ApplicationConfiguration=function(){var a="TellForm",b=["duScroll","ui.select","ngSanitize","vButton","ngResource","TellForm.templates","ui.router","ui.bootstrap","ui.utils","pascalprecht.translate","view-form"],c=function(b,c){angular.module(b,c||[]),angular.module(a).requires.push(b)};return{applicationModuleName:a,applicationModuleVendorDependencies:b,registerModule:c}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function(a){a.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("FORM_URL","/forms/:formId"),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),angular.module("TellForm.templates",[]).run(["$templateCache",function(a){a.put("modules/core/views/header.client.view.html",'<section class="navbar navbar-inverse" data-ng-controller=HeaderController ng-hide=hideNav><div class=container><div class=navbar-header><button class=navbar-toggle type=button data-ng-click=toggleCollapsibleMenu()><span class=sr-only>Toggle navigation</span> <span>{{ \'MENU_BTN\' | translate }}</span></button> <a href="/#!/" class=navbar-brand><img src=/static/modules/core/img/logo_white.svg height=100%></a></div><nav class="collapse navbar-collapse" collapse=!isCollapsed role=navigation><ul class="nav navbar-nav navbar-right" data-ng-hide=authentication.isAuthenticated()><li ng-hide=$root.signupDisabled ui-route=/signup ng-class="{active: $uiRoute}"><a href=/#!/signup>{{ \'SIGNUP_TAB\' | translate }}</a></li><li class=divider-vertical></li><li ui-route=/signin ng-class="{active: $uiRoute}"><a href=/#!/signin>{{ \'SIGNIN_TAB\' | translate }}</a></li></ul><ul class="nav navbar-nav navbar-right" data-ng-show=authentication.isAuthenticated()><li class=dropdown uib-dropdown><a href=# class=dropdown-toggle data-toggle=dropdown dropdown-toggle><span>{{ \'MY_SETTINGS\' | translate }}</span> <b class=caret></b></a><ul class=dropdown-menu><li><a href=/#!/settings/profile>{{ \'EDIT_PROFILE\' | translate }}</a></li><li class=divider></li><li><a href=/#!/settings/password>{{ \'CHANGE_PASSWORD\' | translate }}</a></li></ul></li><li><a href="/" ng-click=signout()>{{ \'SIGNOUT_TAB\' | translate }}</a></li></ul></nav></div></section>'),a.put("modules/forms/admin/views/admin-form.client.view.html",'<header data-ng-include="\'/static/modules/core/views/header.client.view.html\'"></header><section class="admin-form container-fluid"><script type=text/ng-template id=formDeleteModal.html><div class="modal-header">\n <h2 class="modal-title hidden-md hidden-lg">{{ \'ARE_YOU_SURE\' | translate }}</h2>\n <h3 class="modal-title hidden-xs hidden-sm">{{ \'ARE_YOU_SURE\' | translate }}</h3>\n </div>\n <div class="modal-body">\n \t<div class="modal-body-alert">\n\t\t\t\t{{ \'READ_WARNING\' | translate }}\n\t\t\t</div>\n \t\t<p class="hidden-xs hidden-sm">\n \t\t \t{{ \'DELETE_WARNING1\' | translate }} <strong>{{myform.title}}</strong> {{ \'DELETE_WARNING2\' | translate }}\n \t\t</p>\n <p>{{ \'DELETE_CONFIRM\' | translate }}</p>\n </div>\n <div class="modal-footer">\n\t\t\t<input type="text" style="width:100%" data-ng-model="deleteConfirm" class="input-block" autofocus required aria-label="Type in the name of the form to confirm that you want to delete this form.">\n <button type="submit" ng-click="removeCurrentForm()" class="btn btn-block btn-danger" ng-disabled="myform.title != deleteConfirm">\n \t{{ \'I_UNDERSTAND\' | translate }}\n </button>\n </div></script><div class="page-header row" style="padding-bottom: 1em"><div class="col-xs-10 col-sm-8"><h1 class="hidden-sm hidden-xs" data-ng-bind=myform.title style="margin-bottom: 0px"></h1><h2 class="hidden-md hidden-lg" data-ng-bind=myform.title style="margin-bottom: 0px"></h2></div><div class="col-xs-1 col-sm-2"><small class=pull-right><button class="btn btn-danger" ng-click=openDeleteModal()><i class="fa fa-trash-o"></i> <span class="show-sm hidden-lg hidden-md hidden-xs">{{ \'DELETE_FORM_SM\' | translate}}</span> <span class="hidden-xs hidden-sm">{{ \'DELETE_FORM_MD\' | translate}}</span></button></small></div><div class="col-xs-1 col-sm-2"><small class=pull-right><a class="btn btn-secondary view-form-btn" href={{actualFormURL}}><span class="hidden-xs hidden-sm">{{ \'VIEW\' | translate }} <span ng-show=myform.isLive>{{ \'LIVE\' | translate }}</span> <span ng-hide=myform.isLive>{{ \'PREVIEW\' | translate }}</span></span> <i class="status-light status-light-on fa fa-dot-circle-o" ng-if=myform.isLive></i> <i class="status-light status-light-off fa fa-dot-circle-o" ng-if=!myform.isLive></i></a></small></div></div><div class=row><div class=col-xs-12><uib-tabset active=activePill vertical=true type=pills><uib-tab index=0 heading="{{ \'CREATE_TAB\' | translate }}"><edit-form-directive myform=myform></edit-form-directive></uib-tab><uib-tab ng-repeat="tab in tabData" index={{$index+1}} heading={{tab.heading}}><div class=row data-ng-include="\'/static/modules/forms/admin/views/adminTabs/\'+tab.templateName+\'.html\'"></div></uib-tab><uib-tab index=2 heading="{{ \'ANALYZE_TAB\' | translate }}"><edit-submissions-form-directive myform=myform user=myform.admin></edit-submissions-form-directive></uib-tab><uib-tab ng-if=tabData heading="{{ \'SHARE_TAB\' | translate }}" index={{tabData.length}}><div class=config-form><div class=row><div class=col-sm-12><uib-tabset active=activePill vertical=true type=pills><uib-tab index=0 heading="{{ \'SHARE_YOUR_FORM\' | translate }}"><div class=row><div class=col-sm-12>{{ \'TELLFORM_URL\' | translate }}</div><div class="col-sm-8 form-input"><span ngclipboard data-clipboard-target=#copyURL><input id=copyURL ng-value=actualFormURL class="form-control ng-pristine ng-untouched ng-valid"></span></div><div class=col-sm-4><button class="btn btn btn-secondary view-form-btn" ngclipboard data-clipboard-target=#copyURL>{{ \'COPY\' | translate }} <i class="fa fa-clipboard" aria-hidden=true></i></button></div></div></uib-tab><uib-tab index=1 heading="{{ \'EMBED_YOUR_FORM\' | translate }}"><div class=row><div class=col-sm-12>{{ \'COPY_AND_PASTE\' | translate }}</div><div class="col-sm-8 form-input"><span ngclipboard data-clipboard-target=#copyEmbedded><textarea id=copyEmbedded class="form-control ng-pristine ng-untouched ng-valid" style="min-height:200px; width:100%; background-color: #FFFFCC; color: #30313F">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- {{ \'CHANGE_WIDTH_AND_HEIGHT\' | translate }} -->\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<iframe id=iframe src={{actualFormURL}} style=width:100%;height:500px></iframe>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div style="font-family: Sans-Serif;font-size: 12px;color: #999;opacity: 0.5; padding-top: 5px">{{ \'POWERED_BY\' | translate }} <a href=https://www.tellform.com style="color: #999" target=_blank>TellForm</a></div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</textarea></span></div><div class=col-sm-4><button class="btn btn btn-secondary view-form-btn" ngclipboard data-clipboard-target=#copyEmbedded>{{ \'COPY\' | translate }} <i class="fa fa-clipboard" aria-hidden=true></i></button></div></div></uib-tab></uib-tabset></div></div></div></uib-tab><uib-tab ng-if="tabData && myform.form_fields.length" heading="{{ \'DESIGN_TAB\' | translate }}" index={{tabData.length}}+1><div class="config-form design container"><div class=row><div class="col-sm-4 col-xs-12"><div class="row field"><div class="field-title col-sm-5"><h5>{{ \'BACKGROUND_COLOR\' | translate }}</h5></div><div class="field-input col-sm-6"><input class=form-control colorpicker=hex ng-model=myform.design.colors.backgroundColor ng-pattern="/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/" ng-style="{ \'background-color\': myform.design.colors.backgroundColor }"></div></div><div class="row field"><div class="field-title col-sm-5"><h5>{{ \'QUESTION_TEXT_COLOR\' | translate }}</h5></div><div class="field-input col-sm-6"><input class=form-control colorpicker=hex ng-model=myform.design.colors.questionColor ng-pattern="/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/" ng-style="{ \'background-color\': myform.design.colors.questionColor }"></div></div><div class="row field"><div class="field-title col-sm-5"><h5>{{ \'ANSWER_TEXT_COLOR\' | translate }}</h5></div><div class="field-input col-sm-6"><input class=form-control colorpicker=hex ng-model=myform.design.colors.answerColor ng-pattern="/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/" ng-style="{ \'background-color\': myform.design.colors.answerColor }"></div></div><div class="row field"><div class="field-title col-sm-5"><h5>{{ \'BTN_BACKGROUND_COLOR\' | translate }}</h5></div><div class="field-input col-sm-6"><input class=form-control colorpicker=hex ng-model=myform.design.colors.buttonColor ng-pattern="/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/" ng-style="{ \'background-color\': myform.design.colors.buttonColor }"></div></div><div class="row field"><div class="field-title col-sm-5"><h5>{{ \'BTN_TEXT_COLOR\' | translate }}</h5></div><div class="field-input col-sm-6"><input class=form-control colorpicker=hex ng-model=myform.design.colors.buttonTextColor ng-pattern="/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/" ng-style="{ \'background-color\': myform.design.colors.buttonTextColor }"></div></div></div><div class="col-sm-8 hidden-xs"><div class=public-form ng-style="{ \'background-color\': myform.design.colors.backgroundColor }"><iframe id=iframe ng-if=!!formURL ng-src="{{formURL | trustSrc}}" style="border: none; box-shadow: 0px 0px 10px 0px grey; overflow: hidden; height: 400px; width: 90%; position: absolute"></iframe></div></div></div><div class=row><div class="col-sm-offset-4 col-sm-2"><button class="btn btn-signup btn-rounded" type=button ng-click="update(false, myform, false, false, null)"><i class="icon-arrow-left icon-white"></i>{{ \'SAVE_CHANGES\' | translate }}</button></div><div class=col-sm-1><button class="btn btn-secondary btn-rounded" type=button ng-click=resetForm()><i class="icon-eye-open icon-white"></i>{{ \'CANCEL\' | translate }}</button></div></div></div></uib-tab></uib-tabset></div></div></section>'),a.put("modules/forms/admin/views/list-forms.client.view.html",'<header data-ng-include="\'/static/modules/core/views/header.client.view.html\'"></header><section class=overlay ng-if=showCreateModal ng-click=closeCreateModal()></section><script type=text/ng-template id=deleteModalListForms.html><div class="modal-header">\n\t\t<h2 class="modal-title hidden-md hidden-lg">{{ \'ARE_YOU_SURE\' | translate }}</h2>\n\t\t<h3 class="modal-title hidden-xs hidden-sm">{{ \'ARE_YOU_SURE\' | translate }}</h3>\n\t</div>\n\t<div class="modal-body">\n\t\t<div class="modal-body-alert">\n\t\t\t{{ \'READ_WARNING\' | translate }}\n\t\t</div>\n\t\t<p class="hidden-xs hidden-sm">\n\t\t\t{{ \'DELETE_WARNING1\' | translate }} <strong>{{content.currFormTitle}}</strong> {{ \'DELETE_WARNING2\' | translate }}\n\t\t</p>\n\t\t<p>{{ \'DELETE_CONFIRM\' | translate }}</p>\n\t</div>\n\t<div class="modal-footer">\n\t\t<input type="text" style="width:100%" data-ng-model="deleteConfirm" class="input-block" autofocus required aria-label="Type in the name of the form to confirm that you want to delete this form.">\n\t\t<button type="submit" ng-click="deleteForm()" class="btn btn-block btn-danger" ng-disabled="content.currFormTitle != deleteConfirm">\n\t\t\t{{ \'I_UNDERSTAND\' | translate }}\n\t\t</button>\n\t</div></script><section data-ng-controller="ListFormsController as ctrl" data-ng-init=findAll() class=container><br><div class=row><div ng-click=openCreateModal() class="col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item create-new"><div class="title-row col-xs-12"><h4 class="fa fa-plus fa-6"></h4></div><div class="col-xs-12 details-row"><small class=list-group-item-text>{{ \'CREATE_A_NEW_FORM\' | translate }}</small></div></div><form name=forms.createForm class="col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item create-new new-form" ng-if=showCreateModal><div class="title-row row"><div class="col-xs-5 field-title text-left">{{ \'NAME\' | translate }}</div><div class="col-xs-12 field-input"><input name=title required ng-model=formTitle ng-pattern=languageRegExp ng-minlength=4 style="color:black"></div></div><div class="details-row row"><div class="col-xs-5 field-title text-left">{{ \'LANGUAGE\' | translate }}</div><div class="col-xs-12 field-input"><div class="button custom-select"><select style=color:black name=language required ng-model=formLanguage ng-init="formLanguage = user.language"><option ng-repeat="language in languages" value={{language}}>{{language}}</option></select></div></div></div><div class="details-row submit row"><div class="col-xs-12 field-title text-center"><button class="btn btn-primary" ng-disabled=forms.createForm.$invalid ng-click=createNewForm()>{{ \'CREATE_FORM\' | translate }}</button></div></div></form><div data-ng-repeat="form in myforms" class="col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item container" ng-class="{\'paused\': !form.isLive}"><div class=row><span class=pull-right><i style=cursor:pointer class="fa fa-trash-o" ng-click=openDeleteModal($index)></i> <i style=cursor:pointer class="fa fa-files-o" ng-click=duplicateForm($index)></i></span></div><div class=row><a data-ng-href=#!/forms/{{form._id}}/admin/create class="title-row col-xs-12"><h4 class=list-group-item-heading data-ng-bind=form.title></h4></a><div class="col-xs-12 responses-row"><small class=list-group-item-text><span>{{ form.numberOfResponses }} {{ \'RESPONSES\' | translate }}</span></small><br><br><small ng-if=!form.isLive class=list-group-item-text><span>{{ \'FORM_PAUSED\' | translate }}</span></small></div></div></div></div></section>'),a.put("modules/forms/admin/views/adminTabs/analyze.html","<edit-submissions-form-directive myform=myform user=user></edit-submissions-form-directive>"),a.put("modules/forms/admin/views/adminTabs/configure.html","<configure-form-directive myform=myform user=user></configure-form-directive>"),a.put("modules/forms/admin/views/adminTabs/create.html","<edit-form-directive myform=myform></edit-form-directive>"),a.put("modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",'<div class="config-form container"><div class=row><div class="col-sm-offset-2 col-sm-4"><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'FORM_NAME\' | translate }}</h5></div><div class=col-sm-12><input class=form-control ng-model=myform.title value={{myform.title}} style="width: 100%" ng-minlength=4 ng-pattern="/^[a-zA-Z0-9 \\-.]*$/"></div></div><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'FORM_STATUS\' | translate }}</h5></div><div class="field-input col-sm-12"><label style="display: inline-block"><input type=radio data-ng-value=true ng-model=myform.isLive ng-required=true style="background-color:#33CC00">  <span>{{ \'PUBLIC\' | translate }}</span></label><label style="display: inline-block"><input type=radio data-ng-value=false ng-model=myform.isLive ng-required="true">  <span>{{ \'PRIVATE\' | translate }}</span></label></div></div><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'ENABLE_EMAIL_NOTIFICATIONS\' | translate }}</h5></div><div class="field-input col-sm-12"><label style="display: inline-block"><input type=radio data-ng-value=true ng-model=myform.emailNotifications.enabled ng-required=true style="background-color:#33CC00">  <span>{{ \'PUBLIC\' | translate }}</span></label><label style="display: inline-block"><input type=radio data-ng-value=false ng-model=myform.emailNotifications.enabled ng-required="true">  <span>{{ \'PRIVATE\' | translate }}</span></label></div></div><div class="row field" ng-if=myform.emailNotifications.enabled><div class="field-title col-sm-12"><h5>{{ \'EMAIL_NOTIFICATION_RECIPIENTS\' | translate }}</h5></div><div class=col-sm-12><input class=form-control ng-model=myform.emailNotifications.recipients value={{myform.emailNotifications.recipients}} style="width: 100%" placeholder=email@domain.com,email2@domain2.com,etc></div></div><div class="row field"><div class="col-sm-12 field-title">{{ \'LANGUAGE\' | translate }}</div><div class="col-sm-12 field-input"><select ng-model=myform.language><option ng-repeat="language in languages" ng-selected="language == myform.language" value={{language}}>{{language}}</option></select><span class=required-error ng-show="field.required && !field.fieldValue">* {{ \'REQUIRED_FIELD\' | translate }}</span></div></div></div><div class=col-sm-4><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'GA_TRACKING_CODE\' | translate }}</h5></div><div class=col-sm-12><input class=form-control ng-model=myform.analytics.gaCode value={{myform.analytics.gaCode}} style="width: 100%" ng-minlength=4 placeholder=UA-XXXXX-Y ng-pattern="/\\bUA-\\d{4,10}-\\d{1,4}\\b/"></div></div><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'DISPLAY_FOOTER\' | translate }}</h5></div><div class="field-input col-sm-12"><label style="display: inline-block"><input type=radio data-ng-value=false ng-model=myform.hideFooter ng-required="true">  <span>{{ \'YES\' | translate }}</span></label><label style="display: inline-block"><input type=radio data-ng-value=true ng-model=myform.hideFooter ng-required="true">  <span>{{ \'NO\' | translate }}</span></label></div></div><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'DISPLAY_START_PAGE\' | translate }}</h5></div><div class="field-input col-sm-12"><label style="display: inline-block"><input type=radio data-ng-value=true ng-model=myform.startPage.showStart ng-required=true style="background-color:#33CC00">  <span>{{ \'YES\' | translate }}</span></label><label style="display: inline-block"><input type=radio data-ng-value=false ng-model=myform.startPage.showStart ng-required="true">  <span>{{ \'NO\' | translate }}</span></label></div></div><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'DISPLAY_END_PAGE\' | translate }}</h5></div><div class="field-input col-sm-12"><label style="display: inline-block"><input type=radio data-ng-value=true ng-model=myform.endPage.showEnd ng-required=true style="background-color:#33CC00">  <span>{{ \'YES\' | translate }}</span></label><label style="display: inline-block"><input type=radio data-ng-value=false ng-model=myform.endPage.showEnd ng-required="true">  <span>{{ \'NO\' | translate }}</span></label></div></div></div></div><div class=row><div class="col-sm-offset-4 col-sm-2"><button class="btn btn-signup btn-rounded" type=button ng-click="update(false, myform, false, false, null)"><i class="icon-arrow-left icon-white"></i>{{ \'SAVE_CHANGES\' | translate }}</button></div><div class=col-sm-1><button class="btn btn-secondary btn-rounded" type=button ng-click=resetForm()><i class="icon-eye-open icon-white"></i>{{ \'CANCEL\' | translate }}</button></div></div></div>'),a.put("modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",'<form class=row name=editForm><script type=text/ng-template id=editEndPageModal.html class=edit-endpage-modal><div class="modal-body">\n\t\t\t<div class="row">\n\t\t\t\t<div class="edit-panel col-md-6 col-xs-12 col-sm-12">\n\t\t\t\t\t<div class="row modal-header">\n\t\t\t\t\t\t<h2 class="modal-title hidden-md hidden-lg">{{ \'EDIT_END_PAGE\' | translate }}</h2>\n\t\t\t\t\t\t<h3 class="modal-title hidden-xs hidden-sm">{{ \'EDIT_END_PAGE\' | translate }}</h3>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'TITLE\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n\t\t\t\t\t\t\t<input class="form-control" type="text"\n\t\t\t\t\t\t\t\t ng-model="myform.endPage.title" required>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'PARAGRAPH\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n <textarea class="form-control" type="text"\n\t\t\t\t\t\t\t\t\t\t\t ng-model="myform.endPage.paragraph"></textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'BTN_TEXT\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n\t\t\t\t\t\t\t<input class="form-control" type="text"\n\t\t\t\t\t\t\t\t ng-model="myform.endPage.buttonText" required>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<div class="col-md-4 col-xs-12 field-input">{{ \'SHOW_BUTTONS\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-8 col-xs-12 field-input">\n\t\t\t\t\t\t\t<label class="switch-light switch-holo" onclick="">\n\t\t\t\t\t\t\t\t<input type="checkbox" ng-model="showButtons">\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'OFF\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'ON\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<a></a>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row options buttons" ng-if="showButtons">\n\t\t\t\t\t\t<div class="col-md-3 col-xs-12">{{ \'BUTTONS\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-9 col-xs-12">\n\t\t\t\t\t\t\t<div ng-repeat="button in myform.endPage.buttons track by button._id" class="row" style="padding-bottom:1em;">\n\n\t\t\t\t\t\t\t\t<div class="col-xs-5">\n\t\t\t\t\t\t\t\t\t<span>{{ \'BUTTON_TEXT\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<input type="text"\n\t\t\t\t\t\t\t\t\t\t name="{{button.text}}_buttonText_startPage"\n\t\t\t\t\t\t\t\t\t\t ng-model="button.text"\n\t\t\t\t\t\t\t\t\t\t value="{{button.text}}"\n\t\t\t\t\t\t\t\t\t\t placeholder="{{ \'BUTTON_TEXT\' | translate }}">\n\t\t\t\t\t\t\t\t</div>\n\n\n\t\t\t\t\t\t\t\t<div class="col-xs-5">\n\t\t\t\t\t\t\t\t\t<span>{{ \'BUTTON_LINK\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<input type="text"\n\t\t\t\t\t\t\t\t\t\t name="{{button.url}}_url_startPage"\n\t\t\t\t\t\t\t\t\t\t ng-model="button.url"\n\t\t\t\t\t\t\t\t\t\t value="{{button.url}}"\n\t\t\t\t\t\t\t\t\t\t placeholder="http://aeouaou.com/aoeuoa">\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class="col-xs-2">\n\t\t\t\t\t\t\t\t\t<a class="btn btn-danger btn-mini right" type="button" ng-click="deleteButton(button)">\n\t\t\t\t\t\t\t\t\t\t<i class="fa fa-trash-o"></i>\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div class="row"><br></div>\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<button class="btn btn-primary btn-small col-md-offset-6 col-md-6 col-sm-4 col-sm-offset-8 col-xs-4 col-xs-offset-8" type="button" ng-click="addButton()">\n\t\t\t\t\t\t\t\t\t<i class="icon-plus icon-white"></i> {{ \'ADD_BUTTON\' | translate }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="modal-footer row">\n\t\t\t\t\t\t<button type="submit" ng-click="saveEndPage()" class="btn btn-signup btn-rounded">\n\t\t\t\t\t\t\t{{ \'SAVE_START_PAGE\' | translate }}\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button ng-click="cancel()" class="btn btn-secondary btn-rounded">\n\t\t\t\t\t\t\t{{ \'CANCEL\' | translate }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="preview-field-panel col-md-6 hidden-sm hidden-xs">\n\t\t\t\t\t<form class="public-form">\n\n\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t<div class="col-xs-12 text-center" style="overflow-wrap: break-word;">\n\t\t\t\t\t\t\t\t<h1 style="font-weight: 400; font-size: 25px;">\n\t\t\t\t\t\t\t\t\t{{myform.endPage.title}}\n\t\t\t\t\t\t\t\t</h1>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="col-xs-10 col-xs-offset-1 text-center" style="overflow-wrap: break-word;">\n\t\t\t\t\t\t\t\t<p style="color: grey; font-weight: 100; font-size: 16px;">\n\t\t\t\t\t\t\t\t\t{{myform.endPage.paragraph}}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div class="row form-actions text-center" style="padding: 5px 25px 5px 25px;">\n\t\t\t\t\t\t\t<button ng-click="reloadForm()" class="btn" type="button"\n\t\t\t\t\t\t\t\t\tng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}">\n\t\t\t<span style="font-size: 1.6em;">\n\t\t\t{{myform.endPage.buttonText}}\n\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em;">\n\t\t\t\t\t\t\t<p ng-repeat="button in myform.endPage.buttons" class="text-center" style="display:inline;">\n\t\t\t\t\t\t\t\t<button class="btn" style="background-color:rgb(156, 226, 235)" type="button" ng-style="{\'background-color\':button.bgColor, \'color\':button.color}">\n\t\t\t\t\t\t\t\t\t<a href="{{button.url}}"\n\t\t\t\t\t\t\t\t\t style="font-size: 1.6em; text-decoration: none;"\n\t\t\t\t\t\t\t\t\t ng-style="{\'color\':button.color}">\n\t\t\t\t\t\t\t\t\t\t{{button.text}}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t</div></script><script type=text/ng-template id=editStartPageModal.html class=edit-startpage-modal><div class="modal-body">\n\t\t\t<div class="row">\n\t\t\t\t<div class="edit-panel col-md-6 col-xs-12 col-sm-12">\n\t\t\t\t\t<div class="row modal-header">\n\t\t\t\t\t\t<h2 class="modal-title hidden-md hidden-lg">{{ \'EDIT_START_PAGE\' | translate }}</h2>\n\t\t\t\t\t\t<h3 class="modal-title hidden-xs hidden-sm">{{ \'EDIT_START_PAGE\' | translate }}</h3>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'INTRO_TITLE\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n\t\t\t\t\t\t\t<input class="form-control" type="text"\n\t\t\t\t\t\t\t\t ng-model="myform.startPage.introTitle"\n\t\t\t\t\t\t\t\t name="introTitleStartPage" required>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'INTRO_PARAGRAPH\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n <textarea class="form-control" type="text"\n\t\t\t\t\t\t\t\t\t\t\t ng-model="myform.startPage.introParagraph"\n\t\t\t\t\t\t\t\t\t\t\t name="introParagraphStartPage"></textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'INTRO_BTN\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n\t\t\t\t\t\t\t<input class="form-control" type="text"\n\t\t\t\t\t\t\t\t ng-model="myform.startPage.introButtonText"\n\t\t\t\t\t\t\t\t name="introButtonText" required>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<div class="col-md-4 col-xs-12 field-input">{{ \'SHOW_BUTTONS\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-8 col-xs-12 field-input">\n\t\t\t\t\t\t\t<label class="switch-light switch-holo" onclick="">\n\t\t\t\t\t\t\t\t<input type="checkbox" ng-model="showButtons">\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'OFF\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'ON\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<a></a>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row options buttons" ng-if="showButtons">\n\t\t\t\t\t\t<div class="col-md-3 col-xs-12">{{ \'BUTTONS\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-9 col-xs-12">\n\t\t\t\t\t\t\t<div ng-repeat="button in myform.startPage.buttons track by button._id" class="row" style="padding-bottom:1em;">\n\n\t\t\t\t\t\t\t\t<div class="col-xs-5">\n\t\t\t\t\t\t\t\t\t<span>{{ \'BUTTON_TEXT\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<input type="text"\n\t\t\t\t\t\t\t\t\t\t name="{{button.text}}_buttonText_startPage"\n\t\t\t\t\t\t\t\t\t\t ng-model="button.text"\n\t\t\t\t\t\t\t\t\t\t value="{{button.text}}"\n\t\t\t\t\t\t\t\t\t\t placeholder="{{ \'BUTTON_TEXT\' | translate }}">\n\t\t\t\t\t\t\t\t</div>\n\n\n\t\t\t\t\t\t\t\t<div class="col-xs-5">\n\t\t\t\t\t\t\t\t\t<span>{{ \'BUTTON_LINK\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<input type="text"\n\t\t\t\t\t\t\t\t\t\t name="{{button.url}}_url_startPage"\n\t\t\t\t\t\t\t\t\t\t ng-model="button.url"\n\t\t\t\t\t\t\t\t\t\t value="{{button.url}}"\n\t\t\t\t\t\t\t\t\t\t placeholder="http://aeouaou.com/aoeuoa">\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class="col-xs-2">\n\t\t\t\t\t\t\t\t\t<a class="btn btn-danger btn-mini right" type="button" ng-click="deleteButton(button)">\n\t\t\t\t\t\t\t\t\t\t<i class="fa fa-trash-o"></i>\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div class="row"><br></div>\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<button class="btn btn-primary btn-small col-md-offset-6 col-md-6 col-sm-4 col-sm-offset-8 col-xs-4 col-xs-offset-8" type="button" ng-click="addButton()">\n\t\t\t\t\t\t\t\t\t<i class="icon-plus icon-white"></i> {{ \'ADD_BUTTON\' | translate }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="modal-footer row">\n\t\t\t\t\t\t<button type="submit" ng-click="saveStartPage()" class="btn btn-signup btn-rounded">\n\t\t\t\t\t\t\t{{ \'SAVE_START_PAGE\' | translate }}\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button ng-click="cancel()" class="btn btn-secondary btn-rounded">\n\t\t\t\t\t\t\t{{ \'CANCEL\' | translate }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="preview-field-panel col-md-6 hidden-sm hidden-xs">\n\t\t\t\t\t<form class="public-form">\n\n\t\t\t\t\t\t<div class="field row">\n\t\t\t\t\t\t\t<div class="col-xs-12 text-center" style="overflow-wrap: break-word;">\n\t\t\t\t\t\t\t\t<h1>{{myform.startPage.introTitle}}</h1>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="col-xs-10 col-xs-offset-1 text-left" style="overflow-wrap: break-word;">\n\t\t\t\t\t\t\t\t<p style="color:#ddd;">{{myform.startPage.introParagraph}}</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em;">\n\t\t\t\t\t\t\t<p ng-repeat="button in myform.startPage.buttons" class="text-center" style="display:inline;">\n\t\t\t\t\t\t\t\t<button class="btn btn-info" type="button" ng-style="{\'background-color\':button.bgColor, \'color\':button.color}">\n\t\t\t\t\t\t\t\t\t<a href="{{button.url}}" style="font-size: 1.6em; text-decoration: none; color: inherit;" >\n\t\t\t\t\t\t\t\t\t\t{{button.text}}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="row form-actions">\n\t\t\t\t\t\t\t<button class="btn btn-info btn btn-info col-md-6 col-md-offset-3 col-lg-6 col-lg-offset-3" type="button">\n\t\t\t\t\t\t\t\t\t\t<span style="color:white; font-size: 1.6em; text-decoration: none;">\n\t\t\t\t\t\t\t\t\t\t\t{{myform.startPage.introButtonText}}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t</div></script><script type=text/ng-template id=editFieldModal.html class=edit-field-modal><div class="modal-body">\n\t\t\t<div class="row">\n\t\t\t\t<div class="edit-panel col-md-6 col-xs-12 col-sm-12">\n\t\t\t\t\t<div class="row modal-header">\n\t\t\t\t\t\t<h2 class="modal-title hidden-md hidden-lg">{{ \'EDIT_FIELD\' | translate }}</h2>\n\t\t\t\t\t\t<h3 class="modal-title hidden-xs hidden-sm">{{ \'EDIT_FIELD\' | translate }}</h3>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-12 bold">{{ \'QUESTION_TITLE\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-12">\n\t\t\t\t\t\t\t<input type="text" class="form-control" ng-model="field.title" name="title{{field._id}}" value="{{field.title}}" required></div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row description" ng-hide="showRatingOptions(field)">\n\t\t\t\t\t\t<div class="col-md-12 bold">{{ \'QUESTION_DESCRIPTION\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-12">\n\t\t\t\t\t\t\t<textarea type="text" class="form-control" ng-model="field.description" name="description{{field._id}}"value="{{field.description}}"></textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row" ng-show="showAddOptions(field)"><br></div>\n\t\t\t\t\t<div class="row options" ng-if="showAddOptions(field)">\n\t\t\t\t\t\t<div class="col-md-4 col-xs-12">{{ \'OPTIONS\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-8 col-xs-12">\n\t\t\t\t\t\t\t<div ng-repeat="option in field.fieldOptions track by option.option_id" class="row">\n\t\t\t\t\t\t\t\t<input type="text" name="{{option.option_value}}{{field._id}}" ng-model="option.option_value" class="col-xs-5">\n\n\t\t\t\t\t\t\t\t<a class="btn btn-danger btn-mini right" type="button" ng-click="deleteOption(field, option)" class="col-xs-3">\n\t\t\t\t\t\t\t\t\t<i class="fa fa-trash-o"></i>\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<button class="btn btn-primary btn-small col-md-offset-0 col-md-6 col-sm-4 col-sm-offset-4 col-xs-6 col-xs-offset-6" type="button" ng-click="addOption(field)">\n\t\t\t\t\t\t\t\t\t<i class="icon-plus icon-white"></i> {{ \'ADD_OPTION\' | translate }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row" ng-show="showRatingOptions(field)"><br></div>\n\t\t\t\t\t<div class="row" ng-if="showRatingOptions(field)">\n\t\t\t\t\t\t<div class="col-md-9 col-sm-9">{{ \'NUM_OF_STEPS\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-3 col-sm-3">\n\t\t\t\t\t\t\t<input style="width:100%" type="number"\n\t\t\t\t\t\t\t\t min="1" max="10"\n\t\t\t\t\t\t\t\t ng-model="field.ratingOptions.steps"\n\t\t\t\t\t\t\t\t name="ratingOptions_steps{{field._id}}"\n\t\t\t\t\t\t\t\t ng-value="{{field.ratingOptions.steps}}"\n\t\t\t\t\t\t\t\t required>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<div class="col-md-5 col-sm-9">{{ \'SHAPE\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-7 col-sm-3">\n\t\t\t\t\t\t\t<select style="width:100%" ng-model="field.ratingOptions.shape"\n\t\t\t\t\t\t\t\t\tvalue="{{field.ratingOptions.steps}}"\n\t\t\t\t\t\t\t\t\tname="ratingOptions_shape{{field._id}}" required>\n\t\t\t\t\t\t\t\t<option ng-repeat="shapeType in validShapes"\n\t\t\t\t\t\t\t\t\t\tvalue="{{shapeType}}">\n\t\t\t\t\t\t\t\t\t{{select2FA[shapeType]}}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<div class="col-md-4 col-xs-12 field-title">{{ \'REQUIRED_FIELD\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-8 col-xs-12 field-input">\n\t\t\t\t\t\t\t<label class="switch-light switch-holo" onclick="">\n\t\t\t\t\t\t\t\t<input type="checkbox" ng-model="field.required">\n\t\t\t\t\t\t\t\t<span class="large-3 columns float-left">\n\t\t\t\t\t\t\t\t\t<span> {{ \'OFF\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'ON\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<a></a>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<div class="col-md-4 col-xs-12 field-input">{{ \'LOGIC_JUMP\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-8 col-xs-12 field-input">\n\t\t\t\t\t\t\t<label class="switch-light switch-holo" onclick="">\n\t\t\t\t\t\t\t\t<input type="checkbox" ng-model="showLogicJump">\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'OFF\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'ON\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<a></a>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row question" ng-if="!!showLogicJump">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">\n\n\t\t\t\t\t\t\t<b> {{ \'IF_THIS_FIELD\' | translate }} </b>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">\n\t\t\t\t\t\t\t<select style="width:100%" ng-model="field.logicJump.expressionString"\n\t\t\t\t\t\t\t\t\tvalue="{{field.logicJump.expressionString}}"\n\t\t\t\t\t\t\t\t\tname="logicjump_expressionString{{field._id}}">\n\t\t\t\t\t\t\t\t<option value="field == static">\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_EQUAL_TO\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field != static">\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_NOT_EQUAL_TO\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\n\t\t\t\t\t\t\t\t<option value="field > static" ng-if-start="field.fieldType === \'number\' || field.fieldType === \'rating\' || field.fieldType === \'number\'">\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_GREATER_THAN\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field >= static">\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_GREATER_OR_EQUAL_THAN\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field < static">\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_SMALLER_THAN\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field <= static" ng-if-end>\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_SMALLER_OR_EQUAL_THAN\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\n\t\t\t\t\t\t\t\t<option value="field contains static" ng-if-start="field.fieldType !== \'number\' && field.fieldType !== \'rating\' && field.fieldType !== \'number\'">\n\n\t\t\t\t\t\t\t\t\t{{ \'CONTAINS\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field !contains static">\n\n\t\t\t\t\t\t\t\t\t{{ \'DOES_NOT_CONTAINS\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field ends static">\n\n\t\t\t\t\t\t\t\t\t{{ \'ENDS_WITH\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field !ends static">\n\n\t\t\t\t\t\t\t\t\t{{ \'DOES_NOT_END_WITH\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field starts static">\n\n\t\t\t\t\t\t\t\t\t{{ \'STARTS_WITH\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field !starts static" ng-if-end>\n\n\t\t\t\t\t\t\t\t\t{{ \'DOES_NOT_START_WITH\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">\n\t\t\t\t\t\t\t<input type="text" ng-model="field.logicJump.valueB"/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-md-2">\n\n\t\t\t\t\t\t\t<b>{{ \'THEN_JUMP_TO\' | translate }}</b>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-md-10">\n\t\t\t\t\t\t\t<select style="width:100%" ng-model="field.logicJump.jumpTo"\n\t\t\t\t\t\t\t\t\tvalue="{{field.logicJump.jumpTo}}"\n\t\t\t\t\t\t\t\t\tname="logicjump_jumpTo{{field._id}}">\n\t\t\t\t\t\t\t\t<option ng-repeat="jump_field in myform.form_fields"\n\t\t\t\t\t\t\t\t\t\tvalue="{{jump_field._id}}">\n\t\t\t\t\t\t\t\t\t{{jump_field.title}}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer row">\n\t\t\t\t\t\t<button type="submit" ng-click="saveField()" class="btn btn-signup btn-rounded">\n\t\t\t\t\t\t\t{{ \'SAVE_FIELD\' | translate }}\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button ng-click="cancel()" class="btn btn-secondary btn-rounded">\n\t\t\t\t\t\t\t{{ \'CANCEL\' | translate }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="preview-field-panel col-md-6 hidden-sm hidden-xs">\n\t\t\t\t\t<form class="public-form"ss>\n\t\t\t\t\t\t<field-directive field="field" validate="false" class="preview-field">\n\t\t\t\t\t\t</field-directive>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t</div></script><div class="col-xs-2 col-sm-4 add-field"><div class="row add-field-title"><h3 class="col-md-12 hidden-sm hidden-xs">{{ \'ADD_FIELD_LG\' | translate }}</h3><h4 class="col-sm-12 hidden-xs hidden-md hidden-lg">{{ \'ADD_FIELD_MD\' | translate }}</h4><h5 class="col-xs-12 hidden-sm hidden-md hidden-lg">{{ \'ADD_FIELD_SM\' | translate }}</h5></div><div class="panel-group row" class=draggable ng-model=addField.types><div class="col-xs-12 col-sm-12 col-md-6" ng-repeat="type in addField.types" style=padding-top:7.5px><div class="panel panel-default" style=background-color:#f5f5f5><div class=panel-heading ng-click="addNewField(false, type.name)" style="cursor: pointer; font-size:12px; padding-left: 10px; padding-right: 10px"><span><field-icon-directive type-name={{type.name}}></field-icon-directive></span> <span class=hidden-xs style=padding-left:0.3em>{{type.value}}</span></div></div></div></div></div><div class="col-xs-10 col-sm-8 current-fields"><div class=row ng-if=myform.startPage.showStart><div class=col-sm-12><div class="panel panel-default startPage" ng-click=openEditStartPageModal()><div class=panel-heading><h4 class=text-center>{{ \'WELCOME_SCREEN\' | translate }}</h4></div></div></div></div><div class=row><div class=col-sm-12><hr></div></div><div class="row dropzoneContainer"><div class="panel-group dropzone col-xs-12" ui-sortable=sortableOptions ng-model=myform.form_fields><div class="col-xs-12 field-row" ng-repeat="field in myform.form_fields track by $id($index)" ng-if=!field.deletePreserved><div class=col-xs-10><div class="panel panel-default" ng-click=openEditModal(field)><div class=panel-heading><div class=row><span class=col-xs-1 ng-switch=field.fieldType><field-icon-directive type-name={{field.fieldType}}></field-icon-directive></span> <span class=col-xs-11>{{field.title}} <span ng-show=field.required>*</span></span></div></div></div></div><div class="col-xs-1 box"><div class="panel tool-panel panel-default"><div class=panel-heading style="padding: 10px 10px" ng-click=deleteField($index)><span class=text-center><a href="" class="fa fa-trash-o"></a></span></div></div></div><div class="col-xs-1 box"><div class="panel tool-panel panel-default"><div class=panel-heading style="padding: 10px 10px" ng-click=duplicateField($index)><span class=text-center><a href="" class="fa fa-files-o"></a></span></div></div></div></div><div class="col-xs-12 field-row"><div class=col-xs-12 style="padding-right: 5px"><div class="panel panel-default" style="border-style: dashed; border-color: #a9a9a9"><div class=panel-heading><h4 class="panel-title text-center" style="color: #a9a9a9">{{ \'CLICK_FIELDS_FOOTER\' | translate }}</h4></div></div></div></div><hr></div></div><div class=row ng-if=myform.endPage.showEnd><div class=col-sm-12><div class="panel panel-default startPage" ng-click=openEditEndPageModal()><div class=panel-heading><h4 class=text-center>{{ \'END_SCREEN\' | translate }}</h4></div></div></div></div></div></form>'), -a.put("modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html","<div class=\"submissions-table container\"><div class=\"row text-center analytics\"><div class=\"col-xs-12 header-title\"><div class=col-xs-3>{{ 'TOTAL_VIEWS' | translate }}</div><div class=col-xs-3>{{ 'RESPONSES' | translate }}</div><div class=col-xs-3>{{ 'COMPLETION_RATE' | translate }}</div><div class=col-xs-3>{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div></div><div class=\"col-xs-12 header-numbers\"><div class=col-xs-3>{{myform.analytics.visitors.length}}</div><div class=col-xs-3>{{myform.analytics.submissions}}</div><div class=col-xs-3>{{myform.analytics.conversionRate | number:0}}%</div><div class=col-xs-3>{{ AverageTimeElapsed | secondsToDateTime | date:'mm:ss'}}</div></div><div class=\"col-xs-12 detailed-title\"><div class=col-xs-3>{{ 'DESKTOP_AND_LAPTOP' | translate }}</div><div class=col-xs-3>{{ 'TABLETS' | translate }}</div><div class=col-xs-3>{{ 'PHONES' | translate }}</div><div class=col-xs-3>{{ 'OTHER' | translate }}</div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.desktop.visits}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.tablet.visits}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.tablet.visits}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.other.visits}}</div></div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.desktop.responses}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.tablet.responses}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.phone.responses}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.other.responses}}</div></div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.desktop.completion}}%</div></div><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.tablet.completion}}%</div></div><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.phone.completion}}%</div></div><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.other.completion}}%</div></div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.desktop.average_time | secondsToDateTime | date:'mm:ss'}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.tablet.average_time | secondsToDateTime | date:'mm:ss'}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.phone.average_time | secondsToDateTime | date:'mm:ss'}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.other.average_time | secondsToDateTime | date:'mm:ss'}}</div></div></div><div class=\"col-xs-12 field-title-row\"><div class=col-xs-3><strong>{{ 'FIELD_TITLE' | translate }}</strong></div><div class=col-xs-3><strong>{{ 'FIELD_VIEWS' | translate }}</strong></div><div class=col-xs-3><strong>{{ 'FIELD_RESPONSES' | translate }}</strong></div><div class=col-xs-3><strong>{{ 'FIELD_DROPOFF' | translate }}</strong></div></div><div class=\"col-xs-12 field-detailed-row\" ng-repeat=\"fieldStats in myform.analytics.fields\"><div class=col-xs-3>{{fieldStats.field.title}}</div><div class=col-xs-3>{{fieldStats.totalViews}}</div><div class=col-xs-3>{{fieldStats.responses}}</div><div class=col-xs-3>{{fieldStats.continueRate}}%</div></div></div><br><div class=\"row table-tools\"><div class=col-xs-2><button class=\"btn btn-danger\" ng-click=deleteSelectedSubmissions() ng-disabled=!isAtLeastOneChecked();><i class=\"fa fa-trash-o\"></i> {{ 'DELETE_SELECTED' | translate }}</button></div><div class=\"col-xs-2 col-xs-offset-4 text-right\"><button class=\"btn btn-gray\" ng-click=\"exportSubmissions('xml')\"><small>{{ 'EXPORT_TO_EXCEL' | translate }}</small></button></div><div class=\"col-md-2 text-right\"><button class=\"btn btn-gray\" ng-click=\"exportSubmissions('csv')\"><small>{{ 'EXPORT_TO_CSV' | translate }}</small></button></div><div class=\"col-md-2 text-right\"><button class=\"btn btn-gray\" ng-click=\"exportSubmissions('json')\"><small>{{ 'EXPORT_TO_JSON' | translate }}</small></button></div></div><div class=\"row table-outer\"><div class=col-xs-12><table id=table-submission-data class=\"table table-striped table-hover table-condensed\"><thead><tr><th><input ng-model=table.masterChecker ng-change=toggleAllCheckers() type=\"checkbox\"></th><th>#</th><th data-ng-repeat=\"(key, value) in myform.form_fields track by $index\">{{value.title}}</th><th>{{ 'PERCENTAGE_COMPLETE' | translate }}</th><th>{{ 'TIME_ELAPSED' | translate }}</th><th>{{ 'DEVICE' | translate }}</th><th>{{ 'LOCATION' | translate }}</th><th>{{ 'IP_ADDRESS' | translate }}</th><th>{{ 'DATE_SUBMITTED' | translate }} (UTC)</th></tr></thead><tbody><tr data-ng-repeat=\"row in table.rows\" ng-click=rowClicked($index) ng-class=\"{selected: row.selected === true}\"><td><input ng-model=row.selected type=\"checkbox\"></td><th class=scope>{{$index+1}}</th><td data-ng-repeat=\"field in row.form_fields\">{{field.fieldValue}}</td><td>{{row.percentageComplete}}%</td><td>{{row.timeElapsed | secondsToDateTime | date:'mm:ss'}}</td><td>{{row.device.name}}, {{row.device.type}}</td><td>{{row.geoLocation.City}}, {{row.geoLocation.Country}}</td><td>{{row.ipAddr}}</td><td>{{row.created | date:'yyyy-MM-dd HH:mm:ss'}}</td></tr></tbody></table></div></div></div>"),a.put("modules/users/views/authentication/access-denied.client.view.html","<section class=\"text-center auth\"><h3 class=col-md-12>{{ 'ACCESS_DENIED_TEXT' | translate }}</h3><a href=/#!/sigin class=col-md-12>{{ 'SIGNIN_BTN' | translate }}</a></section>"),a.put("modules/users/views/authentication/signin.client.view.html",'<section class="auth sigin-view valign-wrapper" data-ng-controller=AuthenticationController><div class="row valign"><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><div class=col-md-12><form class="signin form-horizontal" autocomplete=off><fieldset><div data-ng-show=error class="text-center text-danger">Error: <strong data-ng-bind=error></strong></div><div class=form-group><input id=username name=username class=form-control data-ng-model=credentials.username placeholder="{{ \'USERNAME_OR_EMAIL_LABEL\' | translate }}" ng-minlength=4></div><div class=form-group><input type=password id=password name=password class=form-control data-ng-model=credentials.password placeholder="{{ \'PASSWORD_LABEL\' | translate }}" ng-minlength=4></div><div class=form-group><button class="btn btn-signup btn-rounded btn-block" ng-click=signin()>{{ \'SIGNIN_BTN\' | translate }}</button></div><div class="text-center forgot-password"><a ui-sref=forgot>{{ \'FORGOT_PASSWORD_LINK\' | translate }}</a></div></fieldset></form></div></div><div class="text-center forgot-password col-md-12"><a ui-sref=signup>{{ \'SIGNUP_ACCOUNT_LINK\' | translate }}</a></div></div></section>'),a.put("modules/users/views/authentication/signup-success.client.view.html",'<section class="auth signup-view success" data-ng-controller=AuthenticationController><h3 class="col-xs-offset-2 col-xs-8 col-md-offset-3 col-md-6 text-center">{{ \'SUCCESS_HEADER\' | translate }}</h3><div class="col-xs-offset-2 col-xs-8 col-md-offset-3 col-md-6"><h2>{{ \'SUCCESS_TEXT\' | translate }}<br><br>{{ \'NOT_ACTIVATED_YET\' | translate }}</h2><br><br><p><strong>{{ \'BEFORE_YOU_CONTINUE\' | translate }}</strong> <a href=mail:polydaic@gmail.com>polydaic@gmail.com</a></p><div class="text-center form-group"><button type=submit class="btn btn-primary btn-rounded"><a href="/#!/" style="color: white; text-decoration: none">{{ \'CONTINUE\' | translate }}</a></button></div></div></section>'),a.put("modules/users/views/authentication/signup.client.view.html",'<section class="auth signup-view valign-wrapper" data-ng-controller=AuthenticationController><div class="row valign"><div class="col-md-12 text-center vcenter" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><div class="col-xs-offset-3 col-xs-6 col-sm-offset-4 col-sm-4"><form name=userForm data-ng-submit=signup() class="signin form-horizontal" autocomplete=off><fieldset><div data-ng-show=error id=signup_errors class=text-center>{{\'SIGNUP_ERROR_TEXT\' | translate}}:<br><strong data-ng-bind=error></strong></div><div class=form-group><input id=username name=username class=form-control ng-pattern=languageRegExp ng-minlength=4 ng-model=credentials.username placeholder="{{ \'USERNAME_LABEL\' | translate }}" ng-minlength=4></div><div class=form-group><input type=email id=email name=email class=form-control ng-model=credentials.email placeholder="{{ \'EMAIL_LABEL\' | translate }}"></div><div class=form-group><input type=password id=password name=password class=form-control ng-model=credentials.password placeholder="{{ \'PASSWORD_LABEL\' | translate }}" ng-minlength=4></div><div class="text-center form-group"><button type=submit class="btn btn-signup btn-rounded btn-block">{{ \'SIGNUP_BTN\' | translate }}</button></div></fieldset></form><div class="text-center forgot-password"><a ui-sref=signin>{{ \'SIGN_IN_ACCOUNT_LINK\' | translate }}</a></div></div></div></section>'),a.put("modules/users/views/password/forgot-password.client.view.html",'<section class="auth valign-wrapper" data-ng-controller=PasswordController><div class="row valign"><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><div class=col-md-12><form data-ng-submit=askForPasswordReset() autocomplete=off><fieldset><div class=form-group><input id=username name=username class=form-control data-ng-model=credentials.username placeholder="{{ \'USERNAME_OR_EMAIL_LABEL\' | translate }}"></div><div class="text-center form-group"><button type=submit class="btn btn-signup btn-rounded btn-block">{{ \'PASSWORD_RESTORE_HEADER\' | translate }}</button></div><div data-ng-show=error class="text-center text-danger"><strong>{{error}}</strong></div><div data-ng-show=success class="text-center text-success"><strong>{{success}}</strong></div></fieldset></form></div></div></div></section>'),a.put("modules/users/views/password/reset-password-invalid.client.view.html","<section class=\"row text-center\"><h3 class=col-md-12>{{ 'PASSWORD_RESET_INVALID' | translate }}</h3><a href=/#!/password/forgot class=col-md-12>{{ 'ASK_FOR_NEW_PASSWORD' | translate }}</a></section>"),a.put("modules/users/views/password/reset-password-success.client.view.html","<section class=\"row text-center\"><h3 class=col-md-12>{{ 'PASSWORD_RESET_SUCCESS' | translate }}</h3><a href=\"/#!/\" class=col-md-12>{{ 'CONTINUE_TO_LOGIN' | translate }}</a></section>"),a.put("modules/users/views/password/reset-password.client.view.html",'<section class="row auth" data-ng-controller=PasswordController><h3 class="col-md-12 text-center">{{ \'RESET_PASSWORD\' | translate }}</h3><div class="col-xs-offset-2 col-xs-8 col-md-offset-3 col-md-6"><form data-ng-submit=resetUserPassword() class="signin form-horizontal" autocomplete=off><fieldset><div class=form-group><label for=newPassword>{{ \'NEW_PASSWORD_LABEL\' | translate }}</label><input type=password id=newPassword name=newPassword class=form-control data-ng-model=passwordDetails.newPassword placeholder="{{ \'NEW_PASSWORD_LABEL\' | translate }}"></div><div class=form-group><label for=verifyPassword>{{ \'VERIFY_PASSWORD_LABEL\' | translate }}</label><input type=password id=verifyPassword name=verifyPassword class=form-control data-ng-model=passwordDetails.verifyPassword placeholder="{{ \'VERIFY_PASSWORD_LABEL\' | translate }}"></div><div class="text-center form-group"><button type=submit class="btn btn-large btn-primary">{{ \'UPDATE_PASSWORD_LABEL\' | translate }}</button></div><div data-ng-show=error class="text-center text-danger"><strong>{{error}}</strong></div><div data-ng-show=success class="text-center text-success"><strong>{{success}}</strong></div></fieldset></form></div></section>'),a.put("modules/users/views/settings/change-password.client.view.html",'<header data-ng-include="\'/static/modules/core/views/header.client.view.html\'"></header><section class=row data-ng-controller=SettingsController><h3 class="col-md-12 text-center">{{ \'CHANGE_PASSWORD\' | translate }}</h3><div class="col-xs-offset-2 col-xs-8 col-md-offset-3 col-md-6"><form data-ng-submit=changeUserPassword() class="signin form-horizontal" autocomplete=off><fieldset><div class=form-group><label for=currentPassword>{{ \'CURRENT_PASSWORD_LABEL\' | translate }}</label><input type=password id=currentPassword name=currentPassword class=form-control data-ng-model=passwordDetails.currentPassword placeholder="{{ \'CURRENT_PASSWORD_LABEL\' | translate }}"></div><hr><div class=form-group><label for=newPassword>{{ \'NEW_PASSWORD_LABEL\' | translate }}</label><input type=password id=newPassword name=newPassword class=form-control data-ng-model=passwordDetails.newPassword placeholder="{{ \'NEW_PASSWORD_LABEL\' | translate }}"></div><div class=form-group><label for=verifyPassword>{{ \'VERIFY_PASSWORD_LABEL\' | translate }}</label><input type=password id=verifyPassword name=verifyPassword class=form-control data-ng-model=passwordDetails.verifyPassword placeholder="{{ \'VERIFY_PASSWORD_LABEL\' | translate }}"></div><div class="text-center form-group"><button type=submit class="btn btn-large btn-primary">{{ \'SAVE_PASSWORD_BTN\' | translate }}</button></div><div data-ng-show=success class="text-center text-success"><strong>{{ \'PASSWORD_CHANGE_SUCCESS\' | translate }}</strong></div><div data-ng-show=error class="text-center text-danger"><strong data-ng-bind=error></strong></div></fieldset></form></div></section>'),a.put("modules/users/views/settings/edit-profile.client.view.html",'<header data-ng-include="\'/static/modules/core/views/header.client.view.html\'"></header><section class=row data-ng-controller=SettingsController><h2 class="col-xs-offset-1 col-xs-10 text-center">{{ \'EDIT_PROFILE\' | translate }}</h2><div class="col-xs-offset-3 col-xs-6"><form name=userForm data-ng-submit=updateUserProfile(userForm.$valid) class="signin form-horizontal" autocomplete=off><fieldset><div data-ng-show=success class="text-center text-success"><strong>{{ \'PROFILE_SAVE_SUCCESS\' | translate }}</strong></div><div data-ng-show=error class="text-center text-danger">{{ \'PROFILE_SAVE_ERROR\' | translate }}<br><strong data-ng-bind=error></strong></div><div class="form-group row"><div class="col-xs-7 field-title">{{ \'FIRST_NAME_LABEL\' | translate }}</div><div class="col-xs-12 field-input"><input id=firstName name=firstName class=form-control data-ng-model=user.firstName ng-pattern="/^[\\w0-9 \\-.]*$/"></div></div><div class="form-group row"><div class="col-xs-7 field-title">{{ \'LAST_NAME_LABEL\' | translate }}</div><div class="col-xs-12 field-input"><input id=lastName name=lastName class=form-control data-ng-model=user.lastName ng-pattern="/^[\\w0-9 \\-.]*$/"></div></div><div class=row><hr></div><div class="row form-group"><div class="col-xs-7 field-title">{{ \'LANGUAGE_LABEL\' | translate }}</div><div class="col-xs-12 field-input"><select ng-model=user.language required><option ng-repeat="language in languages" ng-selected="language == user.language" value={{language}}>{{language}}</option></select></div></div><div class="row form-group"><div class="col-xs-7 field-title">{{ \'USERNAME_LABEL\' | translate }}</div><div class="col-xs-12 field-input"><input id=username name=username class=form-control data-ng-model=user.username></div></div><div class="row form-group"><div class="col-xs-7 field-title">{{ \'EMAIL_LABEL\' | translate }}</div><div class="col-xs-12 field-input"><input type=email id=email name=email class=form-control data-ng-model=user.email></div></div><div class="text-center form-group"><button type=submit class="btn btn-signup btn-rounded">{{ \'SAVE_CHANGES\' | translate }}</button> <button type=none ng-click=cancel() class="btn btn-rounded">{{ \'CANCEL_BTN\' | translate }}</button></div></fieldset></form></div></section>'),a.put("modules/users/views/settings/social-accounts.client.view.html",'<header data-ng-include="\'/static/modules/core/views/header.client.view.html\'"></header><section class=row data-ng-controller=SettingsController><h3 class="col-md-12 text-center" data-ng-show=hasConnectedAdditionalSocialAccounts()>{{ \'CONNECTED_SOCIAL_ACCOUNTS\' | translate }}:</h3><div class="col-md-12 text-center"><div data-ng-repeat="(providerName, providerData) in user.additionalProvidersData" class=remove-account-container><img ng-src=/modules/users/img/buttons/{{providerName}}.png> <a class="btn btn-danger btn-remove-account" data-ng-click=removeUserSocialAccount(providerName)><i class="glyphicon glyphicon-trash"></i></a></div></div><h3 class="col-md-12 text-center">{{ \'CONNECT_OTHER_SOCIAL_ACCOUNTS\' | translate }}</h3><div class="col-md-12 text-center"><a href=/auth/facebook data-ng-hide="isConnectedSocialAccount(\'facebook\')" class=undecorated-link><img src=/modules/users/img/buttons/facebook.png></a> <a href=/auth/twitter data-ng-hide="isConnectedSocialAccount(\'twitter\')" class=undecorated-link><img src=/modules/users/img/buttons/twitter.png></a> <a href=/auth/google data-ng-hide="isConnectedSocialAccount(\'google\')" class=undecorated-link><img src=/modules/users/img/buttons/google.png></a> <a href=/auth/linkedin data-ng-hide="isConnectedSocialAccount(\'linkedin\')" class=undecorated-link><img src=/modules/users/img/buttons/linkedin.png></a> <a href=/auth/github data-ng-hide="isConnectedSocialAccount(\'github\')" class=undecorated-link><img src=/modules/users/img/buttons/github.png></a></div></section>'),a.put("modules/users/views/verify/resend-verify-email.client.view.html",'<section class="auth valign-wrapper" data-ng-controller=VerifyController><section class="row valign" ng-if=!isResetSent><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><div data-ng-show=error class="text-center text-danger"><strong>{{error}}</strong></div><div class=col-md-12><form data-ng-submit=resendVerifyEmail() class="signin form-horizontal" autocomplete=off><fieldset><div class=form-group><input id=email name=email class=form-control data-ng-model=credentials.email placeholder="{{ \'ENTER_ACCOUNT_EMAIL\' | translate}}"></div><div class="text-center form-group"><button type=submit class="btn btn-signup btn-rounded btn-block" ng-click=resendVerifyEmail()>{{ \'RESEND_VERIFICATION_EMAIL\' | translate }}</button></div></fieldset></form></div></div></section><section class="row valign" ng-if=isResetSent><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><h3 class="col-md-12 text-center">{{ \'VERIFICATION_EMAIL_SENT\' | translate }}</h3><div class=col-md-12><h2>{{ \'VERIFICATION_EMAIL_SENT_TO\' | translate }} {{username}}.<br>{{ \'NOT_ACTIVATED_YET\' | translate }}</h2><p>{{ \'CHECK_YOUR_EMAIL\' | translate }} <a href=mail:polydaic@gmail.com>polydaic@gmail.com</a></p><div class="text-center form-group"><button type=submit class="btn btn-large btn-primary btn-rounded"><a href="/#!/" style=color:white>{{ \'CONTINUE\' | translate }}</a></button></div></div></div></section></section>'),a.put("modules/users/views/verify/verify-account.client.view.html",'<section class=auth data-ng-controller=VerifyController ng-init=validateVerifyToken()><section class="row text-center" ng-if=isResetSent><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><h3 class=col-md-12>{{ \'VERIFY_SUCCESS\' | translate }}</h3><div class=col-md-12><a href=/#!/signin class="btn btn-signup btn-rounded btn-block">{{ \'CONTINUE_TO_LOGIN\' | translate }}</a></div></div></section><section class="row text-center" ng-if=!isResetSent><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><h3 class=col-md-12>{{ \'VERIFY_ERROR\' | translate }}</h3><div class=col-md-12><a href=/#!/verify class="btn btn-rounded btn-default">{{ \'REVERIFY_ACCOUNT_LINK\' | translate }}</a></div><div class=col-sm-12><a href=/#!/signin class="btn btn-rounded btn-primary">{{ \'SIGNIN_BTN\' | translate }}</a></div></div></section></section>'),a.put("form_modules/forms/base/views/directiveViews/entryPage/startPage.html",'<div class="field row text-center"><div class="col-xs-12 text-center"><h1>{{pageData.introTitle}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-left"><p style=color:#ddd>{{pageData.introParagraph}}</p></div></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in pageData.buttons" class=text-center style=display:inline><button class="btn btn-info" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none; color: inherit">{{button.text}}</a></button></p></div><div class="row form-actions"><p class="col-xs-3 col-xs-offset-3 text-center"><button class="btn btn-info" type=button><a ng-click=exitpageData() style="color:white; font-size: 1.6em; text-decoration: none">{{ \'CONTINUE_FORM\' | translate }}</a></button></p></div>'),a.put("form_modules/forms/base/views/directiveViews/field/date.html",'<div class="field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show="!field.required && !field.fieldValue">{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><div class="control-group input-append"><input class=focusOn ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" ng-class="{ \'no-border\': !!field.fieldValue }" ui-date=dateOptions ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required placeholder=MM/DD/YYYY on-tab-key=nextField() on-tab-and-shift-key=prevField() ng-change=nextField()></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/dropdown.html",'<div class="field row dropdown" ng-if="field.fieldOptions.length > 0"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><ui-select ng-model=field.fieldValue theme=selectize search-enabled=true search-by=option_value set-search-to-answer=true ng-required=field.required on-tab-and-shift-key=prevField() on-tab-key=nextField() ng-change=nextField()><ui-select-match placeholder="Type or select an option"></ui-select-match><ui-select-choices repeat="option in field.fieldOptions | filter: $select.search" ng-class="{\'active\': option.option_value === field.fieldValue }"><span ng-bind-html="option.option_value | highlight: $select.search"></span></ui-select-choices></ui-select></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/hidden.html","<input type=hidden>"),a.put("form_modules/forms/base/views/directiveViews/field/legal.html",'<div class="field row radio legal" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-valid-key=nextField()><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><br><p class=col-xs-12>{{field.description}}</p></div><div class="col-xs-12 field-input container"><div class=row-fluid><label class="btn col-md-5 col-xs-12" ng-class="{activeBtn: field.fieldValue == \'true\'}"><input class=focusOn ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" type=radio value=true ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter style=float:left>Y</div><span>{{ \'LEGAL_ACCEPT\' | translate }}</span></label><label class="btn col-md-5 col-md-offset-1 col-xs-12" ng-class="{activeBtn: field.fieldValue == \'false\'}"><input class=focusOn ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" type=radio value=false ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter style=float:left>N</div><span>{{ \'LEGAL_NO_ACCEPT\' | translate }}</span></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/radio.html",'<div class="field row radio" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-option field=field ng-if="field.fieldOptions.length > 0"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><div ng-repeat="option in field.fieldOptions" class=row-fluid><label class="btn col-md-4 col-xs-12 col-sm-12" style="margin: 0.5em; padding-left:30px" ng-class="{activeBtn: field.fieldValue == field.fieldOptions[$index].option_value}"><div class=letter style=float:left>{{$index+1}}</div><input ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" type=radio class=focusOn value={{option.option_value}} ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="$root.nextField()"> <span ng-bind=option.option_value></span></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/rating.html",'<div class="textfield field row"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><input-stars max={{field.ratingOptions.steps}} ng-init="field.fieldValue = 1" on-shape-click=true on-star-click=nextField() icon-full={{field.ratingOptions.shape}} icon-base="fa fa-3x" icon-empty={{field.ratingOptions.shape}} ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() class="angular-input-stars focusOn"></input-stars></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/statement.html",'<div class="statement field row" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField()><div class="row field-title field-title"><div class=col-xs-1><i class="fa fa-quote-left fa-1"></i></div><h2 class="text-left col-xs-9">{{field.title}}</h2><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="row field-title field-input"><p class=col-xs-12 ng-if=field.description.length>{{field.description}}</p><br><div class="col-xs-offset-1 col-xs-11"><button class="btn focusOn">ng-style="{\'font-size\': \'1.3em\', \'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click="nextField()"> {{ \'CONTINUE\' | translate }}</button></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/textarea.html",'<div class="field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><small>{{ \'NEWLINE\' | translate }}</small><p><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><small style=font-size:0.6em>Press SHIFT+ENTER to add a newline</small><textarea class="textarea focusOn" type=text ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-class="{ \'no-border\': !!field.fieldValue }" value={{field.fieldValue}} ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() style="border: none; border-left: lightgrey dashed 2px">\n\t\t</textarea></div></div><div><div class="btn btn-lg btn-default" style="padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)"><button ng-disabled="!field.fieldValue || forms.myForm.{{field.fieldType}}{{$index}}.$invalid" ng-style="{\'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click=$root.nextField() class="btn col-sm-5 col-xs-5">{{ \'OK\' | translate }} <i class="fa fa-check"></i></button><div class="col-sm-3 col-xs-6" style=margin-top:0.2em><small style="color:#ddd; font-size:70%">{{ \'ENTER\' | translate }}</small></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/textfield.html",'<div class="textfield field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title row-fluid" ng-style="{\'color\': design.colors.questionColor}"><h3 class=col-xs-12><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>({{ \'OPTIONAL\' | translate }})</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><input ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" name={{field.fieldType}}{{index}} type={{input_type}} ng-pattern=validateRegex placeholder={{placeholder}} ng-class="{ \'no-border\': !!field.fieldValue }" class="focusOn text-field-input" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" value=field.fieldValue on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() ng-required=field.required aria-describedby="inputError2Status"></div><div class=col-xs-12><div ng-show="forms.myForm.{{field.fieldType}}{{index}}.$invalid && !!forms.myForm.{{field.fieldType}}{{index}}.$viewValue " class="alert alert-danger" role=alert><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>Error:</span> <span ng-if="field.fieldType == \'email\'">{{ \'ERROR_EMAIL_INVALID\' | translate }}</span> <span ng-if="field.fieldType == \'number\'">{{ \'ERROR_NOT_A_NUMBER\' | translate }}</span> <span ng-if="field.fieldType == \'link\'">{{ \'ERROR_URL_INVALID\' | translate }}</span></div></div></div><div><div class="btn btn-lg btn-default" style="padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)"><button ng-disabled="!field.fieldValue || field.$invalid" ng-style="{\'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click=nextField() class="btn col-sm-5 col-xs-5">{{ \'OK\' | translate }} <i class="fa fa-check"></i></button><div class="col-xs-6 col-sm-3" style=margin-top:0.2em><small style="color:#ddd; font-size:70%">{{ \'ENTER\' | translate }}</small></div></div></div>'), -a.put("form_modules/forms/base/views/directiveViews/field/yes_no.html",'<div class="field row radio" ng-click="setActiveField(field._id, index, true)" key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-tab-key=nextField() on-tab-and-shift-key=prevField() on-valid-key=nextField()><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3 class=row><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=row>{{field.description}}</p></div><div class="col-xs-12 field-input"><div class=row><label class="btn btn-default col-md-2 col-sm-3 col-xs-7" style="background: rgba(0,0,0,0.1); text-align:left"><input type=radio value=true class=focusOn style="opacity: 0; margin-left: 0px" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter>{{ \'Y\' | translate }}</div><span>{{ \'YES\' | translate }}</span> <i ng-show="field.fieldValue === \'true\'" class="fa fa-check" aria-hidden=true></i></label></div><div class=row style="margin-top: 10px"><label class="btn btn-default col-md-2 col-sm-3 col-xs-7" style="background: rgba(0,0,0,0.1); text-align:left"><input type=radio value=false style="opacity:0; margin-left:0px" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter>{{ \'N\' | translate }}</div><span>{{ \'NO\' | translate }}</span> <i ng-show="field.fieldValue === \'false\'" class="fa fa-check" aria-hidden=true></i></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",'<section class="overlay submitform" ng-if="!ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))"></section><section class="overlay previewform submitform" ng-if="ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))"></section><div ng-show="!myform.submitted && myform.startPage.showStart" class=form-submitted style="padding-top: 35vh"><div class=row><div class="col-xs-12 text-center" style="overflow-wrap: break-word"><h1 style="font-weight: 400; nont-size: 25px" ng-style="{\'color\': form.design.colors.questionColor}">{{myform.startPage.introTitle}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-center" style="overflow-wrap: break-word"><p style="font-weight: 100; font-size: 16px" ng-style="{\'color\': form.design.colors.questionColor}">{{myform.startPage.introParagraph}}</p></div></div><div class="row form-actions text-center" style="padding: 5px 25px 5px 25px"><button ng-click=exitStartPage() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{myform.startPage.introButtonText}}</span></button></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in myform.startPage.buttons" class=text-center style=display:inline><button class=btn style="background-color:rgb(156, 226, 235)" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none" ng-style="{\'color\':button.color}">{{button.text}}</a></button></p></div></div><div class=form-fields ng-show="!myform.submitted && !myform.startPage.showStart" ng-style="{ \'border-color\': myform.design.colors.buttonTextColor }"><div class=row><form name=forms.myForm novalidate class="submission-form col-sm-12 col-md-offset-1 col-md-10"><div ng-repeat="field in myform.form_fields" ng-if=!field.deletePreserved data-index={{$index}} data-id={{field._id}} ng-class="{activeField: selected._id == field._id }" class="row field-directive"><field-directive field=field design=myform.design index=$index forms=forms></field-directive></div></form></div><div class="row form-actions" id=submit_field ng-class="{activeField: selected._id == \'submit_field\' }" ng-style="{ \'background-color\':myform.design.colors.buttonColor}" style="border-top: 1px solid #ddd; margin-right: -13%; margin-left: -13%; margin-top: 30vh; height: 100vh"><div class="col-xs-12 text-left" style="background-color:#990000; color:white" ng-if=forms.myForm.$invalid>{{ \'COMPLETING_NEEDED\' | translate:translateAdvancementData }}</div><button ng-if=!forms.myForm.$invalid class="Button btn col-sm-2 col-xs-8 focusOn" v-busy=loading v-busy-label="Please wait" v-pressable ng-disabled="loading || forms.myForm.$invalid" ng-click=submitForm() on-enter-key=submitForm() on-enter-key-disabled="loading || forms.myForm.$invalid" ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" style="font-size: 1.6em; margin-left: 1em; margin-top: 1em">{{ \'SUBMIT\' | translate }}</button> <button ng-if=forms.myForm.$invalid class="Button btn col-sm-2 col-xs-8 focusOn" ng-click=goToInvalid() on-enter-key=goToInvalid() on-enter-key-disabled=!forms.myForm.$invalid style="font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white">{{ \'REVIEW\' | translate }}</button><div class="col-sm-2 hidden-xs" style="font-size: 75%; margin-top:3.25em"><small>{{ \'ENTER\' | translate }}</small></div></div><section ng-if=!myform.hideFooter class="navbar navbar-fixed-bottom" ng-style="{ \'background-color\':myform.design.colors.buttonColor, \'padding-top\': \'15px\', \'border-top\': \'2px \'+ myform.design.colors.buttonTextColor +\' solid\', \'color\':myform.design.colors.buttonTextColor}"><div class=container-fluid><div class=row><div class="col-sm-5 col-md-6 col-xs-5" ng-show=!myform.submitted><p class=lead>{{ \'ADVANCEMENT\' | translate:translateAdvancementData }}</p></div><div class="col-md-6 col-md-offset-0 col-sm-offset-2 col-sm-3 col-xs-offset-1 col-xs-6 row"><div class="col-md-4 col-md-offset-2 hidden-sm hidden-xs"><a href=/#!/forms class=btn ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}">{{ \'CREATE_FORM\' | translate }}</a></div><div class="col-md-4 col-sm-10 col-md-offset-0 col-sm-offset-2 col-xs-12 row"><button class="btn btn-lg col-xs-6" id=focusDownButton ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" ng-click=nextField() ng-disabled="selected.index > myform.form_fields.length-1"><i class="fa fa-chevron-down"></i></button> <button class="btn btn-lg col-xs-6" id=focusUpButton ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" ng-click=prevField() ng-disabled="selected.index == 0"><i class="fa fa-chevron-up"></i></button></div></div></div></div></section></div><div ng-if="myform.submitted && !loading && !myform.endPage.showEnd" class=form-submitted ng-style="{\'color\':myform.design.colors.buttonTextColor}" style="padding-top: 5vh"><div class="field row text-center" ng-style="{\'color\': myform.design.colors.questionColor}"><div class="col-xs-12 col-sm-12 col-md-6 col-md-offset-3 text-center">{{ \'FORM_SUCCESS\' | translate }}</div></div><div class="row form-actions"><p class=text-center><button ng-click=reloadForm() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{ \'BACK_TO_FORM\' | translate }}</span></button></p></div></div><div ng-if="myform.submitted && !loading && myform.endPage.showEnd" class=form-submitted ng-style="{\'color\':myform.design.colors.buttonTextColor}" style="padding-top: 5vh"><div class=row><div class="col-xs-12 text-center" style="overflow-wrap: break-word"><h1 style="font-weight: 400; font-size: 25px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.endPage.title}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-center" style="overflow-wrap: break-word"><p style="font-weight: 100; font-size: 16px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.endPage.paragraph}}</p></div></div><div class="row form-actions text-center" style="padding: 5px 25px 5px 25px"><button ng-click=reloadForm() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{myform.endPage.buttonText}}</span></button></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in myform.endPage.buttons" class=text-center style=display:inline><button class=btn style="background-color:rgb(156, 226, 235)" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none" ng-style="{\'color\':button.color}">{{button.text}}</a></button></p></div></div>'),a.put("form_modules/forms/base/views/form-unauthorized.client.view.html",'<section class="auth sigin-view valign-wrapper"><div class="row valign"><h3 class="col-md-12 text-center">Not Authorized to Access Form</h3><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px">The form you are trying to access is currently private and not accesible publically.<br>If you are the owner of the form, you can set it to "Public" in the "Configuration" panel in the form admin.</div></div></div></section>'),a.put("form_modules/forms/base/views/submit-form.client.view.html","<section class=public-form ng-style=\"{ 'background-color': myform.design.colors.backgroundColor }\"><submit-form-directive myform=myform></submit-form-directive></section><script ng-if=myform.analytics.gaCode>window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;\n\tga('create', '{{myform.analytics.gaCode}}', 'auto'); ga('send', 'pageview');</script><script ng-if=myform.analytics.gaCode src=https://www.google-analytics.com/analytics.js async defer></script>")}]),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","ui.date","ui.sortable","angular-input-stars","users","ngclipboard"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function(a,b,c){b.otherwise("/forms")}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function(a,b,c,d){a.$state=c,a.$stateParams=d,a.$on("$stateChangeSuccess",function(a,d,e,f){c.previous=f;var g=["home","signin","resendVerifyEmail","verify","signup","signup-success","forgot","reset-invalid","reset","reset-success"];g.indexOf(d.name)>0?b.isAuthenticated()&&(a.preventDefault(),c.go("listForms")):"access_denied"===d.name||b.isAuthenticated()||"submitForm"===d.name||(a.preventDefault(),c.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function(a,b,c,d,e,f){a.$on("$stateChangeStart",function(a,f){var g,h,i;h=f&&f.data&&f.data.permissions?f.data.permissions:null,b.ensureHasCurrentUser(c),i=b.currentUser,i&&(g=new d(i),null!==h&&(g.canAccess(h)||(a.preventDefault(),e.go("access_denied"))))})}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User","$window","$translate","$locale",function(a,b,c,d,e,f,g,h,i){a.signupDisabled=g.signupDisabled,b.user=a.user=e.ensureHasCurrentUser(f),b.authentication=a.authentication=e,a.languages=b.languages=["en","fr","es","it","de"],b.authentication.isAuthenticated()?a.language=b.user.language:a.language=i.id.substring(0,2),h.use(a.language),b.isCollapsed=!1,a.hideNav=!1,b.menu=c.getMenu("topbar"),b.signout=function(){var c=f.logout();c.then(function(){e.logout(),e.ensureHasCurrentUser(f),b.user=a.user=null,d.go("listForms"),d.reload()},function(a){console.error("Logout Failed: "+a)})},b.toggleCollapsibleMenu=function(){b.isCollapsed=!b.isCollapsed},b.$on("$stateChangeSuccess",function(c,d,e,f,g){b.isCollapsed=!1,a.hideNav=!1,angular.isDefined(d.data)&&angular.isDefined(d.data.hideNav)&&(a.hideNav=d.data.hideNav)})}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var a=function(a){if(a){if(~this.roles.indexOf("*"))return!0;for(var b in a.roles)for(var c in this.roles)if(this.roles[c]===a.roles[b])return!0;return!1}return this.isPublic};this.validateMenuExistance=function(a){if(a&&a.length){if(this.menus[a])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(a){return this.validateMenuExistance(a),this.menus[a]},this.addMenu=function(b,c,d){return this.menus[b]={isPublic:c||!1,roles:d||this.defaultRoles,items:[],shouldRender:a},this.menus[b]},this.removeMenu=function(a){this.validateMenuExistance(a),delete this.menus[a]},this.addMenuItem=function(b,c,d,e,f,g,h,i){return this.validateMenuExistance(b),this.menus[b].items.push({title:c,link:d,menuItemType:e||"item",menuItemClass:e,uiRoute:f||"/"+d,isPublic:null===g||"undefined"==typeof g?this.menus[b].isPublic:g,roles:null===h||"undefined"==typeof h?this.menus[b].roles:h,position:i||0,items:[],shouldRender:a}),this.menus[b]},this.addSubMenuItem=function(b,c,d,e,f,g,h,i){this.validateMenuExistance(b);for(var j in this.menus[b].items)this.menus[b].items[j].link===c&&this.menus[b].items[j].items.push({title:d,link:e,uiRoute:f||"/"+e,isPublic:null===g||"undefined"==typeof g?this.menus[b].items[j].isPublic:g,roles:null===h||"undefined"==typeof h?this.menus[b].items[j].roles:h,position:i||0,shouldRender:a});return this.menus[b]},this.removeMenuItem=function(a,b){this.validateMenuExistance(a);for(var c in this.menus[a].items)this.menus[a].items[c].link===b&&this.menus[a].items.splice(c,1);return this.menus[a]},this.removeSubMenuItem=function(a,b){this.validateMenuExistance(a);for(var c in this.menus[a].items)for(var d in this.menus[a].items[c].items)this.menus[a].items[c].items[d].link===b&&this.menus[a].items[c].items.splice(d,1);return this.menus[a]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("core").factory("subdomain",["$location",function(a){var b=a.host();return b.indexOf(".")<0?null:b.split(".")[0]}]),angular.module("forms").run(["Menus",function(a){a.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("secondsToDateTime",[function(){return function(a){return new Date(1970,0,1).setSeconds(a)}}]).filter("formValidity",[function(){return function(a){if(a&&a.form_fields&&a.visible_form_fields){var b=Object.keys(a),c=(b.filter(function(a){return"$"!==a[0]}),a.form_fields),d=c.filter(function(a){return"object"==typeof a&&"statement"!==a.fieldType&&"rating"!==a.fieldType?!!a.fieldValue:"rating"===a.fieldType||void 0}).length;return d-(a.form_fields.length-a.visible_form_fields.length)}return 0}}]).filter("trustSrc",["$sce",function(a){return function(b){return a.trustAsResourceUrl(b)}}]).config(["$provide",function(a){a.decorator("accordionDirective",["$delegate",function(a){var b=a[0];return b.replace=!0,a}])}]),angular.module("forms").config(["$stateProvider",function(a){a.state("listForms",{url:"/forms",templateUrl:"modules/forms/admin/views/list-forms.client.view.html"}).state("submitForm",{url:"/forms/:formId",templateUrl:"/static/form_modules/forms/base/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"GetForms",myForm:["GetForms","$stateParams","$q",function(a,b,c){var d=c.defer();return a.get({formId:b.formId},function(a){d.resolve(a)}),d.promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/admin/views/admin-form.client.view.html",data:{permissions:["editForm"]},resolve:{GetForms:"GetForms",myForm:["GetForms","$stateParams","$q",function(a,b,c){var d=c.defer();return a.get({formId:b.formId},function(a){d.resolve(a)}),d.promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/admin/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/admin/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/admin/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/admin/views/adminTabs/create.html"})}]),angular.module("forms").factory("GetForms",["$resource","FORM_URL",function(a,b){return a(b,{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(a,b){var c=angular.fromJson(a);return c.visible_form_fields=_.filter(c.form_fields,function(a){return a.deletePreserved===!1}),c}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("users").config(["$httpProvider",function(a){a.interceptors.push(["$q","$location",function(a,b){return{responseError:function(c){return"/users/me"!==b.path()&&c.config&&"/users/me"!==c.config.url&&(401===c.status?(b.nextAfterLogin=b.path(),b.path("/signin")):403===c.status&&b.path("/access_denied")),a.reject(c)}}}])}]),angular.module("users").config(["$stateProvider",function(a){var b=function(a,b,c,d,e){var f=a.defer();return e.currentUser&&e.currentUser.email?b(f.resolve):e.currentUser=d.getCurrent(function(){e.login(),b(f.resolve())},function(){e.logout(),b(f.reject()),c.go("signin",{reload:!0})}),f.promise};b.$inject=["$q","$timeout","$state","User","Auth"];var c=function(a,b,c){var d=c.defer();return b(a.signupDisabled?d.reject():d.resolve()),d.promise};c.$inject=["$window","$timeout","$q"],a.state("profile",{resolve:{loggedin:b},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:b},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:b},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:c},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:c},url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("verify",{resolve:{isDisabled:c},url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("resendVerifyEmail",{resolve:{isDisabled:c},url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function(a,b,c,d,e,f){a=d,a.credentials={},a.error="",a.signin=function(){e.login(a.credentials).then(function(b){f.login(b),a.user=d.user=f.ensureHasCurrentUser(e),"home"!==c.previous.name&&"verify"!==c.previous.name&&""!==c.previous.name?c.go(c.previous.name):c.go("listForms")},function(b){d.user=f.ensureHasCurrentUser(e),a.user=d.user,a.error=b,console.error("loginError: "+b)})},a.signup=function(){return"admin"===a.credentials?void(a.error="Username cannot be 'admin'. Please pick another username."):void e.signup(a.credentials).then(function(a){c.go("signup-success")},function(b){console.error(b),b?(a.error=b,console.error(b)):console.error("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function(a,b,c,d){a.error="",a.askForPasswordReset=function(){d.askForPasswordReset(a.credentials).then(function(b){a.success=b.message,a.credentials=null},function(b){a.error=b,a.credentials=null})},a.resetUserPassword=function(){a.success=a.error=null,d.resetPassword(a.passwordDetails,b.token).then(function(b){a.success=b.message,a.passwordDetails=null,c.go("reset-success")},function(b){a.error=b.message||b,a.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users","Auth",function(a,b,c,d,e,f){a.user=f.currentUser,a.hasConnectedAdditionalSocialAccounts=function(b){for(var c in a.user.additionalProvidersData)return!0;return!1},a.cancel=function(){a.user=f.currentUser},a.isConnectedSocialAccount=function(b){return a.user.provider===b||a.user.additionalProvidersData&&a.user.additionalProvidersData[b]},a.removeUserSocialAccount=function(b){a.success=a.error=null,c["delete"]("/users/accounts",{params:{provider:b}}).success(function(b){a.success=!0,a.user=b}).error(function(b){a.error=b.message})},a.updateUserProfile=function(b){if(b){a.success=a.error=null;var c=new e(a.user);c.$update(function(b){a.success=!0,a.user=b},function(b){a.error=b.data.message})}else a.submitted=!0},a.changeUserPassword=function(){a.success=a.error=null,c.post("/users/password",a.passwordDetails).success(function(b){a.success=!0,a.passwordDetails=null}).error(function(b){a.error=b.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function(a,b,c,d,e,f){a.isResetSent=!1,a.credentials={},a.error="",a.resendVerifyEmail=function(){d.resendVerifyEmail(a.credentials.email).then(function(b){a.success=b.message,a.credentials=null,a.isResetSent=!0},function(b){a.error=b,a.credentials.email=null,a.isResetSent=!1})},a.validateVerifyToken=function(){f.token&&(console.log(f.token),d.validateVerifyToken(f.token).then(function(b){a.success=b.message,a.isResetSent=!0,a.credentials.email=null},function(b){a.isResetSent=!1,a.error=b,a.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function(a){var b={isLoggedIn:!1},c={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(d){return c._currentUser&&c._currentUser.username?c._currentUser:a.user?(c._currentUser=a.user,c._currentUser):void d.getCurrent().then(function(d){return c._currentUser=d,b.isLoggedIn=!0,a.user=c._currentUser,c._currentUser},function(d){return b.isLoggedIn=!1,c._currentUser=null,a.user=null,null})},isAuthenticated:function(){return!!c._currentUser},getUserState:function(){return b},login:function(a){b.isLoggedIn=!0,c._currentUser=a},logout:function(){a.user=null,b.isLoggedIn=!1,c._currentUser=null}};return c}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(a,b){return function(c){return{canAccess:function(d){var e,f,g;for(angular.isArray(d)||(d=[d]),e=0,f=d.length;e<f;e++){if(g=d[e],null===a[g])throw"Bad permission value";if(!c||!c.roles)return!1;switch(g){case a.viewAdminSettings:case a.editAdminSettings:return c.roles.indexOf(b.admin)>-1;case a.viewPrivateForm:case a.editForm:return c.roles.indexOf(b.admin)>-1||c.roles.indexOf(b.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function(a,b,c,d,e){var f={getCurrent:function(){var a=b.defer();return d.get("/users/me").success(function(b){a.resolve(b)}).error(function(){a.reject("User's session has expired")}),a.promise},login:function(a){var c=b.defer();return d.post("/auth/signin",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},logout:function(){var a=b.defer();return d.get("/auth/signout").then(function(b){a.resolve(null)},function(b){a.reject(b.data.message||b.data)}),a.promise},signup:function(a){var c=b.defer();return d.post("/auth/signup",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},resendVerifyEmail:function(a){var c=b.defer();return d.post("/auth/verify",{email:a}).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},validateVerifyToken:function(a){var c=/^([A-Za-z0-9]{48})$/g;if(!c.test(a))throw new Error("Error token: "+a+" is not a valid verification token");var e=b.defer();return d.get("/auth/verify/"+a).then(function(a){e.resolve(a.data)},function(a){e.reject(a.data)}),e.promise},resetPassword:function(a,c){var e=b.defer();return d.post("/auth/reset/"+c,a).then(function(a){e.resolve(a)},function(a){e.reject(a.data.message||a.data)}),e.promise},askForPasswordReset:function(a){var c=b.defer();return d.post("/auth/forgot",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise}};return f}]),angular.module("users").factory("Users",["$resource",function(a){return a("users",{},{update:{method:"PUT"}})}]),angular.module("core").config(["$translateProvider",function(a){a.translations("en",{MENU:"MENU",SIGNUP_TAB:"Sign Up",SIGNIN_TAB:"Sign In",SIGNOUT_TAB:"Signout",EDIT_PROFILE:"Edit Profile",MY_FORMS:"My Forms",MY_SETTINGS:"My Settings",CHANGE_PASSWORD:"Change Password"}),a.preferredLanguage("en").fallbackLanguage("en").useSanitizeValueStrategy("escape")}]),angular.module("core").config(["$translateProvider",function(a){a.translations("fr",{MENU:"MENU",SIGNUP_TAB:"Créer un Compte",SIGNIN_TAB:"Connexion",SIGNOUT_TAB:"Créer un compte",EDIT_PROFILE:"Modifier Mon Profil",MY_FORMS:"Mes Formulaires",MY_SETTINGS:"Mes Paramètres",CHANGE_PASSWORD:"Changer mon Mot de Pass"})}]),angular.module("core").config(["$translateProvider",function(a){a.translations("es",{MENU:"MENU",SIGNUP_TAB:"Registrarse",SIGNIN_TAB:"Entrar",SIGNOUT_TAB:"Salir",EDIT_PROFILE:"Editar Perfil",MY_FORMS:"Mis formularios",MY_SETTINGS:"Mis configuraciones",CHANGE_PASSWORD:"Cambiar contraseña"})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$window","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm","$filter",function(a,b,c,d,e,f,g,h,i,j,k){c.activePill=0,c.copied=!1,c.onCopySuccess=function(a){c.copied=!0},c=a,c.animationsEnabled=!0,c.myform=j,a.saveInProgress=!1,g.setForm(c.myform),c.formURL="/#!/forms/"+c.myform._id,c.myform.isLive?b.subdomainsDisabled===!0?c.actualFormURL=window.location.protocol+"//"+window.location.host+"/view"+c.formURL:window.location.host.split(".").length<3?c.actualFormURL=window.location.protocol+"//"+c.myform.admin.username+"."+window.location.host+c.formURL:c.actualFormURL=window.location.protocol+"//"+c.myform.admin.username+"."+window.location.host.split(".").slice(1,3).join(".")+c.formURL:c.actualFormURL=window.location.protocol+"//"+window.location.host+c.formURL;var l=c.refreshFrame=function(){document.getElementById("iframe")&&document.getElementById("iframe").contentWindow.location.reload()};c.tabData=[{heading:k("translate")("CONFIGURE_TAB"),templateName:"configure"}],c.setForm=function(a){c.myform=a},a.resetForm=function(){c.myform=f.get({formId:d.formId})},c.openDeleteModal=function(){c.deleteModal=i.open({animation:c.animationsEnabled,templateUrl:"formDeleteModal.html",controller:"AdminFormController",resolve:{myForm:function(){return c.myform}}}),c.deleteModal.result.then(function(a){c.selected=a})},c.cancelDeleteModal=function(){c.deleteModal&&c.deleteModal.dismiss("cancel")},c.removeCurrentForm=function(){if(c.deleteModal&&c.deleteModal.opened){c.deleteModal.close();var a=c.myform._id;if(!a)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");h["delete"]("/forms/"+a).then(function(a){e.go("listForms",{},{reload:!0})},function(a){console.error(a)})}},c.update=a.update=function(b,d,e,f,g){l();var i=!0;if(b||(i=!a.saveInProgress),i){var j=null;if(b||(a.saveInProgress=!0),e)c.updatePromise=h.put("/forms/"+c.myform._id,{changes:d}).then(function(b){f&&(a.myform=c.myform=b.data)})["catch"](function(a){j=a.data,console.error(j)})["finally"](function(){if(b||(a.saveInProgress=!1),"function"==typeof g)return g(j)});else{var k=d;k.analytics&&k.analytics.visitors&&delete k.analytics.visitors,k.submissions&&delete k.submissions,c.updatePromise=h.put("/forms/"+c.myform._id,{form:k}).then(function(b){f&&(a.myform=c.myform=b.data)})["catch"](function(a){j=a.data,console.error(j)})["finally"](function(){if(b||(a.saveInProgress=!1),"function"==typeof g)return g(j)})}}}}]),angular.module("forms").controller("ListFormsController",["$rootScope","$scope","$stateParams","$state","GetForms","CurrentForm","$http","$uibModal",function(a,b,c,d,e,f,g,h){b=a,b.forms={},b.showCreateModal=!1,a.languageRegExp={regExp:/[@!#$%^&*()\-+={}\[\]|\\/'";:`.,~№?<>]+/i,test:function(a){return!this.regExp.test(a)}},b.openDeleteModal=function(a){b.deleteModal=h.open({animation:b.animationsEnabled,templateUrl:"deleteModalListForms.html",controller:["$uibModalInstance","items","$scope",function(a,b,c){c.content=b,c.cancel=c.cancelDeleteModal,c.deleteForm=function(){c.$parent.removeForm(b.formIndex)}}],resolve:{items:function(){return{currFormTitle:b.myforms[a].title,formIndex:a}}}})},b.cancelDeleteModal=function(){b.deleteModal&&b.deleteModal.dismiss("cancel")},b.findAll=function(){e.query(function(a){b.myforms=a})},b.openCreateModal=function(){b.showCreateModal||(b.showCreateModal=!0)},b.closeCreateModal=function(){b.showCreateModal&&(b.showCreateModal=!1)},b.setForm=function(a){b.myform=a},b.goToWithId=function(a,b){d.go(a,{formId:b},{reload:!0})},b.duplicateForm=function(a){var c=_.cloneDeep(b.myforms[a]);delete c._id,g.post("/forms",{form:c}).success(function(c,d,e){b.myforms.splice(a+1,0,c)}).error(function(a){console.error(a),null===a&&(b.error=a.data.message)})},b.createNewForm=function(){var a={};a.title=b.forms.createForm.title.$modelValue,a.language=b.forms.createForm.language.$modelValue,b.forms.createForm.$valid&&b.forms.createForm.$dirty&&g.post("/forms",{form:a}).success(function(a,c,d){b.goToWithId("viewForm.create",a._id+"")}).error(function(a){console.error(a),b.error=a.data.message})},b.removeForm=function(a){if(a>=b.myforms.length||a<0)throw new Error("Error: form_index in removeForm() must be between 0 and "+b.myforms.length-1);g["delete"]("/forms/"+b.myforms[a]._id).success(function(c,d,e){b.myforms.splice(a,1),b.cancelDeleteModal()}).error(function(a){console.error(a)})}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function(a,b,c,d){return{templateUrl:"modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function(b){b.log="",b.languages=a.languages,b.resetForm=a.resetForm,b.update=a.update}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields","$uibModal",function(a,b,c){return{templateUrl:"modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",restrict:"E",transclude:!0,scope:{myform:"="},controller:["$scope",function(d){var e;d.sortableOptions={appendTo:".dropzone",forceHelperSize:!0,forcePlaceholderSize:!0,update:function(a,b){d.update(!1,d.myform,!1,!1,function(a){})}},d.openEditModal=function(a){d.editFieldModal=c.open({animation:!0,templateUrl:"editFieldModal.html",windowClass:"edit-modal-window",controller:["$uibModalInstance","$scope",function(b,c){c.field=a,c.showLogicJump=!1,c.showAddOptions=function(a){return"dropdown"===a.fieldType||"checkbox"===a.fieldType||"radio"===a.fieldType; -},c.validShapes=["Heart","Star","thumbs-up","thumbs-down","Circle","Square","Check Circle","Smile Outlined","Hourglass","bell","Paper Plane","Comment","Trash"],c.addOption=function(a){if("checkbox"===a.fieldType||"dropdown"===a.fieldType||"radio"===a.fieldType){a.fieldOptions||(a.fieldOptions=[]);var b=a.fieldOptions.length+1,c={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+b,option_value:"Option "+b};a.fieldOptions.push(c)}},c.deleteOption=function(a,b){if("checkbox"===a.fieldType||"dropdown"===a.fieldType||"radio"===a.fieldType)for(var c=0;c<a.fieldOptions.length;c++)if(a.fieldOptions[c].option_id===b.option_id){a.fieldOptions.splice(c,1);break}},c.select2FA={Heart:"Heart",Star:"Star","thumbs-up":"Thumbs Up","thumbs-down":"Thumbs Down",Circle:"Circle",Square:"Square","Check Circle":"Checkmark","Smile Outlined":"Smile",Hourglass:"Hourglass",bell:"Bell","Paper Plane":"Paper Plane",Comment:"Chat Bubble",Trash:"Trash Can"},c.showRatingOptions=function(a){return"rating"===a.fieldType},c.saveField=function(){c.myform.form_fields.push(a),c.$parent.update(!1,c.$parent.myform,!1,!0,function(){b.close()})},c.cancel=function(){b.close()}}]})},d.openEditStartPageModal=function(){d.editStartPageModal=c.open({animation:!0,templateUrl:"editStartPageModal.html",windowClass:"edit-modal-window",controller:["$uibModalInstance","$scope",function(a,b){b.showButtons=!1,b.lastButtonID=0,b.addButton=function(){var a={};a.bgColor="#ddd",a.color="#ffffff",a.text="Button",a._id=Math.floor(1e5*Math.random()),b.myform.startPage.buttons.push(a)},b.deleteButton=function(a){for(var c,d=0;d<b.myform.startPage.buttons.length;d++)if(c=b.myform.startPage.buttons[d]._id,c===a._id){b.myform.startPage.buttons.splice(d,1);break}},b.saveStartPage=function(){b.$parent.update(!1,b.$parent.myform,!1,!0,function(){a.close()})},b.cancel=function(){a.close()}}]})},d.openEditEndPageModal=function(){d.editEndPageModal=c.open({animation:!0,templateUrl:"editEndPageModal.html",windowClass:"edit-modal-window",controller:["$uibModalInstance","$scope",function(a,b){b.showButtons=!1,b.lastButtonID=0,b.addButton=function(){var a={};a.bgColor="#ddd",a.color="#ffffff",a.text="Button",a._id=Math.floor(1e5*Math.random()),b.myform.endPage.buttons.push(a)},b.deleteButton=function(a){for(var c,d=0;d<b.myform.endPage.buttons.length;d++)if(c=b.myform.endPage.buttons[d]._id,c===a._id){b.myform.endPage.buttons.splice(d,1);break}},b.saveEndPage=function(){b.$parent.update(!1,b.$parent.myform,!1,!0,function(){a.close()})},b.cancel=function(){a.close()}}]})},d.update=a.update,d.dropzone={handle:".handle",containment:".dropzoneContainer",cursor:"grabbing"},d.addNewField=function(a,b){d.addField.lastAddedID++;for(var c=b,f=0;f<d.addField.types.length;f++)if(d.addField.types[f].name===b){d.addField.types[f].lastAddedID++,c=d.addField.types[f].value+d.addField.types[f].lastAddedID;break}e={title:c,fieldType:b,fieldValue:"",required:!0,disabled:!1,deletePreserved:!1,logicJump:{}},"rating"===b&&(e.ratingOptions={steps:5,shape:"Heart"},e.fieldValue=0),d.showAddOptions(e)&&(e.fieldOptions=[],e.fieldOptions.push({option_id:Math.floor(1e5*Math.random()),option_title:"Option 0",option_value:"Option 0"})),a&&d.myform.form_fields.push(e),d.openEditModal(e)},d.showAddOptions=function(a){return"dropdown"===a.fieldType||"checkbox"===a.fieldType||"radio"===a.fieldType},d.showRatingOptions=function(a){return"rating"===a.fieldType},d.deleteField=function(a){d.myform.form_fields.splice(a,1),d.update(!1,d.myform,!1,!0,null)},d.duplicateField=function(a){var b=angular.copy(d.myform.form_fields[a]);b._id="cloned"+_.uniqueId(),b.title+=" copy",d.myform.form_fields.push(b),d.update(!1,d.myform,!1,!0,null)},d.addField={},d.addField.types=b.types,d.addField.types.forEach(function(a){return a.lastAddedID=1,a})}]}}]),angular.module("forms").directive("editSubmissionsFormDirective",["$rootScope","$http","Forms","$stateParams","$interval",function(a,b,c,d,e){return{templateUrl:"modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html",restrict:"E",scope:{user:"=",myform:"="},controller:["$scope",function(a){a.table={masterChecker:!1,rows:[]};for(var c=a.myform.submissions||[],d=0;d<c.length;d++){for(var f=0;f<c[d].form_fields.length;f++)"dropdown"===c[d].form_fields[f].fieldType&&(c[d].form_fields[f].fieldValue=c[d].form_fields[f].fieldValue.option_value);c[d].selected=!1}a.table.rows=c;var g=function(){b({method:"GET",url:"/someUrl"}).then(function(b){for(var c=(_.cloneDeep(a.myform.form_fields),b.data||[]),d=0;d<c.length;d++){for(var e=0;e<c[d].form_fields.length;e++)"dropdown"===c[d].form_fields[e].fieldType&&(c[d].form_fields[e].fieldValue=c[d].form_fields[e].fieldValue.option_value);c[d].selected=!1}a.table.rows=c})};a.AverageTimeElapsed=function(){for(var b=0,c=a.table.rows.length,d=0;d<a.table.rows.length;d++)b+=a.table.rows[d].timeElapsed;return 0===c?0:(b/c).toFixed(0)}(),a.DeviceStatistics=function(){var b=function(){return{visits:0,responses:0,completion:0,average_time:0,total_time:0}},c={desktop:b(),tablet:b(),phone:b(),other:b()};if(a.myform.analytics&&a.myform.analytics.visitors)for(var d=a.myform.analytics.visitors,e=0;e<d.length;e++){var f=d[e],g=f.deviceType;c[g].visits++,f.isSubmitted&&(c[g].total_time=c[g].total_time+f.timeElapsed,c[g].responses++),c[g].visits&&(c[g].completion=100*(c[g].responses/c[g].visits).toFixed(2)),c[g].responses&&(c[g].average_time=(c[g].total_time/c[g].responses).toFixed(0))}return c}();var h=e(g,1e6);a.$on("$destroy",function(){h&&e.cancel(a.updateFields)}),a.isAtLeastOneChecked=function(){for(var b=0;b<a.table.rows.length;b++)if(a.table.rows[b].selected)return!0;return!1},a.toggleAllCheckers=function(){for(var b=0;b<a.table.rows.length;b++)a.table.rows[b].selected=a.table.masterChecker},a.toggleObjSelection=function(a){a.stopPropagation()},a.rowClicked=function(b){a.table.rows[b].selected=!a.table.rows[b].selected},a.deleteSelectedSubmissions=function(){var c=_.chain(a.table.rows).filter(function(a){return!!a.selected}).pluck("_id").value();b({url:"/forms/"+a.myform._id+"/submissions",method:"DELETE",data:{deleted_submissions:c},headers:{"Content-Type":"application/json;charset=utf-8"}}).success(function(b,c){for(var d=[],e=0;e<a.table.rows.length;e++)a.table.rows[e].selected||d.push(a.table.rows[e]);a.table.rows=d}).error(function(a){console.error(a)})},a.exportSubmissions=function(a){angular.element("#table-submission-data").tableExport({type:a,escape:!1,ignoreColumn:[0]})}}]}}]),angular.module("forms").service("FormFields",["$filter",function(a){this.types=[{name:"textfield",value:a("translate")("SHORT_TEXT")},{name:"email",value:a("translate")("EMAIL")},{name:"radio",value:a("translate")("MULTIPLE_CHOICE")},{name:"dropdown",value:a("translate")("DROPDOWN")},{name:"date",value:a("translate")("DATE")},{name:"textarea",value:a("translate")("PARAGRAPH")},{name:"yes_no",value:a("translate")("YES_NO")},{name:"legal",value:a("translate")("LEGAL")},{name:"rating",value:a("translate")("RATING")},{name:"link",value:a("translate")("LINK")},{name:"number",value:a("translate")("NUMBERS")},{name:"statement",value:a("translate")("STATEMENT")}]}]),angular.module("forms").factory("Submissions",["$resource",function(a){return a("forms/:formID/submissions/:submissionId",{submissionId:"@_id",formId:"@_id"},{query:{method:"GET",isArray:!0},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("users").config(["$translateProvider",function(a){a.translations("en",{ACCESS_DENIED_TEXT:"You need to be logged in to access this page",USERNAME_OR_EMAIL_LABEL:"Username or Email",USERNAME_LABEL:"Username",PASSWORD_LABEL:"Password",CURRENT_PASSWORD_LABEL:"Current Password",NEW_PASSWORD_LABEL:"New Password",VERIFY_PASSWORD_LABEL:"Verify Password",UPDATE_PASSWORD_LABEL:"Update Password",FIRST_NAME_LABEL:"First Name",LAST_NAME_LABEL:"Last Name",LANGUAGE_LABEL:"Language",EMAIL_LABEL:"Email",SIGNUP_ACCOUNT_LINK:"Don't have an account? Sign up here",SIGN_IN_ACCOUNT_LINK:"Already have an account? Sign in here",SIGNUP_HEADER_TEXT:"Sign up",SIGNIN_HEADER_TEXT:"Sign in",SIGNUP_ERROR_TEXT:"Couldn't complete registration due to errors",ENTER_ACCOUNT_EMAIL:"Enter your account email.",RESEND_VERIFICATION_EMAIL:"Resend Verification Email",SAVE_CHANGES:"Save Changes",CANCEL_BTN:"Cancel",EDIT_PROFILE:"Edit your profile",UPDATE_PROFILE_BTN:"Update Profile",PROFILE_SAVE_SUCCESS:"Profile saved successfully",PROFILE_SAVE_ERROR:"Could't Save Your Profile.",CONNECTED_SOCIAL_ACCOUNTS:"Connected social accounts",CONNECT_OTHER_SOCIAL_ACCOUNTS:"Connect other social accounts",FORGOT_PASSWORD_LINK:"Forgot your password?",REVERIFY_ACCOUNT_LINK:"Resend your verification email",SIGNIN_BTN:"Sign in",SIGNUP_BTN:"Sign up",SAVE_PASSWORD_BTN:"Save Password",SUCCESS_HEADER:"Signup Successful",SUCCESS_TEXT:"You’ve successfully registered an account at TellForm.",VERIFICATION_EMAIL_SENT:"Verification Email has been Sent",VERIFICATION_EMAIL_SENT_TO:"A verification email has been sent to",NOT_ACTIVATED_YET:"But your account is not activated yet",BEFORE_YOU_CONTINUE:"Before you continue, make sure to check your email for our verification. If you don’t receive it within 24h drop us a line at ",CHECK_YOUR_EMAIL:"Check your email and click on the activation link to activate your account. If you have any questions drop us a line at",CONTINUE:"Continue",PASSWORD_RESTORE_HEADER:"Restore your password",ENTER_YOUR_EMAIL:"Enter your account email.",SUBMIT_BTN:"Submit",ASK_FOR_NEW_PASSWORD:"Ask for new password reset",PASSWORD_RESET_INVALID:"Password reset is invalid",PASSWORD_RESET_SUCCESS:"Passport successfully reset",PASSWORD_CHANGE_SUCCESS:"Passport successfully changed",RESET_PASSWORD:"Reset your password",CHANGE_PASSWORD:"Change your password",CONTINUE_TO_LOGIN:"Continue to login page",VERIFY_SUCCESS:"Account successfully activated",VERIFY_ERROR:"Verification link is invalid or has expired"}),a.preferredLanguage("en").fallbackLanguage("en").useSanitizeValueStrategy("escape")}]),angular.module("users").config(["$translateProvider",function(a){a.translations("fr",{ACCESS_DENIED_TEXT:"Vouz n’êtes pas autorisé à accéder à cette page.",USERNAME_LABEL:"Nom d’utilisateur",PASSWORD_LABEL:"Mot de Passe",CURRENT_PASSWORD_LABEL:"Mot de passe actuel",NEW_PASSWORD_LABEL:"Nouveau Mot de Passe",VERIFY_PASSWORD_LABEL:"Vérifier le mot de passe",UPDATE_PASSWORD_LABEL:"Mettre à jour le mot de passe",FIRST_NAME_LABEL:"Prénom",LAST_NAME_LABEL:"Nom",LANGUAGE_LABEL:"Langue",EMAIL_LABEL:"Email",UPDATE_PROFILE_BTN:"Modifier le Profil",PROFILE_SAVE_SUCCESS:"Profil enregistré avec succès",PROFILE_SAVE_ERROR:"Erreur: impossible d’enregistrer votre Profile.",FORGOT_PASSWORD_LINK:"Mot de passe oublié ?",REVERIFY_ACCOUNT_LINK:"Re-envoyez un email de vérification",SIGNIN_BTN:"Connexion",SIGNUP_BTN:"Créer un compte",SAVE_PASSWORD_BTN:"Enregistrer votre nouveau Mot de Passe",SUCCESS_HEADER:"Votre Compte a été enregistré !",SUCCESS_TEXT:"Votre compte Tellform a été crée avec succès.",VERIFICATION_EMAIL_SENT:"Un email de verification a été envoyer à",NOT_ACTIVATED_YET:"Mais votre compte n'est pas activé",BEFORE_YOU_CONTINUE:"Avant de continuer, vous devez valider votre adresse mail. Merci de vérifier votre boite mail. Si vous ne l’avez pas reçu dans les prochaines 24h, contactez-nous a ",CHECK_YOUR_EMAIL:"Vérifiez vos emails, et cliquez sur le lien de validation pour activer votre compte. Si vous avez une question contactez-nous à",PASSWORD_RESTORE_HEADER:"Mot de passe perdu",ENTER_YOUR_EMAIL:"Entrer votre email",SUBMIT_BTN:"Enregistrer",ASK_FOR_NEW_PASSWORD:"Demander un nouveau mot de pass ",PASSWORD_RESET_INVALID:"Le nouveau mot de passe est invalid",PASSWORD_RESET_SUCCESS:"Mot de passe réinitialisé avec succès",PASSWORD_CHANGE_SUCCESS:"Mot de passe enregistré avec succès",CONTINUE_TO_LOGIN:"Allez à la page de connexion",VERIFY_SUCCESS:"Votre compte est activé !",VERIFY_ERROR:"Le lien de vérification est invalide ou à expiré"})}]),angular.module("users").config(["$translateProvider",function(a){a.translations("es",{ACCESS_DENIED_TEXT:"Tenés que estar logueado para acceder a esta página",USERNAME_OR_EMAIL_LABEL:"Usuario o Email",USERNAME_LABEL:"Usuario",PASSWORD_LABEL:"Contraseña",CURRENT_PASSWORD_LABEL:"Contraseña actual",NEW_PASSWORD_LABEL:"Nueva contraseña",VERIFY_PASSWORD_LABEL:"Verificar contraseña",UPDATE_PASSWORD_LABEL:"Actualizar contraseña",FIRST_NAME_LABEL:"Nombre",LAST_NAME_LABEL:"Apellido",LANGUAGE_LABEL:"Idioma",EMAIL_LABEL:"Email",SIGNUP_ACCOUNT_LINK:"¿No tenés cuenta? Resgistrate acá",SIGN_IN_ACCOUNT_LINK:"¿Ya tenés cuenta? Entra acá",SIGNUP_HEADER_TEXT:"Registrar",SIGNIN_HEADER_TEXT:"Entrar",SIGNUP_ERROR_TEXT:"No se pudo terminar la registración por errores",ENTER_ACCOUNT_EMAIL:"Ingresá tu correo electrónico.",RESEND_VERIFICATION_EMAIL:"Reenviar email de verificación",SAVE_CHANGES:"Grabar cambios",CANCEL_BTN:"Cancelar",EDIT_PROFILE:"Editar perfil",UPDATE_PROFILE_BTN:"Actualizar perfil",PROFILE_SAVE_SUCCESS:"Perfil actualizado satisfactoriamente",PROFILE_SAVE_ERROR:"No se pudo grabar el perfil.",CONNECTED_SOCIAL_ACCOUNTS:"Redes sociales conectadas",CONNECT_OTHER_SOCIAL_ACCOUNTS:"Conectar otras redes sociales",FORGOT_PASSWORD_LINK:"¿Olvidaste la contraseña?",REVERIFY_ACCOUNT_LINK:"Reenviar email de verificación",SIGNIN_BTN:"Entrar",SIGNUP_BTN:"Registrarse",SAVE_PASSWORD_BTN:"Grabar contraseña",SUCCESS_HEADER:"Ingresaste exitosamente",SUCCESS_TEXT:"Registraste exitosamente una cuenta en TellForm.",VERIFICATION_EMAIL_SENT:"El email de verificación fue enviado exitosamente",VERIFICATION_EMAIL_SENT_TO:"Un email de verificación fue enviado a",NOT_ACTIVATED_YET:"Tu cuenta aún no está activa",BEFORE_YOU_CONTINUE:"Antes de continuar asegurate de leer el email de verificación que te enviamos. Si no lo recibís en 24hs escribinos a ",CHECK_YOUR_EMAIL:"Leé el email y hacé click en el link de activación para activar la cuenta. Si tenés alguna pregunta escribinos a ",CONTINUE:"Continuar",PASSWORD_RESTORE_HEADER:"Restaurar la contraseña",ENTER_YOUR_EMAIL:"Ingresá el email de tu cuenta.",SUBMIT_BTN:"Enviar",ASK_FOR_NEW_PASSWORD:"Pedir reseteo de contraseña",PASSWORD_RESET_INVALID:"El reseteo de la contraseña es inválido",PASSWORD_RESET_SUCCESS:"Contraseña exitosamente reseteada",PASSWORD_CHANGE_SUCCESS:"Contraseña exitosamente cambiada",RESET_PASSWORD:"Resetear contraseña",CHANGE_PASSWORD:"Cambiar contraseña",CONTINUE_TO_LOGIN:"Ir a la página de ingreso",VERIFY_SUCCESS:"Cuenta activada exitosamente",VERIFY_ERROR:"El link de verificación es inválido o inexistente"})}]),angular.module("forms").config(["$translateProvider",function(a){a.translations("en",{ADVANCED_SETTINGS:"Advanced Settings",FORM_NAME:"Form Name",FORM_STATUS:"Form Status",PUBLIC:"Public",PRIVATE:"Private",GA_TRACKING_CODE:"Google Analytics Tracking Code",DISPLAY_FOOTER:"Display Form Footer?",SAVE_CHANGES:"Save Changes",CANCEL:"Cancel",DISPLAY_START_PAGE:"Display Start Page?",DISPLAY_END_PAGE:"Display Custom End Page?",ENABLE_EMAIL_NOTIFICATIONS:"Enable Email Notifications",EMAIL_NOTIFICATION_RECIPIENTS:"Email Notification Recipients",CREATE_A_NEW_FORM:"Create a new form",CREATE_FORM:"Create form",CREATED_ON:"Created on",MY_FORMS:"My forms",NAME:"Name",LANGUAGE:"Language",FORM_PAUSED:"Form paused",EDIT_FIELD:"Edit this Field",SAVE_FIELD:"Save",ON:"ON",OFF:"OFF",REQUIRED_FIELD:"Required",LOGIC_JUMP:"Logic Jump",SHOW_BUTTONS:"Additional Buttons",SAVE_START_PAGE:"Save",ARE_YOU_SURE:"Are you ABSOLUTELY sure?",READ_WARNING:"Unexpected bad things will happen if you don’t read this!",DELETE_WARNING1:'This action CANNOT be undone. This will permanently delete the "',DELETE_WARNING2:'" form and remove all associated form submissions.',DELETE_CONFIRM:"Please type in the name of the form to confirm.",I_UNDERSTAND:"I understand the consequences, delete this form.",DELETE_FORM_SM:"Delete",DELETE_FORM_MD:"Delete Form",DELETE:"Delete",FORM:"Form",VIEW:"View",LIVE:"Live",PREVIEW:"Preview",COPY:"Copy",COPY_AND_PASTE:"Copy and Paste this to add your TellForm to your website",CHANGE_WIDTH_AND_HEIGHT:"Change the width and height values to suit you best",POWERED_BY:"Powered by",TELLFORM_URL:"Your TellForm is permanently at this URL",DISABLED:"Disabled",YES:"YES",NO:"NO",ADD_LOGIC_JUMP:"Add Logic Jump",ADD_FIELD_LG:"Click to Add New Field",ADD_FIELD_MD:"Add New Field",ADD_FIELD_SM:"Add Field",EDIT_START_PAGE:"Edit Start Page",EDIT_END_PAGE:"Edit End Page",WELCOME_SCREEN:"Start Page",END_SCREEN:"End Page",INTRO_TITLE:"Title",INTRO_PARAGRAPH:"Paragraph",INTRO_BTN:"Start Button",TITLE:"Title",PARAGRAPH:"Paragraph",BTN_TEXT:"Go Back Button",BUTTONS:"Buttons",BUTTON_TEXT:"Text",BUTTON_LINK:"Link",ADD_BUTTON:"Add Button",PREVIEW_FIELD:"Preview Question",QUESTION_TITLE:"Title",QUESTION_DESCRIPTION:"Description",OPTIONS:"Options",ADD_OPTION:"Add Option",NUM_OF_STEPS:"Number of Steps",CLICK_FIELDS_FOOTER:"Click on fields to add them here",SHAPE:"Shape",IF_THIS_FIELD:"If this field",IS_EQUAL_TO:"is equal to",IS_NOT_EQUAL_TO:"is not equal to",IS_GREATER_THAN:"is greater than",IS_GREATER_OR_EQUAL_THAN:"is greater or equal than",IS_SMALLER_THAN:"is_smaller_than",IS_SMALLER_OR_EQUAL_THAN:"is smaller or equal than",CONTAINS:"contains",DOES_NOT_CONTAINS:"does not contain",ENDS_WITH:"ends with",DOES_NOT_END_WITH:"does not end with",STARTS_WITH:"starts with",DOES_NOT_START_WITH:"does not start with",THEN_JUMP_TO:"then jump to",TOTAL_VIEWS:"total unique visits",RESPONSES:"responses",COMPLETION_RATE:"completion rate",AVERAGE_TIME_TO_COMPLETE:"avg. completion time",DESKTOP_AND_LAPTOP:"Desktops",TABLETS:"Tablets",PHONES:"Phones",OTHER:"Other",UNIQUE_VISITS:"Unique Visits",FIELD_TITLE:"Field Title",FIELD_VIEWS:"Field Views",FIELD_DROPOFF:"Field Completion",FIELD_RESPONSES:"Field Responses",DELETE_SELECTED:"Delete Selected",EXPORT_TO_EXCEL:"Export to Excel",EXPORT_TO_CSV:"Export to CSV",EXPORT_TO_JSON:"Export to JSON",PERCENTAGE_COMPLETE:"Percentage Complete",TIME_ELAPSED:"Time Elapsed",DEVICE:"Device",LOCATION:"Location",IP_ADDRESS:"IP Address",DATE_SUBMITTED:"Date Submitted",GENERATED_PDF:"Generated PDF",BACKGROUND_COLOR:"Background Color",DESIGN_HEADER:"Change how your Form Looks",QUESTION_TEXT_COLOR:"Question Text Color",ANSWER_TEXT_COLOR:"Answer Text Color",BTN_BACKGROUND_COLOR:"Button Background Color",BTN_TEXT_COLOR:"Button Text Color",EMBED_YOUR_FORM:"Embed your form",SHARE_YOUR_FORM:"Share your form",CREATE_TAB:"Create",DESIGN_TAB:"Design",CONFIGURE_TAB:"Configure",ANALYZE_TAB:"Analyze",SHARE_TAB:"Share",SHORT_TEXT:"Short Text",EMAIL:"Email",MULTIPLE_CHOICE:"Multiple Choice",DROPDOWN:"Dropdown",DATE:"Date",PARAGRAPH_T:"Paragraph",YES_NO:"Yes/No",LEGAL:"Legal",RATING:"Rating",NUMBERS:"Numbers",SIGNATURE:"Signature",FILE_UPLOAD:"File upload",OPTION_SCALE:"Option Scale",PAYMENT:"Payment",STATEMENT:"Statement",LINK:"Link",FORM_SUCCESS:"Form entry successfully submitted!",REVIEW:"Review",BACK_TO_FORM:"Go back to Form",EDIT_FORM:"Edit this TellForm",ADVANCEMENT:"{{done}} out of {{total}} answered",CONTINUE_FORM:"Continue to Form",REQUIRED:"required",COMPLETING_NEEDED:"{{answers_not_completed}} answer(s) need completing",OPTIONAL:"optional",ERROR_EMAIL_INVALID:"Please enter a valid email address",ERROR_NOT_A_NUMBER:"Please enter valid numbers only",ERROR_URL_INVALID:"Please a valid url",OK:"OK",ENTER:"press ENTER",NEWLINE:"press SHIFT+ENTER to create a newline",CONTINUE:"Continue",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",SUBMIT:"Submit",UPLOAD_FILE:"Upload your File"})}]),angular.module("forms").config(["$translateProvider",function(a){a.translations("french",{FORM_SUCCESS:"Votre formulaire a été enregistré!",REVIEW:"Incomplet",BACK_TO_FORM:"Retourner au formulaire",EDIT_FORM:"Éditer le Tellform",CREATE_FORM:"Créer un TellForm",ADVANCEMENT:"{{done}} complétés sur {{total}}",CONTINUE_FORM:"Aller au formulaire",REQUIRED:"obligatoire",COMPLETING_NEEDED:"{{answers_not_completed}} réponse(s) doive(nt) être complétée(s)",OPTIONAL:"facultatif",ERROR_EMAIL_INVALID:"Merci de rentrer une adresse mail valide",ERROR_NOT_A_NUMBER:"Merce de ne rentrer que des nombres",ERROR_URL_INVALID:"Merci de rentrer une url valide",OK:"OK",ENTER:"presser ENTRÉE",YES:"Oui",NO:"Non",NEWLINE:"presser SHIFT+ENTER pour créer une nouvelle ligne",CONTINUE:"Continuer",LEGAL_ACCEPT:"J’accepte",LEGAL_NO_ACCEPT:"Je n’accepte pas",DELETE:"Supprimer",CANCEL:"Réinitialiser",SUBMIT:"Enregistrer",UPLOAD_FILE:"Envoyer un fichier",Y:"O",N:"N"})}]),angular.module("forms").config(["$translateProvider",function(a){a.translations("german",{FORM_SUCCESS:"Ihre Angaben wurden gespeichert.",REVIEW:"Unvollständig",BACK_TO_FORM:"Zurück zum Formular",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} von {{total}} beantwortet",CONTINUE_FORM:"Zum Formular",REQUIRED:"verpflichtend",COMPLETING_NEEDED:"Es fehlen/fehtl noch {{answers_not_completed}} Antwort(en)",OPTIONAL:"fakultativ",ERROR_EMAIL_INVALID:"Bitte gültige Mailadresse eingeben",ERROR_NOT_A_NUMBER:"Bitte nur Zahlen eingeben",ERROR_URL_INVALID:"Bitte eine gültige URL eingeben",OK:"Okay",ENTER:"Eingabetaste drücken",YES:"Ja",NO:"Nein",NEWLINE:"Für eine neue Zeile SHIFT+ENTER drücken",CONTINUE:"Weiter",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Entfernen",CANCEL:"Canceln",SUBMIT:"Speichern",UPLOAD_FILE:"Datei versenden",Y:"J",N:"N"})}]),angular.module("forms").config(["$translateProvider",function(a){a.translations("italian",{FORM_SUCCESS:"Il formulario è stato inviato con successo!",REVIEW:"Incompleto",BACK_TO_FORM:"Ritorna al formulario",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} su {{total}} completate",CONTINUE_FORM:"Vai al formulario",REQUIRED:"obbligatorio",COMPLETING_NEEDED:"{{answers_not_completed}} risposta/e deve/ono essere completata/e",OPTIONAL:"opzionale",ERROR_EMAIL_INVALID:"Si prega di inserire un indirizzo email valido",ERROR_NOT_A_NUMBER:"Si prega di inserire solo numeri",ERROR_URL_INVALID:"Grazie per inserire un URL valido",OK:"OK",ENTER:"premere INVIO",YES:"Sì",NO:"No",NEWLINE:"premere SHIFT+INVIO per creare una nuova linea",CONTINUE:"Continua",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Cancella",CANCEL:"Reset",SUBMIT:"Registra",UPLOAD_FILE:"Invia un file",Y:"S",N:"N"})}]),angular.module("forms").config(["$translateProvider",function(a){a.translations("es",{ADVANCED_SETTINGS:"Configuraciones avanzadas",FORM_NAME:"Nombre del formulario",FORM_STATUS:"Estado del formulario",PUBLIC:"Público",PRIVATE:"Privado",GA_TRACKING_CODE:"Código de Google Analytics",DISPLAY_FOOTER:"¿Mostrar pie de página?",SAVE_CHANGES:"Grabar",CANCEL:"Cancelar",DISPLAY_START_PAGE:"¿Mostrar página de inicio?",DISPLAY_END_PAGE:"¿Mostrar paǵina de fin?",CREATE_A_NEW_FORM:"Crear formulario",CREATE_FORM:"Crear formulario",CREATED_ON:"Creado en",MY_FORMS:"Mis formularios",NAME:"Nombre",LANGUAGE:"Idioma",FORM_PAUSED:"Formulario pausado",EDIT_FIELD:"Editar este campo",SAVE_FIELD:"Grabar",ON:"ON",OFF:"OFF",REQUIRED_FIELD:"Requerido",LOGIC_JUMP:"Salto lógico",SHOW_BUTTONS:"Botones adicionales",SAVE_START_PAGE:"Grabar",ARE_YOU_SURE:"¿Estás absolutamente seguro?",READ_WARNING:"¡Algo malo ocurrirá si no lees esto!",DELETE_WARNING1:'Esta acción no tiene vuelta atrás. Esto borrará permanentemente el "',DELETE_WARNING2:'" formulario y todos los datos asociados.',DELETE_CONFIRM:"Por favor escribí el nombre del formulario para confirmar.",I_UNDERSTAND:"Entiendo las consecuencias y quiero borrarlo.",DELETE_FORM_SM:"Borrar",DELETE_FORM_MD:"Borrar formulario",DELETE:"Borrar",FORM:"Formulario",VIEW:"Vista",LIVE:"Online",PREVIEW:"Vista previa",COPY:"Copiar",COPY_AND_PASTE:"Copiar y pegar esto para agregar su TellForm a su sitio web",CHANGE_WIDTH_AND_HEIGHT:"Cambie los valores de ancho y altura para adaptar el formulario a sus necesidades",POWERED_BY:"Con la tecnlogía de",TELLFORM_URL:"Tu TellForm está en esta URL permanente",DISABLED:"Deshabilitado",YES:"SI",NO:"NO",ADD_LOGIC_JUMP:"Agregar salto lógico",ADD_FIELD_LG:"Click para agregar campo",ADD_FIELD_MD:"Agregar nuevo campo",ADD_FIELD_SM:"Agregar campo",EDIT_START_PAGE:"Editar paǵina de inicio",EDIT_END_PAGE:"Editar página de finalización",WELCOME_SCREEN:"Comienzo",END_SCREEN:"Fin",INTRO_TITLE:"Título",INTRO_PARAGRAPH:"Parágrafo",INTRO_BTN:"Botón de comienzo",TITLE:"Título",PARAGRAPH:"Paragrafo",BTN_TEXT:"Botón para volver atrás",BUTTONS:"Botones",BUTTON_TEXT:"Texto",BUTTON_LINK:"Link",ADD_BUTTON:"Agregar Botón",PREVIEW_FIELD:"Vista previa Pregunta",QUESTION_TITLE:"Título",QUESTION_DESCRIPTION:"Descripción",OPTIONS:"Opciones",ADD_OPTION:"Agregar Opciones",NUM_OF_STEPS:"Cantidad de pasos",CLICK_FIELDS_FOOTER:"Click en los campos para agregar",SHAPE:"Forma",IF_THIS_FIELD:"Si este campo",IS_EQUAL_TO:"es igual a",IS_NOT_EQUAL_TO:"no es igual a",IS_GREATER_THAN:"es mayor que",IS_GREATER_OR_EQUAL_THAN:"es mayor o igual que",IS_SMALLER_THAN:"es menor que",IS_SMALLER_OR_EQUAL_THAN:"is menor o igual que",CONTAINS:"contiene",DOES_NOT_CONTAINS:"no contiene",ENDS_WITH:"termina con",DOES_NOT_END_WITH:"no termina con",STARTS_WITH:"comienza con",DOES_NOT_START_WITH:"no comienza con",THEN_JUMP_TO:"luego salta a",TOTAL_VIEWS:"Total de visitas únicas",RESPONSES:"respuestas",COMPLETION_RATE:"Taza de terminación",AVERAGE_TIME_TO_COMPLETE:"Promedio de tiempo de rellenado",DESKTOP_AND_LAPTOP:"Computadora",TABLETS:"Tablets",PHONES:"Móviles",OTHER:"Otros",UNIQUE_VISITS:"Visitas únicas",FIELD_TITLE:"Título de campo",FIELD_VIEWS:"Vistas de campo",FIELD_DROPOFF:"Finalización de campo",FIELD_RESPONSES:"Respuestas de campo",DELETE_SELECTED:"Borrar selección",EXPORT_TO_EXCEL:"Exportar a Excel",EXPORT_TO_CSV:"Exportar a CSV",EXPORT_TO_JSON:"Exportar a JSON",PERCENTAGE_COMPLETE:"Porcentaje de completitud",TIME_ELAPSED:"Tiempo usado",DEVICE:"Dispositivo",LOCATION:"Lugar",IP_ADDRESS:"Dirección IP",DATE_SUBMITTED:"Fecha de envío",GENERATED_PDF:"PDF generado",BACKGROUND_COLOR:"Color de fondo",DESIGN_HEADER:"Cambiar diseño de formulario",QUESTION_TEXT_COLOR:"Color de la pregunta",ANSWER_TEXT_COLOR:"Color de la respuesta",BTN_BACKGROUND_COLOR:"Color de fondo del botón",BTN_TEXT_COLOR:"Color del texto del botón",EMBED_YOUR_FORM:"Pone tu formulario",SHARE_YOUR_FORM:"Compartí tu formulario",CREATE_TAB:"Crear",DESIGN_TAB:"Diseño",CONFIGURE_TAB:"Configuración",ANALYZE_TAB:"Análisis",SHARE_TAB:"Compartir",SHORT_TEXT:"Texto corto",EMAIL:"Email",MULTIPLE_CHOICE:"Opciones múltiples",DROPDOWN:"Desplegable",DATE:"Fecha",PARAGRAPH_T:"Párrafo",YES_NO:"Si/No",LEGAL:"Legal",RATING:"Puntaje",NUMBERS:"Números",SIGNATURE:"Firma",FILE_UPLOAD:"Subir archivo",OPTION_SCALE:"Escala",PAYMENT:"Pago",STATEMENT:"Declaración",LINK:"Enlace",FORM_SUCCESS:"¡El formulario ha sido enviado con éxito!",REVIEW:"Revisar",BACK_TO_FORM:"Regresar al formulario",ADVANCEMENT:"{{done}} de {{total}} contestadas",CONTINUE_FORM:"Continuar al formulario",REQUIRED:"Información requerida",COMPLETING_NEEDED:"{{answers_not_completed}} respuesta(s) necesita(n) ser completada(s)",OPTIONAL:"Opcional",ERROR_EMAIL_INVALID:"Favor de proporcionar un correo electrónico válido",ERROR_NOT_A_NUMBER:"Por favor, introduzca sólo números válidos",ERROR_URL_INVALID:"Favor de proporcionar un url válido",OK:"OK",ENTER:"pulse INTRO",NEWLINE:"presione SHIFT+INTRO para crear una nueva línea",CONTINUE:"Continuar",LEGAL_ACCEPT:"Yo acepto",LEGAL_NO_ACCEPT:"Yo no acepto",SUBMIT:"Registrar",UPLOAD_FILE:"Cargar el archivo",Y:"S",N:"N"})}]),ApplicationConfiguration.registerModule("view-form",["ngFileUpload","ui.date","angular-input-stars"]),function(){function a(a,b){function c(b,c,d){var e=window.navigator.userLanguage||window.navigator.language;e=e.slice(0,2);var f=navigator.userAgent,g=new MobileDetect(f),h="other";g.tablet()?h="tablet":g.mobile()?h="mobile":g.is("bot")||(h="desktop"),$.ajaxSetup({async:!1});var i=$.getJSON("https://freegeoip.net/json/").responseJSON;$.ajaxSetup({async:!0}),i||(i={ip:"",city:"",country_name:""});var j={referrer:document.referrer,isSubmitted:b.submitted,formId:b._id,lastActiveField:b.form_fields[c]._id,timeElapsed:d,language:e,deviceType:h,ipAddr:i.ip,geoLocation:{city:i.city,country:i.country_name}};a.emit("form-visitor-data",j)}function d(){a.socket||a.connect(),a.on("disconnect",function(){a.connect()})}var e={send:c};return d(),e}angular.module("view-form").factory("SendVisitorData",a),a.$inject=["Socket","$state"]}(),angular.module("view-form").directive("keyToOption",function(){return{restrict:"A",scope:{field:"="},link:function(a,b,c,d){b.bind("keydown keypress",function(b){var c=b.which||b.keyCode,d=parseInt(String.fromCharCode(c))-1;d<a.field.fieldOptions.length&&(b.preventDefault(),a.$apply(function(){a.field.fieldValue=a.field.fieldOptions[d].option_value}))})}}}),angular.module("view-form").directive("keyToTruthy",["$rootScope",function(a){return{restrict:"A",scope:{field:"=",nextField:"&"},link:function(a,b,c){b.bind("keydown keypress",function(b){var d=b.which||b.keyCode,e=c.keyCharTruthy.charCodeAt(0)-32,f=c.keyCharFalsey.charCodeAt(0)-32;d===e?(b.preventDefault(),a.$apply(function(){a.field.fieldValue="true",c.onValidKey&&a.$root.$eval(c.onValidKey)})):d===f&&(b.preventDefault(),a.$apply(function(){a.field.fieldValue="false",c.onValidKey&&a.$root.$eval(c.onValidKey)}))})}}}]),angular.module("view-form").filter("formValidity",function(){return function(a){if(a&&a.form_fields&&a.visible_form_fields){var b=Object.keys(a),c=(b.filter(function(a){return"$"!==a[0]}),a.form_fields),d=c.filter(function(a){return"object"==typeof a&&"rating"!==a.fieldType&&"statement"!==a.fieldType?!!a.fieldValue:"rating"===a.fieldType||void 0}).length;return d-(a.form_fields.length-a.visible_form_fields.length)}return 0}}),angular.module("view-form").value("supportedFields",["textfield","textarea","date","dropdown","hidden","password","radio","legal","statement","rating","yes_no","number","natural"]),angular.module("view-form").constant("VIEW_FORM_URL","/forms/:formId/render"),angular.module("view-form").config(["$translateProvider",function(a){a.translations("english",{FORM_SUCCESS:"Form entry successfully submitted!",REVIEW:"Review",BACK_TO_FORM:"Go back to Form",EDIT_FORM:"Edit this TellForm",CREATE_FORM:"Create this TellForm",ADVANCEMENT:"{{done}} out of {{total}} answered",CONTINUE_FORM:"Continue to Form",REQUIRED:"required",COMPLETING_NEEDED:"{{answers_not_completed}} answer(s) need completing",OPTIONAL:"optional",ERROR_EMAIL_INVALID:"Please enter a valid email address",ERROR_NOT_A_NUMBER:"Please enter valid numbers only",ERROR_URL_INVALID:"Please a valid url",OK:"OK",ENTER:"press ENTER",YES:"Yes",NO:"No",NEWLINE:"press SHIFT+ENTER to create a newline",CONTINUE:"Continue",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Delete",CANCEL:"Cancel",SUBMIT:"Submit",UPLOAD_FILE:"Upload your File"}),a.preferredLanguage("english").fallbackLanguage("english").useSanitizeValueStrategy("escape")}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("french",{FORM_SUCCESS:"Votre formulaire a été enregistré!",REVIEW:"Incomplet",BACK_TO_FORM:"Retourner au formulaire",EDIT_FORM:"Éditer le Tellform",CREATE_FORM:"Créer un TellForm",ADVANCEMENT:"{{done}} complétés sur {{total}}",CONTINUE_FORM:"Aller au formulaire",REQUIRED:"obligatoire",COMPLETING_NEEDED:"{{answers_not_completed}} réponse(s) doive(nt) être complétée(s)",OPTIONAL:"facultatif",ERROR_EMAIL_INVALID:"Merci de rentrer une adresse mail valide",ERROR_NOT_A_NUMBER:"Merce de ne rentrer que des nombres",ERROR_URL_INVALID:"Merci de rentrer une url valide",OK:"OK",ENTER:"presser ENTRÉE",YES:"Oui",NO:"Non",NEWLINE:"presser SHIFT+ENTER pour créer une nouvelle ligne",CONTINUE:"Continuer",LEGAL_ACCEPT:"J’accepte",LEGAL_NO_ACCEPT:"Je n’accepte pas",DELETE:"Supprimer",CANCEL:"Réinitialiser",SUBMIT:"Enregistrer",UPLOAD_FILE:"Envoyer un fichier",Y:"O",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("german",{FORM_SUCCESS:"Ihre Angaben wurden gespeichert.",REVIEW:"Unvollständig",BACK_TO_FORM:"Zurück zum Formular",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} von {{total}} beantwortet", -CONTINUE_FORM:"Zum Formular",REQUIRED:"verpflichtend",COMPLETING_NEEDED:"Es fehlen/fehtl noch {{answers_not_completed}} Antwort(en)",OPTIONAL:"fakultativ",ERROR_EMAIL_INVALID:"Bitte gültige Mailadresse eingeben",ERROR_NOT_A_NUMBER:"Bitte nur Zahlen eingeben",ERROR_URL_INVALID:"Bitte eine gültige URL eingeben",OK:"Okay",ENTER:"Eingabetaste drücken",YES:"Ja",NO:"Nein",NEWLINE:"Für eine neue Zeile SHIFT+ENTER drücken",CONTINUE:"Weiter",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Entfernen",CANCEL:"Canceln",SUBMIT:"Speichern",UPLOAD_FILE:"Datei versenden",Y:"J",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("italian",{FORM_SUCCESS:"Il formulario è stato inviato con successo!",REVIEW:"Incompleto",BACK_TO_FORM:"Ritorna al formulario",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} su {{total}} completate",CONTINUE_FORM:"Vai al formulario",REQUIRED:"obbligatorio",COMPLETING_NEEDED:"{{answers_not_completed}} risposta/e deve/ono essere completata/e",OPTIONAL:"opzionale",ERROR_EMAIL_INVALID:"Si prega di inserire un indirizzo email valido",ERROR_NOT_A_NUMBER:"Si prega di inserire solo numeri",ERROR_URL_INVALID:"Grazie per inserire un URL valido",OK:"OK",ENTER:"premere INVIO",YES:"Sì",NO:"No",NEWLINE:"premere SHIFT+INVIO per creare una nuova linea",CONTINUE:"Continua",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Cancella",CANCEL:"Reset",SUBMIT:"Registra",UPLOAD_FILE:"Invia un file",Y:"S",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("spanish",{FORM_SUCCESS:"¡El formulario ha sido enviado con éxito!",REVIEW:"Revisar",BACK_TO_FORM:"Regresar al formulario",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} de {{total}} contestadas",CONTINUE_FORM:"Continuar al formulario",REQUIRED:"Información requerida",COMPLETING_NEEDED:"{{answers_not_completed}} respuesta(s) necesita(n) ser completada(s)",OPTIONAL:"Opcional",ERROR_EMAIL_INVALID:"Favor de proporcionar un correo electrónico válido",ERROR_NOT_A_NUMBER:"Por favor, introduzca sólo números válidos",ERROR_URL_INVALID:"Favor de proporcionar un url válido",OK:"OK",ENTER:"pulse INTRO",YES:"Si",NO:"No",NEWLINE:"presione SHIFT+INTRO para crear una nueva línea",CONTINUE:"Continuar",LEGAL_ACCEPT:"Yo acepto",LEGAL_NO_ACCEPT:"Yo no acepto",DELETE:"Eliminar",CANCEL:"Cancelar",SUBMIT:"Registrar",UPLOAD_FILE:"Cargar el archivo",Y:"S",N:"N"})}]),angular.module("view-form").controller("SubmitFormController",["$scope","$rootScope","$state","$translate","myForm",function(a,b,c,d,e){a.myform=e,d.use(e.language)}]),angular.module("view-form").directive("fieldIconDirective",function(){return{template:'<i class="{{typeIcon}}"></i>',restrict:"E",scope:{typeName:"@"},controller:["$scope",function(a){var b={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card",statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};a.typeIcon=b[a.typeName]}]}});var __indexOf=[].indexOf||function(a){for(var b=0,c=this.length;b<c;b++)if(b in this&&this[b]===a)return b;return-1};angular.module("view-form").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache","supportedFields",function(a,b,c,d,e){var f=function(a){var b=a,c="form_modules/forms/base/views/directiveViews/field/";return __indexOf.call(e,b)>=0&&(c=c+b+".html"),d.get(c)};return{template:"<div>{{field.title}}</div>",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(a,d){c.chooseDefaultOption=a.chooseDefaultOption=function(b){"yes_no"===b?a.field.fieldValue="true":"rating"===b?a.field.fieldValue=0:"radio"===a.field.fieldType?a.field.fieldValue=a.field.fieldOptions[0].option_value:"legal"===b&&(a.field.fieldValue="true",c.nextField())},a.nextField=c.nextField,a.setActiveField=c.setActiveField,"date"===a.field.fieldType&&(a.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var e=a.field.fieldType;if("number"===a.field.fieldType||"textfield"===a.field.fieldType||"email"===a.field.fieldType||"link"===a.field.fieldType){switch(a.field.fieldType){case"textfield":a.input_type="text";break;case"email":a.input_type="email",a.placeholder="joesmith@example.com";break;case"number":a.input_type="text",a.validateRegex=/^-?\d+$/;break;default:a.input_type="url",a.placeholder="http://example.com"}e="textfield"}var g=f(e);d.html(g).show();b(d.contents())(a)}}}]),angular.module("view-form").directive("onEnterKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode,e=!1;null!==d.onEnterKeyDisabled&&(e=d.onEnterKeyDisabled),13!==c||b.shiftKey||e||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterKey)}))})}}}]).directive("onTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onTabKey)}))})}}}]).directive("onEnterOrTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;13!==c&&9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterOrTabKey)}))})}}}]).directive("onTabAndShiftKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;9===c&&b.shiftKey&&(b.preventDefault(),a.$apply(function(){a.$eval(d.onTabAndShiftKey)}))})}}}]),angular.module("view-form").directive("onFinishRender",["$rootScope","$timeout",function(a,b){return{restrict:"A",link:function(b,c,d){if(c.attr("ng-repeat")||c.attr("data-ng-repeat")){var e=d.onFinishRender||"ngRepeat";b.$first&&!b.$last?b.$evalAsync(function(){a.$broadcast(e+" Started")}):b.$last&&b.$evalAsync(function(){a.$broadcast(e+" Finished")})}}}}]),jsep.addBinaryOp("contains",10),jsep.addBinaryOp("!contains",10),jsep.addBinaryOp("begins",10),jsep.addBinaryOp("!begins",10),jsep.addBinaryOp("ends",10),jsep.addBinaryOp("!ends",10),angular.module("view-form").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","SendVisitorData","$translate",function(a,b,c,d,e,f){return{templateUrl:"form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"=",ispreview:"="},controller:["$document","$window","$scope",function(f,g,h){h.noscroll=!1,h.forms={},h.ispreview&&b.restartClock();var i=h.myform.visible_form_fields.filter(function(a){return"statement"!==a.fieldType}).length,j=c("formValidity")(h.myform);h.translateAdvancementData={done:j,total:i,answers_not_completed:i-j},h.reloadForm=function(){h.myform.submitted=!1,h.myform.form_fields=_.chain(h.myform.visible_form_fields).map(function(a){return a.fieldValue="",a}).value(),h.loading=!1,h.error="",h.selected={_id:"",index:0},h.setActiveField(h.myform.visible_form_fields[0]._id,0,!1),b.restartClock()},g.onscroll=function(){h.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var a=document.getElementsByClassName("activeField")[0].getBoundingClientRect();h.fieldTop=a.top,h.fieldBottom=a.bottom;var b,c;h.noscroll||(h.selected.index===h.myform.visible_form_fields.length-1&&h.fieldBottom<200?(c=h.selected.index+1,b="submit_field",h.setActiveField(b,c,!1)):h.selected.index===h.myform.visible_form_fields.length?h.fieldTop>200&&(c=h.selected.index-1,b=h.myform.visible_form_fields[c]._id,h.setActiveField(b,c,!1)):h.fieldBottom<0?(c=h.selected.index+1,b=h.myform.visible_form_fields[c]._id,h.setActiveField(b,c,!1)):0!==h.selected.index&&h.fieldTop>0&&(c=h.selected.index-1,b=h.myform.visible_form_fields[c]._id,h.setActiveField(b,c,!1)),h.$apply())};var k=function(a){var b=a.logicJump;if(b.expressionString&&b.valueB&&a.fieldValue){var c,d,e=jsep(b.expressionString);if("field"===e.left.name?(c=a.fieldValue,d=b.valueB):(c=b.valueB,d=a.fieldValue),"number"===a.fieldType||"scale"===a.fieldType||"rating"===a.fieldType)switch(e.operator){case"==":return parseInt(c)===parseInt(d);case"!==":return parseInt(c)!==parseInt(d);case">":return parseInt(c)>parseInt(d);case">=":return parseInt(c)>parseInt(d);case"<":return parseInt(c)<parseInt(d);case"<=":return parseInt(c)<=parseInt(d);default:return!1}else switch(e.operator){case"==":return c===d;case"!==":return c!==d;case"contains":return c.indexOf(d)>-1;case"!contains":return!(c.indexOf(d)>-1);case"begins":return c.startsWith(d);case"!begins":return!c.startsWith(d);case"ends":return c.endsWith(d);case"!ends":return c.endsWith(d);default:return!1}}},l=function(){if(null===h.selected)throw console.error("current active field is null"),new Error("current active field is null");return"submit_field"===h.selected._id?h.myform.form_fields.length-1:h.selected.index};h.setActiveField=d.setActiveField=function(a,d,g){if(null!==h.selected&&h.selected._id!==a){if(h.selected._id=a,h.selected.index=d,!d)for(var j=0;j<h.myform.visible_form_fields.length;j++){var k=h.myform.visible_form_fields[j];if(a===k._id){h.selected.index=j;break}}var m=c("formValidity")(h.myform);h.translateAdvancementData={done:m,total:i,answers_not_completed:i-m},g?(h.noscroll=!0,setTimeout(function(){f.scrollToElement(angular.element(".activeField"),-10,200).then(function(){h.noscroll=!1,setTimeout(function(){document.querySelectorAll(".activeField .focusOn").length?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input").length?document.querySelectorAll(".activeField input")[0].focus():document.querySelectorAll(".activeField .selectize-input")[0].focus()})})})):setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input")[0]&&document.querySelectorAll(".activeField input")[0].focus()}),h.myform.submitted||e.send(h.myform,l(),b.getTimeElapsed())}},d.nextField=h.nextField=function(){var a=h.myform.visible_form_fields[h.selected.index];if(h.selected&&h.selected.index>-1)if(a.logicJump&&k(a))d.setActiveField(a.logicJump.jumpTo,null,!0);else{var b,c;h.selected.index<h.myform.visible_form_fields.length-1?(b=h.selected.index+1,c=h.myform.visible_form_fields[b]._id,d.setActiveField(c,b,!0)):h.selected.index===h.myform.visible_form_fields.length-1&&(b=h.selected.index+1,c="submit_field",d.setActiveField(c,b,!0))}},d.prevField=h.prevField=function(){if(h.selected.index>0){var a=h.selected.index-1,b=h.myform.visible_form_fields[a]._id;h.setActiveField(b,a,!0)}},h.exitStartPage=function(){h.myform.startPage.showStart=!1,h.myform.visible_form_fields.length>0&&(h.selected._id=h.myform.visible_form_fields[0]._id)},d.goToInvalid=h.goToInvalid=function(){document.querySelectorAll(".ng-invalid.focusOn")[0].focus()};var m=function(){var a=new MobileDetect(window.navigator.userAgent),b="other";return a.tablet()?b="tablet":a.mobile()?b="mobile":a.is("bot")||(b="desktop"),{type:b,name:window.navigator.platform}},n=function(){$.ajaxSetup({async:!1});var a=$.getJSON("https://freegeoip.net/json/").responseJSON;return $.ajaxSetup({async:!0}),a&&a.ip||(a={ip:"Adblocker"}),{ipAddr:a.ip,geoLocation:{City:a.city,Country:a.country_name}}};d.submitForm=h.submitForm=function(){var d=b.stopClock();h.loading=!0;var f=_.cloneDeep(h.myform),g=m();f.device=g;var i=n();f.ipAddr=i.ipAddr,f.geoLocation=i.geoLocation,f.timeElapsed=d,f.percentageComplete=c("formValidity")(h.myform)/h.myform.visible_form_fields.length*100,delete f.endPage,delete f.isLive,delete f.provider,delete f.startPage,delete f.visible_form_fields,delete f.analytics,delete f.design,delete f.submissions,delete f.submitted;for(var j=0;j<h.myform.form_fields.length;j++)"dropdown"!==h.myform.form_fields[j].fieldType||h.myform.form_fields[j].deletePreserved||(h.myform.form_fields[j].fieldValue=h.myform.form_fields[j].fieldValue.option_value),delete f.form_fields[j].submissionId,delete f.form_fields[j].disabled,delete f.form_fields[j].ratingOptions,delete f.form_fields[j].fieldOptions,delete f.form_fields[j].logicJump,delete f.form_fields[j].description,delete f.form_fields[j].validFieldTypes,delete f.form_fields[j].fieldType;setTimeout(function(){h.submitPromise=a.post("/forms/"+h.myform._id,f).success(function(a,b){h.myform.submitted=!0,h.loading=!1,e.send(f,l(),d)}).error(function(a){h.loading=!1,console.error(a),h.error=a.message})},500)},h.reloadForm()}]}}]),angular.module("view-form").service("CurrentForm",function(){var a={};this.getForm=function(){return a},this.setForm=function(b){a=b}}),angular.module("view-form").factory("Forms",["$resource","VIEW_FORM_URL",function(a,b){return a(b,{formId:"@_id"},{get:{method:"GET",transformResponse:function(a,b){var c=angular.fromJson(a);return c.visible_form_fields=_.filter(c.form_fields,function(a){return a.deletePreserved===!1}),c}},update:{method:"PUT"},save:{method:"POST"}})}]),function(){function a(a,b){function c(){var a="";a=b.socketUrl&&b.socketPort?window.location.protocol+"//"+b.socketUrl+":"+b.socketPort:b.socketUrl?window.location.protocol+"//"+b.socketUrl:b.socketPort?window.location.protocol+"//"+window.location.hostname+":"+b.socketPort:window.location.protocol+"//"+window.location.hostname,g.socket=io(a,{transports:["websocket","polling"]})}function d(a,b){g.socket&&g.socket.emit(a,b)}function e(b,c){g.socket&&g.socket.on(b,function(b){a(function(){c(b)})})}function f(a){g.socket&&g.socket.removeListener(a)}var g={socket:null};return c(),g={connect:c,emit:d,on:e,removeListener:f,socket:null}}angular.module("view-form").factory("Socket",a),a.$inject=["$timeout","$window"]}(),angular.module("view-form").service("TimeCounter",[function(){var a,b=null;this.timeSpent=0,this.restartClock=function(){a=Date.now(),b=null},this.getTimeElapsed=function(){if(a)return Math.abs(Date.now().valueOf()-a.valueOf())/1e3},this.stopClock=function(){return a&&null===b?(b=Date.now(),this.timeSpent=Math.abs(b.valueOf()-a.valueOf())/1e3,this._startTime=this._endTime=null,this.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]); \ No newline at end of file +"use strict";var ApplicationConfiguration=function(){var a="TellForm",b=["duScroll","ui.select","ngSanitize","vButton","ngResource","TellForm.templates","ui.router","ui.bootstrap","ui.utils","pascalprecht.translate","view-form"],c=function(b,c){angular.module(b,c||[]),angular.module(a).requires.push(b)};return{applicationModuleName:a,applicationModuleVendorDependencies:b,registerModule:c}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function(a){a.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("FORM_URL","/forms/:formId"),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),angular.module("TellForm.templates",[]).run(["$templateCache",function(a){a.put("modules/core/views/header.client.view.html",'<section class="navbar navbar-inverse" data-ng-controller=HeaderController ng-hide=hideNav><div class=container><div class=navbar-header><button class=navbar-toggle type=button data-ng-click=toggleCollapsibleMenu()><span class=sr-only>Toggle navigation</span> <span>{{ \'MENU_BTN\' | translate }}</span></button> <a href="/#!/" class=navbar-brand><img src=/static/modules/core/img/logo_white.svg height=100%></a></div><nav class="collapse navbar-collapse" collapse=!isCollapsed role=navigation><ul class="nav navbar-nav navbar-right" data-ng-hide=authentication.isAuthenticated()><li ng-hide=$root.signupDisabled ui-route=/signup ng-class="{active: $uiRoute}"><a href=/#!/signup>{{ \'SIGNUP_TAB\' | translate }}</a></li><li class=divider-vertical></li><li ui-route=/signin ng-class="{active: $uiRoute}"><a href=/#!/signin>{{ \'SIGNIN_TAB\' | translate }}</a></li></ul><ul class="nav navbar-nav navbar-right" data-ng-show=authentication.isAuthenticated()><li class=dropdown uib-dropdown><a href=# class=dropdown-toggle data-toggle=dropdown dropdown-toggle><span>{{ \'MY_SETTINGS\' | translate }}</span> <b class=caret></b></a><ul class=dropdown-menu><li><a href=/#!/settings/profile>{{ \'EDIT_PROFILE\' | translate }}</a></li><li class=divider></li><li><a href=/#!/settings/password>{{ \'CHANGE_PASSWORD\' | translate }}</a></li></ul></li><li><a href="/" ng-click=signout()>{{ \'SIGNOUT_TAB\' | translate }}</a></li></ul></nav></div></section>'),a.put("modules/forms/admin/views/admin-form.client.view.html",'<header data-ng-include="\'/static/modules/core/views/header.client.view.html\'"></header><section class="admin-form container-fluid"><script type=text/ng-template id=formDeleteModal.html><div class="modal-header">\n <h2 class="modal-title hidden-md hidden-lg">{{ \'ARE_YOU_SURE\' | translate }}</h2>\n <h3 class="modal-title hidden-xs hidden-sm">{{ \'ARE_YOU_SURE\' | translate }}</h3>\n </div>\n <div class="modal-body">\n \t<div class="modal-body-alert">\n\t\t\t\t{{ \'READ_WARNING\' | translate }}\n\t\t\t</div>\n \t\t<p class="hidden-xs hidden-sm">\n \t\t \t{{ \'DELETE_WARNING1\' | translate }} <strong>{{myform.title}}</strong> {{ \'DELETE_WARNING2\' | translate }}\n \t\t</p>\n <p>{{ \'DELETE_CONFIRM\' | translate }}</p>\n </div>\n <div class="modal-footer">\n\t\t\t<input type="text" style="width:100%" data-ng-model="deleteConfirm" class="input-block" autofocus required aria-label="Type in the name of the form to confirm that you want to delete this form.">\n <button type="submit" ng-click="removeCurrentForm()" class="btn btn-block btn-danger" ng-disabled="myform.title != deleteConfirm">\n \t{{ \'I_UNDERSTAND\' | translate }}\n </button>\n </div></script><div class="page-header row" style="padding-bottom: 1em"><div class="col-xs-10 col-sm-8"><h1 class="hidden-sm hidden-xs" data-ng-bind=myform.title style="margin-bottom: 0px"></h1><h2 class="hidden-md hidden-lg" data-ng-bind=myform.title style="margin-bottom: 0px"></h2></div><div class="col-xs-1 col-sm-2"><small class=pull-right><button class="btn btn-danger" ng-click=openDeleteModal()><i class="fa fa-trash-o"></i> <span class="show-sm hidden-lg hidden-md hidden-xs">{{ \'DELETE_FORM_SM\' | translate}}</span> <span class="hidden-xs hidden-sm">{{ \'DELETE_FORM_MD\' | translate}}</span></button></small></div><div class="col-xs-1 col-sm-2"><small class=pull-right><a class="btn btn-secondary view-form-btn" href={{actualFormURL}}><span class="hidden-xs hidden-sm">{{ \'VIEW\' | translate }} <span ng-show=myform.isLive>{{ \'LIVE\' | translate }}</span> <span ng-hide=myform.isLive>{{ \'PREVIEW\' | translate }}</span></span> <i class="status-light status-light-on fa fa-dot-circle-o" ng-if=myform.isLive></i> <i class="status-light status-light-off fa fa-dot-circle-o" ng-if=!myform.isLive></i></a></small></div></div><div class=row><div class=col-xs-12><uib-tabset active=activePill vertical=true type=pills><uib-tab index=0 heading="{{ \'CREATE_TAB\' | translate }}" select=deactivateDesignTab()><edit-form-directive myform=myform></edit-form-directive></uib-tab><uib-tab ng-repeat="tab in tabData" index={{$index+1}} heading={{tab.heading}} select=deactivateDesignTab()><div class=row data-ng-include="\'/static/modules/forms/admin/views/adminTabs/\'+tab.templateName+\'.html\'"></div></uib-tab><uib-tab index=2 heading="{{ \'ANALYZE_TAB\' | translate }}" select=deactivateDesignTab()><edit-submissions-form-directive myform=myform user=myform.admin></edit-submissions-form-directive></uib-tab><uib-tab ng-if=tabData heading="{{ \'SHARE_TAB\' | translate }}" index={{tabData.length}} select=deactivateDesignTab()><div class=config-form><div class=row><div class=col-sm-12><uib-tabset active=activePill vertical=true type=pills><uib-tab index=0 heading="{{ \'SHARE_YOUR_FORM\' | translate }}"><div class=row><div class=col-sm-12>{{ \'TELLFORM_URL\' | translate }}</div><div class="col-sm-8 form-input"><span ngclipboard data-clipboard-target=#copyURL><input id=copyURL ng-value=actualFormURL class="form-control ng-pristine ng-untouched ng-valid"></span></div><div class=col-sm-4><button class="btn btn btn-secondary view-form-btn" ngclipboard data-clipboard-target=#copyURL>{{ \'COPY\' | translate }} <i class="fa fa-clipboard" aria-hidden=true></i></button></div></div></uib-tab><uib-tab index=1 heading="{{ \'EMBED_YOUR_FORM\' | translate }}"><div class=row><div class=col-sm-12>{{ \'COPY_AND_PASTE\' | translate }}</div><div class="col-sm-8 form-input"><span ngclipboard data-clipboard-target=#copyEmbedded><textarea id=copyEmbedded class="form-control ng-pristine ng-untouched ng-valid" style="min-height:200px; width:100%; background-color: #FFFFCC; color: #30313F">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- {{ \'CHANGE_WIDTH_AND_HEIGHT\' | translate }} -->\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<iframe id=iframe src={{actualFormURL}} style=width:100%;height:500px></iframe>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div style="font-family: Sans-Serif;font-size: 12px;color: #999;opacity: 0.5; padding-top: 5px">{{ \'POWERED_BY\' | translate }} <a href=https://www.tellform.com style="color: #999" target=_blank>TellForm</a></div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</textarea></span></div><div class=col-sm-4><button class="btn btn btn-secondary view-form-btn" ngclipboard data-clipboard-target=#copyEmbedded>{{ \'COPY\' | translate }} <i class="fa fa-clipboard" aria-hidden=true></i></button></div></div></uib-tab></uib-tabset></div></div></div></uib-tab><uib-tab class=design-tab ng-if="tabData && myform.form_fields.length" heading="{{ \'DESIGN_TAB\' | translate }}" index={{tabData.length}}+1 select=activateDesignTab()><div class="config-form design container"><div class=row><div class="col-sm-4 col-xs-12"><div class="row field"><div class="field-title col-sm-5"><h5>{{ \'BACKGROUND_COLOR\' | translate }}</h5></div><div class="field-input col-sm-6"><input class=form-control colorpicker=hex ng-model=myform.design.colors.backgroundColor ng-pattern="/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/" ng-style="{ \'background-color\': myform.design.colors.backgroundColor }"></div></div><div class="row field"><div class="field-title col-sm-5"><h5>{{ \'QUESTION_TEXT_COLOR\' | translate }}</h5></div><div class="field-input col-sm-6"><input class=form-control colorpicker=hex ng-model=myform.design.colors.questionColor ng-pattern="/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/" ng-style="{ \'background-color\': myform.design.colors.questionColor }"></div></div><div class="row field"><div class="field-title col-sm-5"><h5>{{ \'ANSWER_TEXT_COLOR\' | translate }}</h5></div><div class="field-input col-sm-6"><input class=form-control colorpicker=hex ng-model=myform.design.colors.answerColor ng-pattern="/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/" ng-style="{ \'background-color\': myform.design.colors.answerColor }"></div></div><div class="row field"><div class="field-title col-sm-5"><h5>{{ \'BTN_BACKGROUND_COLOR\' | translate }}</h5></div><div class="field-input col-sm-6"><input class=form-control colorpicker=hex ng-model=myform.design.colors.buttonColor ng-pattern="/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/" ng-style="{ \'background-color\': myform.design.colors.buttonColor }"></div></div><div class="row field"><div class="field-title col-sm-5"><h5>{{ \'BTN_TEXT_COLOR\' | translate }}</h5></div><div class="field-input col-sm-6"><input class=form-control colorpicker=hex ng-model=myform.design.colors.buttonTextColor ng-pattern="/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/" ng-style="{ \'background-color\': myform.design.colors.buttonTextColor }"></div></div></div><div class="col-sm-8 hidden-xs" ng-if=designTabActive><div class=public-form ng-style="{ \'background-color\': myform.design.colors.backgroundColor }"><iframe id=iframe ng-if=!!formURL ng-src="{{formURL | trustSrc}}" style="border: none; box-shadow: 0px 0px 10px 0px grey; overflow: hidden; height: 400px; width: 90%; position: absolute"></iframe></div></div></div><div class=row><div class="col-sm-offset-4 col-sm-2"><button class="btn btn-signup btn-rounded" type=button ng-click="updateDesign(false, myform, false, false)"><i class="icon-arrow-left icon-white"></i>{{ \'SAVE_CHANGES\' | translate }}</button></div><div class=col-sm-1><button class="btn btn-secondary btn-rounded" type=button ng-click=resetForm()><i class="icon-eye-open icon-white"></i>{{ \'CANCEL\' | translate }}</button></div></div></div></uib-tab></uib-tabset></div></div></section>'),a.put("modules/forms/admin/views/list-forms.client.view.html",'<header data-ng-include="\'/static/modules/core/views/header.client.view.html\'"></header><section class=overlay ng-if=showCreateModal ng-click=closeCreateModal()></section><script type=text/ng-template id=deleteModalListForms.html><div class="modal-header">\n\t\t<h2 class="modal-title hidden-md hidden-lg">{{ \'ARE_YOU_SURE\' | translate }}</h2>\n\t\t<h3 class="modal-title hidden-xs hidden-sm">{{ \'ARE_YOU_SURE\' | translate }}</h3>\n\t</div>\n\t<div class="modal-body">\n\t\t<div class="modal-body-alert">\n\t\t\t{{ \'READ_WARNING\' | translate }}\n\t\t</div>\n\t\t<p class="hidden-xs hidden-sm">\n\t\t\t{{ \'DELETE_WARNING1\' | translate }} <strong>{{content.currFormTitle}}</strong> {{ \'DELETE_WARNING2\' | translate }}\n\t\t</p>\n\t\t<p>{{ \'DELETE_CONFIRM\' | translate }}</p>\n\t</div>\n\t<div class="modal-footer">\n\t\t<input type="text" style="width:100%" data-ng-model="deleteConfirm" class="input-block" autofocus required aria-label="Type in the name of the form to confirm that you want to delete this form.">\n\t\t<button type="submit" ng-click="deleteForm()" class="btn btn-block btn-danger" ng-disabled="content.currFormTitle != deleteConfirm">\n\t\t\t{{ \'I_UNDERSTAND\' | translate }}\n\t\t</button>\n\t</div></script><section class=container><br><div class=row><div ng-click=openCreateModal() class="col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item create-new"><div class="title-row col-xs-12"><h4 class="fa fa-plus fa-6"></h4></div><div class="col-xs-12 details-row"><small class=list-group-item-text>{{ \'CREATE_A_NEW_FORM\' | translate }}</small></div></div><form name=forms.createForm class="col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item create-new new-form" ng-if=showCreateModal><div class="title-row row"><div class="col-xs-5 field-title text-left">{{ \'NAME\' | translate }}</div><div class="col-xs-12 field-input"><input name=title required ng-model=formTitle ng-pattern=languageRegExp ng-minlength=4 style="color:black"></div></div><div class="details-row row"><div class="col-xs-5 field-title text-left">{{ \'LANGUAGE\' | translate }}</div><div class="col-xs-12 field-input"><div class="button custom-select"><select style=color:black name=language required ng-model=formLanguage ng-init="formLanguage = user.language"><option ng-repeat="language in languages" value={{language}}>{{language}}</option></select></div></div></div><div class="details-row submit row"><div class="col-xs-12 field-title text-center"><button class="btn btn-primary" ng-disabled=forms.createForm.$invalid ng-click=createNewForm()>{{ \'CREATE_FORM\' | translate }}</button></div></div></form><div data-ng-repeat="form in myforms" class="col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item container" ng-class="{\'paused\': !form.isLive}" ng-clkc="goToWithId(\'viewForm.create\', form._id)"><div class=row><span class=pull-right><i style=cursor:pointer class="fa fa-trash-o" ng-click=openDeleteModal($index)></i> <i style=cursor:pointer class="fa fa-files-o" ng-click=duplicateForm($index)></i></span></div><div class=row><a data-ng-href=#!/forms/{{form._id}}/admin/create class="title-row col-xs-12"><h4 class=list-group-item-heading data-ng-bind=form.title></h4></a><div class="col-xs-12 responses-row"><small class=list-group-item-text><span>{{ form.numberOfResponses }} {{ \'RESPONSES\' | translate }}</span></small><br><br><small ng-if=!form.isLive class=list-group-item-text><span>{{ \'FORM_PAUSED\' | translate }}</span></small></div></div></div></div></section>'),a.put("modules/forms/admin/views/adminTabs/analyze.html","<edit-submissions-form-directive myform=myform user=user></edit-submissions-form-directive>"),a.put("modules/forms/admin/views/adminTabs/configure.html","<configure-form-directive myform=myform user=user></configure-form-directive>"),a.put("modules/forms/admin/views/adminTabs/create.html","<edit-form-directive myform=myform></edit-form-directive>"),a.put("modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",'<div class="config-form container"><div class=row><div class="col-sm-offset-2 col-sm-4"><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'FORM_NAME\' | translate }}</h5></div><div class=col-sm-12><input class=form-control ng-model=myform.title value={{myform.title}} style="width: 100%" ng-minlength=4 ng-pattern="/^[a-zA-Z0-9 \\-.]*$/"></div></div><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'FORM_STATUS\' | translate }}</h5></div><div class="field-input col-sm-12"><label style="display: inline-block"><input type=radio data-ng-value=true ng-model=myform.isLive ng-required=true style="background-color:#33CC00">  <span>{{ \'PUBLIC\' | translate }}</span></label><label style="display: inline-block"><input type=radio data-ng-value=false ng-model=myform.isLive ng-required="true">  <span>{{ \'PRIVATE\' | translate }}</span></label></div></div><div class="row field"><div class="col-sm-12 field-title">{{ \'LANGUAGE\' | translate }}</div><div class="col-sm-12 field-input"><select ng-model=myform.language><option ng-repeat="language in languages" ng-selected="language == myform.language" value={{language}}>{{language}}</option></select><span class=required-error ng-show="field.required && !field.fieldValue">* {{ \'REQUIRED_FIELD\' | translate }}</span></div></div></div><div class=col-sm-4><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'GA_TRACKING_CODE\' | translate }}</h5></div><div class=col-sm-12><input class=form-control ng-model=myform.analytics.gaCode value={{myform.analytics.gaCode}} style="width: 100%" ng-minlength=4 placeholder=UA-XXXXX-Y ng-pattern="/\\bUA-\\d{4,10}-\\d{1,4}\\b/"></div></div><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'DISPLAY_FOOTER\' | translate }}</h5></div><div class="field-input col-sm-12"><label style="display: inline-block"><input type=radio data-ng-value=false ng-model=myform.hideFooter ng-required="true">  <span>{{ \'YES\' | translate }}</span></label><label style="display: inline-block"><input type=radio data-ng-value=true ng-model=myform.hideFooter ng-required="true">  <span>{{ \'NO\' | translate }}</span></label></div></div><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'DISPLAY_START_PAGE\' | translate }}</h5></div><div class="field-input col-sm-12"><label style="display: inline-block"><input type=radio data-ng-value=true ng-model=myform.startPage.showStart ng-required=true style="background-color:#33CC00">  <span>{{ \'YES\' | translate }}</span></label><label style="display: inline-block"><input type=radio data-ng-value=false ng-model=myform.startPage.showStart ng-required="true">  <span>{{ \'NO\' | translate }}</span></label></div></div><div class="row field"><div class="field-title col-sm-12"><h5>{{ \'DISPLAY_END_PAGE\' | translate }}</h5></div><div class="field-input col-sm-12"><label style="display: inline-block"><input type=radio data-ng-value=true ng-model=myform.endPage.showEnd ng-required=true style="background-color:#33CC00">  <span>{{ \'YES\' | translate }}</span></label><label style="display: inline-block"><input type=radio data-ng-value=false ng-model=myform.endPage.showEnd ng-required="true">  <span>{{ \'NO\' | translate }}</span></label></div></div></div></div><div class=row><div class="col-sm-offset-4 col-sm-2"><button class="btn btn-signup btn-rounded" type=button ng-click="update(false, myform, false, false, null)"><i class="icon-arrow-left icon-white"></i>{{ \'SAVE_CHANGES\' | translate }}</button></div><div class=col-sm-1><button class="btn btn-secondary btn-rounded" type=button ng-click=resetForm()><i class="icon-eye-open icon-white"></i>{{ \'CANCEL\' | translate }}</button></div></div></div>'),a.put("modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",'<form class=row name=editForm><script type=text/ng-template id=editEndPageModal.html class=edit-endpage-modal><div class="modal-body">\n\t\t\t<div class="row">\n\t\t\t\t<div class="edit-panel col-md-6 col-xs-12 col-sm-12">\n\t\t\t\t\t<div class="row modal-header">\n\t\t\t\t\t\t<h2 class="modal-title hidden-md hidden-lg">{{ \'EDIT_END_PAGE\' | translate }}</h2>\n\t\t\t\t\t\t<h3 class="modal-title hidden-xs hidden-sm">{{ \'EDIT_END_PAGE\' | translate }}</h3>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'TITLE\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n\t\t\t\t\t\t\t<input class="form-control" type="text"\n\t\t\t\t\t\t\t\t ng-model="myform.endPage.title" required>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'PARAGRAPH\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n <textarea class="form-control" type="text"\n\t\t\t\t\t\t\t\t\t\t\t ng-model="myform.endPage.paragraph"></textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'BTN_TEXT\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n\t\t\t\t\t\t\t<input class="form-control" type="text"\n\t\t\t\t\t\t\t\t ng-model="myform.endPage.buttonText" required>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<div class="col-md-4 col-xs-12 field-input">{{ \'SHOW_BUTTONS\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-8 col-xs-12 field-input">\n\t\t\t\t\t\t\t<label class="switch-light switch-holo" onclick="">\n\t\t\t\t\t\t\t\t<input type="checkbox" ng-model="showButtons">\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'OFF\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'ON\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<a></a>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row options buttons" ng-if="showButtons">\n\t\t\t\t\t\t<div class="col-md-3 col-xs-12">{{ \'BUTTONS\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-9 col-xs-12">\n\t\t\t\t\t\t\t<div ng-repeat="button in myform.endPage.buttons track by button._id" class="row" style="padding-bottom:1em;">\n\n\t\t\t\t\t\t\t\t<div class="col-xs-5">\n\t\t\t\t\t\t\t\t\t<span>{{ \'BUTTON_TEXT\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<input type="text"\n\t\t\t\t\t\t\t\t\t\t name="{{button.text}}_buttonText_startPage"\n\t\t\t\t\t\t\t\t\t\t ng-model="button.text"\n\t\t\t\t\t\t\t\t\t\t value="{{button.text}}"\n\t\t\t\t\t\t\t\t\t\t placeholder="{{ \'BUTTON_TEXT\' | translate }}">\n\t\t\t\t\t\t\t\t</div>\n\n\n\t\t\t\t\t\t\t\t<div class="col-xs-5">\n\t\t\t\t\t\t\t\t\t<span>{{ \'BUTTON_LINK\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<input type="text"\n\t\t\t\t\t\t\t\t\t\t name="{{button.url}}_url_startPage"\n\t\t\t\t\t\t\t\t\t\t ng-model="button.url"\n\t\t\t\t\t\t\t\t\t\t value="{{button.url}}"\n\t\t\t\t\t\t\t\t\t\t placeholder="http://aeouaou.com/aoeuoa">\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class="col-xs-2">\n\t\t\t\t\t\t\t\t\t<a class="btn btn-danger btn-mini right" type="button" ng-click="deleteButton(button)">\n\t\t\t\t\t\t\t\t\t\t<i class="fa fa-trash-o"></i>\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div class="row"><br></div>\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<button class="btn btn-primary btn-small col-md-offset-6 col-md-6 col-sm-4 col-sm-offset-8 col-xs-4 col-xs-offset-8" type="button" ng-click="addButton()">\n\t\t\t\t\t\t\t\t\t<i class="icon-plus icon-white"></i> {{ \'ADD_BUTTON\' | translate }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="modal-footer row">\n\t\t\t\t\t\t<button type="submit" ng-click="saveEndPage()" class="btn btn-signup btn-rounded">\n\t\t\t\t\t\t\t{{ \'SAVE_START_PAGE\' | translate }}\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button ng-click="cancel()" class="btn btn-secondary btn-rounded">\n\t\t\t\t\t\t\t{{ \'CANCEL\' | translate }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="preview-field-panel col-md-6 hidden-sm hidden-xs">\n\t\t\t\t\t<form class="public-form">\n\n\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t<div class="col-xs-12 text-center" style="overflow-wrap: break-word;">\n\t\t\t\t\t\t\t\t<h1 style="font-weight: 400; font-size: 25px;">\n\t\t\t\t\t\t\t\t\t{{myform.endPage.title}}\n\t\t\t\t\t\t\t\t</h1>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="col-xs-10 col-xs-offset-1 text-center" style="overflow-wrap: break-word;">\n\t\t\t\t\t\t\t\t<p style="color: grey; font-weight: 100; font-size: 16px;">\n\t\t\t\t\t\t\t\t\t{{myform.endPage.paragraph}}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div class="row form-actions text-center" style="padding: 5px 25px 5px 25px;">\n\t\t\t\t\t\t\t<button ng-click="reloadForm()" class="btn" type="button"\n\t\t\t\t\t\t\t\t\tng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}">\n\t\t\t<span style="font-size: 1.6em;">\n\t\t\t{{myform.endPage.buttonText}}\n\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em;">\n\t\t\t\t\t\t\t<p ng-repeat="button in myform.endPage.buttons" class="text-center" style="display:inline;">\n\t\t\t\t\t\t\t\t<button class="btn" style="background-color:rgb(156, 226, 235)" type="button" ng-style="{\'background-color\':button.bgColor, \'color\':button.color}">\n\t\t\t\t\t\t\t\t\t<a href="{{button.url}}"\n\t\t\t\t\t\t\t\t\t style="font-size: 1.6em; text-decoration: none;"\n\t\t\t\t\t\t\t\t\t ng-style="{\'color\':button.color}">\n\t\t\t\t\t\t\t\t\t\t{{button.text}}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t</div></script><script type=text/ng-template id=editStartPageModal.html class=edit-startpage-modal><div class="modal-body">\n\t\t\t<div class="row">\n\t\t\t\t<div class="edit-panel col-md-6 col-xs-12 col-sm-12">\n\t\t\t\t\t<div class="row modal-header">\n\t\t\t\t\t\t<h2 class="modal-title hidden-md hidden-lg">{{ \'EDIT_START_PAGE\' | translate }}</h2>\n\t\t\t\t\t\t<h3 class="modal-title hidden-xs hidden-sm">{{ \'EDIT_START_PAGE\' | translate }}</h3>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'INTRO_TITLE\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n\t\t\t\t\t\t\t<input class="form-control" type="text"\n\t\t\t\t\t\t\t\t ng-model="myform.startPage.introTitle"\n\t\t\t\t\t\t\t\t name="introTitleStartPage" required>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'INTRO_PARAGRAPH\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n <textarea class="form-control" type="text"\n\t\t\t\t\t\t\t\t\t\t\t ng-model="myform.startPage.introParagraph"\n\t\t\t\t\t\t\t\t\t\t\t name="introParagraphStartPage"></textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">{{ \'INTRO_BTN\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-8 col-sm-12">\n\t\t\t\t\t\t\t<input class="form-control" type="text"\n\t\t\t\t\t\t\t\t ng-model="myform.startPage.introButtonText"\n\t\t\t\t\t\t\t\t name="introButtonText" required>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<div class="col-md-4 col-xs-12 field-input">{{ \'SHOW_BUTTONS\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-8 col-xs-12 field-input">\n\t\t\t\t\t\t\t<label class="switch-light switch-holo" onclick="">\n\t\t\t\t\t\t\t\t<input type="checkbox" ng-model="showButtons">\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'OFF\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'ON\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<a></a>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row options buttons" ng-if="showButtons">\n\t\t\t\t\t\t<div class="col-md-3 col-xs-12">{{ \'BUTTONS\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-9 col-xs-12">\n\t\t\t\t\t\t\t<div ng-repeat="button in myform.startPage.buttons track by button._id" class="row" style="padding-bottom:1em;">\n\n\t\t\t\t\t\t\t\t<div class="col-xs-5">\n\t\t\t\t\t\t\t\t\t<span>{{ \'BUTTON_TEXT\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<input type="text"\n\t\t\t\t\t\t\t\t\t\t name="{{button.text}}_buttonText_startPage"\n\t\t\t\t\t\t\t\t\t\t ng-model="button.text"\n\t\t\t\t\t\t\t\t\t\t value="{{button.text}}"\n\t\t\t\t\t\t\t\t\t\t placeholder="{{ \'BUTTON_TEXT\' | translate }}">\n\t\t\t\t\t\t\t\t</div>\n\n\n\t\t\t\t\t\t\t\t<div class="col-xs-5">\n\t\t\t\t\t\t\t\t\t<span>{{ \'BUTTON_LINK\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<input type="text"\n\t\t\t\t\t\t\t\t\t\t name="{{button.url}}_url_startPage"\n\t\t\t\t\t\t\t\t\t\t ng-model="button.url"\n\t\t\t\t\t\t\t\t\t\t value="{{button.url}}"\n\t\t\t\t\t\t\t\t\t\t placeholder="http://aeouaou.com/aoeuoa">\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class="col-xs-2">\n\t\t\t\t\t\t\t\t\t<a class="btn btn-danger btn-mini right" type="button" ng-click="deleteButton(button)">\n\t\t\t\t\t\t\t\t\t\t<i class="fa fa-trash-o"></i>\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div class="row"><br></div>\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<button class="btn btn-primary btn-small col-md-offset-6 col-md-6 col-sm-4 col-sm-offset-8 col-xs-4 col-xs-offset-8" type="button" ng-click="addButton()">\n\t\t\t\t\t\t\t\t\t<i class="icon-plus icon-white"></i> {{ \'ADD_BUTTON\' | translate }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="modal-footer row">\n\t\t\t\t\t\t<button type="submit" ng-click="saveStartPage()" class="btn btn-signup btn-rounded">\n\t\t\t\t\t\t\t{{ \'SAVE_START_PAGE\' | translate }}\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button ng-click="cancel()" class="btn btn-secondary btn-rounded">\n\t\t\t\t\t\t\t{{ \'CANCEL\' | translate }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="preview-field-panel col-md-6 hidden-sm hidden-xs">\n\t\t\t\t\t<form class="public-form">\n\n\t\t\t\t\t\t<div class="field row">\n\t\t\t\t\t\t\t<div class="col-xs-12 text-center" style="overflow-wrap: break-word;">\n\t\t\t\t\t\t\t\t<h1>{{myform.startPage.introTitle}}</h1>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="col-xs-10 col-xs-offset-1 text-left" style="overflow-wrap: break-word;">\n\t\t\t\t\t\t\t\t<p style="color:#ddd;">{{myform.startPage.introParagraph}}</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em;">\n\t\t\t\t\t\t\t<p ng-repeat="button in myform.startPage.buttons" class="text-center" style="display:inline;">\n\t\t\t\t\t\t\t\t<button class="btn btn-info" type="button" ng-style="{\'background-color\':button.bgColor, \'color\':button.color}">\n\t\t\t\t\t\t\t\t\t<a href="{{button.url}}" style="font-size: 1.6em; text-decoration: none; color: inherit;" >\n\t\t\t\t\t\t\t\t\t\t{{button.text}}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="row form-actions">\n\t\t\t\t\t\t\t<button class="btn btn-info btn btn-info col-md-6 col-md-offset-3 col-lg-6 col-lg-offset-3" type="button">\n\t\t\t\t\t\t\t\t\t\t<span style="color:white; font-size: 1.6em; text-decoration: none;">\n\t\t\t\t\t\t\t\t\t\t\t{{myform.startPage.introButtonText}}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t</div></script><script type=text/ng-template id=editFieldModal.html class=edit-field-modal><div class="modal-body">\n\t\t\t<div class="row">\n\t\t\t\t<div class="edit-panel col-md-6 col-xs-12 col-sm-12">\n\t\t\t\t\t<div class="row modal-header">\n\t\t\t\t\t\t<h2 class="modal-title hidden-md hidden-lg">{{ \'EDIT_FIELD\' | translate }}</h2>\n\t\t\t\t\t\t<h3 class="modal-title hidden-xs hidden-sm">{{ \'EDIT_FIELD\' | translate }}</h3>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row question">\n\t\t\t\t\t\t<div class="col-md-12 bold">{{ \'QUESTION_TITLE\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-12">\n\t\t\t\t\t\t\t<input type="text" class="form-control" ng-model="field.title" name="title{{field._id}}" value="{{field.title}}" required></div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row description" ng-hide="showRatingOptions()">\n\t\t\t\t\t\t<div class="col-md-12 bold">{{ \'QUESTION_DESCRIPTION\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-12">\n\t\t\t\t\t\t\t<textarea type="text" class="form-control" ng-model="field.description" name="description{{field._id}}"value="{{field.description}}"></textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row" ng-show="showAddOptions()"><br></div>\n\t\t\t\t\t<div class="row options" ng-if="showAddOptions()">\n\t\t\t\t\t\t<div class="col-md-4 col-xs-12">{{ \'OPTIONS\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-8 col-xs-12">\n\t\t\t\t\t\t\t<div ng-repeat="option in field.fieldOptions track by option.option_id" class="row">\n\t\t\t\t\t\t\t\t<input type="text" name="{{option.option_value}}{{field._id}}" ng-model="option.option_value" class="col-xs-5">\n\n\t\t\t\t\t\t\t\t<a class="btn btn-danger btn-mini right" type="button" ng-click="deleteOption(option)" class="col-xs-3">\n\t\t\t\t\t\t\t\t\t<i class="fa fa-trash-o"></i>\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<button class="btn btn-primary btn-small col-md-offset-0 col-md-6 col-sm-4 col-sm-offset-4 col-xs-6 col-xs-offset-6" type="button" ng-click="addOption()">\n\t\t\t\t\t\t\t\t\t<i class="icon-plus icon-white"></i> {{ \'ADD_OPTION\' | translate }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row" ng-show="showRatingOptions()"><br></div>\n\t\t\t\t\t<div class="row" ng-if="showRatingOptions()">\n\t\t\t\t\t\t<div class="col-md-9 col-sm-9">{{ \'NUM_OF_STEPS\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-3 col-sm-3">\n\t\t\t\t\t\t\t<input style="width:100%" type="number"\n\t\t\t\t\t\t\t\t min="1" max="10"\n\t\t\t\t\t\t\t\t ng-model="field.ratingOptions.steps"\n\t\t\t\t\t\t\t\t name="ratingOptions_steps{{field._id}}"\n\t\t\t\t\t\t\t\t ng-value="{{field.ratingOptions.steps}}"\n\t\t\t\t\t\t\t\t required>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<div class="col-md-5 col-sm-9">{{ \'SHAPE\' | translate }}:</div>\n\t\t\t\t\t\t<div class="col-md-7 col-sm-3">\n\t\t\t\t\t\t\t<select style="width:100%" ng-model="field.ratingOptions.shape"\n\t\t\t\t\t\t\t\t\tvalue="{{field.ratingOptions.steps}}"\n\t\t\t\t\t\t\t\t\tname="ratingOptions_shape{{field._id}}" required>\n\t\t\t\t\t\t\t\t<option ng-repeat="shapeType in validShapes"\n\t\t\t\t\t\t\t\t\t\tvalue="{{shapeType}}">\n\t\t\t\t\t\t\t\t\t{{select2FA[shapeType]}}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row"><br></div>\n\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<div class="col-md-4 col-xs-12 field-title">{{ \'REQUIRED_FIELD\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-8 col-xs-12 field-input">\n\t\t\t\t\t\t\t<label class="switch-light switch-holo" onclick="">\n\t\t\t\t\t\t\t\t<input type="checkbox" ng-model="field.required">\n\t\t\t\t\t\t\t\t<span class="large-3 columns float-left">\n\t\t\t\t\t\t\t\t\t<span> {{ \'OFF\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'ON\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<a></a>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<div class="col-md-4 col-xs-12 field-input">{{ \'LOGIC_JUMP\' | translate }}</div>\n\t\t\t\t\t\t<div class="col-md-8 col-xs-12 field-input">\n\t\t\t\t\t\t\t<label class="switch-light switch-holo" onclick="">\n\t\t\t\t\t\t\t\t<input type="checkbox" ng-model="field.logicJump.enabled">\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'OFF\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<span> {{ \'ON\' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<a></a>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row question" ng-if="field.logicJump.enabled"">\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">\n\n\t\t\t\t\t\t\t<b> {{ \'IF_THIS_FIELD\' | translate }} </b>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">\n\t\t\t\t\t\t\t<select style="width:100%" ng-model="field.logicJump.expressionString"\n\t\t\t\t\t\t\t\t\tvalue="{{field.logicJump.expressionString}}"\n\t\t\t\t\t\t\t\t\tname="logicjump_expressionString{{field._id}}">\n\t\t\t\t\t\t\t\t<option value="field == static">\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_EQUAL_TO\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field != static">\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_NOT_EQUAL_TO\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\n\t\t\t\t\t\t\t\t<option value="field > static" ng-if-start="field.fieldType === \'number\' || field.fieldType === \'rating\' || field.fieldType === \'number\'">\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_GREATER_THAN\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field >= static">\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_GREATER_OR_EQUAL_THAN\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field < static">\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_SMALLER_THAN\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field <= static" ng-if-end>\n\n\t\t\t\t\t\t\t\t\t{{ \'IS_SMALLER_OR_EQUAL_THAN\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\n\t\t\t\t\t\t\t\t<option value="field contains static" ng-if-start="field.fieldType !== \'number\' && field.fieldType !== \'rating\' && field.fieldType !== \'number\'">\n\n\t\t\t\t\t\t\t\t\t{{ \'CONTAINS\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field !contains static">\n\n\t\t\t\t\t\t\t\t\t{{ \'DOES_NOT_CONTAINS\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field ends static">\n\n\t\t\t\t\t\t\t\t\t{{ \'ENDS_WITH\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field !ends static">\n\n\t\t\t\t\t\t\t\t\t{{ \'DOES_NOT_END_WITH\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field starts static">\n\n\t\t\t\t\t\t\t\t\t{{ \'STARTS_WITH\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option value="field !starts static" ng-if-end>\n\n\t\t\t\t\t\t\t\t\t{{ \'DOES_NOT_START_WITH\' | translate }}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-md-4 col-sm-12">\n\t\t\t\t\t\t\t<input type="text" ng-model="field.logicJump.valueB"/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-md-2">\n\n\t\t\t\t\t\t\t<b>{{ \'THEN_JUMP_TO\' | translate }}</b>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-md-10">\n\t\t\t\t\t\t\t<select style="width:100%" ng-model="field.logicJump.jumpTo"\n\t\t\t\t\t\t\t\t\tvalue="{{field.logicJump.jumpTo}}"\n\t\t\t\t\t\t\t\t\tname="logicjump_jumpTo{{field._id}}">\n\t\t\t\t\t\t\t\t<option ng-repeat="jump_field in myform.form_fields"\n\t\t\t\t\t\t\t\t\t\tvalue="{{jump_field._id}}">\n\t\t\t\t\t\t\t\t\t{{jump_field.title}}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer row">\n\t\t\t\t\t\t<button type="submit" ng-click="saveField()" class="btn btn-signup btn-rounded">\n\t\t\t\t\t\t\t{{ \'SAVE_FIELD\' | translate }}\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button ng-click="cancel()" class="btn btn-secondary btn-rounded">\n\t\t\t\t\t\t\t{{ \'CANCEL\' | translate }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="preview-field-panel col-md-6 hidden-sm hidden-xs">\n\t\t\t\t\t<form class="public-form">\n\t\t\t\t\t\t<field-directive field="field" validate="false" class="preview-field">\n\t\t\t\t\t\t</field-directive>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t</div></script><div class="col-xs-2 col-sm-4 add-field"><div class="row add-field-title"><h3 class="col-md-12 hidden-sm hidden-xs">{{ \'ADD_FIELD_LG\' | translate }}</h3><h4 class="col-sm-12 hidden-xs hidden-md hidden-lg">{{ \'ADD_FIELD_MD\' | translate }}</h4><h5 class="col-xs-12 hidden-sm hidden-md hidden-lg">{{ \'ADD_FIELD_SM\' | translate }}</h5></div><div class="panel-group row" class=draggable ng-model=addField.types><div class="col-xs-12 col-sm-12 col-md-6" ng-repeat="type in addField.types" style=padding-top:7.5px><div class="panel panel-default" style=background-color:#f5f5f5><div class=panel-heading ng-click=addNewField(type.name) style="cursor: pointer; font-size:12px; padding-left: 10px; padding-right: 10px"><span><field-icon-directive type-name={{type.name}}></field-icon-directive></span> <span class=hidden-xs style=padding-left:0.3em>{{type.value}}</span></div></div></div></div></div><div class="col-xs-10 col-sm-8 current-fields"><div class=row ng-if=myform.startPage.showStart><div class=col-sm-12><div class="panel panel-default startPage" ng-click=openEditStartPageModal()><div class=panel-heading><h4 class=text-center>{{ \'WELCOME_SCREEN\' | translate }}</h4></div></div></div></div><div class=row><div class=col-sm-12><hr></div></div><div class="row dropzoneContainer"><div class="panel-group dropzone col-xs-12" ui-sortable=sortableOptions ng-model=myform.form_fields><div class="col-xs-12 field-row" ng-repeat="field in myform.form_fields track by $id($index)" ng-if=!field.deletePreserved><div class=col-xs-10><div class="panel panel-default" ng-click="openEditModal(field, true, $index)"><div class=panel-heading><div class=row><span class=col-xs-1 ng-switch=field.fieldType><field-icon-directive type-name={{field.fieldType}}></field-icon-directive></span> <span class=col-xs-11>{{field.title}} <span ng-show=field.required>*</span></span></div></div></div></div><div class="col-xs-1 box"><div class="panel tool-panel panel-default"><div class=panel-heading style="padding: 10px 10px" ng-click=deleteField($index)><span class=text-center><a href="" class="fa fa-trash-o"></a></span></div></div></div><div class="col-xs-1 box"><div class="panel tool-panel panel-default"><div class=panel-heading style="padding: 10px 10px" ng-click=duplicateField($index)><span class=text-center><a href="" class="fa fa-files-o"></a></span></div></div></div></div><div class="col-xs-12 field-row"><div class=col-xs-12 style="padding-right: 5px"><div class="panel panel-default" style="border-style: dashed; border-color: #a9a9a9"><div class=panel-heading><h4 class="panel-title text-center" style="color: #a9a9a9">{{ \'CLICK_FIELDS_FOOTER\' | translate }}</h4></div></div></div></div><hr></div></div><div class=row ng-if=myform.endPage.showEnd><div class=col-sm-12><div class="panel panel-default startPage" ng-click=openEditEndPageModal()><div class=panel-heading><h4 class=text-center>{{ \'END_SCREEN\' | translate }}</h4></div></div></div></div></div></form>'), +a.put("modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html","<div class=\"submissions-table container\"><div class=\"row text-center analytics\"><div class=\"col-xs-12 header-title\"><div class=col-xs-3>{{ 'TOTAL_VIEWS' | translate }}</div><div class=col-xs-3>{{ 'RESPONSES' | translate }}</div><div class=col-xs-3>{{ 'COMPLETION_RATE' | translate }}</div><div class=col-xs-3>{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div></div><div class=\"col-xs-12 header-numbers\"><div class=col-xs-3>{{myform.analytics.visitors.length}}</div><div class=col-xs-3>{{myform.analytics.submissions}}</div><div class=col-xs-3>{{myform.analytics.conversionRate | number:0}}%</div><div class=col-xs-3>{{ AverageTimeElapsed | secondsToDateTime | date:'mm:ss'}}</div></div><div class=\"col-xs-12 detailed-title\"><div class=col-xs-3>{{ 'DESKTOP_AND_LAPTOP' | translate }}</div><div class=col-xs-3>{{ 'TABLETS' | translate }}</div><div class=col-xs-3>{{ 'PHONES' | translate }}</div><div class=col-xs-3>{{ 'OTHER' | translate }}</div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.desktop.visits}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.tablet.visits}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.tablet.visits}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'UNIQUE_VISITS' | translate }}</div><div class=row>{{DeviceStatistics.other.visits}}</div></div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.desktop.responses}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.tablet.responses}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.phone.responses}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'RESPONSES' | translate }}</div><div class=row>{{DeviceStatistics.other.responses}}</div></div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.desktop.completion}}%</div></div><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.tablet.completion}}%</div></div><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.phone.completion}}%</div></div><div class=col-xs-3><div class=\"row header\">{{ 'COMPLETION_RATE' | translate }}</div><div class=row>{{DeviceStatistics.other.completion}}%</div></div></div><div class=\"col-xs-12 detailed-row\"><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.desktop.average_time | secondsToDateTime | date:'mm:ss'}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.tablet.average_time | secondsToDateTime | date:'mm:ss'}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.phone.average_time | secondsToDateTime | date:'mm:ss'}}</div></div><div class=col-xs-3><div class=\"row header\">{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}</div><div class=row>{{DeviceStatistics.other.average_time | secondsToDateTime | date:'mm:ss'}}</div></div></div><div class=\"col-xs-12 field-title-row\"><div class=col-xs-3><strong>{{ 'FIELD_TITLE' | translate }}</strong></div><div class=col-xs-3><strong>{{ 'FIELD_VIEWS' | translate }}</strong></div><div class=col-xs-3><strong>{{ 'FIELD_RESPONSES' | translate }}</strong></div><div class=col-xs-3><strong>{{ 'FIELD_DROPOFF' | translate }}</strong></div></div><div class=\"col-xs-12 field-detailed-row\" ng-repeat=\"fieldStats in myform.analytics.fields\"><div class=col-xs-3>{{fieldStats.field.title}}</div><div class=col-xs-3>{{fieldStats.totalViews}}</div><div class=col-xs-3>{{fieldStats.responses}}</div><div class=col-xs-3>{{fieldStats.continueRate}}%</div></div></div><br><div class=\"row table-tools\"><div class=col-xs-2><button class=\"btn btn-danger\" ng-click=deleteSelectedSubmissions() ng-disabled=!isAtLeastOneChecked();><i class=\"fa fa-trash-o\"></i> {{ 'DELETE_SELECTED' | translate }}</button></div><div class=\"col-xs-2 col-xs-offset-4 text-right\"><button class=\"btn btn-gray\" ng-click=\"exportSubmissions('xml')\"><small>{{ 'EXPORT_TO_EXCEL' | translate }}</small></button></div><div class=\"col-md-2 text-right\"><button class=\"btn btn-gray\" ng-click=\"exportSubmissions('csv')\"><small>{{ 'EXPORT_TO_CSV' | translate }}</small></button></div><div class=\"col-md-2 text-right\"><button class=\"btn btn-gray\" ng-click=\"exportSubmissions('json')\"><small>{{ 'EXPORT_TO_JSON' | translate }}</small></button></div></div><div class=\"row table-outer\"><div class=col-xs-12><table id=table-submission-data class=\"table table-striped table-hover table-condensed\"><thead><tr><th><input ng-model=table.masterChecker ng-change=toggleAllCheckers() type=\"checkbox\"></th><th>#</th><th data-ng-repeat=\"(key, value) in myform.form_fields track by $index\">{{value.title}}</th><th>{{ 'PERCENTAGE_COMPLETE' | translate }}</th><th>{{ 'TIME_ELAPSED' | translate }}</th><th>{{ 'DEVICE' | translate }}</th><th>{{ 'LOCATION' | translate }}</th><th>{{ 'IP_ADDRESS' | translate }}</th><th>{{ 'DATE_SUBMITTED' | translate }} (UTC)</th></tr></thead><tbody><tr data-ng-repeat=\"row in table.rows\" ng-click=rowClicked($index) ng-class=\"{selected: row.selected === true}\"><td><input ng-model=row.selected type=\"checkbox\"></td><th class=scope>{{$index+1}}</th><td data-ng-repeat=\"field in row.form_fields\">{{field.fieldValue}}</td><td>{{row.percentageComplete}}%</td><td>{{row.timeElapsed | secondsToDateTime | date:'mm:ss'}}</td><td>{{row.device.name}}, {{row.device.type}}</td><td>{{row.geoLocation.City}}, {{row.geoLocation.Country}}</td><td>{{row.ipAddr}}</td><td>{{row.created | date:'yyyy-MM-dd HH:mm:ss'}}</td></tr></tbody></table></div></div></div>"),a.put("modules/users/views/authentication/access-denied.client.view.html","<section class=\"text-center auth\"><h3 class=col-md-12>{{ 'ACCESS_DENIED_TEXT' | translate }}</h3><a href=/#!/sigin class=col-md-12>{{ 'SIGNIN_BTN' | translate }}</a></section>"),a.put("modules/users/views/authentication/signin.client.view.html",'<section class="auth sigin-view valign-wrapper" data-ng-controller=AuthenticationController><div class="row valign"><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><div class=col-md-12><form class="signin form-horizontal" autocomplete=off><fieldset><div data-ng-show=error class="text-center text-danger">Error: <strong data-ng-bind=error></strong></div><div class=form-group><input id=username name=username class=form-control data-ng-model=credentials.username placeholder="{{ \'USERNAME_OR_EMAIL_LABEL\' | translate }}" ng-minlength=4></div><div class=form-group><input type=password id=password name=password class=form-control data-ng-model=credentials.password placeholder="{{ \'PASSWORD_LABEL\' | translate }}" ng-minlength=4></div><div class=form-group><button class="btn btn-signup btn-rounded btn-block" ng-click=signin()>{{ \'SIGNIN_BTN\' | translate }}</button></div><div class="text-center forgot-password"><a ui-sref=forgot>{{ \'FORGOT_PASSWORD_LINK\' | translate }}</a></div></fieldset></form></div></div><div class="text-center forgot-password col-md-12"><a ui-sref=signup>{{ \'SIGNUP_ACCOUNT_LINK\' | translate }}</a></div></div></section>'),a.put("modules/users/views/authentication/signup-success.client.view.html",'<section class="auth signup-view success" data-ng-controller=AuthenticationController><h3 class="col-xs-offset-2 col-xs-8 col-md-offset-3 col-md-6 text-center">{{ \'SUCCESS_HEADER\' | translate }}</h3><div class="col-xs-offset-2 col-xs-8 col-md-offset-3 col-md-6"><h2>{{ \'SUCCESS_TEXT\' | translate }}<br><br>{{ \'NOT_ACTIVATED_YET\' | translate }}</h2><br><br><p><strong>{{ \'BEFORE_YOU_CONTINUE\' | translate }}</strong> <a href=mail:polydaic@gmail.com>polydaic@gmail.com</a></p><div class="text-center form-group"><button type=submit class="btn btn-primary btn-rounded"><a href="/#!/" style="color: white; text-decoration: none">{{ \'CONTINUE\' | translate }}</a></button></div></div></section>'),a.put("modules/users/views/authentication/signup.client.view.html",'<section class="auth signup-view valign-wrapper" data-ng-controller=AuthenticationController><div class="row valign"><div class="col-md-12 text-center vcenter" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><div class="col-xs-offset-3 col-xs-6 col-sm-offset-4 col-sm-4"><form name=userForm data-ng-submit=signup() class="signin form-horizontal" autocomplete=off><fieldset><div data-ng-show=error id=signup_errors class=text-center>{{\'SIGNUP_ERROR_TEXT\' | translate}}:<br><strong data-ng-bind=error></strong></div><div class=form-group><input id=username name=username class=form-control ng-pattern=languageRegExp ng-minlength=4 ng-model=credentials.username placeholder="{{ \'USERNAME_LABEL\' | translate }}" ng-minlength=4></div><div class=form-group><input type=email id=email name=email class=form-control ng-model=credentials.email placeholder="{{ \'EMAIL_LABEL\' | translate }}"></div><div class=form-group><input type=password id=password name=password class=form-control ng-model=credentials.password placeholder="{{ \'PASSWORD_LABEL\' | translate }}" ng-minlength=4></div><div class="text-center form-group"><button type=submit class="btn btn-signup btn-rounded btn-block">{{ \'SIGNUP_BTN\' | translate }}</button></div></fieldset></form><div class="text-center forgot-password"><a ui-sref=signin>{{ \'SIGN_IN_ACCOUNT_LINK\' | translate }}</a></div></div></div></section>'),a.put("modules/users/views/password/forgot-password.client.view.html",'<section class="auth valign-wrapper" data-ng-controller=PasswordController><div class="row valign"><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><div class=col-md-12><form data-ng-submit=askForPasswordReset() autocomplete=off><fieldset><div class=form-group><input id=username name=username class=form-control data-ng-model=credentials.username placeholder="{{ \'USERNAME_OR_EMAIL_LABEL\' | translate }}"></div><div class="text-center form-group"><button type=submit class="btn btn-signup btn-rounded btn-block">{{ \'PASSWORD_RESTORE_HEADER\' | translate }}</button></div><div data-ng-show=error class=text-center><strong>Error: {{error}}</strong></div><div data-ng-show=success class=text-center><strong>{{success}}</strong></div></fieldset></form></div></div></div></section>'),a.put("modules/users/views/password/reset-password-invalid.client.view.html","<section class=\"row text-center\"><h3 class=col-md-12>{{ 'PASSWORD_RESET_INVALID' | translate }}</h3><a href=/#!/password/forgot class=col-md-12>{{ 'ASK_FOR_NEW_PASSWORD' | translate }}</a></section>"),a.put("modules/users/views/password/reset-password-success.client.view.html","<section class=\"row text-center\"><h3 class=col-md-12>{{ 'PASSWORD_RESET_SUCCESS' | translate }}</h3><a href=\"/#!/\" class=col-md-12>{{ 'CONTINUE_TO_LOGIN' | translate }}</a></section>"),a.put("modules/users/views/password/reset-password.client.view.html",'<section class="row auth" data-ng-controller=PasswordController><h3 class="col-md-12 text-center">{{ \'RESET_PASSWORD\' | translate }}</h3><div class="col-xs-offset-2 col-xs-8 col-md-offset-3 col-md-6"><form data-ng-submit=resetUserPassword() class="signin form-horizontal" autocomplete=off><fieldset><div class=form-group><label for=newPassword>{{ \'NEW_PASSWORD_LABEL\' | translate }}</label><input type=password id=newPassword name=newPassword class=form-control data-ng-model=passwordDetails.newPassword placeholder="{{ \'NEW_PASSWORD_LABEL\' | translate }}"></div><div class=form-group><label for=verifyPassword>{{ \'VERIFY_PASSWORD_LABEL\' | translate }}</label><input type=password id=verifyPassword name=verifyPassword class=form-control data-ng-model=passwordDetails.verifyPassword placeholder="{{ \'VERIFY_PASSWORD_LABEL\' | translate }}"></div><div class="text-center form-group"><button type=submit class="btn btn-large btn-primary">{{ \'UPDATE_PASSWORD_LABEL\' | translate }}</button></div><div data-ng-show=error class="text-center text-danger"><strong>{{error}}</strong></div><div data-ng-show=success class="text-center text-success"><strong>{{success}}</strong></div></fieldset></form></div></section>'),a.put("modules/users/views/settings/change-password.client.view.html",'<header data-ng-include="\'/static/modules/core/views/header.client.view.html\'"></header><section class=row data-ng-controller=SettingsController><h3 class="col-md-12 text-center">{{ \'CHANGE_PASSWORD\' | translate }}</h3><div class="col-xs-offset-2 col-xs-8 col-md-offset-3 col-md-6"><form data-ng-submit=changeUserPassword() class="signin form-horizontal" autocomplete=off><fieldset><div class=form-group><label for=currentPassword>{{ \'CURRENT_PASSWORD_LABEL\' | translate }}</label><input type=password id=currentPassword name=currentPassword class=form-control data-ng-model=passwordDetails.currentPassword placeholder="{{ \'CURRENT_PASSWORD_LABEL\' | translate }}"></div><hr><div class=form-group><label for=newPassword>{{ \'NEW_PASSWORD_LABEL\' | translate }}</label><input type=password id=newPassword name=newPassword class=form-control data-ng-model=passwordDetails.newPassword placeholder="{{ \'NEW_PASSWORD_LABEL\' | translate }}"></div><div class=form-group><label for=verifyPassword>{{ \'VERIFY_PASSWORD_LABEL\' | translate }}</label><input type=password id=verifyPassword name=verifyPassword class=form-control data-ng-model=passwordDetails.verifyPassword placeholder="{{ \'VERIFY_PASSWORD_LABEL\' | translate }}"></div><div class="text-center form-group"><button type=submit class="btn btn-large btn-primary">{{ \'SAVE_PASSWORD_BTN\' | translate }}</button></div><div data-ng-show=success class="text-center text-success"><strong>{{ \'PASSWORD_CHANGE_SUCCESS\' | translate }}</strong></div><div data-ng-show=error class="text-center text-danger"><strong data-ng-bind=error></strong></div></fieldset></form></div></section>'),a.put("modules/users/views/settings/edit-profile.client.view.html",'<header data-ng-include="\'/static/modules/core/views/header.client.view.html\'"></header><section class=row data-ng-controller=SettingsController><h2 class="col-xs-offset-1 col-xs-10 text-center">{{ \'EDIT_PROFILE\' | translate }}</h2><div class="col-xs-offset-3 col-xs-6"><form name=userForm data-ng-submit=updateUserProfile(userForm.$valid) class="signin form-horizontal" autocomplete=off><fieldset><div data-ng-show=success class="text-center text-success"><strong>{{ \'PROFILE_SAVE_SUCCESS\' | translate }}</strong></div><div data-ng-show=error class="text-center text-danger">{{ \'PROFILE_SAVE_ERROR\' | translate }}<br><strong data-ng-bind=error></strong></div><div class="form-group row"><div class="col-xs-7 field-title">{{ \'FIRST_NAME_LABEL\' | translate }}</div><div class="col-xs-12 field-input"><input id=firstName name=firstName class=form-control data-ng-model=user.firstName ng-pattern="/^[\\w0-9 \\-.]*$/"></div></div><div class="form-group row"><div class="col-xs-7 field-title">{{ \'LAST_NAME_LABEL\' | translate }}</div><div class="col-xs-12 field-input"><input id=lastName name=lastName class=form-control data-ng-model=user.lastName ng-pattern="/^[\\w0-9 \\-.]*$/"></div></div><div class=row><hr></div><div class="row form-group"><div class="col-xs-7 field-title">{{ \'LANGUAGE_LABEL\' | translate }}</div><div class="col-xs-12 field-input"><select ng-model=user.language required><option ng-repeat="language in languages" ng-selected="language == user.language" value={{language}}>{{language}}</option></select></div></div><div class="row form-group"><div class="col-xs-7 field-title">{{ \'USERNAME_LABEL\' | translate }}</div><div class="col-xs-12 field-input"><input id=username name=username class=form-control data-ng-model=user.username></div></div><div class="row form-group"><div class="col-xs-7 field-title">{{ \'EMAIL_LABEL\' | translate }}</div><div class="col-xs-12 field-input"><input type=email id=email name=email class=form-control data-ng-model=user.email></div></div><div class="text-center form-group"><button type=submit class="btn btn-signup btn-rounded">{{ \'SAVE_CHANGES\' | translate }}</button> <button type=none ng-click=cancel() class="btn btn-rounded">{{ \'CANCEL_BTN\' | translate }}</button></div></fieldset></form></div></section>'),a.put("modules/users/views/settings/social-accounts.client.view.html",'<header data-ng-include="\'/static/modules/core/views/header.client.view.html\'"></header><section class=row data-ng-controller=SettingsController><h3 class="col-md-12 text-center" data-ng-show=hasConnectedAdditionalSocialAccounts()>{{ \'CONNECTED_SOCIAL_ACCOUNTS\' | translate }}:</h3><div class="col-md-12 text-center"><div data-ng-repeat="(providerName, providerData) in user.additionalProvidersData" class=remove-account-container><img ng-src=/modules/users/img/buttons/{{providerName}}.png> <a class="btn btn-danger btn-remove-account" data-ng-click=removeUserSocialAccount(providerName)><i class="glyphicon glyphicon-trash"></i></a></div></div><h3 class="col-md-12 text-center">{{ \'CONNECT_OTHER_SOCIAL_ACCOUNTS\' | translate }}</h3><div class="col-md-12 text-center"><a href=/auth/facebook data-ng-hide="isConnectedSocialAccount(\'facebook\')" class=undecorated-link><img src=/modules/users/img/buttons/facebook.png></a> <a href=/auth/twitter data-ng-hide="isConnectedSocialAccount(\'twitter\')" class=undecorated-link><img src=/modules/users/img/buttons/twitter.png></a> <a href=/auth/google data-ng-hide="isConnectedSocialAccount(\'google\')" class=undecorated-link><img src=/modules/users/img/buttons/google.png></a> <a href=/auth/linkedin data-ng-hide="isConnectedSocialAccount(\'linkedin\')" class=undecorated-link><img src=/modules/users/img/buttons/linkedin.png></a> <a href=/auth/github data-ng-hide="isConnectedSocialAccount(\'github\')" class=undecorated-link><img src=/modules/users/img/buttons/github.png></a></div></section>'),a.put("modules/users/views/verify/resend-verify-email.client.view.html",'<section class="auth valign-wrapper" data-ng-controller=VerifyController><section class="row valign" ng-if=!isResetSent><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><div data-ng-show=error class="text-center text-danger"><strong>{{error}}</strong></div><div class=col-md-12><form data-ng-submit=resendVerifyEmail() class="signin form-horizontal" autocomplete=off><fieldset><div class=form-group><input id=email name=email class=form-control data-ng-model=credentials.email placeholder="{{ \'ENTER_ACCOUNT_EMAIL\' | translate}}"></div><div class="text-center form-group"><button type=submit class="btn btn-signup btn-rounded btn-block" ng-click=resendVerifyEmail()>{{ \'RESEND_VERIFICATION_EMAIL\' | translate }}</button></div></fieldset></form></div></div></section><section class="row valign" ng-if=isResetSent><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><h3 class="col-md-12 text-center">{{ \'VERIFICATION_EMAIL_SENT\' | translate }}</h3><div class=col-md-12><h2>{{ \'VERIFICATION_EMAIL_SENT_TO\' | translate }} {{username}}.<br>{{ \'NOT_ACTIVATED_YET\' | translate }}</h2><p>{{ \'CHECK_YOUR_EMAIL\' | translate }} <a href=mail:polydaic@gmail.com>polydaic@gmail.com</a></p><div class="text-center form-group"><button type=submit class="btn btn-large btn-primary btn-rounded"><a href="/#!/" style=color:white>{{ \'CONTINUE\' | translate }}</a></button></div></div></div></section></section>'),a.put("modules/users/views/verify/verify-account.client.view.html",'<section class=auth data-ng-controller=VerifyController ng-init=validateVerifyToken()><section class="row text-center" ng-if=isResetSent><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><h3 class=col-md-12>{{ \'VERIFY_SUCCESS\' | translate }}</h3><div class=col-md-12><a href=/#!/signin class="btn btn-signup btn-rounded btn-block">{{ \'CONTINUE_TO_LOGIN\' | translate }}</a></div></div></section><section class="row text-center" ng-if=!isResetSent><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px"><img src=/static/modules/core/img/logo_white.svg height=100px></div><h3 class=col-md-12>{{ \'VERIFY_ERROR\' | translate }}</h3><div class=col-md-12><a href=/#!/verify class="btn btn-rounded btn-default">{{ \'REVERIFY_ACCOUNT_LINK\' | translate }}</a></div><div class=col-sm-12><a href=/#!/signin class="btn btn-rounded btn-primary">{{ \'SIGNIN_BTN\' | translate }}</a></div></div></section></section>'),a.put("form_modules/forms/base/views/directiveViews/entryPage/startPage.html",'<div class="field row text-center"><div class="col-xs-12 text-center"><h1>{{pageData.introTitle}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-left"><p style=color:#ddd>{{pageData.introParagraph}}</p></div></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in pageData.buttons" class=text-center style=display:inline><button class="btn btn-info" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none; color: inherit">{{button.text}}</a></button></p></div><div class="row form-actions"><p class="col-xs-3 col-xs-offset-3 text-center"><button class="btn btn-info" type=button><a ng-click=exitpageData() style="color:white; font-size: 1.6em; text-decoration: none">{{ \'CONTINUE_FORM\' | translate }}</a></button></p></div>'),a.put("form_modules/forms/base/views/directiveViews/field/date.html",'<div class="field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show="!field.required && !field.fieldValue">{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><div class="control-group input-append"><input class=focusOn ng-focus="setActiveField(field._id, null, false)" ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" ng-class="{ \'no-border\': !!field.fieldValue }" ui-date=dateOptions ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required placeholder=MM/DD/YYYY on-tab-key=nextField() on-tab-and-shift-key=prevField() ng-change=nextField()></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/dropdown.html",'<div class="field row dropdown" ng-if="field.fieldOptions.length > 0"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><ui-select ng-model=field.fieldValue ng-focus="setActiveField(field._id, null, false)" theme=selectize search-enabled=true search-by=option_value set-search-to-answer=true ng-required=field.required on-tab-and-shift-key=prevField() on-tab-key=nextField() ng-change=nextField()><ui-select-match placeholder="Type or select an option"></ui-select-match><ui-select-choices repeat="option in field.fieldOptions | filter: $select.search" ng-class="{\'active\': option.option_value === field.fieldValue }"><span ng-bind-html="option.option_value | highlight: $select.search"></span></ui-select-choices></ui-select></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/hidden.html","<input type=hidden>"),a.put("form_modules/forms/base/views/directiveViews/field/legal.html",'<div class="field row radio legal" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-valid-key=nextField()><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><br><p class=col-xs-12>{{field.description}}</p></div><div class="col-xs-12 field-input container"><div class=row-fluid><label class="btn col-md-5 col-xs-12" ng-class="{activeBtn: field.fieldValue == \'true\'}"><input class=focusOn ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" type=radio value=true ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter style=float:left>Y</div><span>{{ \'LEGAL_ACCEPT\' | translate }}</span></label><label class="btn col-md-5 col-md-offset-1 col-xs-12" ng-class="{activeBtn: field.fieldValue == \'false\'}"><input class=focusOn ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" type=radio value=false ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter style=float:left>N</div><span>{{ \'LEGAL_NO_ACCEPT\' | translate }}</span></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/radio.html",'<div class="field row radio" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-option field=field ng-if="field.fieldOptions.length > 0"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><div ng-repeat="option in field.fieldOptions" class=row-fluid><label class="btn col-md-4 col-xs-12 col-sm-12" style="margin: 0.5em; padding-left:30px" ng-class="{activeBtn: field.fieldValue == field.fieldOptions[$index].option_value}"><div class=letter style=float:left>{{$index+1}}</div><input ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" ng-focus="setActiveField(field._id, null, false)" type=radio class=focusOn value={{option.option_value}} ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="$root.nextField()"> <span ng-bind=option.option_value></span></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/rating.html",'<div class="textfield field row"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><input-stars max={{field.ratingOptions.steps}} ng-init="field.fieldValue = 1" on-shape-click=true on-star-click=nextField() icon-full={{field.ratingOptions.shape}} icon-base="fa fa-3x" icon-empty={{field.ratingOptions.shape}} ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() class="angular-input-stars focusOn"></input-stars></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/statement.html",'<div class="statement field row" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField()><div class="row field-title field-title"><div class=col-xs-1><i class="fa fa-quote-left fa-1"></i></div><h2 class="text-left col-xs-9">{{field.title}}</h2><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="row field-title field-input"><p class=col-xs-12 ng-if=field.description.length>{{field.description}}</p><br><div class="col-xs-offset-1 col-xs-11"><button class="btn focusOn" ng-style="{\'font-size\': \'1.3em\', \'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click=nextField()>{{ \'CONTINUE\' | translate }}</button></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/textarea.html",'<div class="field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><small>{{ \'NEWLINE\' | translate }}</small><p><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><small style=font-size:0.6em>Press SHIFT+ENTER to add a newline</small><textarea class="textarea focusOn" type=text ng-focus="setActiveField(field._id, null, false)" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-class="{ \'no-border\': !!field.fieldValue }" value={{field.fieldValue}} ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() style="border: none; border-left: lightgrey dashed 2px">\n\t\t</textarea></div></div><div><div class="btn btn-lg btn-default" style="padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)"><button ng-disabled="!field.fieldValue || forms.myForm.{{field.fieldType}}{{$index}}.$invalid" ng-style="{\'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click=$root.nextField() class="btn col-sm-5 col-xs-5">{{ \'OK\' | translate }} <i class="fa fa-check"></i></button><div class="col-sm-3 col-xs-6" style=margin-top:0.2em><small style="color:#ddd; font-size:70%">{{ \'ENTER\' | translate }}</small></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/textfield.html",'<div class="textfield field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title row-fluid" ng-style="{\'color\': design.colors.questionColor}"><h3 class=col-xs-12><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>({{ \'OPTIONAL\' | translate }})</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><input ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" name={{field.fieldType}}{{index}} type={{input_type}} ng-pattern=validateRegex placeholder={{placeholder}} ng-class="{ \'no-border\': !!field.fieldValue }" class="focusOn text-field-input" ng-focus="setActiveField(field._id, null, false)" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" value=field.fieldValue on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() ng-required=field.required aria-describedby="inputError2Status"></div><div class=col-xs-12><div ng-show="forms.myForm.{{field.fieldType}}{{index}}.$invalid && !!forms.myForm.{{field.fieldType}}{{index}}.$viewValue " class="alert alert-danger" role=alert><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>Error:</span> <span ng-if="field.fieldType == \'email\'">{{ \'ERROR_EMAIL_INVALID\' | translate }}</span> <span ng-if="field.fieldType == \'number\'">{{ \'ERROR_NOT_A_NUMBER\' | translate }}</span> <span ng-if="field.fieldType == \'link\'">{{ \'ERROR_URL_INVALID\' | translate }}</span></div></div></div><div><div class="btn btn-lg btn-default" ng-disabled="!field.fieldValue || field.$invalid" style="padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)"><button ng-disabled="!field.fieldValue || field.$invalid" ng-style="{\'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click=nextField() class="btn col-sm-5 col-xs-5">{{ \'OK\' | translate }} <i class="fa fa-check"></i></button><div class="col-xs-6 col-sm-3" style=margin-top:0.2em><small style="color:#ddd; font-size:70%">{{ \'ENTER\' | translate }}</small></div></div></div>'), +a.put("form_modules/forms/base/views/directiveViews/field/yes_no.html",'<div class="field row radio" ng-click="setActiveField(field._id, index, true)" key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-tab-key=nextField() on-tab-and-shift-key=prevField() on-valid-key=nextField()><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3 class=row><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=row>{{field.description}}</p></div><div class="col-xs-12 field-input"><div class=row><label class="btn btn-default col-md-2 col-sm-3 col-xs-7" style="background: rgba(0,0,0,0.1); text-align:left"><input type=radio value=true class=focusOn style="opacity: 0; margin-left: 0px" ng-focus="setActiveField(field._id, null, false)" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter>{{ \'Y\' | translate }}</div><span>{{ \'YES\' | translate }}</span> <i ng-show="field.fieldValue === \'true\'" class="fa fa-check" aria-hidden=true></i></label></div><div class=row style="margin-top: 10px"><label class="btn btn-default col-md-2 col-sm-3 col-xs-7" style="background: rgba(0,0,0,0.1); text-align:left"><input type=radio value=false style="opacity:0; margin-left:0px" ng-focus="setActiveField(field._id, null, false)" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter>{{ \'N\' | translate }}</div><span>{{ \'NO\' | translate }}</span> <i ng-show="field.fieldValue === \'false\'" class="fa fa-check" aria-hidden=true></i></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",'<div ng-show="!myform.submitted && myform.startPage.showStart" class=form-submitted style="padding-top: 35vh"><div class=row><div class="col-xs-12 text-center" style="overflow-wrap: break-word"><h1 style="font-weight: 400; nont-size: 25px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.startPage.introTitle}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-center" style="overflow-wrap: break-word"><p style="font-weight: 100; font-size: 16px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.startPage.introParagraph}}</p></div></div><div class="row form-actions text-center" style="padding: 5px 25px 5px 25px"><button ng-click=exitStartPage() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{myform.startPage.introButtonText}}</span></button></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in myform.startPage.buttons" class=text-center style=display:inline><button class=btn style="background-color:rgb(156, 226, 235)" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none" ng-style="{\'color\':button.color}">{{button.text}}</a></button></p></div></div><div class=form-fields ng-show="!myform.submitted && !myform.startPage.showStart" ng-style="{ \'border-color\': myform.design.colors.buttonTextColor }"><div class="row form-field-wrapper"><form name=forms.myForm novalidate class=submission-form><div ng-repeat="field in myform.form_fields" ng-if=!field.deletePreserved data-index={{$index}} data-id={{field._id}} ng-class="{activeField: selected._id == field._id }" class="row field-directive"><field-directive field=field design=myform.design index=$index forms=forms></field-directive></div><div class="row form-actions" id=submit_field ng-class="{activeField: selected._id == \'submit_field\' }" ng-style="{ \'background-color\':myform.design.colors.buttonColor}" style="border-top: 1px solid #ddd; margin-top: 30vh; height: 100vh; margin-left: 1%; margin-right: 1%" on-tab-and-shift-key=prevField() on-tab-key=nextField() on-enter-key=submitForm()><div class="col-xs-12 text-left" style="background-color:#990000; color:white" ng-if=forms.myForm.$invalid>{{ \'COMPLETING_NEEDED\' | translate:translateAdvancementData }}</div><button ng-if=!forms.myForm.$invalid class="Button btn col-sm-2 col-xs-8 focusOn" v-busy=loading v-busy-label="Please wait" v-pressable ng-disabled="loading || forms.myForm.$invalid" ng-click=submitForm() on-enter-key-disabled="loading || forms.myForm.$invalid" ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" style="font-size: 1.6em; margin-left: 1em; margin-top: 1em">{{ \'SUBMIT\' | translate }}</button> <button ng-if=forms.myForm.$invalid class="Button btn col-sm-2 col-xs-8 focusOn" ng-click=goToInvalid() on-enter-key=goToInvalid() on-enter-key-disabled=!forms.myForm.$invalid style="font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white">{{ \'REVIEW\' | translate }}</button><div class="col-sm-2 hidden-xs" style="font-size: 75%; margin-top:3.25em"><small>{{ \'ENTER\' | translate }}</small></div></div></form></div><section ng-if=!myform.hideFooter class="navbar navbar-fixed-bottom" ng-style="{ \'background-color\':myform.design.colors.buttonColor, \'padding-top\': \'15px\', \'border-top\': \'2px \'+ myform.design.colors.buttonTextColor +\' solid\', \'color\':myform.design.colors.buttonTextColor}"><div class=container-fluid><div class=row><div class="col-sm-5 col-md-6 col-xs-5" ng-show=!myform.submitted><p class=lead>{{ \'ADVANCEMENT\' | translate:translateAdvancementData }}</p></div><div class="col-md-6 col-md-offset-0 col-sm-offset-2 col-sm-3 col-xs-offset-1 col-xs-6 row"><div class="col-md-4 col-md-offset-2 hidden-sm hidden-xs"><a href=/#!/forms class=btn ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}">{{ \'CREATE_FORM\' | translate }}</a></div><div class="col-md-4 col-sm-10 col-md-offset-0 col-sm-offset-2 col-xs-12 row"><button class="btn btn-lg col-xs-6" id=focusDownButton ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" ng-click=nextField() ng-disabled="selected.index > myform.form_fields.length-1"><i class="fa fa-chevron-down"></i></button> <button class="btn btn-lg col-xs-6" id=focusUpButton ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" ng-click=prevField() ng-disabled="selected.index == 0"><i class="fa fa-chevron-up"></i></button></div></div></div></div></section></div><div ng-if="myform.submitted && !loading && !myform.endPage.showEnd" class=form-submitted ng-style="{\'color\':myform.design.colors.buttonTextColor}" style="padding-top: 5vh"><div class="field row text-center" ng-style="{\'color\': myform.design.colors.questionColor}"><div class="col-xs-12 col-sm-12 col-md-6 col-md-offset-3 text-center">{{ \'FORM_SUCCESS\' | translate }}</div></div><div class="row form-actions"><p class=text-center><button ng-click=reloadForm() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{ \'BACK_TO_FORM\' | translate }}</span></button></p></div></div><div ng-if="myform.submitted && !loading && myform.endPage.showEnd" class=form-submitted ng-style="{\'color\':myform.design.colors.buttonTextColor}" style="padding-top: 5vh"><div class=row><div class="col-xs-12 text-center" style="overflow-wrap: break-word"><h1 style="font-weight: 400; font-size: 25px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.endPage.title}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-center" style="overflow-wrap: break-word"><p style="font-weight: 100; font-size: 16px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.endPage.paragraph}}</p></div></div><div class="row form-actions text-center" style="padding: 5px 25px 5px 25px"><button ng-click=reloadForm() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{myform.endPage.buttonText}}</span></button></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in myform.endPage.buttons" class=text-center style=display:inline><button class=btn style="background-color:rgb(156, 226, 235)" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none" ng-style="{\'color\':button.color}">{{button.text}}</a></button></p></div></div>'),a.put("form_modules/forms/base/views/form-not-found.client.view.html",'<script>$(".loader").fadeOut("slow");</script><section class="public-form auth sigin-view valign-wrapper"><div class="row valign"><h3 class="col-md-12 text-center">404 - Form Does not Exist</h3><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px">The form you are trying to access does not exist. Sorry about that!</div></div></div></section>'),a.put("form_modules/forms/base/views/form-unauthorized.client.view.html",'<script>$(".loader").fadeOut("slow");</script><section class="public-form auth sigin-view valign-wrapper"><div class="row valign"><h3 class="col-md-12 text-center">Not Authorized to Access Form</h3><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px">The form you are trying to access is currently private and not accesible publically.<br>If you are the owner of the form, you can set it to "Public" in the "Configuration" panel in the form admin.</div></div></div></section>'),a.put("form_modules/forms/base/views/submit-form.client.view.html","<section class=public-form><submit-form-directive myform=myform></submit-form-directive></section><script ng-if=myform.analytics.gaCode>window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;\n\tga('create', '{{myform.analytics.gaCode}}', 'auto'); ga('send', 'pageview');</script><script ng-if=myform.analytics.gaCode src=https://www.google-analytics.com/analytics.js async defer></script>")}]),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","ui.date","ui.sortable","angular-input-stars","users","ngclipboard"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function(a,b,c){b.otherwise("/forms")}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function(a,b,c,d){a.$state=c,a.$stateParams=d,a.$on("$stateChangeSuccess",function(a,d,e,f){c.previous=f;var g=["home","signin","resendVerifyEmail","verify","signup","signup-success","forgot","reset-invalid","reset","reset-success"];g.indexOf(d.name)>0?b.isAuthenticated()&&(a.preventDefault(),c.go("listForms")):"access_denied"===d.name||b.isAuthenticated()||"submitForm"===d.name||(a.preventDefault(),c.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function(a,b,c,d,e,f){a.$on("$stateChangeStart",function(a,f){var g,h,i;h=f&&f.data&&f.data.permissions?f.data.permissions:null,b.ensureHasCurrentUser(c),i=b.currentUser,i&&(g=new d(i),null!==h&&(g.canAccess(h)||(a.preventDefault(),e.go("access_denied"))))})}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User","$window","$translate","$locale",function(a,b,c,d,e,f,g,h,i){a.signupDisabled=g.signupDisabled,b.user=a.user=e.ensureHasCurrentUser(f),b.authentication=a.authentication=e,a.languages=b.languages=["en","fr","es","it","de"],b.authentication.isAuthenticated()?a.language=b.user.language:a.language=i.id.substring(0,2),h.use(a.language),b.isCollapsed=!1,a.hideNav=!1,b.menu=c.getMenu("topbar"),b.signout=function(){var c=f.logout();c.then(function(){e.logout(),e.ensureHasCurrentUser(f),b.user=a.user=null,d.go("listForms"),d.reload()},function(a){console.error("Logout Failed: "+a)})},b.toggleCollapsibleMenu=function(){b.isCollapsed=!b.isCollapsed},b.$on("$stateChangeSuccess",function(c,d,e,f,g){b.isCollapsed=!1,a.hideNav=!1,angular.isDefined(d.data)&&angular.isDefined(d.data.hideNav)&&(a.hideNav=d.data.hideNav)})}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var a=function(a){if(a){if(~this.roles.indexOf("*"))return!0;for(var b in a.roles)for(var c in this.roles)if(this.roles[c]===a.roles[b])return!0;return!1}return this.isPublic};this.validateMenuExistance=function(a){if(a&&a.length){if(this.menus[a])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(a){return this.validateMenuExistance(a),this.menus[a]},this.addMenu=function(b,c,d){return this.menus[b]={isPublic:c||!1,roles:d||this.defaultRoles,items:[],shouldRender:a},this.menus[b]},this.removeMenu=function(a){this.validateMenuExistance(a),delete this.menus[a]},this.addMenuItem=function(b,c,d,e,f,g,h,i){return this.validateMenuExistance(b),this.menus[b].items.push({title:c,link:d,menuItemType:e||"item",menuItemClass:e,uiRoute:f||"/"+d,isPublic:null===g||"undefined"==typeof g?this.menus[b].isPublic:g,roles:null===h||"undefined"==typeof h?this.menus[b].roles:h,position:i||0,items:[],shouldRender:a}),this.menus[b]},this.addSubMenuItem=function(b,c,d,e,f,g,h,i){this.validateMenuExistance(b);for(var j in this.menus[b].items)this.menus[b].items[j].link===c&&this.menus[b].items[j].items.push({title:d,link:e,uiRoute:f||"/"+e,isPublic:null===g||"undefined"==typeof g?this.menus[b].items[j].isPublic:g,roles:null===h||"undefined"==typeof h?this.menus[b].items[j].roles:h,position:i||0,shouldRender:a});return this.menus[b]},this.removeMenuItem=function(a,b){this.validateMenuExistance(a);for(var c in this.menus[a].items)this.menus[a].items[c].link===b&&this.menus[a].items.splice(c,1);return this.menus[a]},this.removeSubMenuItem=function(a,b){this.validateMenuExistance(a);for(var c in this.menus[a].items)for(var d in this.menus[a].items[c].items)this.menus[a].items[c].items[d].link===b&&this.menus[a].items[c].items.splice(d,1);return this.menus[a]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("core").factory("subdomain",["$location",function(a){var b=a.host();return b.indexOf(".")<0?null:b.split(".")[0]}]),angular.module("forms").run(["Menus",function(a){a.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("secondsToDateTime",[function(){return function(a){return new Date(1970,0,1).setSeconds(a)}}]).filter("formValidity",[function(){return function(a){if(a&&a.form_fields&&a.visible_form_fields){var b=Object.keys(a),c=(b.filter(function(a){return"$"!==a[0]}),a.form_fields),d=c.filter(function(a){return"object"==typeof a&&"statement"!==a.fieldType&&"rating"!==a.fieldType?!!a.fieldValue:"rating"===a.fieldType||void 0}).length;return d-(a.form_fields.length-a.visible_form_fields.length)}return 0}}]).filter("trustSrc",["$sce",function(a){return function(b){return a.trustAsResourceUrl(b)}}]).config(["$provide",function(a){a.decorator("accordionDirective",["$delegate",function(a){var b=a[0];return b.replace=!0,a}])}]),angular.module("forms").config(["$stateProvider",function(a){a.state("listForms",{url:"/forms",templateUrl:"modules/forms/admin/views/list-forms.client.view.html",resolve:{Forms:"GetForms",myForms:["GetForms","$q",function(a,b){var c=b.defer();return a.query(function(a){c.resolve(a)}),c.promise}]},controller:"ListFormsController",controllerAs:"ctrl"}).state("submitForm",{url:"/forms/:formId",templateUrl:"/static/form_modules/forms/base/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"GetForms",myForm:["GetForms","$stateParams","$q",function(a,b,c){var d=c.defer();return a.get({formId:b.formId},function(a){d.resolve(a)}),d.promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/admin/views/admin-form.client.view.html",data:{permissions:["editForm"]},resolve:{GetForms:"GetForms",myForm:["GetForms","$stateParams","$q",function(a,b,c){var d=c.defer();return a.get({formId:b.formId},function(a){d.resolve(a)}),d.promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/admin/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/admin/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/admin/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/admin/views/adminTabs/create.html"})}]),angular.module("forms").factory("GetForms",["$resource","FORM_URL",function(a,b){return a(b,{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(a,b){var c=angular.fromJson(a);return c.visible_form_fields=_.filter(c.form_fields,function(a){return a.deletePreserved===!1}),c}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("users").config(["$httpProvider",function(a){a.interceptors.push(["$q","$location",function(a,b){return{responseError:function(c){return"/users/me"!==b.path()&&c.config&&"/users/me"!==c.config.url&&(401===c.status?(b.nextAfterLogin=b.path(),b.path("/signin")):403===c.status&&b.path("/access_denied")),a.reject(c)}}}])}]),angular.module("users").config(["$stateProvider",function(a){var b=function(a,b,c,d,e){var f=a.defer();return e.currentUser&&e.currentUser.email?b(f.resolve):e.currentUser=d.getCurrent(function(){e.login(),b(f.resolve())},function(){e.logout(),b(f.reject()),c.go("signin",{reload:!0})}),f.promise};b.$inject=["$q","$timeout","$state","User","Auth"];var c=function(a,b,c){var d=c.defer();return b(a.signupDisabled?d.reject():d.resolve()),d.promise};c.$inject=["$window","$timeout","$q"],a.state("profile",{resolve:{loggedin:b},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:b},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:b},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:c},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:c},url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("verify",{resolve:{isDisabled:c},url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("resendVerifyEmail",{resolve:{isDisabled:c},url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function(a,b,c,d,e,f){a=d,a.credentials={},a.error="",a.signin=function(){e.login(a.credentials).then(function(b){f.login(b),a.user=d.user=f.ensureHasCurrentUser(e),"home"!==c.previous.name&&"verify"!==c.previous.name&&""!==c.previous.name?c.go(c.previous.name):c.go("listForms")},function(b){d.user=f.ensureHasCurrentUser(e),a.user=d.user,a.error=b,console.error("loginError: "+b)})},a.signup=function(){return"admin"===a.credentials?void(a.error="Username cannot be 'admin'. Please pick another username."):void e.signup(a.credentials).then(function(a){c.go("signup-success")},function(b){console.error(b),b?(a.error=b,console.error(b)):console.error("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function(a,b,c,d){a.error="",a.askForPasswordReset=function(){d.askForPasswordReset(a.credentials).then(function(b){a.success=b.message,a.credentials=null},function(b){a.error=b,a.credentials=null})},a.resetUserPassword=function(){a.success=a.error=null,d.resetPassword(a.passwordDetails,b.token).then(function(b){a.success=b.message,a.passwordDetails=null,c.go("reset-success")},function(b){a.error=b.message||b,a.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users","Auth",function(a,b,c,d,e,f){a.user=f.currentUser,a.hasConnectedAdditionalSocialAccounts=function(b){for(var c in a.user.additionalProvidersData)return!0;return!1},a.cancel=function(){a.user=f.currentUser},a.isConnectedSocialAccount=function(b){return a.user.provider===b||a.user.additionalProvidersData&&a.user.additionalProvidersData[b]},a.removeUserSocialAccount=function(b){a.success=a.error=null,c["delete"]("/users/accounts",{params:{provider:b}}).success(function(b){a.success=!0,a.user=b}).error(function(b){a.error=b.message})},a.updateUserProfile=function(b){if(b){a.success=a.error=null;var c=new e(a.user);c.$update(function(b){a.success=!0,a.user=b},function(b){a.error=b.data.message})}else a.submitted=!0},a.changeUserPassword=function(){a.success=a.error=null,c.post("/users/password",a.passwordDetails).success(function(b){a.success=!0,a.passwordDetails=null}).error(function(b){a.error=b.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function(a,b,c,d,e,f){a.isResetSent=!1,a.credentials={},a.error="",a.resendVerifyEmail=function(){d.resendVerifyEmail(a.credentials.email).then(function(b){a.success=b.message,a.credentials=null,a.isResetSent=!0},function(b){a.error=b,a.credentials.email=null,a.isResetSent=!1})},a.validateVerifyToken=function(){f.token&&(console.log(f.token),d.validateVerifyToken(f.token).then(function(b){a.success=b.message,a.isResetSent=!0,a.credentials.email=null},function(b){a.isResetSent=!1,a.error=b,a.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function(a){var b={isLoggedIn:!1},c={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(d){return c._currentUser&&c._currentUser.username?c._currentUser:a.user?(c._currentUser=a.user,c._currentUser):void d.getCurrent().then(function(d){return c._currentUser=d,b.isLoggedIn=!0,a.user=c._currentUser,c._currentUser},function(d){return b.isLoggedIn=!1,c._currentUser=null,a.user=null,null})},isAuthenticated:function(){return!!c._currentUser},getUserState:function(){return b},login:function(a){b.isLoggedIn=!0,c._currentUser=a},logout:function(){a.user=null,b.isLoggedIn=!1,c._currentUser=null}};return c}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(a,b){return function(c){return{canAccess:function(d){var e,f,g;for(angular.isArray(d)||(d=[d]),e=0,f=d.length;e<f;e++){if(g=d[e],null===a[g])throw"Bad permission value";if(!c||!c.roles)return!1;switch(g){case a.viewAdminSettings:case a.editAdminSettings:return c.roles.indexOf(b.admin)>-1;case a.viewPrivateForm:case a.editForm:return c.roles.indexOf(b.admin)>-1||c.roles.indexOf(b.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function(a,b,c,d,e){var f={getCurrent:function(){var a=b.defer();return d.get("/users/me").success(function(b){a.resolve(b)}).error(function(){a.reject("User's session has expired")}),a.promise},login:function(a){var c=b.defer();return d.post("/auth/signin",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},logout:function(){var a=b.defer();return d.get("/auth/signout").then(function(b){a.resolve(null)},function(b){a.reject(b.data.message||b.data)}),a.promise},signup:function(a){var c=b.defer();return d.post("/auth/signup",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},resendVerifyEmail:function(a){var c=b.defer();return d.post("/auth/verify",{email:a}).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},validateVerifyToken:function(a){var c=/^([A-Za-z0-9]{48})$/g;if(!c.test(a))throw new Error("Error token: "+a+" is not a valid verification token");var e=b.defer();return d.get("/auth/verify/"+a).then(function(a){e.resolve(a.data)},function(a){e.reject(a.data)}),e.promise},resetPassword:function(a,c){var e=b.defer();return d.post("/auth/reset/"+c,a).then(function(a){e.resolve(a)},function(a){e.reject(a.data.message||a.data)}),e.promise},askForPasswordReset:function(a){var c=b.defer();return d.post("/auth/forgot",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise}};return f}]),angular.module("users").factory("Users",["$resource",function(a){return a("users",{},{update:{method:"PUT"}})}]),angular.module("core").config(["$translateProvider",function(a){a.translations("en",{MENU:"MENU",SIGNUP_TAB:"Sign Up",SIGNIN_TAB:"Sign In",SIGNOUT_TAB:"Signout",EDIT_PROFILE:"Edit Profile",MY_FORMS:"My Forms",MY_SETTINGS:"My Settings",CHANGE_PASSWORD:"Change Password"}),a.preferredLanguage("en").fallbackLanguage("en").useSanitizeValueStrategy("escape")}]),angular.module("core").config(["$translateProvider",function(a){a.translations("fr",{MENU:"MENU",SIGNUP_TAB:"Créer un Compte",SIGNIN_TAB:"Connexion",SIGNOUT_TAB:"Créer un compte",EDIT_PROFILE:"Modifier Mon Profil",MY_FORMS:"Mes Formulaires",MY_SETTINGS:"Mes Paramètres",CHANGE_PASSWORD:"Changer mon Mot de Pass"})}]),angular.module("core").config(["$translateProvider",function(a){a.translations("es",{MENU:"MENU",SIGNUP_TAB:"Registrarse",SIGNIN_TAB:"Entrar",SIGNOUT_TAB:"Salir",EDIT_PROFILE:"Editar Perfil",MY_FORMS:"Mis formularios",MY_SETTINGS:"Mis configuraciones",CHANGE_PASSWORD:"Cambiar contraseña"})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$window","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm","$filter",function(a,b,c,d,e,f,g,h,i,j,k){c.activePill=0,c.copied=!1,c.onCopySuccess=function(a){c.copied=!0},c=a,c.animationsEnabled=!0,c.myform=j,a.saveInProgress=!1,c.oldForm=_.cloneDeep(c.myform),g.setForm(c.myform),c.formURL="/#!/forms/"+c.myform._id,c.myform.isLive?b.subdomainsDisabled===!0?c.actualFormURL=window.location.protocol+"//"+window.location.host+"/view"+c.formURL:window.location.host.split(".").length<3?c.actualFormURL=window.location.protocol+"//"+c.myform.admin.username+"."+window.location.host+c.formURL:c.actualFormURL=window.location.protocol+"//"+c.myform.admin.username+"."+window.location.host.split(".").slice(1,3).join(".")+c.formURL:c.actualFormURL=window.location.protocol+"//"+window.location.host+c.formURL;var l=c.refreshFrame=function(){document.getElementById("iframe")&&document.getElementById("iframe").contentWindow.location.reload()};c.tabData=[{heading:k("translate")("CONFIGURE_TAB"),templateName:"configure"}],c.designTabActive=!1,c.deactivateDesignTab=function(){c.designTabActive=!1},c.activateDesignTab=function(){c.designTabActive=!0},c.setForm=function(a){c.myform=a},a.resetForm=function(){c.myform=f.get({formId:d.formId})},c.openDeleteModal=function(){c.deleteModal=i.open({animation:c.animationsEnabled,templateUrl:"formDeleteModal.html",controller:"AdminFormController",resolve:{myForm:function(){return c.myform}}}),c.deleteModal.result.then(function(a){c.selected=a})},c.cancelDeleteModal=function(){c.deleteModal&&c.deleteModal.dismiss("cancel")},c.removeCurrentForm=function(){if(c.deleteModal&&c.deleteModal.opened){c.deleteModal.close();var a=c.myform._id;if(!a)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");h["delete"]("/forms/"+a).then(function(a){e.go("listForms",{},{reload:!0})},function(a){console.error(a)})}},c.updateDesign=function(a,b,d,e){c.update(a,b,d,e,function(){l()})},c.update=a.update=function(b,d,e,f,g){var i=!0;if(b||(i=!a.saveInProgress),i){var j=null;if(b||(a.saveInProgress=!0),e){for(var k=new RegExp("^[0-9a-fA-F]{24}$"),l=0;l<c.myform.form_fields.length;l++){var m=c.myform.form_fields[l];k.exec(m._id+"")||(delete c.myform.form_fields[l]._id,delete c.myform.form_fields[l].id)}var d=DeepDiff.diff(c.oldForm,c.myform);c.updatePromise=h.put("/forms/"+c.myform._id,{changes:d}).then(function(b){f&&(a.myform=c.myform=b.data,c.oldForm=_.cloneDeep(c.myform))})["catch"](function(a){j=a.data,console.error(j)})["finally"](function(){if(b||(a.saveInProgress=!1),"function"==typeof g)return g(j)})}else{var n=d;n.analytics&&n.analytics.visitors&&delete n.analytics.visitors,n.submissions&&delete n.submissions,n.visible_form_fields&&delete n.visible_form_fields,n.analytics&&(delete n.analytics.visitors,delete n.analytics.fields,delete n.analytics.submissions,delete n.analytics.views,delete n.analytics.conversionRate),delete n.created,delete n.lastModified,delete n.__v,c.updatePromise=h.put("/forms/"+c.myform._id,{form:n}).then(function(b){f&&(a.myform=c.myform=b.data)})["catch"](function(a){j=a.data,console.error(j)})["finally"](function(){if(b||(a.saveInProgress=!1),"function"==typeof g)return g(j)})}}}}]),angular.module("forms").controller("ListFormsController",["$rootScope","$scope","$stateParams","$state","GetForms","CurrentForm","$http","$uibModal","myForms",function(a,b,c,d,e,f,g,h,i){b=a,b.forms={},b.showCreateModal=!1,b.myforms=i,a.languageRegExp={regExp:/[@!#$%^&*()\-+={}\[\]|\\/'";:`.,~№?<>]+/i,test:function(a){return!this.regExp.test(a)}},b.openDeleteModal=function(a){b.deleteModal=h.open({animation:b.animationsEnabled,templateUrl:"deleteModalListForms.html",controller:["$uibModalInstance","items","$scope",function(a,b,c){c.content=b,c.cancel=c.cancelDeleteModal,c.deleteForm=function(){c.$parent.removeForm(b.formIndex)}}],resolve:{items:function(){return{currFormTitle:b.myforms[a].title,formIndex:a}}}})},b.cancelDeleteModal=function(){b.deleteModal&&b.deleteModal.dismiss("cancel")},b.openCreateModal=function(){b.showCreateModal||(b.showCreateModal=!0)},b.closeCreateModal=function(){b.showCreateModal&&(b.showCreateModal=!1)},b.setForm=function(a){b.myform=a},b.goToWithId=function(a,b){d.go(a,{formId:b},{reload:!0})},b.duplicateForm=function(a){var c=_.cloneDeep(b.myforms[a]);delete c._id,g.post("/forms",{form:c}).success(function(c,d,e){b.myforms.splice(a+1,0,c)}).error(function(a){console.error(a),null===a&&(b.error=a.data.message)})},b.createNewForm=function(){var a={};a.title=b.forms.createForm.title.$modelValue,a.language=b.forms.createForm.language.$modelValue,b.forms.createForm.$valid&&b.forms.createForm.$dirty&&g.post("/forms",{form:a}).success(function(a,c,d){b.goToWithId("viewForm.create",a._id+"")}).error(function(a){console.error(a),b.error=a.data.message})},b.removeForm=function(a){if(a>=b.myforms.length||a<0)throw new Error("Error: form_index in removeForm() must be between 0 and "+b.myforms.length-1);g["delete"]("/forms/"+b.myforms[a]._id).success(function(c,d,e){ +b.myforms.splice(a,1),b.cancelDeleteModal()}).error(function(a){console.error(a)})}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function(a,b,c,d){return{templateUrl:"modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function(b){b.log="",b.languages=a.languages,b.resetForm=a.resetForm,b.update=a.update}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields","$uibModal",function(a,b,c){return{templateUrl:"modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",restrict:"E",transclude:!0,scope:{myform:"="},controller:["$scope",function(d){var e;d.sortableOptions={appendTo:".dropzone",forceHelperSize:!0,forcePlaceholderSize:!0,update:function(a,b){d.update(!1,d.myform,!0,!1,function(a){})}},d.openEditModal=function(a,b,e){d.editFieldModal=c.open({animation:!0,templateUrl:"editFieldModal.html",windowClass:"edit-modal-window",controller:["$uibModalInstance","$scope",function(c,d){d.field=a,d.showLogicJump=!1,d.isEdit=b,d.showAddOptions=function(a){return"dropdown"===d.field.fieldType||"checkbox"===d.field.fieldType||"radio"===d.field.fieldType},d.validShapes=["Heart","Star","thumbs-up","thumbs-down","Circle","Square","Check Circle","Smile Outlined","Hourglass","bell","Paper Plane","Comment","Trash"],d.addOption=function(){if("checkbox"===d.field.fieldType||"dropdown"===d.field.fieldType||"radio"===d.field.fieldType){d.field.fieldOptions||(d.field.fieldOptions=[]);var a=d.field.fieldOptions.length+1,b={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+a,option_value:"Option "+a};d.field.fieldOptions.push(b)}},d.deleteOption=function(a){if("checkbox"===d.field.fieldType||"dropdown"===d.field.fieldType||"radio"===d.field.fieldType)for(var b=0;b<d.field.fieldOptions.length;b++)if(d.field.fieldOptions[b].option_id===a.option_id){d.field.fieldOptions.splice(b,1);break}},d.select2FA={Heart:"Heart",Star:"Star","thumbs-up":"Thumbs Up","thumbs-down":"Thumbs Down",Circle:"Circle",Square:"Square","Check Circle":"Checkmark","Smile Outlined":"Smile",Hourglass:"Hourglass",bell:"Bell","Paper Plane":"Paper Plane",Comment:"Chat Bubble",Trash:"Trash Can"},d.showRatingOptions=function(){return"rating"===d.field.fieldType},d.saveField=function(){d.isEdit?d.myform.form_fields[e]=d.field:d.myform.form_fields.push(a),d.$parent.update(!1,d.$parent.myform,!0,!0,function(){c.close()})},d.cancel=function(){c.close()}}]})},d.openEditStartPageModal=function(){d.editStartPageModal=c.open({animation:!0,templateUrl:"editStartPageModal.html",windowClass:"edit-modal-window",controller:["$uibModalInstance","$scope",function(a,b){b.showButtons=!1,b.lastButtonID=0,b.addButton=function(){var a={};a.bgColor="#ddd",a.color="#ffffff",a.text="Button",a._id=Math.floor(1e5*Math.random()),b.myform.startPage.buttons.push(a)},b.deleteButton=function(a){for(var c,d=0;d<b.myform.startPage.buttons.length;d++)if(c=b.myform.startPage.buttons[d]._id,c===a._id){b.myform.startPage.buttons.splice(d,1);break}},b.saveStartPage=function(){b.$parent.update(!1,b.$parent.myform,!0,!0,function(){a.close()})},b.cancel=function(){a.close()}}]})},d.openEditEndPageModal=function(){d.editEndPageModal=c.open({animation:!0,templateUrl:"editEndPageModal.html",windowClass:"edit-modal-window",controller:["$uibModalInstance","$scope",function(a,b){b.showButtons=!1,b.lastButtonID=0,b.addButton=function(){var a={};a.bgColor="#ddd",a.color="#ffffff",a.text="Button",a._id=Math.floor(1e5*Math.random()),b.myform.endPage.buttons.push(a)},b.deleteButton=function(a){for(var c,d=0;d<b.myform.endPage.buttons.length;d++)if(c=b.myform.endPage.buttons[d]._id,c===a._id){b.myform.endPage.buttons.splice(d,1);break}},b.saveEndPage=function(){b.$parent.update(!1,b.$parent.myform,!0,!0,function(){a.close()})},b.cancel=function(){a.close()}}]})},d.update=a.update,d.dropzone={handle:".handle",containment:".dropzoneContainer",cursor:"grabbing"},d.addNewField=function(a){d.addField.lastAddedID++;for(var b=a,c=0;c<d.addField.types.length;c++)if(d.addField.types[c].name===a){d.addField.types[c].lastAddedID++,b=d.addField.types[c].value+d.addField.types[c].lastAddedID;break}e={title:b,fieldType:a,fieldValue:"",required:!0,disabled:!1,deletePreserved:!1,logicJump:{}},"rating"===a&&(e.ratingOptions={steps:5,shape:"Heart"},e.fieldValue=0),d.showAddOptions(e)&&(e.fieldOptions=[],e.fieldOptions.push({option_id:Math.floor(1e5*Math.random()),option_title:"Option 0",option_value:"Option 0"})),d.openEditModal(e,!1,d.myform.form_fields.length)},d.showAddOptions=function(a){return"dropdown"===a.fieldType||"checkbox"===a.fieldType||"radio"===a.fieldType},d.showRatingOptions=function(a){return"rating"===a.fieldType},d.deleteField=function(a){d.myform.form_fields.splice(a,1),d.update(!1,d.myform,!1,!0,null)},d.duplicateField=function(a){var b=angular.copy(d.myform.form_fields[a]);b._id="cloned"+_.uniqueId(),b.title+=" copy",d.myform.form_fields.push(b),d.update(!1,d.myform,!1,!0,null)},d.addField={},d.addField.types=b.types,d.addField.types.forEach(function(a){return a.lastAddedID=1,a})}]}}]),angular.module("forms").directive("editSubmissionsFormDirective",["$rootScope","$http","Forms","$stateParams","$interval",function(a,b,c,d,e){return{templateUrl:"modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html",restrict:"E",scope:{user:"=",myform:"="},controller:["$scope",function(a){a.table={masterChecker:!1,rows:[]};var c=function(){b({method:"GET",url:"/forms"+a.myform._id+"/submissions"}).then(function(b){for(var c=(_.cloneDeep(a.myform.form_fields),b.data||[]),d=0;d<c.length;d++){for(var e=0;e<c[d].form_fields.length;e++)"dropdown"===c[d].form_fields[e].fieldType&&(c[d].form_fields[e].fieldValue=c[d].form_fields[e].fieldValue.option_value);c[d].selected=!1}a.table.rows=c})};c(),a.AverageTimeElapsed=function(){for(var b=0,c=a.table.rows.length,d=0;d<a.table.rows.length;d++)b+=a.table.rows[d].timeElapsed;return 0===c?0:(b/c).toFixed(0)}(),a.DeviceStatistics=function(){var b=function(){return{visits:0,responses:0,completion:0,average_time:0,total_time:0}},c={desktop:b(),tablet:b(),phone:b(),other:b()};if(a.myform.analytics&&a.myform.analytics.visitors)for(var d=a.myform.analytics.visitors,e=0;e<d.length;e++){var f=d[e],g=f.deviceType;c[g].visits++,f.isSubmitted&&(c[g].total_time=c[g].total_time+f.timeElapsed,c[g].responses++),c[g].visits&&(c[g].completion=100*(c[g].responses/c[g].visits).toFixed(2)),c[g].responses&&(c[g].average_time=(c[g].total_time/c[g].responses).toFixed(0))}return c}();var d=e(c,1e6);a.$on("$destroy",function(){d&&e.cancel(a.updateFields)}),a.isAtLeastOneChecked=function(){for(var b=0;b<a.table.rows.length;b++)if(a.table.rows[b].selected)return!0;return!1},a.toggleAllCheckers=function(){for(var b=0;b<a.table.rows.length;b++)a.table.rows[b].selected=a.table.masterChecker},a.toggleObjSelection=function(a){a.stopPropagation()},a.rowClicked=function(b){a.table.rows[b].selected=!a.table.rows[b].selected},a.deleteSelectedSubmissions=function(){var c=_.chain(a.table.rows).filter(function(a){return!!a.selected}).pluck("_id").value();b({url:"/forms/"+a.myform._id+"/submissions",method:"DELETE",data:{deleted_submissions:c},headers:{"Content-Type":"application/json;charset=utf-8"}}).success(function(b,c){for(var d=[],e=0;e<a.table.rows.length;e++)a.table.rows[e].selected||d.push(a.table.rows[e]);a.table.rows=d}).error(function(a){console.error(a)})},a.exportSubmissions=function(a){angular.element("#table-submission-data").tableExport({type:a,escape:!1,ignoreColumn:[0]})}}]}}]),angular.module("forms").service("FormFields",["$filter",function(a){this.types=[{name:"textfield",value:a("translate")("SHORT_TEXT")},{name:"email",value:a("translate")("EMAIL")},{name:"radio",value:a("translate")("MULTIPLE_CHOICE")},{name:"dropdown",value:a("translate")("DROPDOWN")},{name:"date",value:a("translate")("DATE")},{name:"textarea",value:a("translate")("PARAGRAPH")},{name:"yes_no",value:a("translate")("YES_NO")},{name:"legal",value:a("translate")("LEGAL")},{name:"rating",value:a("translate")("RATING")},{name:"link",value:a("translate")("LINK")},{name:"number",value:a("translate")("NUMBERS")},{name:"statement",value:a("translate")("STATEMENT")}]}]),angular.module("forms").factory("Submissions",["$resource",function(a){return a("forms/:formID/submissions/:submissionId",{submissionId:"@_id",formId:"@_id"},{query:{method:"GET",isArray:!0},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("users").config(["$translateProvider",function(a){a.translations("en",{ACCESS_DENIED_TEXT:"You need to be logged in to access this page",USERNAME_OR_EMAIL_LABEL:"Username or Email",USERNAME_LABEL:"Username",PASSWORD_LABEL:"Password",CURRENT_PASSWORD_LABEL:"Current Password",NEW_PASSWORD_LABEL:"New Password",VERIFY_PASSWORD_LABEL:"Verify Password",UPDATE_PASSWORD_LABEL:"Update Password",FIRST_NAME_LABEL:"First Name",LAST_NAME_LABEL:"Last Name",LANGUAGE_LABEL:"Language",EMAIL_LABEL:"Email",SIGNUP_ACCOUNT_LINK:"Don't have an account? Sign up here",SIGN_IN_ACCOUNT_LINK:"Already have an account? Sign in here",SIGNUP_HEADER_TEXT:"Sign up",SIGNIN_HEADER_TEXT:"Sign in",SIGNUP_ERROR_TEXT:"Couldn't complete registration due to errors",ENTER_ACCOUNT_EMAIL:"Enter your account email.",RESEND_VERIFICATION_EMAIL:"Resend Verification Email",SAVE_CHANGES:"Save Changes",CANCEL_BTN:"Cancel",EDIT_PROFILE:"Edit your profile",UPDATE_PROFILE_BTN:"Update Profile",PROFILE_SAVE_SUCCESS:"Profile saved successfully",PROFILE_SAVE_ERROR:"Could't Save Your Profile.",CONNECTED_SOCIAL_ACCOUNTS:"Connected social accounts",CONNECT_OTHER_SOCIAL_ACCOUNTS:"Connect other social accounts",FORGOT_PASSWORD_LINK:"Forgot your password?",REVERIFY_ACCOUNT_LINK:"Resend your verification email",SIGNIN_BTN:"Sign in",SIGNUP_BTN:"Sign up",SAVE_PASSWORD_BTN:"Save Password",SUCCESS_HEADER:"Signup Successful",SUCCESS_TEXT:"You’ve successfully registered an account at TellForm.",VERIFICATION_EMAIL_SENT:"Verification Email has been Sent",VERIFICATION_EMAIL_SENT_TO:"A verification email has been sent to",NOT_ACTIVATED_YET:"But your account is not activated yet",BEFORE_YOU_CONTINUE:"Before you continue, make sure to check your email for our verification. If you don’t receive it within 24h drop us a line at ",CHECK_YOUR_EMAIL:"Check your email and click on the activation link to activate your account. If you have any questions drop us a line at",CONTINUE:"Continue",PASSWORD_RESTORE_HEADER:"Restore your password",ENTER_YOUR_EMAIL:"Enter your account email.",SUBMIT_BTN:"Submit",ASK_FOR_NEW_PASSWORD:"Ask for new password reset",PASSWORD_RESET_INVALID:"Password reset is invalid",PASSWORD_RESET_SUCCESS:"Passport successfully reset",PASSWORD_CHANGE_SUCCESS:"Passport successfully changed",RESET_PASSWORD:"Reset your password",CHANGE_PASSWORD:"Change your password",CONTINUE_TO_LOGIN:"Continue to login page",VERIFY_SUCCESS:"Account successfully activated",VERIFY_ERROR:"Verification link is invalid or has expired"}),a.preferredLanguage("en").fallbackLanguage("en").useSanitizeValueStrategy("escape")}]),angular.module("users").config(["$translateProvider",function(a){a.translations("fr",{ACCESS_DENIED_TEXT:"Vouz n’êtes pas autorisé à accéder à cette page.",USERNAME_LABEL:"Nom d’utilisateur",PASSWORD_LABEL:"Mot de Passe",CURRENT_PASSWORD_LABEL:"Mot de passe actuel",NEW_PASSWORD_LABEL:"Nouveau Mot de Passe",VERIFY_PASSWORD_LABEL:"Vérifier le mot de passe",UPDATE_PASSWORD_LABEL:"Mettre à jour le mot de passe",FIRST_NAME_LABEL:"Prénom",LAST_NAME_LABEL:"Nom",LANGUAGE_LABEL:"Langue",EMAIL_LABEL:"Email",UPDATE_PROFILE_BTN:"Modifier le Profil",PROFILE_SAVE_SUCCESS:"Profil enregistré avec succès",PROFILE_SAVE_ERROR:"Erreur: impossible d’enregistrer votre Profile.",FORGOT_PASSWORD_LINK:"Mot de passe oublié ?",REVERIFY_ACCOUNT_LINK:"Re-envoyez un email de vérification",SIGNIN_BTN:"Connexion",SIGNUP_BTN:"Créer un compte",SAVE_PASSWORD_BTN:"Enregistrer votre nouveau Mot de Passe",SUCCESS_HEADER:"Votre Compte a été enregistré !",SUCCESS_TEXT:"Votre compte Tellform a été crée avec succès.",VERIFICATION_EMAIL_SENT:"Un email de verification a été envoyer à",NOT_ACTIVATED_YET:"Mais votre compte n'est pas activé",BEFORE_YOU_CONTINUE:"Avant de continuer, vous devez valider votre adresse mail. Merci de vérifier votre boite mail. Si vous ne l’avez pas reçu dans les prochaines 24h, contactez-nous a ",CHECK_YOUR_EMAIL:"Vérifiez vos emails, et cliquez sur le lien de validation pour activer votre compte. Si vous avez une question contactez-nous à",PASSWORD_RESTORE_HEADER:"Mot de passe perdu",ENTER_YOUR_EMAIL:"Entrer votre email",SUBMIT_BTN:"Enregistrer",ASK_FOR_NEW_PASSWORD:"Demander un nouveau mot de pass ",PASSWORD_RESET_INVALID:"Le nouveau mot de passe est invalid",PASSWORD_RESET_SUCCESS:"Mot de passe réinitialisé avec succès",PASSWORD_CHANGE_SUCCESS:"Mot de passe enregistré avec succès",CONTINUE_TO_LOGIN:"Allez à la page de connexion",VERIFY_SUCCESS:"Votre compte est activé !",VERIFY_ERROR:"Le lien de vérification est invalide ou à expiré"})}]),angular.module("users").config(["$translateProvider",function(a){a.translations("es",{ACCESS_DENIED_TEXT:"Tenés que estar logueado para acceder a esta página",USERNAME_OR_EMAIL_LABEL:"Usuario o Email",USERNAME_LABEL:"Usuario",PASSWORD_LABEL:"Contraseña",CURRENT_PASSWORD_LABEL:"Contraseña actual",NEW_PASSWORD_LABEL:"Nueva contraseña",VERIFY_PASSWORD_LABEL:"Verificar contraseña",UPDATE_PASSWORD_LABEL:"Actualizar contraseña",FIRST_NAME_LABEL:"Nombre",LAST_NAME_LABEL:"Apellido",LANGUAGE_LABEL:"Idioma",EMAIL_LABEL:"Email",SIGNUP_ACCOUNT_LINK:"¿No tenés cuenta? Resgistrate acá",SIGN_IN_ACCOUNT_LINK:"¿Ya tenés cuenta? Entra acá",SIGNUP_HEADER_TEXT:"Registrar",SIGNIN_HEADER_TEXT:"Entrar",SIGNUP_ERROR_TEXT:"No se pudo terminar la registración por errores",ENTER_ACCOUNT_EMAIL:"Ingresá tu correo electrónico.",RESEND_VERIFICATION_EMAIL:"Reenviar email de verificación",SAVE_CHANGES:"Grabar cambios",CANCEL_BTN:"Cancelar",EDIT_PROFILE:"Editar perfil",UPDATE_PROFILE_BTN:"Actualizar perfil",PROFILE_SAVE_SUCCESS:"Perfil actualizado satisfactoriamente",PROFILE_SAVE_ERROR:"No se pudo grabar el perfil.",CONNECTED_SOCIAL_ACCOUNTS:"Redes sociales conectadas",CONNECT_OTHER_SOCIAL_ACCOUNTS:"Conectar otras redes sociales",FORGOT_PASSWORD_LINK:"¿Olvidaste la contraseña?",REVERIFY_ACCOUNT_LINK:"Reenviar email de verificación",SIGNIN_BTN:"Entrar",SIGNUP_BTN:"Registrarse",SAVE_PASSWORD_BTN:"Grabar contraseña",SUCCESS_HEADER:"Ingresaste exitosamente",SUCCESS_TEXT:"Registraste exitosamente una cuenta en TellForm.",VERIFICATION_EMAIL_SENT:"El email de verificación fue enviado exitosamente",VERIFICATION_EMAIL_SENT_TO:"Un email de verificación fue enviado a",NOT_ACTIVATED_YET:"Tu cuenta aún no está activa",BEFORE_YOU_CONTINUE:"Antes de continuar asegurate de leer el email de verificación que te enviamos. Si no lo recibís en 24hs escribinos a ",CHECK_YOUR_EMAIL:"Leé el email y hacé click en el link de activación para activar la cuenta. Si tenés alguna pregunta escribinos a ",CONTINUE:"Continuar",PASSWORD_RESTORE_HEADER:"Restaurar la contraseña",ENTER_YOUR_EMAIL:"Ingresá el email de tu cuenta.",SUBMIT_BTN:"Enviar",ASK_FOR_NEW_PASSWORD:"Pedir reseteo de contraseña",PASSWORD_RESET_INVALID:"El reseteo de la contraseña es inválido",PASSWORD_RESET_SUCCESS:"Contraseña exitosamente reseteada",PASSWORD_CHANGE_SUCCESS:"Contraseña exitosamente cambiada",RESET_PASSWORD:"Resetear contraseña",CHANGE_PASSWORD:"Cambiar contraseña",CONTINUE_TO_LOGIN:"Ir a la página de ingreso",VERIFY_SUCCESS:"Cuenta activada exitosamente",VERIFY_ERROR:"El link de verificación es inválido o inexistente"})}]),angular.module("forms").config(["$translateProvider",function(a){a.translations("en",{ADVANCED_SETTINGS:"Advanced Settings",FORM_NAME:"Form Name",FORM_STATUS:"Form Status",PUBLIC:"Public",PRIVATE:"Private",GA_TRACKING_CODE:"Google Analytics Tracking Code",DISPLAY_FOOTER:"Display Form Footer?",SAVE_CHANGES:"Save Changes",CANCEL:"Cancel",DISPLAY_START_PAGE:"Display Start Page?",DISPLAY_END_PAGE:"Display Custom End Page?",CREATE_A_NEW_FORM:"Create a new form",CREATE_FORM:"Create form",CREATED_ON:"Created on",MY_FORMS:"My forms",NAME:"Name",LANGUAGE:"Language",FORM_PAUSED:"Form paused",EDIT_FIELD:"Edit this Field",SAVE_FIELD:"Save",ON:"ON",OFF:"OFF",REQUIRED_FIELD:"Required",LOGIC_JUMP:"Logic Jump",SHOW_BUTTONS:"Additional Buttons",SAVE_START_PAGE:"Save",ARE_YOU_SURE:"Are you ABSOLUTELY sure?",READ_WARNING:"Unexpected bad things will happen if you don’t read this!",DELETE_WARNING1:'This action CANNOT be undone. This will permanently delete the "',DELETE_WARNING2:'" form and remove all associated form submissions.',DELETE_CONFIRM:"Please type in the name of the form to confirm.",I_UNDERSTAND:"I understand the consequences, delete this form.",DELETE_FORM_SM:"Delete",DELETE_FORM_MD:"Delete Form",DELETE:"Delete",FORM:"Form",VIEW:"View",LIVE:"Live",PREVIEW:"Preview",COPY:"Copy",COPY_AND_PASTE:"Copy and Paste this to add your TellForm to your website",CHANGE_WIDTH_AND_HEIGHT:"Change the width and height values to suit you best",POWERED_BY:"Powered by",TELLFORM_URL:"Your TellForm is permanently at this URL",DISABLED:"Disabled",YES:"YES",NO:"NO",ADD_LOGIC_JUMP:"Add Logic Jump",ADD_FIELD_LG:"Click to Add New Field",ADD_FIELD_MD:"Add New Field",ADD_FIELD_SM:"Add Field",EDIT_START_PAGE:"Edit Start Page",EDIT_END_PAGE:"Edit End Page",WELCOME_SCREEN:"Start Page",END_SCREEN:"End Page",INTRO_TITLE:"Title",INTRO_PARAGRAPH:"Paragraph",INTRO_BTN:"Start Button",TITLE:"Title",PARAGRAPH:"Paragraph",BTN_TEXT:"Go Back Button",BUTTONS:"Buttons",BUTTON_TEXT:"Text",BUTTON_LINK:"Link",ADD_BUTTON:"Add Button",PREVIEW_FIELD:"Preview Question",QUESTION_TITLE:"Title",QUESTION_DESCRIPTION:"Description",OPTIONS:"Options",ADD_OPTION:"Add Option",NUM_OF_STEPS:"Number of Steps",CLICK_FIELDS_FOOTER:"Click on fields to add them here",SHAPE:"Shape",IF_THIS_FIELD:"If this field",IS_EQUAL_TO:"is equal to",IS_NOT_EQUAL_TO:"is not equal to",IS_GREATER_THAN:"is greater than",IS_GREATER_OR_EQUAL_THAN:"is greater or equal than",IS_SMALLER_THAN:"is_smaller_than",IS_SMALLER_OR_EQUAL_THAN:"is smaller or equal than",CONTAINS:"contains",DOES_NOT_CONTAINS:"does not contain",ENDS_WITH:"ends with",DOES_NOT_END_WITH:"does not end with",STARTS_WITH:"starts with",DOES_NOT_START_WITH:"does not start with",THEN_JUMP_TO:"then jump to",TOTAL_VIEWS:"total unique visits",RESPONSES:"responses",COMPLETION_RATE:"completion rate",AVERAGE_TIME_TO_COMPLETE:"avg. completion time",DESKTOP_AND_LAPTOP:"Desktops",TABLETS:"Tablets",PHONES:"Phones",OTHER:"Other",UNIQUE_VISITS:"Unique Visits",FIELD_TITLE:"Field Title",FIELD_VIEWS:"Field Views",FIELD_DROPOFF:"Field Completion",FIELD_RESPONSES:"Field Responses",DELETE_SELECTED:"Delete Selected",EXPORT_TO_EXCEL:"Export to Excel",EXPORT_TO_CSV:"Export to CSV",EXPORT_TO_JSON:"Export to JSON",PERCENTAGE_COMPLETE:"Percentage Complete",TIME_ELAPSED:"Time Elapsed",DEVICE:"Device",LOCATION:"Location",IP_ADDRESS:"IP Address",DATE_SUBMITTED:"Date Submitted",GENERATED_PDF:"Generated PDF",BACKGROUND_COLOR:"Background Color",DESIGN_HEADER:"Change how your Form Looks",QUESTION_TEXT_COLOR:"Question Text Color",ANSWER_TEXT_COLOR:"Answer Text Color",BTN_BACKGROUND_COLOR:"Button Background Color",BTN_TEXT_COLOR:"Button Text Color",EMBED_YOUR_FORM:"Embed your form",SHARE_YOUR_FORM:"Share your form",CREATE_TAB:"Create",DESIGN_TAB:"Design",CONFIGURE_TAB:"Configure",ANALYZE_TAB:"Analyze",SHARE_TAB:"Share",SHORT_TEXT:"Short Text",EMAIL:"Email",MULTIPLE_CHOICE:"Multiple Choice",DROPDOWN:"Dropdown",DATE:"Date",PARAGRAPH_T:"Paragraph",YES_NO:"Yes/No",LEGAL:"Legal",RATING:"Rating",NUMBERS:"Numbers",SIGNATURE:"Signature",FILE_UPLOAD:"File upload",OPTION_SCALE:"Option Scale",PAYMENT:"Payment",STATEMENT:"Statement",LINK:"Link",FORM_SUCCESS:"Form entry successfully submitted!",REVIEW:"Review",BACK_TO_FORM:"Go back to Form",EDIT_FORM:"Edit this TellForm",ADVANCEMENT:"{{done}} out of {{total}} answered",CONTINUE_FORM:"Continue to Form",REQUIRED:"required",COMPLETING_NEEDED:"{{answers_not_completed}} answer(s) need completing",OPTIONAL:"optional",ERROR_EMAIL_INVALID:"Please enter a valid email address",ERROR_NOT_A_NUMBER:"Please enter valid numbers only",ERROR_URL_INVALID:"Please a valid url",OK:"OK",ENTER:"press ENTER",NEWLINE:"press SHIFT+ENTER to create a newline",CONTINUE:"Continue",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",SUBMIT:"Submit",UPLOAD_FILE:"Upload your File"})}]),angular.module("forms").config(["$translateProvider",function(a){a.translations("french",{FORM_SUCCESS:"Votre formulaire a été enregistré!",REVIEW:"Incomplet",BACK_TO_FORM:"Retourner au formulaire",EDIT_FORM:"Éditer le Tellform",CREATE_FORM:"Créer un TellForm",ADVANCEMENT:"{{done}} complétés sur {{total}}",CONTINUE_FORM:"Aller au formulaire",REQUIRED:"obligatoire",COMPLETING_NEEDED:"{{answers_not_completed}} réponse(s) doive(nt) être complétée(s)",OPTIONAL:"facultatif",ERROR_EMAIL_INVALID:"Merci de rentrer une adresse mail valide",ERROR_NOT_A_NUMBER:"Merce de ne rentrer que des nombres",ERROR_URL_INVALID:"Merci de rentrer une url valide",OK:"OK",ENTER:"presser ENTRÉE",YES:"Oui",NO:"Non",NEWLINE:"presser SHIFT+ENTER pour créer une nouvelle ligne",CONTINUE:"Continuer",LEGAL_ACCEPT:"J’accepte",LEGAL_NO_ACCEPT:"Je n’accepte pas",DELETE:"Supprimer",CANCEL:"Réinitialiser",SUBMIT:"Enregistrer",UPLOAD_FILE:"Envoyer un fichier",Y:"O",N:"N"})}]),angular.module("forms").config(["$translateProvider",function(a){a.translations("german",{FORM_SUCCESS:"Ihre Angaben wurden gespeichert.",REVIEW:"Unvollständig",BACK_TO_FORM:"Zurück zum Formular",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} von {{total}} beantwortet",CONTINUE_FORM:"Zum Formular",REQUIRED:"verpflichtend",COMPLETING_NEEDED:"Es fehlen/fehtl noch {{answers_not_completed}} Antwort(en)",OPTIONAL:"fakultativ",ERROR_EMAIL_INVALID:"Bitte gültige Mailadresse eingeben",ERROR_NOT_A_NUMBER:"Bitte nur Zahlen eingeben",ERROR_URL_INVALID:"Bitte eine gültige URL eingeben",OK:"Okay",ENTER:"Eingabetaste drücken",YES:"Ja",NO:"Nein",NEWLINE:"Für eine neue Zeile SHIFT+ENTER drücken",CONTINUE:"Weiter",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Entfernen",CANCEL:"Canceln",SUBMIT:"Speichern",UPLOAD_FILE:"Datei versenden",Y:"J",N:"N"})}]),angular.module("forms").config(["$translateProvider",function(a){a.translations("italian",{FORM_SUCCESS:"Il formulario è stato inviato con successo!",REVIEW:"Incompleto",BACK_TO_FORM:"Ritorna al formulario",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} su {{total}} completate",CONTINUE_FORM:"Vai al formulario",REQUIRED:"obbligatorio",COMPLETING_NEEDED:"{{answers_not_completed}} risposta/e deve/ono essere completata/e",OPTIONAL:"opzionale",ERROR_EMAIL_INVALID:"Si prega di inserire un indirizzo email valido",ERROR_NOT_A_NUMBER:"Si prega di inserire solo numeri",ERROR_URL_INVALID:"Grazie per inserire un URL valido",OK:"OK",ENTER:"premere INVIO",YES:"Sì",NO:"No",NEWLINE:"premere SHIFT+INVIO per creare una nuova linea",CONTINUE:"Continua",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Cancella",CANCEL:"Reset",SUBMIT:"Registra",UPLOAD_FILE:"Invia un file",Y:"S",N:"N"})}]),angular.module("forms").config(["$translateProvider",function(a){a.translations("es",{ADVANCED_SETTINGS:"Configuraciones avanzadas",FORM_NAME:"Nombre del formulario",FORM_STATUS:"Estado del formulario",PUBLIC:"Público",PRIVATE:"Privado",GA_TRACKING_CODE:"Código de Google Analytics",DISPLAY_FOOTER:"¿Mostrar pie de página?",SAVE_CHANGES:"Grabar",CANCEL:"Cancelar",DISPLAY_START_PAGE:"¿Mostrar página de inicio?",DISPLAY_END_PAGE:"¿Mostrar paǵina de fin?",CREATE_A_NEW_FORM:"Crear formulario",CREATE_FORM:"Crear formulario",CREATED_ON:"Creado en",MY_FORMS:"Mis formularios",NAME:"Nombre",LANGUAGE:"Idioma",FORM_PAUSED:"Formulario pausado",EDIT_FIELD:"Editar este campo",SAVE_FIELD:"Grabar",ON:"ON",OFF:"OFF",REQUIRED_FIELD:"Requerido",LOGIC_JUMP:"Salto lógico",SHOW_BUTTONS:"Botones adicionales",SAVE_START_PAGE:"Grabar",ARE_YOU_SURE:"¿Estás absolutamente seguro?",READ_WARNING:"¡Algo malo ocurrirá si no lees esto!",DELETE_WARNING1:'Esta acción no tiene vuelta atrás. Esto borrará permanentemente el "',DELETE_WARNING2:'" formulario y todos los datos asociados.',DELETE_CONFIRM:"Por favor escribí el nombre del formulario para confirmar.",I_UNDERSTAND:"Entiendo las consecuencias y quiero borrarlo.",DELETE_FORM_SM:"Borrar",DELETE_FORM_MD:"Borrar formulario",DELETE:"Borrar",FORM:"Formulario",VIEW:"Vista",LIVE:"Online",PREVIEW:"Vista previa",COPY:"Copiar",COPY_AND_PASTE:"Copiar y pegar esto para agregar su TellForm a su sitio web",CHANGE_WIDTH_AND_HEIGHT:"Cambie los valores de ancho y altura para adaptar el formulario a sus necesidades",POWERED_BY:"Con la tecnlogía de",TELLFORM_URL:"Tu TellForm está en esta URL permanente",DISABLED:"Deshabilitado",YES:"SI",NO:"NO",ADD_LOGIC_JUMP:"Agregar salto lógico",ADD_FIELD_LG:"Click para agregar campo",ADD_FIELD_MD:"Agregar nuevo campo",ADD_FIELD_SM:"Agregar campo",EDIT_START_PAGE:"Editar paǵina de inicio",EDIT_END_PAGE:"Editar página de finalización",WELCOME_SCREEN:"Comienzo",END_SCREEN:"Fin",INTRO_TITLE:"Título",INTRO_PARAGRAPH:"Parágrafo",INTRO_BTN:"Botón de comienzo",TITLE:"Título",PARAGRAPH:"Paragrafo",BTN_TEXT:"Botón para volver atrás",BUTTONS:"Botones",BUTTON_TEXT:"Texto",BUTTON_LINK:"Link",ADD_BUTTON:"Agregar Botón",PREVIEW_FIELD:"Vista previa Pregunta",QUESTION_TITLE:"Título",QUESTION_DESCRIPTION:"Descripción",OPTIONS:"Opciones",ADD_OPTION:"Agregar Opciones",NUM_OF_STEPS:"Cantidad de pasos",CLICK_FIELDS_FOOTER:"Click en los campos para agregar",SHAPE:"Forma",IF_THIS_FIELD:"Si este campo",IS_EQUAL_TO:"es igual a",IS_NOT_EQUAL_TO:"no es igual a",IS_GREATER_THAN:"es mayor que",IS_GREATER_OR_EQUAL_THAN:"es mayor o igual que",IS_SMALLER_THAN:"es menor que",IS_SMALLER_OR_EQUAL_THAN:"is menor o igual que",CONTAINS:"contiene",DOES_NOT_CONTAINS:"no contiene",ENDS_WITH:"termina con",DOES_NOT_END_WITH:"no termina con",STARTS_WITH:"comienza con",DOES_NOT_START_WITH:"no comienza con",THEN_JUMP_TO:"luego salta a",TOTAL_VIEWS:"Total de visitas únicas",RESPONSES:"respuestas",COMPLETION_RATE:"Taza de terminación",AVERAGE_TIME_TO_COMPLETE:"Promedio de tiempo de rellenado",DESKTOP_AND_LAPTOP:"Computadora",TABLETS:"Tablets",PHONES:"Móviles",OTHER:"Otros",UNIQUE_VISITS:"Visitas únicas",FIELD_TITLE:"Título de campo",FIELD_VIEWS:"Vistas de campo",FIELD_DROPOFF:"Finalización de campo",FIELD_RESPONSES:"Respuestas de campo",DELETE_SELECTED:"Borrar selección",EXPORT_TO_EXCEL:"Exportar a Excel",EXPORT_TO_CSV:"Exportar a CSV",EXPORT_TO_JSON:"Exportar a JSON",PERCENTAGE_COMPLETE:"Porcentaje de completitud",TIME_ELAPSED:"Tiempo usado",DEVICE:"Dispositivo",LOCATION:"Lugar",IP_ADDRESS:"Dirección IP",DATE_SUBMITTED:"Fecha de envío",GENERATED_PDF:"PDF generado",BACKGROUND_COLOR:"Color de fondo",DESIGN_HEADER:"Cambiar diseño de formulario",QUESTION_TEXT_COLOR:"Color de la pregunta",ANSWER_TEXT_COLOR:"Color de la respuesta",BTN_BACKGROUND_COLOR:"Color de fondo del botón",BTN_TEXT_COLOR:"Color del texto del botón",EMBED_YOUR_FORM:"Pone tu formulario",SHARE_YOUR_FORM:"Compartí tu formulario",CREATE_TAB:"Crear",DESIGN_TAB:"Diseño",CONFIGURE_TAB:"Configuración",ANALYZE_TAB:"Análisis",SHARE_TAB:"Compartir",SHORT_TEXT:"Texto corto",EMAIL:"Email",MULTIPLE_CHOICE:"Opciones múltiples",DROPDOWN:"Desplegable",DATE:"Fecha",PARAGRAPH_T:"Párrafo",YES_NO:"Si/No",LEGAL:"Legal",RATING:"Puntaje",NUMBERS:"Números",SIGNATURE:"Firma",FILE_UPLOAD:"Subir archivo",OPTION_SCALE:"Escala",PAYMENT:"Pago",STATEMENT:"Declaración",LINK:"Enlace",FORM_SUCCESS:"¡El formulario ha sido enviado con éxito!",REVIEW:"Revisar",BACK_TO_FORM:"Regresar al formulario",ADVANCEMENT:"{{done}} de {{total}} contestadas",CONTINUE_FORM:"Continuar al formulario",REQUIRED:"Información requerida",COMPLETING_NEEDED:"{{answers_not_completed}} respuesta(s) necesita(n) ser completada(s)",OPTIONAL:"Opcional",ERROR_EMAIL_INVALID:"Favor de proporcionar un correo electrónico válido",ERROR_NOT_A_NUMBER:"Por favor, introduzca sólo números válidos",ERROR_URL_INVALID:"Favor de proporcionar un url válido",OK:"OK",ENTER:"pulse INTRO",NEWLINE:"presione SHIFT+INTRO para crear una nueva línea",CONTINUE:"Continuar",LEGAL_ACCEPT:"Yo acepto",LEGAL_NO_ACCEPT:"Yo no acepto",SUBMIT:"Registrar",UPLOAD_FILE:"Cargar el archivo",Y:"S",N:"N"})}]),ApplicationConfiguration.registerModule("view-form",["ngFileUpload","ui.date","angular-input-stars"]),function(){function a(a,b){function c(b,c,d){var e=window.navigator.userLanguage||window.navigator.language;e=e.slice(0,2);var f=navigator.userAgent,g=new MobileDetect(f),h="other";g.tablet()?h="tablet":g.mobile()?h="mobile":g.is("bot")||(h="desktop");var i={referrer:document.referrer,isSubmitted:b.submitted,formId:b._id,lastActiveField:b.form_fields[c]._id,timeElapsed:d,language:e,deviceType:h,ipAddr:null,geoLocation:null};a.emit("form-visitor-data",i)}function d(){a.socket||a.connect(),a.on("disconnect",function(){a.connect()})}var e={send:c};return d(),e}angular.module("view-form").factory("SendVisitorData",a),a.$inject=["Socket","$state"]}(),angular.module("view-form").directive("keyToOption",function(){return{restrict:"A",scope:{field:"="},link:function(a,b,c,d){b.bind("keydown keypress",function(b){var c=b.which||b.keyCode,d=parseInt(String.fromCharCode(c))-1;d<a.field.fieldOptions.length&&(b.preventDefault(),a.$apply(function(){a.field.fieldValue=a.field.fieldOptions[d].option_value}))})}}}),angular.module("view-form").directive("keyToTruthy",["$rootScope",function(a){return{restrict:"A",scope:{field:"=",nextField:"&"},link:function(a,b,c){b.bind("keydown keypress",function(b){var d=b.which||b.keyCode,e=c.keyCharTruthy.charCodeAt(0)-32,f=c.keyCharFalsey.charCodeAt(0)-32;d===e?(b.preventDefault(),a.$apply(function(){a.field.fieldValue="true",c.onValidKey&&a.$root.$eval(c.onValidKey)})):d===f&&(b.preventDefault(),a.$apply(function(){a.field.fieldValue="false",c.onValidKey&&a.$root.$eval(c.onValidKey)}))})}}}]),angular.module("view-form").filter("formValidity",function(){return function(a){if(a&&a.form_fields&&a.visible_form_fields){var b=Object.keys(a),c=(b.filter(function(a){return"$"!==a[0]}),a.form_fields),d=c.filter(function(a){return"object"==typeof a&&"rating"!==a.fieldType&&"statement"!==a.fieldType?!!a.fieldValue:"rating"===a.fieldType||void 0}).length;return d-(a.form_fields.length-a.visible_form_fields.length)}return 0}}),angular.module("view-form").value("supportedFields",["textfield","textarea","date","dropdown","hidden","password","radio","legal","statement","rating","yes_no","number","natural"]),angular.module("view-form").constant("VIEW_FORM_URL","/forms/:formId/render"),angular.module("view-form").config(["$translateProvider",function(a){a.translations("english",{FORM_SUCCESS:"Form entry successfully submitted!",REVIEW:"Review",BACK_TO_FORM:"Go back to Form",EDIT_FORM:"Edit this TellForm",CREATE_FORM:"Create this TellForm",ADVANCEMENT:"{{done}} out of {{total}} answered",CONTINUE_FORM:"Continue to Form",REQUIRED:"required",COMPLETING_NEEDED:"{{answers_not_completed}} answer(s) need completing",OPTIONAL:"optional",ERROR_EMAIL_INVALID:"Please enter a valid email address",ERROR_NOT_A_NUMBER:"Please enter valid numbers only",ERROR_URL_INVALID:"Please a valid url",OK:"OK",ENTER:"press ENTER",YES:"Yes",NO:"No",NEWLINE:"press SHIFT+ENTER to create a newline",CONTINUE:"Continue",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Delete",CANCEL:"Cancel",SUBMIT:"Submit",UPLOAD_FILE:"Upload your File"}),a.preferredLanguage("english").fallbackLanguage("english").useSanitizeValueStrategy("escape")}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("french",{FORM_SUCCESS:"Votre formulaire a été enregistré!",REVIEW:"Incomplet",BACK_TO_FORM:"Retourner au formulaire",EDIT_FORM:"Éditer le Tellform",CREATE_FORM:"Créer un TellForm",ADVANCEMENT:"{{done}} complétés sur {{total}}", +CONTINUE_FORM:"Aller au formulaire",REQUIRED:"obligatoire",COMPLETING_NEEDED:"{{answers_not_completed}} réponse(s) doive(nt) être complétée(s)",OPTIONAL:"facultatif",ERROR_EMAIL_INVALID:"Merci de rentrer une adresse mail valide",ERROR_NOT_A_NUMBER:"Merce de ne rentrer que des nombres",ERROR_URL_INVALID:"Merci de rentrer une url valide",OK:"OK",ENTER:"presser ENTRÉE",YES:"Oui",NO:"Non",NEWLINE:"presser SHIFT+ENTER pour créer une nouvelle ligne",CONTINUE:"Continuer",LEGAL_ACCEPT:"J’accepte",LEGAL_NO_ACCEPT:"Je n’accepte pas",DELETE:"Supprimer",CANCEL:"Réinitialiser",SUBMIT:"Enregistrer",UPLOAD_FILE:"Envoyer un fichier",Y:"O",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("german",{FORM_SUCCESS:"Ihre Angaben wurden gespeichert.",REVIEW:"Unvollständig",BACK_TO_FORM:"Zurück zum Formular",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} von {{total}} beantwortet",CONTINUE_FORM:"Zum Formular",REQUIRED:"verpflichtend",COMPLETING_NEEDED:"Es fehlen/fehtl noch {{answers_not_completed}} Antwort(en)",OPTIONAL:"fakultativ",ERROR_EMAIL_INVALID:"Bitte gültige Mailadresse eingeben",ERROR_NOT_A_NUMBER:"Bitte nur Zahlen eingeben",ERROR_URL_INVALID:"Bitte eine gültige URL eingeben",OK:"Okay",ENTER:"Eingabetaste drücken",YES:"Ja",NO:"Nein",NEWLINE:"Für eine neue Zeile SHIFT+ENTER drücken",CONTINUE:"Weiter",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Entfernen",CANCEL:"Canceln",SUBMIT:"Speichern",UPLOAD_FILE:"Datei versenden",Y:"J",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("italian",{FORM_SUCCESS:"Il formulario è stato inviato con successo!",REVIEW:"Incompleto",BACK_TO_FORM:"Ritorna al formulario",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} su {{total}} completate",CONTINUE_FORM:"Vai al formulario",REQUIRED:"obbligatorio",COMPLETING_NEEDED:"{{answers_not_completed}} risposta/e deve/ono essere completata/e",OPTIONAL:"opzionale",ERROR_EMAIL_INVALID:"Si prega di inserire un indirizzo email valido",ERROR_NOT_A_NUMBER:"Si prega di inserire solo numeri",ERROR_URL_INVALID:"Grazie per inserire un URL valido",OK:"OK",ENTER:"premere INVIO",YES:"Sì",NO:"No",NEWLINE:"premere SHIFT+INVIO per creare una nuova linea",CONTINUE:"Continua",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Cancella",CANCEL:"Reset",SUBMIT:"Registra",UPLOAD_FILE:"Invia un file",Y:"S",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("spanish",{FORM_SUCCESS:"¡El formulario ha sido enviado con éxito!",REVIEW:"Revisar",BACK_TO_FORM:"Regresar al formulario",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} de {{total}} contestadas",CONTINUE_FORM:"Continuar al formulario",REQUIRED:"Información requerida",COMPLETING_NEEDED:"{{answers_not_completed}} respuesta(s) necesita(n) ser completada(s)",OPTIONAL:"Opcional",ERROR_EMAIL_INVALID:"Favor de proporcionar un correo electrónico válido",ERROR_NOT_A_NUMBER:"Por favor, introduzca sólo números válidos",ERROR_URL_INVALID:"Favor de proporcionar un url válido",OK:"OK",ENTER:"pulse INTRO",YES:"Si",NO:"No",NEWLINE:"presione SHIFT+INTRO para crear una nueva línea",CONTINUE:"Continuar",LEGAL_ACCEPT:"Yo acepto",LEGAL_NO_ACCEPT:"Yo no acepto",DELETE:"Eliminar",CANCEL:"Cancelar",SUBMIT:"Registrar",UPLOAD_FILE:"Cargar el archivo",Y:"S",N:"N"})}]),angular.module("view-form").controller("SubmitFormController",["$scope","$rootScope","$state","$translate","myForm",function(a,b,c,d,e){a.myform=e,$(".loader").fadeOut("slow"),document.body.style.background=e.design.colors.backgroundColor,d.use(e.language)}]),angular.module("view-form").directive("fieldIconDirective",function(){return{template:'<i class="{{typeIcon}}"></i>',restrict:"E",scope:{typeName:"@"},controller:["$scope",function(a){var b={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card",statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};a.typeIcon=b[a.typeName]}]}});var __indexOf=[].indexOf||function(a){for(var b=0,c=this.length;b<c;b++)if(b in this&&this[b]===a)return b;return-1};angular.module("view-form").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache","supportedFields",function(a,b,c,d,e){var f=function(a){var b=a,c="form_modules/forms/base/views/directiveViews/field/";return __indexOf.call(e,b)>=0&&(c=c+b+".html"),d.get(c)};return{template:"<div>{{field.title}}</div>",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(a,d){c.chooseDefaultOption=a.chooseDefaultOption=function(b){"yes_no"===b?a.field.fieldValue="true":"rating"===b?a.field.fieldValue=0:"radio"===a.field.fieldType?a.field.fieldValue=a.field.fieldOptions[0].option_value:"legal"===b&&(a.field.fieldValue="true",c.nextField())},a.nextField=c.nextField,a.setActiveField=c.setActiveField,"date"===a.field.fieldType&&(a.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var e=a.field.fieldType;if("number"===a.field.fieldType||"textfield"===a.field.fieldType||"email"===a.field.fieldType||"link"===a.field.fieldType){switch(a.field.fieldType){case"textfield":a.input_type="text";break;case"email":a.input_type="email",a.placeholder="joesmith@example.com";break;case"number":a.input_type="text",a.validateRegex=/^-?\d+$/;break;default:a.input_type="url",a.placeholder="http://example.com"}e="textfield"}var g=f(e);d.html(g).show();b(d.contents())(a)}}}]),angular.module("view-form").directive("onEnterKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode,e=!1;null!==d.onEnterKeyDisabled&&(e=d.onEnterKeyDisabled),13!==c||b.shiftKey||e||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterKey)}))})}}}]).directive("onTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keyup keypress",function(b){var c=b.which||b.keyCode;9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onTabKey)}))})}}}]).directive("onEnterOrTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;13!==c&&9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterOrTabKey)}))})}}}]).directive("onTabAndShiftKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;9===c&&b.shiftKey&&(console.log("onTabAndShiftKey"),b.preventDefault(),a.$apply(function(){a.$eval(d.onTabAndShiftKey)}))})}}}]),angular.module("view-form").directive("onFinishRender",["$rootScope","$timeout",function(a,b){return{restrict:"A",link:function(b,c,d){if(c.attr("ng-repeat")||c.attr("data-ng-repeat")){var e=d.onFinishRender||"ngRepeat";b.$first&&!b.$last?b.$evalAsync(function(){a.$broadcast(e+" Started")}):b.$last&&b.$evalAsync(function(){a.$broadcast(e+" Finished")})}}}}]),jsep.addBinaryOp("contains",10),jsep.addBinaryOp("!contains",10),jsep.addBinaryOp("begins",10),jsep.addBinaryOp("!begins",10),jsep.addBinaryOp("ends",10),jsep.addBinaryOp("!ends",10),angular.module("view-form").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","SendVisitorData","$translate","$timeout",function(a,b,c,d,e,f,g){return{templateUrl:"form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"=",ispreview:"="},controller:["$document","$window","$scope",function(f,g,h){var i=!1,j="submit_field";h.forms={},h.ispreview&&b.restartClock();var k=h.myform.visible_form_fields.filter(function(a){return"statement"!==a.fieldType}).length,l=c("formValidity")(h.myform);h.translateAdvancementData={done:l,total:k,answers_not_completed:k-l},h.reloadForm=function(){h.myform.submitted=!1,h.myform.form_fields=_.chain(h.myform.visible_form_fields).map(function(a){return a.fieldValue="",a}).value(),h.loading=!1,h.error="",h.selected={_id:"",index:0},h.setActiveField(h.myform.visible_form_fields[0]._id,0,!1),b.restartClock()};var m=function(a){var b=a.logicJump;if(b.enabled&&b.expressionString&&b.valueB&&a.fieldValue){var c,d,e=jsep(b.expressionString);if("field"===e.left.name?(c=a.fieldValue,d=b.valueB):(c=b.valueB,d=a.fieldValue),"number"===a.fieldType||"scale"===a.fieldType||"rating"===a.fieldType)switch(e.operator){case"==":return parseInt(c)===parseInt(d);case"!==":return parseInt(c)!==parseInt(d);case">":return parseInt(c)>parseInt(d);case">=":return parseInt(c)>parseInt(d);case"<":return parseInt(c)<parseInt(d);case"<=":return parseInt(c)<=parseInt(d);default:return!1}else switch(e.operator){case"==":return c===d;case"!==":return c!==d;case"contains":return c.indexOf(d)>-1;case"!contains":return!(c.indexOf(d)>-1);case"begins":return c.startsWith(d);case"!begins":return!c.startsWith(d);case"ends":return c.endsWith(d);case"!ends":return c.endsWith(d);default:return!1}}},n=function(){if(null===h.selected)throw console.error("current active field is null"),new Error("current active field is null");return h.selected._id===j?h.myform.form_fields.length-1:h.selected.index};h.isActiveField=function(a){return h.selected._id===a._id},h.setActiveField=d.setActiveField=function(a,b,d){if(null!==h.selected&&(a||null!==b)){if(a){if(null===b){b=h.myform.visible_form_fields.length;for(var e=0;e<h.myform.visible_form_fields.length;e++){var g=h.myform.visible_form_fields[e];if(g._id==a){b=e;break}}}}else a=h.myform.visible_form_fields[b]._id;if(h.selected._id!==a){h.selected._id=a,h.selected.index=b;var j=c("formValidity")(h.myform);h.translateAdvancementData={done:j,total:k,answers_not_completed:k-j},d&&(i=!0,setTimeout(function(){f.scrollToElement(angular.element(".activeField"),-10,200).then(function(){i=!1,setTimeout(function(){document.querySelectorAll(".activeField .focusOn").length?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input").length?document.querySelectorAll(".activeField input")[0].focus():document.querySelectorAll(".activeField .selectize-input")[0].focus()})})}))}}},h.$watch("selected.index",function(a,c){a!==c&&c<h.myform.form_fields.length&&(h.myform.submitted||(console.log("SendVisitorData.send()"),e.send(h.myform,c,b.getTimeElapsed())))}),g.onscroll=function(){if(!i){var a,b=$(window).scrollTop(),c=document.getElementsByClassName("activeField")[0].getBoundingClientRect(),d=c.top,e=c.bottom,f=$(".activeField").height(),g=$(".form-actions").height(),k=$(document).height()-$(window).height(),l=($("form_fields").height(),"form > .field-directive:nth-of-type("+String(h.myform.visible_form_fields.length-1)+")"),m=$(l).height(),n=k-g-1.2*m,o=.9;h.selected.index===h.myform.visible_form_fields.length?b<n&&(a=h.selected.index-1,h.setActiveField(null,a,!1)):h.selected.index===h.myform.visible_form_fields.length-1&&b>n?(a=h.selected.index+1,h.setActiveField(j,a,!1)):e<f*o&&h.selected.index<h.myform.visible_form_fields.length-1?(a=h.selected.index+1,h.setActiveField(null,a,!1)):0!==h.selected.index&&d>f*o&&(a=h.selected.index-1,h.setActiveField(null,a,!1))}h.$apply()},d.nextField=h.nextField=function(){if(h.selected&&h.selected.index>-1)if(h.selected._id!==j){var a=h.myform.visible_form_fields[h.selected.index];a.logicJump&&a.logicJump.jumpTo&&m(a)?h.setActiveField(a.logicJump.jumpTo,null,!0):h.selected.index<h.myform.visible_form_fields.length-1?h.setActiveField(null,h.selected.index+1,!0):h.setActiveField(j,null,!0)}else d.setActiveField(null,0,!0);else d.setActiveField(null,0,!0)},d.prevField=h.prevField=function(){console.log("prevField"),console.log(h.selected);var a=h.selected.index-1;h.selected.index>0&&h.setActiveField(null,a,!0)},d.goToInvalid=h.goToInvalid=function(){var a=$(".row.field-directive .ng-invalid.focusOn, .row.field-directive .ng-untouched.focusOn:not(.ng-valid)").first().parents(".row.field-directive").first().attr("data-id");h.setActiveField(a,null,!0)},h.exitStartPage=function(){h.myform.startPage.showStart=!1,h.myform.visible_form_fields.length>0&&(h.selected._id=h.myform.visible_form_fields[0]._id)};var o=function(){var a=new MobileDetect(window.navigator.userAgent),b="other";return a.tablet()?b="tablet":a.mobile()?b="mobile":a.is("bot")||(b="desktop"),{type:b,name:window.navigator.platform}},p=function(){$.ajaxSetup({async:!1});var a=$.getJSON("https://freegeoip.net/json/").responseJSON;return $.ajaxSetup({async:!0}),a&&a.ip||(a={ip:"Adblocker"}),{ipAddr:a.ip,geoLocation:{City:a.city,Country:a.country_name}}};d.submitForm=h.submitForm=function(){if(h.forms.myForm.$invalid)return void h.goToInvalid();var d=b.stopClock();h.loading=!0;var f=_.cloneDeep(h.myform),g=o();f.device=g;var i=p();f.ipAddr=i.ipAddr,f.geoLocation=i.geoLocation,f.timeElapsed=d,f.percentageComplete=c("formValidity")(h.myform)/h.myform.visible_form_fields.length*100,delete f.endPage,delete f.isLive,delete f.provider,delete f.startPage,delete f.visible_form_fields,delete f.analytics,delete f.design,delete f.submissions,delete f.submitted;for(var j=0;j<h.myform.form_fields.length;j++)"dropdown"!==h.myform.form_fields[j].fieldType||h.myform.form_fields[j].deletePreserved||(h.myform.form_fields[j].fieldValue=h.myform.form_fields[j].fieldValue.option_value),delete f.form_fields[j].submissionId,delete f.form_fields[j].disabled,delete f.form_fields[j].ratingOptions,delete f.form_fields[j].fieldOptions,delete f.form_fields[j].logicJump,delete f.form_fields[j].description,delete f.form_fields[j].validFieldTypes,delete f.form_fields[j].fieldType;setTimeout(function(){h.submitPromise=a.post("/forms/"+h.myform._id,f).success(function(a,b){h.myform.submitted=!0,h.loading=!1,e.send(f,n(),d)}).error(function(a){h.loading=!1,console.error(a),h.error=a.message})},500)},h.reloadForm()}]}}]),angular.module("view-form").service("CurrentForm",function(){var a={};this.getForm=function(){return a},this.setForm=function(b){a=b}}),angular.module("view-form").factory("Forms",["$resource","VIEW_FORM_URL",function(a,b){return a(b,{formId:"@_id"},{get:{method:"GET",transformResponse:function(a,b){var c=angular.fromJson(a);return c.visible_form_fields=_.filter(c.form_fields,function(a){return a.deletePreserved===!1}),c}},update:{method:"PUT"},save:{method:"POST"}})}]),function(){function a(a,b){function c(){var a="";a=b.socketUrl&&b.socketPort?window.location.protocol+"//"+b.socketUrl+":"+b.socketPort:b.socketUrl?window.location.protocol+"//"+b.socketUrl:b.socketPort?window.location.protocol+"//"+window.location.hostname+":"+b.socketPort:window.location.protocol+"//"+window.location.hostname,g.socket=io(a,{transports:["websocket","polling"]})}function d(a,b){g.socket&&g.socket.emit(a,b)}function e(b,c){g.socket&&g.socket.on(b,function(b){a(function(){c(b)})})}function f(a){g.socket&&g.socket.removeListener(a)}var g={socket:null};return c(),g={connect:c,emit:d,on:e,removeListener:f,socket:null}}angular.module("view-form").factory("Socket",a),a.$inject=["$timeout","$window"]}(),angular.module("view-form").service("TimeCounter",[function(){var a,b=null;this.timeSpent=0,this.restartClock=function(){a=Date.now(),b=null},this.getTimeElapsed=function(){if(a)return Math.abs(Date.now().valueOf()-a.valueOf())/1e3},this.stopClock=function(){return a&&null===b?(b=Date.now(),this.timeSpent=Math.abs(b.valueOf()-a.valueOf())/1e3,this._startTime=this._endTime=null,this.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]); \ No newline at end of file diff --git a/public/dist/form-application.js b/public/dist/form-application.js index 503a077e..0a804f3a 100644 --- a/public/dist/form-application.js +++ b/public/dist/form-application.js @@ -63,36 +63,38 @@ angular.element(document).ready(function() { angular.module('TellForm-Form.form_templates', []).run(['$templateCache', function($templateCache) { "use strict"; + $templateCache.put("form_modules/forms/base/views/form-not-found.client.view.html", + "<script>$(\".loader\").fadeOut(\"slow\");</script><section class=\"public-form auth sigin-view valign-wrapper\"><div class=\"row valign\"><h3 class=\"col-md-12 text-center\">404 - Form Does not Exist</h3><div class=\"col-md-4 col-md-offset-4\"><div class=\"col-md-12 text-center\" style=\"padding-bottom: 50px\">The form you are trying to access does not exist. Sorry about that!</div></div></div></section>"); $templateCache.put("form_modules/forms/base/views/form-unauthorized.client.view.html", - "<section class=\"auth sigin-view valign-wrapper\"><div class=\"row valign\"><h3 class=\"col-md-12 text-center\">Not Authorized to Access Form</h3><div class=\"col-md-4 col-md-offset-4\"><div class=\"col-md-12 text-center\" style=\"padding-bottom: 50px\">The form you are trying to access is currently private and not accesible publically.<br>If you are the owner of the form, you can set it to \"Public\" in the \"Configuration\" panel in the form admin.</div></div></div></section>"); + "<script>$(\".loader\").fadeOut(\"slow\");</script><section class=\"public-form auth sigin-view valign-wrapper\"><div class=\"row valign\"><h3 class=\"col-md-12 text-center\">Not Authorized to Access Form</h3><div class=\"col-md-4 col-md-offset-4\"><div class=\"col-md-12 text-center\" style=\"padding-bottom: 50px\">The form you are trying to access is currently private and not accesible publically.<br>If you are the owner of the form, you can set it to \"Public\" in the \"Configuration\" panel in the form admin.</div></div></div></section>"); $templateCache.put("form_modules/forms/base/views/submit-form.client.view.html", - "<section class=public-form ng-style=\"{ 'background-color': myform.design.colors.backgroundColor }\"><submit-form-directive myform=myform></submit-form-directive></section><script ng-if=myform.analytics.gaCode>window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;\n" + + "<section class=public-form><submit-form-directive myform=myform></submit-form-directive></section><script ng-if=myform.analytics.gaCode>window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;\n" + " ga('create', '{{myform.analytics.gaCode}}', 'auto'); ga('send', 'pageview');</script><script ng-if=myform.analytics.gaCode src=https://www.google-analytics.com/analytics.js async defer></script>"); $templateCache.put("form_modules/forms/base/views/directiveViews/entryPage/startPage.html", "<div class=\"field row text-center\"><div class=\"col-xs-12 text-center\"><h1>{{pageData.introTitle}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-left\"><p style=color:#ddd>{{pageData.introParagraph}}</p></div></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in pageData.buttons\" class=text-center style=display:inline><button class=\"btn btn-info\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none; color: inherit\">{{button.text}}</a></button></p></div><div class=\"row form-actions\"><p class=\"col-xs-3 col-xs-offset-3 text-center\"><button class=\"btn btn-info\" type=button><a ng-click=exitpageData() style=\"color:white; font-size: 1.6em; text-decoration: none\">{{ 'CONTINUE_FORM' | translate }}</a></button></p></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/date.html", - "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=\"!field.required && !field.fieldValue\">{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div class=\"control-group input-append\"><input class=focusOn ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" ng-class=\"{ 'no-border': !!field.fieldValue }\" ui-date=dateOptions ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required placeholder=MM/DD/YYYY on-tab-key=nextField() on-tab-and-shift-key=prevField() ng-change=nextField()></div></div></div>"); + "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=\"!field.required && !field.fieldValue\">{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div class=\"control-group input-append\"><input class=focusOn ng-focus=\"setActiveField(field._id, null, false)\" ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" ng-class=\"{ 'no-border': !!field.fieldValue }\" ui-date=dateOptions ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required placeholder=MM/DD/YYYY on-tab-key=nextField() on-tab-and-shift-key=prevField() ng-change=nextField()></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/dropdown.html", - "<div class=\"field row dropdown\" ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><ui-select ng-model=field.fieldValue theme=selectize search-enabled=true search-by=option_value set-search-to-answer=true ng-required=field.required on-tab-and-shift-key=prevField() on-tab-key=nextField() ng-change=nextField()><ui-select-match placeholder=\"Type or select an option\"></ui-select-match><ui-select-choices repeat=\"option in field.fieldOptions | filter: $select.search\" ng-class=\"{'active': option.option_value === field.fieldValue }\"><span ng-bind-html=\"option.option_value | highlight: $select.search\"></span></ui-select-choices></ui-select></div></div><br>"); + "<div class=\"field row dropdown\" ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><ui-select ng-model=field.fieldValue ng-focus=\"setActiveField(field._id, null, false)\" theme=selectize search-enabled=true search-by=option_value set-search-to-answer=true ng-required=field.required on-tab-and-shift-key=prevField() on-tab-key=nextField() ng-change=nextField()><ui-select-match placeholder=\"Type or select an option\"></ui-select-match><ui-select-choices repeat=\"option in field.fieldOptions | filter: $select.search\" ng-class=\"{'active': option.option_value === field.fieldValue }\"><span ng-bind-html=\"option.option_value | highlight: $select.search\"></span></ui-select-choices></ui-select></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/hidden.html", "<input type=hidden>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/legal.html", "<div class=\"field row radio legal\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-valid-key=nextField()><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><br><p class=col-xs-12>{{field.description}}</p></div><div class=\"col-xs-12 field-input container\"><div class=row-fluid><label class=\"btn col-md-5 col-xs-12\" ng-class=\"{activeBtn: field.fieldValue == 'true'}\"><input class=focusOn ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" type=radio value=true ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter style=float:left>Y</div><span>{{ 'LEGAL_ACCEPT' | translate }}</span></label><label class=\"btn col-md-5 col-md-offset-1 col-xs-12\" ng-class=\"{activeBtn: field.fieldValue == 'false'}\"><input class=focusOn ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" type=radio value=false ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter style=float:left>N</div><span>{{ 'LEGAL_NO_ACCEPT' | translate }}</span></label></div></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/radio.html", - "<div class=\"field row radio\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-option field=field ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div ng-repeat=\"option in field.fieldOptions\" class=row-fluid><label class=\"btn col-md-4 col-xs-12 col-sm-12\" style=\"margin: 0.5em; padding-left:30px\" ng-class=\"{activeBtn: field.fieldValue == field.fieldOptions[$index].option_value}\"><div class=letter style=float:left>{{$index+1}}</div><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" type=radio class=focusOn value={{option.option_value}} ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"$root.nextField()\"> <span ng-bind=option.option_value></span></label></div></div></div><br>"); + "<div class=\"field row radio\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-option field=field ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div ng-repeat=\"option in field.fieldOptions\" class=row-fluid><label class=\"btn col-md-4 col-xs-12 col-sm-12\" style=\"margin: 0.5em; padding-left:30px\" ng-class=\"{activeBtn: field.fieldValue == field.fieldOptions[$index].option_value}\"><div class=letter style=float:left>{{$index+1}}</div><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" ng-focus=\"setActiveField(field._id, null, false)\" type=radio class=focusOn value={{option.option_value}} ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"$root.nextField()\"> <span ng-bind=option.option_value></span></label></div></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/rating.html", "<div class=\"textfield field row\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><input-stars max={{field.ratingOptions.steps}} ng-init=\"field.fieldValue = 1\" on-shape-click=true on-star-click=nextField() icon-full={{field.ratingOptions.shape}} icon-base=\"fa fa-3x\" icon-empty={{field.ratingOptions.shape}} ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() class=\"angular-input-stars focusOn\"></input-stars></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/statement.html", - "<div class=\"statement field row\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField()><div class=\"row field-title field-title\"><div class=col-xs-1><i class=\"fa fa-quote-left fa-1\"></i></div><h2 class=\"text-left col-xs-9\">{{field.title}}</h2><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"row field-title field-input\"><p class=col-xs-12 ng-if=field.description.length>{{field.description}}</p><br><div class=\"col-xs-offset-1 col-xs-11\"><button class=\"btn focusOn\">ng-style=\"{'font-size': '1.3em', 'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=\"nextField()\"> {{ 'CONTINUE' | translate }}</button></div></div></div>"); + "<div class=\"statement field row\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField()><div class=\"row field-title field-title\"><div class=col-xs-1><i class=\"fa fa-quote-left fa-1\"></i></div><h2 class=\"text-left col-xs-9\">{{field.title}}</h2><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"row field-title field-input\"><p class=col-xs-12 ng-if=field.description.length>{{field.description}}</p><br><div class=\"col-xs-offset-1 col-xs-11\"><button class=\"btn focusOn\" ng-style=\"{'font-size': '1.3em', 'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=nextField()>{{ 'CONTINUE' | translate }}</button></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/textarea.html", - "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><small>{{ 'NEWLINE' | translate }}</small><p><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><small style=font-size:0.6em>Press SHIFT+ENTER to add a newline</small><textarea class=\"textarea focusOn\" type=text ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-class=\"{ 'no-border': !!field.fieldValue }\" value={{field.fieldValue}} ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() style=\"border: none; border-left: lightgrey dashed 2px\">\n" + + "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><small>{{ 'NEWLINE' | translate }}</small><p><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><small style=font-size:0.6em>Press SHIFT+ENTER to add a newline</small><textarea class=\"textarea focusOn\" type=text ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-class=\"{ 'no-border': !!field.fieldValue }\" value={{field.fieldValue}} ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() style=\"border: none; border-left: lightgrey dashed 2px\">\n" + " </textarea></div></div><div><div class=\"btn btn-lg btn-default\" style=\"padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)\"><button ng-disabled=\"!field.fieldValue || forms.myForm.{{field.fieldType}}{{$index}}.$invalid\" ng-style=\"{'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=$root.nextField() class=\"btn col-sm-5 col-xs-5\">{{ 'OK' | translate }} <i class=\"fa fa-check\"></i></button><div class=\"col-sm-3 col-xs-6\" style=margin-top:0.2em><small style=\"color:#ddd; font-size:70%\">{{ 'ENTER' | translate }}</small></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/textfield.html", - "<div class=\"textfield field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title row-fluid\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=col-xs-12><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>({{ 'OPTIONAL' | translate }})</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" name={{field.fieldType}}{{index}} type={{input_type}} ng-pattern=validateRegex placeholder={{placeholder}} ng-class=\"{ 'no-border': !!field.fieldValue }\" class=\"focusOn text-field-input\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" value=field.fieldValue on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() ng-required=field.required aria-describedby=\"inputError2Status\"></div><div class=col-xs-12><div ng-show=\"forms.myForm.{{field.fieldType}}{{index}}.$invalid && !!forms.myForm.{{field.fieldType}}{{index}}.$viewValue \" class=\"alert alert-danger\" role=alert><span class=\"glyphicon glyphicon-exclamation-sign\" aria-hidden=true></span> <span class=sr-only>Error:</span> <span ng-if=\"field.fieldType == 'email'\">{{ 'ERROR_EMAIL_INVALID' | translate }}</span> <span ng-if=\"field.fieldType == 'number'\">{{ 'ERROR_NOT_A_NUMBER' | translate }}</span> <span ng-if=\"field.fieldType == 'link'\">{{ 'ERROR_URL_INVALID' | translate }}</span></div></div></div><div><div class=\"btn btn-lg btn-default\" style=\"padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)\"><button ng-disabled=\"!field.fieldValue || field.$invalid\" ng-style=\"{'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=nextField() class=\"btn col-sm-5 col-xs-5\">{{ 'OK' | translate }} <i class=\"fa fa-check\"></i></button><div class=\"col-xs-6 col-sm-3\" style=margin-top:0.2em><small style=\"color:#ddd; font-size:70%\">{{ 'ENTER' | translate }}</small></div></div></div>"); + "<div class=\"textfield field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title row-fluid\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=col-xs-12><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>({{ 'OPTIONAL' | translate }})</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" name={{field.fieldType}}{{index}} type={{input_type}} ng-pattern=validateRegex placeholder={{placeholder}} ng-class=\"{ 'no-border': !!field.fieldValue }\" class=\"focusOn text-field-input\" ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" value=field.fieldValue on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() ng-required=field.required aria-describedby=\"inputError2Status\"></div><div class=col-xs-12><div ng-show=\"forms.myForm.{{field.fieldType}}{{index}}.$invalid && !!forms.myForm.{{field.fieldType}}{{index}}.$viewValue \" class=\"alert alert-danger\" role=alert><span class=\"glyphicon glyphicon-exclamation-sign\" aria-hidden=true></span> <span class=sr-only>Error:</span> <span ng-if=\"field.fieldType == 'email'\">{{ 'ERROR_EMAIL_INVALID' | translate }}</span> <span ng-if=\"field.fieldType == 'number'\">{{ 'ERROR_NOT_A_NUMBER' | translate }}</span> <span ng-if=\"field.fieldType == 'link'\">{{ 'ERROR_URL_INVALID' | translate }}</span></div></div></div><div><div class=\"btn btn-lg btn-default\" ng-disabled=\"!field.fieldValue || field.$invalid\" style=\"padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)\"><button ng-disabled=\"!field.fieldValue || field.$invalid\" ng-style=\"{'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=nextField() class=\"btn col-sm-5 col-xs-5\">{{ 'OK' | translate }} <i class=\"fa fa-check\"></i></button><div class=\"col-xs-6 col-sm-3\" style=margin-top:0.2em><small style=\"color:#ddd; font-size:70%\">{{ 'ENTER' | translate }}</small></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/yes_no.html", - "<div class=\"field row radio\" ng-click=\"setActiveField(field._id, index, true)\" key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-tab-key=nextField() on-tab-and-shift-key=prevField() on-valid-key=nextField()><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=row><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=row>{{field.description}}</p></div><div class=\"col-xs-12 field-input\"><div class=row><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=true class=focusOn style=\"opacity: 0; margin-left: 0px\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'Y' | translate }}</div><span>{{ 'YES' | translate }}</span> <i ng-show=\"field.fieldValue === 'true'\" class=\"fa fa-check\" aria-hidden=true></i></label></div><div class=row style=\"margin-top: 10px\"><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=false style=\"opacity:0; margin-left:0px\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'N' | translate }}</div><span>{{ 'NO' | translate }}</span> <i ng-show=\"field.fieldValue === 'false'\" class=\"fa fa-check\" aria-hidden=true></i></label></div></div></div><br>"); + "<div class=\"field row radio\" ng-click=\"setActiveField(field._id, index, true)\" key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-tab-key=nextField() on-tab-and-shift-key=prevField() on-valid-key=nextField()><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=row><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=row>{{field.description}}</p></div><div class=\"col-xs-12 field-input\"><div class=row><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=true class=focusOn style=\"opacity: 0; margin-left: 0px\" ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'Y' | translate }}</div><span>{{ 'YES' | translate }}</span> <i ng-show=\"field.fieldValue === 'true'\" class=\"fa fa-check\" aria-hidden=true></i></label></div><div class=row style=\"margin-top: 10px\"><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=false style=\"opacity:0; margin-left:0px\" ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'N' | translate }}</div><span>{{ 'NO' | translate }}</span> <i ng-show=\"field.fieldValue === 'false'\" class=\"fa fa-check\" aria-hidden=true></i></label></div></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html", - "<section class=\"overlay submitform\" ng-if=\"!ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))\"></section><section class=\"overlay previewform submitform\" ng-if=\"ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))\"></section><div ng-show=\"!myform.submitted && myform.startPage.showStart\" class=form-submitted style=\"padding-top: 35vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; nont-size: 25px\" ng-style=\"{'color': form.design.colors.questionColor}\">{{myform.startPage.introTitle}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': form.design.colors.questionColor}\">{{myform.startPage.introParagraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=exitStartPage() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.startPage.introButtonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.startPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div><div class=form-fields ng-show=\"!myform.submitted && !myform.startPage.showStart\" ng-style=\"{ 'border-color': myform.design.colors.buttonTextColor }\"><div class=row><form name=forms.myForm novalidate class=\"submission-form col-sm-12 col-md-offset-1 col-md-10\"><div ng-repeat=\"field in myform.form_fields\" ng-if=!field.deletePreserved data-index={{$index}} data-id={{field._id}} ng-class=\"{activeField: selected._id == field._id }\" class=\"row field-directive\"><field-directive field=field design=myform.design index=$index forms=forms></field-directive></div></form></div><div class=\"row form-actions\" id=submit_field ng-class=\"{activeField: selected._id == 'submit_field' }\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor}\" style=\"border-top: 1px solid #ddd; margin-right: -13%; margin-left: -13%; margin-top: 30vh; height: 100vh\"><div class=\"col-xs-12 text-left\" style=\"background-color:#990000; color:white\" ng-if=forms.myForm.$invalid>{{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }}</div><button ng-if=!forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" v-busy=loading v-busy-label=\"Please wait\" v-pressable ng-disabled=\"loading || forms.myForm.$invalid\" ng-click=submitForm() on-enter-key=submitForm() on-enter-key-disabled=\"loading || forms.myForm.$invalid\" ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em\">{{ 'SUBMIT' | translate }}</button> <button ng-if=forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" ng-click=goToInvalid() on-enter-key=goToInvalid() on-enter-key-disabled=!forms.myForm.$invalid style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white\">{{ 'REVIEW' | translate }}</button><div class=\"col-sm-2 hidden-xs\" style=\"font-size: 75%; margin-top:3.25em\"><small>{{ 'ENTER' | translate }}</small></div></div><section ng-if=!myform.hideFooter class=\"navbar navbar-fixed-bottom\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor, 'padding-top': '15px', 'border-top': '2px '+ myform.design.colors.buttonTextColor +' solid', 'color':myform.design.colors.buttonTextColor}\"><div class=container-fluid><div class=row><div class=\"col-sm-5 col-md-6 col-xs-5\" ng-show=!myform.submitted><p class=lead>{{ 'ADVANCEMENT' | translate:translateAdvancementData }}</p></div><div class=\"col-md-6 col-md-offset-0 col-sm-offset-2 col-sm-3 col-xs-offset-1 col-xs-6 row\"><div class=\"col-md-4 col-md-offset-2 hidden-sm hidden-xs\"><a href=/#!/forms class=btn ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\">{{ 'CREATE_FORM' | translate }}</a></div><div class=\"col-md-4 col-sm-10 col-md-offset-0 col-sm-offset-2 col-xs-12 row\"><button class=\"btn btn-lg col-xs-6\" id=focusDownButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=nextField() ng-disabled=\"selected.index > myform.form_fields.length-1\"><i class=\"fa fa-chevron-down\"></i></button> <button class=\"btn btn-lg col-xs-6\" id=focusUpButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=prevField() ng-disabled=\"selected.index == 0\"><i class=\"fa fa-chevron-up\"></i></button></div></div></div></div></section></div><div ng-if=\"myform.submitted && !loading && !myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=\"field row text-center\" ng-style=\"{'color': myform.design.colors.questionColor}\"><div class=\"col-xs-12 col-sm-12 col-md-6 col-md-offset-3 text-center\">{{ 'FORM_SUCCESS' | translate }}</div></div><div class=\"row form-actions\"><p class=text-center><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{ 'BACK_TO_FORM' | translate }}</span></button></p></div></div><div ng-if=\"myform.submitted && !loading && myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; font-size: 25px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.title}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.paragraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.endPage.buttonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.endPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div>"); + "<div ng-show=\"!myform.submitted && myform.startPage.showStart\" class=form-submitted style=\"padding-top: 35vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; nont-size: 25px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.startPage.introTitle}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.startPage.introParagraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=exitStartPage() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.startPage.introButtonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.startPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div><div class=form-fields ng-show=\"!myform.submitted && !myform.startPage.showStart\" ng-style=\"{ 'border-color': myform.design.colors.buttonTextColor }\"><div class=\"row form-field-wrapper\"><form name=forms.myForm novalidate class=submission-form><div ng-repeat=\"field in myform.form_fields\" ng-if=!field.deletePreserved data-index={{$index}} data-id={{field._id}} ng-class=\"{activeField: selected._id == field._id }\" class=\"row field-directive\"><field-directive field=field design=myform.design index=$index forms=forms></field-directive></div><div class=\"row form-actions\" id=submit_field ng-class=\"{activeField: selected._id == 'submit_field' }\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor}\" style=\"border-top: 1px solid #ddd; margin-top: 30vh; height: 100vh; margin-left: 1%; margin-right: 1%\" on-tab-and-shift-key=prevField() on-tab-key=nextField() on-enter-key=submitForm()><div class=\"col-xs-12 text-left\" style=\"background-color:#990000; color:white\" ng-if=forms.myForm.$invalid>{{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }}</div><button ng-if=!forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" v-busy=loading v-busy-label=\"Please wait\" v-pressable ng-disabled=\"loading || forms.myForm.$invalid\" ng-click=submitForm() on-enter-key-disabled=\"loading || forms.myForm.$invalid\" ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em\">{{ 'SUBMIT' | translate }}</button> <button ng-if=forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" ng-click=goToInvalid() on-enter-key=goToInvalid() on-enter-key-disabled=!forms.myForm.$invalid style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white\">{{ 'REVIEW' | translate }}</button><div class=\"col-sm-2 hidden-xs\" style=\"font-size: 75%; margin-top:3.25em\"><small>{{ 'ENTER' | translate }}</small></div></div></form></div><section ng-if=!myform.hideFooter class=\"navbar navbar-fixed-bottom\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor, 'padding-top': '15px', 'border-top': '2px '+ myform.design.colors.buttonTextColor +' solid', 'color':myform.design.colors.buttonTextColor}\"><div class=container-fluid><div class=row><div class=\"col-sm-5 col-md-6 col-xs-5\" ng-show=!myform.submitted><p class=lead>{{ 'ADVANCEMENT' | translate:translateAdvancementData }}</p></div><div class=\"col-md-6 col-md-offset-0 col-sm-offset-2 col-sm-3 col-xs-offset-1 col-xs-6 row\"><div class=\"col-md-4 col-md-offset-2 hidden-sm hidden-xs\"><a href=/#!/forms class=btn ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\">{{ 'CREATE_FORM' | translate }}</a></div><div class=\"col-md-4 col-sm-10 col-md-offset-0 col-sm-offset-2 col-xs-12 row\"><button class=\"btn btn-lg col-xs-6\" id=focusDownButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=nextField() ng-disabled=\"selected.index > myform.form_fields.length-1\"><i class=\"fa fa-chevron-down\"></i></button> <button class=\"btn btn-lg col-xs-6\" id=focusUpButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=prevField() ng-disabled=\"selected.index == 0\"><i class=\"fa fa-chevron-up\"></i></button></div></div></div></div></section></div><div ng-if=\"myform.submitted && !loading && !myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=\"field row text-center\" ng-style=\"{'color': myform.design.colors.questionColor}\"><div class=\"col-xs-12 col-sm-12 col-md-6 col-md-offset-3 text-center\">{{ 'FORM_SUCCESS' | translate }}</div></div><div class=\"row form-actions\"><p class=text-center><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{ 'BACK_TO_FORM' | translate }}</span></button></p></div></div><div ng-if=\"myform.submitted && !loading && myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; font-size: 25px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.title}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.paragraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.endPage.buttonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.endPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div>"); }]); 'use strict'; @@ -131,7 +133,11 @@ angular.module('view-form').config(['$stateProvider', }). state('unauthorizedFormAccess', { url: '/forms/unauthorized', - templateUrl: '/static/form_modules/forms/base/views/form-unauthorized.client.view.html', + templateUrl: '/static/form_modules/forms/base/views/form-unauthorized.client.view.html' + }) + .state('formNotFound', { + url: '*path', + templateUrl: '/static/form_modules/forms/base/views/form-not-found.client.view.html' }); } ]); @@ -166,18 +172,6 @@ angular.module('view-form').config(['$stateProvider', deviceType = 'desktop'; } - $.ajaxSetup( { 'async': false } ); - var geoData = $.getJSON('https://freegeoip.net/json/').responseJSON; - $.ajaxSetup( { 'async': true } ); - - if(!geoData){ - geoData = { - ip: '', - city: '', - country_name: '' - }; - } - // Create a new message object var visitorData = { referrer: document.referrer, @@ -187,11 +181,8 @@ angular.module('view-form').config(['$stateProvider', timeElapsed: timeElapsed, language: lang, deviceType: deviceType, - ipAddr: geoData.ip, - geoLocation: { - city: geoData.city, - country: geoData.country_name - } + ipAddr: null, + geoLocation: null }; Socket.emit('form-visitor-data', visitorData); @@ -341,6 +332,9 @@ angular.module('view-form').controller('SubmitFormController', [ '$scope', '$rootScope', '$state', '$translate', 'myForm', function($scope, $rootScope, $state, $translate, myForm) { $scope.myform = myForm; + + $(".loader").fadeOut("slow"); + document.body.style.background = myForm.design.colors.backgroundColor; $translate.use(myForm.language); } ]); @@ -514,7 +508,7 @@ angular.module('view-form').directive('onEnterKey', ['$rootScope', function($roo return { restrict: 'A', link: function($scope, $element, $attrs) { - $element.bind('keydown keypress', function(event) { + $element.bind('keyup keypress', function(event) { var keyCode = event.which || event.keyCode; @@ -554,6 +548,8 @@ angular.module('view-form').directive('onEnterKey', ['$rootScope', function($roo var keyCode = event.which || event.keyCode; if(keyCode === 9 && event.shiftKey) { + + console.log('onTabAndShiftKey'); event.preventDefault(); $rootScope.$apply(function() { $rootScope.$eval($attrs.onTabAndShiftKey); @@ -602,8 +598,8 @@ jsep.addBinaryOp('!begins', 10); jsep.addBinaryOp('ends', 10); jsep.addBinaryOp('!ends', 10); -angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCounter', '$filter', '$rootScope', 'SendVisitorData', '$translate', - function ($http, TimeCounter, $filter, $rootScope, SendVisitorData, $translate) { +angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCounter', '$filter', '$rootScope', 'SendVisitorData', '$translate', '$timeout', + function ($http, TimeCounter, $filter, $rootScope, SendVisitorData, $translate, $timeout) { return { templateUrl: 'form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html', restrict: 'E', @@ -612,7 +608,8 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun ispreview: '=' }, controller: ["$document", "$window", "$scope", function($document, $window, $scope){ - $scope.noscroll = false; + var NOSCROLL = false; + var FORM_ACTION_ID = 'submit_field'; $scope.forms = {}; //Don't start timer if we are looking at a design preview @@ -652,99 +649,64 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun TimeCounter.restartClock(); }; - //Fire event when window is scrolled - $window.onscroll = function(){ - $scope.scrollPos = document.body.scrollTop || document.documentElement.scrollTop || 0; - var elemBox = document.getElementsByClassName('activeField')[0].getBoundingClientRect(); - $scope.fieldTop = elemBox.top; - $scope.fieldBottom = elemBox.bottom; - - var field_id; - var field_index; - - if(!$scope.noscroll){ - //Focus on submit button - if( $scope.selected.index === $scope.myform.visible_form_fields.length-1 && $scope.fieldBottom < 200){ - field_index = $scope.selected.index+1; - field_id = 'submit_field'; - $scope.setActiveField(field_id, field_index, false); - } - //Focus on field above submit button - else if($scope.selected.index === $scope.myform.visible_form_fields.length){ - if($scope.fieldTop > 200){ - field_index = $scope.selected.index-1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); - } - } else if( $scope.fieldBottom < 0){ - field_index = $scope.selected.index+1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); - } else if ( $scope.selected.index !== 0 && $scope.fieldTop > 0) { - field_index = $scope.selected.index-1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); - } - $scope.$apply(); - } - }; - /* ** Field Controls */ var evaluateLogicJump = function(field){ var logicJump = field.logicJump; - if (logicJump.expressionString && logicJump.valueB && field.fieldValue) { - var parse_tree = jsep(logicJump.expressionString); - var left, right; + if(logicJump.enabled){ + if (logicJump.expressionString && logicJump.valueB && field.fieldValue) { + var parse_tree = jsep(logicJump.expressionString); + var left, right; - if(parse_tree.left.name === 'field'){ - left = field.fieldValue; - right = logicJump.valueB; - } else { - left = logicJump.valueB; - right = field.fieldValue; - } - - if(field.fieldType === 'number' || field.fieldType === 'scale' || field.fieldType === 'rating'){ - switch(parse_tree.operator) { - case '==': - return (parseInt(left) === parseInt(right)); - case '!==': - return (parseInt(left) !== parseInt(right)); - case '>': - return (parseInt(left) > parseInt(right)); - case '>=': - return (parseInt(left) > parseInt(right)); - case '<': - return (parseInt(left) < parseInt(right)); - case '<=': - return (parseInt(left) <= parseInt(right)); - default: - return false; + if(parse_tree.left.name === 'field'){ + left = field.fieldValue; + right = logicJump.valueB; + } else { + left = logicJump.valueB; + right = field.fieldValue; } - } else { - switch(parse_tree.operator) { - case '==': - return (left === right); - case '!==': - return (left !== right); - case 'contains': - return (left.indexOf(right) > -1); - case '!contains': - /* jshint -W018 */ - return !(left.indexOf(right) > -1); - case 'begins': - return left.startsWith(right); - case '!begins': - return !left.startsWith(right); - case 'ends': - return left.endsWith(right); - case '!ends': - return left.endsWith(right); - default: - return false; + + if(field.fieldType === 'number' || field.fieldType === 'scale' || field.fieldType === 'rating'){ + switch(parse_tree.operator) { + case '==': + return (parseInt(left) === parseInt(right)); + case '!==': + return (parseInt(left) !== parseInt(right)); + case '>': + return (parseInt(left) > parseInt(right)); + case '>=': + return (parseInt(left) > parseInt(right)); + case '<': + return (parseInt(left) < parseInt(right)); + case '<=': + return (parseInt(left) <= parseInt(right)); + default: + return false; + } + } else { + switch(parse_tree.operator) { + case '==': + return (left === right); + case '!==': + return (left !== right); + case 'contains': + return (left.indexOf(right) > -1); + case '!contains': + /* jshint -W018 */ + return !(left.indexOf(right) > -1); + case 'begins': + return left.startsWith(right); + case '!begins': + return !left.startsWith(right); + case 'ends': + return left.endsWith(right); + case '!ends': + return left.endsWith(right); + default: + return false; + } } } } @@ -756,35 +718,46 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun throw new Error('current active field is null'); } - if($scope.selected._id === 'submit_field') { + if($scope.selected._id === FORM_ACTION_ID) { return $scope.myform.form_fields.length - 1; } return $scope.selected.index; + }; + $scope.isActiveField = function(field){ + if($scope.selected._id === field._id) { + return true + } + return false; }; $scope.setActiveField = $rootScope.setActiveField = function(field_id, field_index, animateScroll) { - if($scope.selected === null || $scope.selected._id === field_id){ - //console.log('not scrolling'); - //console.log($scope.selected); - return; - } - //console.log('field_id: '+field_id); - //console.log('field_index: '+field_index); - //console.log($scope.selected); + if($scope.selected === null || (!field_id && field_index === null) ) { + return; + } + + if(!field_id){ + field_id = $scope.myform.visible_form_fields[field_index]._id; + } else if(field_index === null){ + field_index = $scope.myform.visible_form_fields.length - $scope.selected._id = field_id; - $scope.selected.index = field_index; - if(!field_index){ - for(var i=0; i<$scope.myform.visible_form_fields.length; i++){ + for(var i=0; i < $scope.myform.visible_form_fields.length; i++){ var currField = $scope.myform.visible_form_fields[i]; - if(field_id === currField._id){ - $scope.selected.index = i; + if(currField['_id'] == field_id){ + field_index = i; break; } } } + if($scope.selected._id === field_id){ + return; + } + + $scope.selected._id = field_id; + $scope.selected.index = field_index; + + var nb_valid = $filter('formValidity')($scope.myform); $scope.translateAdvancementData = { done: nb_valid, @@ -793,10 +766,10 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun }; if(animateScroll){ - $scope.noscroll=true; + NOSCROLL=true; setTimeout(function() { $document.scrollToElement(angular.element('.activeField'), -10, 200).then(function() { - $scope.noscroll = false; + NOSCROLL = false; setTimeout(function() { if (document.querySelectorAll('.activeField .focusOn').length) { //Handle default case @@ -811,54 +784,109 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun }); }); }); - } else { - setTimeout(function() { - if (document.querySelectorAll('.activeField .focusOn')[0]) { - //FIXME: DAVID: Figure out how to set focus without scroll movement in HTML Dom - document.querySelectorAll('.activeField .focusOn')[0].focus(); - } else if (document.querySelectorAll('.activeField input')[0]){ - document.querySelectorAll('.activeField input')[0].focus(); - } - }); - } - - //Only send analytics data if form has not been submitted - if(!$scope.myform.submitted){ - SendVisitorData.send($scope.myform, getActiveField(), TimeCounter.getTimeElapsed()); - } + } }; - $rootScope.nextField = $scope.nextField = function(){ - var currField = $scope.myform.visible_form_fields[$scope.selected.index]; - - if($scope.selected && $scope.selected.index > -1){ - //Jump to logicJump's destination if it is true - if(currField.logicJump && evaluateLogicJump(currField)){ - $rootScope.setActiveField(currField.logicJump.jumpTo, null, true); - } else { - var selected_index, selected_id; - if($scope.selected.index < $scope.myform.visible_form_fields.length-1){ - selected_index = $scope.selected.index+1; - selected_id = $scope.myform.visible_form_fields[selected_index]._id; - $rootScope.setActiveField(selected_id, selected_index, true); - } else if($scope.selected.index === $scope.myform.visible_form_fields.length-1) { - selected_index = $scope.selected.index+1; - selected_id = 'submit_field'; - $rootScope.setActiveField(selected_id, selected_index, true); - } + $scope.$watch('selected.index', function(oldValue, newValue){ + if(oldValue !== newValue && newValue < $scope.myform.form_fields.length){ + //Only send analytics data if form has not been submitted + if(!$scope.myform.submitted){ + console.log('SendVisitorData.send()'); + SendVisitorData.send($scope.myform, newValue, TimeCounter.getTimeElapsed()); } - } + } + }); + //Fire event when window is scrolled + $window.onscroll = function(){ + if(!NOSCROLL){ + + var scrollTop = $(window).scrollTop(); + var elemBox = document.getElementsByClassName('activeField')[0].getBoundingClientRect(); + var fieldTop = elemBox.top; + var fieldBottom = elemBox.bottom; + + var field_id, field_index; + var elemHeight = $('.activeField').height(); + + var submitSectionHeight = $('.form-actions').height(); + var maxScrollTop = $(document).height() - $(window).height(); + var fieldWrapperHeight = $('form_fields').height(); + + var selector = 'form > .field-directive:nth-of-type(' + String($scope.myform.visible_form_fields.length - 1)+ ')' + var fieldDirectiveHeight = $(selector).height() + var scrollPosition = maxScrollTop - submitSectionHeight - fieldDirectiveHeight*1.2; + + var fractionToJump = 0.9; + + //Focus on field above submit form button + if($scope.selected.index === $scope.myform.visible_form_fields.length){ + if(scrollTop < scrollPosition){ + field_index = $scope.selected.index-1; + $scope.setActiveField(null, field_index, false); + } + } + + //Focus on submit form button + else if($scope.selected.index === $scope.myform.visible_form_fields.length-1 && scrollTop > scrollPosition){ + field_index = $scope.selected.index+1; + $scope.setActiveField(FORM_ACTION_ID, field_index, false); + } + + //If we scrolled bellow the current field, move to next field + else if(fieldBottom < elemHeight * fractionToJump && $scope.selected.index < $scope.myform.visible_form_fields.length-1 ){ + field_index = $scope.selected.index+1; + $scope.setActiveField(null, field_index, false); + } + //If we scrolled above the current field, move to prev field + else if ( $scope.selected.index !== 0 && fieldTop > elemHeight * fractionToJump) { + field_index = $scope.selected.index-1; + $scope.setActiveField(null, field_index, false); + } + } + + $scope.$apply(); + }; + + $rootScope.nextField = $scope.nextField = function(){ + if($scope.selected && $scope.selected.index > -1){ + + if($scope.selected._id !== FORM_ACTION_ID){ + var currField = $scope.myform.visible_form_fields[$scope.selected.index]; + + //Jump to logicJump's destination if it is true + if(currField.logicJump && currField.logicJump.jumpTo && evaluateLogicJump(currField)){ + $scope.setActiveField(currField.logicJump.jumpTo, null, true); + } else if($scope.selected.index < $scope.myform.visible_form_fields.length-1){ + $scope.setActiveField(null, $scope.selected.index+1, true); + } else { + $scope.setActiveField(FORM_ACTION_ID, null, true); + } + } else { + //If we are at the submit actions page, go to the first field + $rootScope.setActiveField(null, 0, true); + } + } else { + //If selected is not defined go to the first field + $rootScope.setActiveField(null, 0, true); + } + }; $rootScope.prevField = $scope.prevField = function(){ + console.log('prevField'); + console.log($scope.selected); + var selected_index = $scope.selected.index - 1; if($scope.selected.index > 0){ - var selected_index = $scope.selected.index - 1; - var selected_id = $scope.myform.visible_form_fields[selected_index]._id; - $scope.setActiveField(selected_id, selected_index, true); + $scope.setActiveField(null, selected_index, true); } }; + $rootScope.goToInvalid = $scope.goToInvalid = function() { + var field_id = $('.row.field-directive .ng-invalid.focusOn, .row.field-directive .ng-untouched.focusOn:not(.ng-valid)').first().parents('.row.field-directive').first().attr('data-id'); + $scope.setActiveField(field_id, null, true); + }; + /* ** Form Display Functions */ @@ -869,10 +897,6 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun } }; - $rootScope.goToInvalid = $scope.goToInvalid = function() { - document.querySelectorAll('.ng-invalid.focusOn')[0].focus(); - }; - var getDeviceData = function(){ var md = new MobileDetect(window.navigator.userAgent); var deviceType = 'other'; @@ -913,6 +937,10 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun }; $rootScope.submitForm = $scope.submitForm = function() { + if($scope.forms.myForm.$invalid){ + $scope.goToInvalid(); + return; + } var _timeElapsed = TimeCounter.stopClock(); $scope.loading = true; diff --git a/public/dist/form-application.min.js b/public/dist/form-application.min.js index 398bcbad..2bd6ddf9 100644 --- a/public/dist/form-application.min.js +++ b/public/dist/form-application.min.js @@ -1,2 +1,2 @@ -"use strict";var ApplicationConfiguration=function(){var a="TellForm-Form",b=["duScroll","ui.select","ngSanitize","vButton","ngResource","TellForm-Form.form_templates","ui.router","ui.bootstrap","pascalprecht.translate"],c=function(b,c){angular.module(b,c||[]),angular.module(a).requires.push(b)};return{applicationModuleName:a,applicationModuleVendorDependencies:b,registerModule:c}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function(a){a.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("FORM_URL","/forms/:formId"),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),angular.module("TellForm-Form.form_templates",[]).run(["$templateCache",function(a){a.put("form_modules/forms/base/views/form-unauthorized.client.view.html",'<section class="auth sigin-view valign-wrapper"><div class="row valign"><h3 class="col-md-12 text-center">Not Authorized to Access Form</h3><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px">The form you are trying to access is currently private and not accesible publically.<br>If you are the owner of the form, you can set it to "Public" in the "Configuration" panel in the form admin.</div></div></div></section>'),a.put("form_modules/forms/base/views/submit-form.client.view.html","<section class=public-form ng-style=\"{ 'background-color': myform.design.colors.backgroundColor }\"><submit-form-directive myform=myform></submit-form-directive></section><script ng-if=myform.analytics.gaCode>window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;\n\tga('create', '{{myform.analytics.gaCode}}', 'auto'); ga('send', 'pageview');</script><script ng-if=myform.analytics.gaCode src=https://www.google-analytics.com/analytics.js async defer></script>"),a.put("form_modules/forms/base/views/directiveViews/entryPage/startPage.html",'<div class="field row text-center"><div class="col-xs-12 text-center"><h1>{{pageData.introTitle}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-left"><p style=color:#ddd>{{pageData.introParagraph}}</p></div></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in pageData.buttons" class=text-center style=display:inline><button class="btn btn-info" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none; color: inherit">{{button.text}}</a></button></p></div><div class="row form-actions"><p class="col-xs-3 col-xs-offset-3 text-center"><button class="btn btn-info" type=button><a ng-click=exitpageData() style="color:white; font-size: 1.6em; text-decoration: none">{{ \'CONTINUE_FORM\' | translate }}</a></button></p></div>'),a.put("form_modules/forms/base/views/directiveViews/field/date.html",'<div class="field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show="!field.required && !field.fieldValue">{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><div class="control-group input-append"><input class=focusOn ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" ng-class="{ \'no-border\': !!field.fieldValue }" ui-date=dateOptions ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required placeholder=MM/DD/YYYY on-tab-key=nextField() on-tab-and-shift-key=prevField() ng-change=nextField()></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/dropdown.html",'<div class="field row dropdown" ng-if="field.fieldOptions.length > 0"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><ui-select ng-model=field.fieldValue theme=selectize search-enabled=true search-by=option_value set-search-to-answer=true ng-required=field.required on-tab-and-shift-key=prevField() on-tab-key=nextField() ng-change=nextField()><ui-select-match placeholder="Type or select an option"></ui-select-match><ui-select-choices repeat="option in field.fieldOptions | filter: $select.search" ng-class="{\'active\': option.option_value === field.fieldValue }"><span ng-bind-html="option.option_value | highlight: $select.search"></span></ui-select-choices></ui-select></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/hidden.html","<input type=hidden>"),a.put("form_modules/forms/base/views/directiveViews/field/legal.html",'<div class="field row radio legal" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-valid-key=nextField()><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><br><p class=col-xs-12>{{field.description}}</p></div><div class="col-xs-12 field-input container"><div class=row-fluid><label class="btn col-md-5 col-xs-12" ng-class="{activeBtn: field.fieldValue == \'true\'}"><input class=focusOn ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" type=radio value=true ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter style=float:left>Y</div><span>{{ \'LEGAL_ACCEPT\' | translate }}</span></label><label class="btn col-md-5 col-md-offset-1 col-xs-12" ng-class="{activeBtn: field.fieldValue == \'false\'}"><input class=focusOn ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" type=radio value=false ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter style=float:left>N</div><span>{{ \'LEGAL_NO_ACCEPT\' | translate }}</span></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/radio.html",'<div class="field row radio" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-option field=field ng-if="field.fieldOptions.length > 0"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><div ng-repeat="option in field.fieldOptions" class=row-fluid><label class="btn col-md-4 col-xs-12 col-sm-12" style="margin: 0.5em; padding-left:30px" ng-class="{activeBtn: field.fieldValue == field.fieldOptions[$index].option_value}"><div class=letter style=float:left>{{$index+1}}</div><input ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" type=radio class=focusOn value={{option.option_value}} ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="$root.nextField()"> <span ng-bind=option.option_value></span></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/rating.html",'<div class="textfield field row"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><input-stars max={{field.ratingOptions.steps}} ng-init="field.fieldValue = 1" on-shape-click=true on-star-click=nextField() icon-full={{field.ratingOptions.shape}} icon-base="fa fa-3x" icon-empty={{field.ratingOptions.shape}} ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() class="angular-input-stars focusOn"></input-stars></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/statement.html",'<div class="statement field row" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField()><div class="row field-title field-title"><div class=col-xs-1><i class="fa fa-quote-left fa-1"></i></div><h2 class="text-left col-xs-9">{{field.title}}</h2><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="row field-title field-input"><p class=col-xs-12 ng-if=field.description.length>{{field.description}}</p><br><div class="col-xs-offset-1 col-xs-11"><button class="btn focusOn">ng-style="{\'font-size\': \'1.3em\', \'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click="nextField()"> {{ \'CONTINUE\' | translate }}</button></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/textarea.html",'<div class="field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><small>{{ \'NEWLINE\' | translate }}</small><p><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><small style=font-size:0.6em>Press SHIFT+ENTER to add a newline</small><textarea class="textarea focusOn" type=text ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-class="{ \'no-border\': !!field.fieldValue }" value={{field.fieldValue}} ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() style="border: none; border-left: lightgrey dashed 2px">\n\t\t</textarea></div></div><div><div class="btn btn-lg btn-default" style="padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)"><button ng-disabled="!field.fieldValue || forms.myForm.{{field.fieldType}}{{$index}}.$invalid" ng-style="{\'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click=$root.nextField() class="btn col-sm-5 col-xs-5">{{ \'OK\' | translate }} <i class="fa fa-check"></i></button><div class="col-sm-3 col-xs-6" style=margin-top:0.2em><small style="color:#ddd; font-size:70%">{{ \'ENTER\' | translate }}</small></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/textfield.html",'<div class="textfield field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title row-fluid" ng-style="{\'color\': design.colors.questionColor}"><h3 class=col-xs-12><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>({{ \'OPTIONAL\' | translate }})</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><input ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" name={{field.fieldType}}{{index}} type={{input_type}} ng-pattern=validateRegex placeholder={{placeholder}} ng-class="{ \'no-border\': !!field.fieldValue }" class="focusOn text-field-input" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" value=field.fieldValue on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() ng-required=field.required aria-describedby="inputError2Status"></div><div class=col-xs-12><div ng-show="forms.myForm.{{field.fieldType}}{{index}}.$invalid && !!forms.myForm.{{field.fieldType}}{{index}}.$viewValue " class="alert alert-danger" role=alert><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>Error:</span> <span ng-if="field.fieldType == \'email\'">{{ \'ERROR_EMAIL_INVALID\' | translate }}</span> <span ng-if="field.fieldType == \'number\'">{{ \'ERROR_NOT_A_NUMBER\' | translate }}</span> <span ng-if="field.fieldType == \'link\'">{{ \'ERROR_URL_INVALID\' | translate }}</span></div></div></div><div><div class="btn btn-lg btn-default" style="padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)"><button ng-disabled="!field.fieldValue || field.$invalid" ng-style="{\'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click=nextField() class="btn col-sm-5 col-xs-5">{{ \'OK\' | translate }} <i class="fa fa-check"></i></button><div class="col-xs-6 col-sm-3" style=margin-top:0.2em><small style="color:#ddd; font-size:70%">{{ \'ENTER\' | translate }}</small></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/yes_no.html",'<div class="field row radio" ng-click="setActiveField(field._id, index, true)" key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-tab-key=nextField() on-tab-and-shift-key=prevField() on-valid-key=nextField()><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3 class=row><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=row>{{field.description}}</p></div><div class="col-xs-12 field-input"><div class=row><label class="btn btn-default col-md-2 col-sm-3 col-xs-7" style="background: rgba(0,0,0,0.1); text-align:left"><input type=radio value=true class=focusOn style="opacity: 0; margin-left: 0px" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter>{{ \'Y\' | translate }}</div><span>{{ \'YES\' | translate }}</span> <i ng-show="field.fieldValue === \'true\'" class="fa fa-check" aria-hidden=true></i></label></div><div class=row style="margin-top: 10px"><label class="btn btn-default col-md-2 col-sm-3 col-xs-7" style="background: rgba(0,0,0,0.1); text-align:left"><input type=radio value=false style="opacity:0; margin-left:0px" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter>{{ \'N\' | translate }}</div><span>{{ \'NO\' | translate }}</span> <i ng-show="field.fieldValue === \'false\'" class="fa fa-check" aria-hidden=true></i></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",'<section class="overlay submitform" ng-if="!ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))"></section><section class="overlay previewform submitform" ng-if="ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))"></section><div ng-show="!myform.submitted && myform.startPage.showStart" class=form-submitted style="padding-top: 35vh"><div class=row><div class="col-xs-12 text-center" style="overflow-wrap: break-word"><h1 style="font-weight: 400; nont-size: 25px" ng-style="{\'color\': form.design.colors.questionColor}">{{myform.startPage.introTitle}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-center" style="overflow-wrap: break-word"><p style="font-weight: 100; font-size: 16px" ng-style="{\'color\': form.design.colors.questionColor}">{{myform.startPage.introParagraph}}</p></div></div><div class="row form-actions text-center" style="padding: 5px 25px 5px 25px"><button ng-click=exitStartPage() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{myform.startPage.introButtonText}}</span></button></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in myform.startPage.buttons" class=text-center style=display:inline><button class=btn style="background-color:rgb(156, 226, 235)" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none" ng-style="{\'color\':button.color}">{{button.text}}</a></button></p></div></div><div class=form-fields ng-show="!myform.submitted && !myform.startPage.showStart" ng-style="{ \'border-color\': myform.design.colors.buttonTextColor }"><div class=row><form name=forms.myForm novalidate class="submission-form col-sm-12 col-md-offset-1 col-md-10"><div ng-repeat="field in myform.form_fields" ng-if=!field.deletePreserved data-index={{$index}} data-id={{field._id}} ng-class="{activeField: selected._id == field._id }" class="row field-directive"><field-directive field=field design=myform.design index=$index forms=forms></field-directive></div></form></div><div class="row form-actions" id=submit_field ng-class="{activeField: selected._id == \'submit_field\' }" ng-style="{ \'background-color\':myform.design.colors.buttonColor}" style="border-top: 1px solid #ddd; margin-right: -13%; margin-left: -13%; margin-top: 30vh; height: 100vh"><div class="col-xs-12 text-left" style="background-color:#990000; color:white" ng-if=forms.myForm.$invalid>{{ \'COMPLETING_NEEDED\' | translate:translateAdvancementData }}</div><button ng-if=!forms.myForm.$invalid class="Button btn col-sm-2 col-xs-8 focusOn" v-busy=loading v-busy-label="Please wait" v-pressable ng-disabled="loading || forms.myForm.$invalid" ng-click=submitForm() on-enter-key=submitForm() on-enter-key-disabled="loading || forms.myForm.$invalid" ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" style="font-size: 1.6em; margin-left: 1em; margin-top: 1em">{{ \'SUBMIT\' | translate }}</button> <button ng-if=forms.myForm.$invalid class="Button btn col-sm-2 col-xs-8 focusOn" ng-click=goToInvalid() on-enter-key=goToInvalid() on-enter-key-disabled=!forms.myForm.$invalid style="font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white">{{ \'REVIEW\' | translate }}</button><div class="col-sm-2 hidden-xs" style="font-size: 75%; margin-top:3.25em"><small>{{ \'ENTER\' | translate }}</small></div></div><section ng-if=!myform.hideFooter class="navbar navbar-fixed-bottom" ng-style="{ \'background-color\':myform.design.colors.buttonColor, \'padding-top\': \'15px\', \'border-top\': \'2px \'+ myform.design.colors.buttonTextColor +\' solid\', \'color\':myform.design.colors.buttonTextColor}"><div class=container-fluid><div class=row><div class="col-sm-5 col-md-6 col-xs-5" ng-show=!myform.submitted><p class=lead>{{ \'ADVANCEMENT\' | translate:translateAdvancementData }}</p></div><div class="col-md-6 col-md-offset-0 col-sm-offset-2 col-sm-3 col-xs-offset-1 col-xs-6 row"><div class="col-md-4 col-md-offset-2 hidden-sm hidden-xs"><a href=/#!/forms class=btn ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}">{{ \'CREATE_FORM\' | translate }}</a></div><div class="col-md-4 col-sm-10 col-md-offset-0 col-sm-offset-2 col-xs-12 row"><button class="btn btn-lg col-xs-6" id=focusDownButton ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" ng-click=nextField() ng-disabled="selected.index > myform.form_fields.length-1"><i class="fa fa-chevron-down"></i></button> <button class="btn btn-lg col-xs-6" id=focusUpButton ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" ng-click=prevField() ng-disabled="selected.index == 0"><i class="fa fa-chevron-up"></i></button></div></div></div></div></section></div><div ng-if="myform.submitted && !loading && !myform.endPage.showEnd" class=form-submitted ng-style="{\'color\':myform.design.colors.buttonTextColor}" style="padding-top: 5vh"><div class="field row text-center" ng-style="{\'color\': myform.design.colors.questionColor}"><div class="col-xs-12 col-sm-12 col-md-6 col-md-offset-3 text-center">{{ \'FORM_SUCCESS\' | translate }}</div></div><div class="row form-actions"><p class=text-center><button ng-click=reloadForm() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{ \'BACK_TO_FORM\' | translate }}</span></button></p></div></div><div ng-if="myform.submitted && !loading && myform.endPage.showEnd" class=form-submitted ng-style="{\'color\':myform.design.colors.buttonTextColor}" style="padding-top: 5vh"><div class=row><div class="col-xs-12 text-center" style="overflow-wrap: break-word"><h1 style="font-weight: 400; font-size: 25px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.endPage.title}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-center" style="overflow-wrap: break-word"><p style="font-weight: 100; font-size: 16px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.endPage.paragraph}}</p></div></div><div class="row form-actions text-center" style="padding: 5px 25px 5px 25px"><button ng-click=reloadForm() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{myform.endPage.buttonText}}</span></button></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in myform.endPage.buttons" class=text-center style=display:inline><button class=btn style="background-color:rgb(156, 226, 235)" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none" ng-style="{\'color\':button.color}">{{button.text}}</a></button></p></div></div>')}]),ApplicationConfiguration.registerModule("view-form",["ngFileUpload","ui.date","angular-input-stars"]),angular.module("view-form").config(["$stateProvider",function(a){a.state("submitForm",{url:"/forms/:formId",templateUrl:"/static/form_modules/forms/base/views/submit-form.client.view.html",resolve:{Forms:"Forms",myForm:["Forms","$q","$state","$stateParams",function(a,b,c,d){var e=b.defer();return a.get({formId:d.formId}).$promise.then(function(a){e.resolve(a)},function(a){c.go("unauthorizedFormAccess"),e.reject({redirectTo:"unauthorizedFormAccess"})}),e.promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("unauthorizedFormAccess",{url:"/forms/unauthorized",templateUrl:"/static/form_modules/forms/base/views/form-unauthorized.client.view.html"})}]),function(){function a(a,b){function c(b,c,d){var e=window.navigator.userLanguage||window.navigator.language;e=e.slice(0,2);var f=navigator.userAgent,g=new MobileDetect(f),h="other";g.tablet()?h="tablet":g.mobile()?h="mobile":g.is("bot")||(h="desktop"),$.ajaxSetup({async:!1});var i=$.getJSON("https://freegeoip.net/json/").responseJSON;$.ajaxSetup({async:!0}),i||(i={ip:"",city:"",country_name:""});var j={referrer:document.referrer,isSubmitted:b.submitted,formId:b._id,lastActiveField:b.form_fields[c]._id,timeElapsed:d,language:e,deviceType:h,ipAddr:i.ip,geoLocation:{city:i.city,country:i.country_name}};a.emit("form-visitor-data",j)}function d(){a.socket||a.connect(),a.on("disconnect",function(){a.connect()})}var e={send:c};return d(),e}angular.module("view-form").factory("SendVisitorData",a),a.$inject=["Socket","$state"]}(),angular.module("view-form").directive("keyToOption",function(){return{restrict:"A",scope:{field:"="},link:function(a,b,c,d){b.bind("keydown keypress",function(b){var c=b.which||b.keyCode,d=parseInt(String.fromCharCode(c))-1;d<a.field.fieldOptions.length&&(b.preventDefault(),a.$apply(function(){a.field.fieldValue=a.field.fieldOptions[d].option_value}))})}}}),angular.module("view-form").directive("keyToTruthy",["$rootScope",function(a){return{restrict:"A",scope:{field:"=",nextField:"&"},link:function(a,b,c){b.bind("keydown keypress",function(b){var d=b.which||b.keyCode,e=c.keyCharTruthy.charCodeAt(0)-32,f=c.keyCharFalsey.charCodeAt(0)-32;d===e?(b.preventDefault(),a.$apply(function(){a.field.fieldValue="true",c.onValidKey&&a.$root.$eval(c.onValidKey)})):d===f&&(b.preventDefault(),a.$apply(function(){a.field.fieldValue="false",c.onValidKey&&a.$root.$eval(c.onValidKey)}))})}}}]),angular.module("view-form").filter("formValidity",function(){return function(a){if(a&&a.form_fields&&a.visible_form_fields){var b=Object.keys(a),c=(b.filter(function(a){return"$"!==a[0]}),a.form_fields),d=c.filter(function(a){return"object"==typeof a&&"rating"!==a.fieldType&&"statement"!==a.fieldType?!!a.fieldValue:"rating"===a.fieldType||void 0}).length;return d-(a.form_fields.length-a.visible_form_fields.length)}return 0}}),angular.module("view-form").value("supportedFields",["textfield","textarea","date","dropdown","hidden","password","radio","legal","statement","rating","yes_no","number","natural"]),angular.module("view-form").constant("VIEW_FORM_URL","/forms/:formId/render"),angular.module("view-form").controller("SubmitFormController",["$scope","$rootScope","$state","$translate","myForm",function(a,b,c,d,e){a.myform=e,d.use(e.language)}]),angular.module("view-form").directive("fieldIconDirective",function(){return{template:'<i class="{{typeIcon}}"></i>',restrict:"E",scope:{typeName:"@"},controller:["$scope",function(a){var b={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card",statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};a.typeIcon=b[a.typeName]}]}});var __indexOf=[].indexOf||function(a){for(var b=0,c=this.length;b<c;b++)if(b in this&&this[b]===a)return b;return-1};angular.module("view-form").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache","supportedFields",function(a,b,c,d,e){var f=function(a){var b=a,c="form_modules/forms/base/views/directiveViews/field/";return __indexOf.call(e,b)>=0&&(c=c+b+".html"),d.get(c)};return{template:"<div>{{field.title}}</div>",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(a,d){c.chooseDefaultOption=a.chooseDefaultOption=function(b){"yes_no"===b?a.field.fieldValue="true":"rating"===b?a.field.fieldValue=0:"radio"===a.field.fieldType?a.field.fieldValue=a.field.fieldOptions[0].option_value:"legal"===b&&(a.field.fieldValue="true",c.nextField())},a.nextField=c.nextField,a.setActiveField=c.setActiveField,"date"===a.field.fieldType&&(a.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var e=a.field.fieldType;if("number"===a.field.fieldType||"textfield"===a.field.fieldType||"email"===a.field.fieldType||"link"===a.field.fieldType){switch(a.field.fieldType){case"textfield":a.input_type="text";break;case"email":a.input_type="email",a.placeholder="joesmith@example.com";break;case"number":a.input_type="text",a.validateRegex=/^-?\d+$/;break;default:a.input_type="url",a.placeholder="http://example.com"}e="textfield"}var g=f(e);d.html(g).show();b(d.contents())(a)}}}]),angular.module("view-form").directive("onEnterKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode,e=!1;null!==d.onEnterKeyDisabled&&(e=d.onEnterKeyDisabled),13!==c||b.shiftKey||e||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterKey)}))})}}}]).directive("onTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onTabKey)}))})}}}]).directive("onEnterOrTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;13!==c&&9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterOrTabKey)}))})}}}]).directive("onTabAndShiftKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;9===c&&b.shiftKey&&(b.preventDefault(),a.$apply(function(){a.$eval(d.onTabAndShiftKey)}))})}}}]),angular.module("view-form").directive("onFinishRender",["$rootScope","$timeout",function(a,b){return{restrict:"A",link:function(b,c,d){if(c.attr("ng-repeat")||c.attr("data-ng-repeat")){var e=d.onFinishRender||"ngRepeat";b.$first&&!b.$last?b.$evalAsync(function(){a.$broadcast(e+" Started")}):b.$last&&b.$evalAsync(function(){a.$broadcast(e+" Finished")})}}}}]),jsep.addBinaryOp("contains",10),jsep.addBinaryOp("!contains",10),jsep.addBinaryOp("begins",10),jsep.addBinaryOp("!begins",10),jsep.addBinaryOp("ends",10),jsep.addBinaryOp("!ends",10),angular.module("view-form").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","SendVisitorData","$translate",function(a,b,c,d,e,f){return{templateUrl:"form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"=",ispreview:"="},controller:["$document","$window","$scope",function(f,g,h){h.noscroll=!1,h.forms={},h.ispreview&&b.restartClock();var i=h.myform.visible_form_fields.filter(function(a){return"statement"!==a.fieldType}).length,j=c("formValidity")(h.myform);h.translateAdvancementData={done:j,total:i,answers_not_completed:i-j},h.reloadForm=function(){h.myform.submitted=!1,h.myform.form_fields=_.chain(h.myform.visible_form_fields).map(function(a){return a.fieldValue="",a}).value(),h.loading=!1,h.error="",h.selected={_id:"",index:0},h.setActiveField(h.myform.visible_form_fields[0]._id,0,!1),b.restartClock()},g.onscroll=function(){h.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var a=document.getElementsByClassName("activeField")[0].getBoundingClientRect();h.fieldTop=a.top,h.fieldBottom=a.bottom;var b,c;h.noscroll||(h.selected.index===h.myform.visible_form_fields.length-1&&h.fieldBottom<200?(c=h.selected.index+1,b="submit_field",h.setActiveField(b,c,!1)):h.selected.index===h.myform.visible_form_fields.length?h.fieldTop>200&&(c=h.selected.index-1,b=h.myform.visible_form_fields[c]._id,h.setActiveField(b,c,!1)):h.fieldBottom<0?(c=h.selected.index+1,b=h.myform.visible_form_fields[c]._id,h.setActiveField(b,c,!1)):0!==h.selected.index&&h.fieldTop>0&&(c=h.selected.index-1,b=h.myform.visible_form_fields[c]._id,h.setActiveField(b,c,!1)),h.$apply())};var k=function(a){var b=a.logicJump;if(b.expressionString&&b.valueB&&a.fieldValue){ -var c,d,e=jsep(b.expressionString);if("field"===e.left.name?(c=a.fieldValue,d=b.valueB):(c=b.valueB,d=a.fieldValue),"number"===a.fieldType||"scale"===a.fieldType||"rating"===a.fieldType)switch(e.operator){case"==":return parseInt(c)===parseInt(d);case"!==":return parseInt(c)!==parseInt(d);case">":return parseInt(c)>parseInt(d);case">=":return parseInt(c)>parseInt(d);case"<":return parseInt(c)<parseInt(d);case"<=":return parseInt(c)<=parseInt(d);default:return!1}else switch(e.operator){case"==":return c===d;case"!==":return c!==d;case"contains":return c.indexOf(d)>-1;case"!contains":return!(c.indexOf(d)>-1);case"begins":return c.startsWith(d);case"!begins":return!c.startsWith(d);case"ends":return c.endsWith(d);case"!ends":return c.endsWith(d);default:return!1}}},l=function(){if(null===h.selected)throw console.error("current active field is null"),new Error("current active field is null");return"submit_field"===h.selected._id?h.myform.form_fields.length-1:h.selected.index};h.setActiveField=d.setActiveField=function(a,d,g){if(null!==h.selected&&h.selected._id!==a){if(h.selected._id=a,h.selected.index=d,!d)for(var j=0;j<h.myform.visible_form_fields.length;j++){var k=h.myform.visible_form_fields[j];if(a===k._id){h.selected.index=j;break}}var m=c("formValidity")(h.myform);h.translateAdvancementData={done:m,total:i,answers_not_completed:i-m},g?(h.noscroll=!0,setTimeout(function(){f.scrollToElement(angular.element(".activeField"),-10,200).then(function(){h.noscroll=!1,setTimeout(function(){document.querySelectorAll(".activeField .focusOn").length?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input").length?document.querySelectorAll(".activeField input")[0].focus():document.querySelectorAll(".activeField .selectize-input")[0].focus()})})})):setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input")[0]&&document.querySelectorAll(".activeField input")[0].focus()}),h.myform.submitted||e.send(h.myform,l(),b.getTimeElapsed())}},d.nextField=h.nextField=function(){var a=h.myform.visible_form_fields[h.selected.index];if(h.selected&&h.selected.index>-1)if(a.logicJump&&k(a))d.setActiveField(a.logicJump.jumpTo,null,!0);else{var b,c;h.selected.index<h.myform.visible_form_fields.length-1?(b=h.selected.index+1,c=h.myform.visible_form_fields[b]._id,d.setActiveField(c,b,!0)):h.selected.index===h.myform.visible_form_fields.length-1&&(b=h.selected.index+1,c="submit_field",d.setActiveField(c,b,!0))}},d.prevField=h.prevField=function(){if(h.selected.index>0){var a=h.selected.index-1,b=h.myform.visible_form_fields[a]._id;h.setActiveField(b,a,!0)}},h.exitStartPage=function(){h.myform.startPage.showStart=!1,h.myform.visible_form_fields.length>0&&(h.selected._id=h.myform.visible_form_fields[0]._id)},d.goToInvalid=h.goToInvalid=function(){document.querySelectorAll(".ng-invalid.focusOn")[0].focus()};var m=function(){var a=new MobileDetect(window.navigator.userAgent),b="other";return a.tablet()?b="tablet":a.mobile()?b="mobile":a.is("bot")||(b="desktop"),{type:b,name:window.navigator.platform}},n=function(){$.ajaxSetup({async:!1});var a=$.getJSON("https://freegeoip.net/json/").responseJSON;return $.ajaxSetup({async:!0}),a&&a.ip||(a={ip:"Adblocker"}),{ipAddr:a.ip,geoLocation:{City:a.city,Country:a.country_name}}};d.submitForm=h.submitForm=function(){var d=b.stopClock();h.loading=!0;var f=_.cloneDeep(h.myform),g=m();f.device=g;var i=n();f.ipAddr=i.ipAddr,f.geoLocation=i.geoLocation,f.timeElapsed=d,f.percentageComplete=c("formValidity")(h.myform)/h.myform.visible_form_fields.length*100,delete f.endPage,delete f.isLive,delete f.provider,delete f.startPage,delete f.visible_form_fields,delete f.analytics,delete f.design,delete f.submissions,delete f.submitted;for(var j=0;j<h.myform.form_fields.length;j++)"dropdown"!==h.myform.form_fields[j].fieldType||h.myform.form_fields[j].deletePreserved||(h.myform.form_fields[j].fieldValue=h.myform.form_fields[j].fieldValue.option_value),delete f.form_fields[j].submissionId,delete f.form_fields[j].disabled,delete f.form_fields[j].ratingOptions,delete f.form_fields[j].fieldOptions,delete f.form_fields[j].logicJump,delete f.form_fields[j].description,delete f.form_fields[j].validFieldTypes,delete f.form_fields[j].fieldType;setTimeout(function(){h.submitPromise=a.post("/forms/"+h.myform._id,f).success(function(a,b){h.myform.submitted=!0,h.loading=!1,e.send(f,l(),d)}).error(function(a){h.loading=!1,console.error(a),h.error=a.message})},500)},h.reloadForm()}]}}]),angular.module("view-form").service("CurrentForm",function(){var a={};this.getForm=function(){return a},this.setForm=function(b){a=b}}),angular.module("view-form").factory("Forms",["$resource","VIEW_FORM_URL",function(a,b){return a(b,{formId:"@_id"},{get:{method:"GET",transformResponse:function(a,b){var c=angular.fromJson(a);return c.visible_form_fields=_.filter(c.form_fields,function(a){return a.deletePreserved===!1}),c}},update:{method:"PUT"},save:{method:"POST"}})}]),function(){function a(a,b){function c(){var a="";a=b.socketUrl&&b.socketPort?window.location.protocol+"//"+b.socketUrl+":"+b.socketPort:b.socketUrl?window.location.protocol+"//"+b.socketUrl:b.socketPort?window.location.protocol+"//"+window.location.hostname+":"+b.socketPort:window.location.protocol+"//"+window.location.hostname,g.socket=io(a,{transports:["websocket","polling"]})}function d(a,b){g.socket&&g.socket.emit(a,b)}function e(b,c){g.socket&&g.socket.on(b,function(b){a(function(){c(b)})})}function f(a){g.socket&&g.socket.removeListener(a)}var g={socket:null};return c(),g={connect:c,emit:d,on:e,removeListener:f,socket:null}}angular.module("view-form").factory("Socket",a),a.$inject=["$timeout","$window"]}(),angular.module("view-form").service("TimeCounter",[function(){var a,b=null;this.timeSpent=0,this.restartClock=function(){a=Date.now(),b=null},this.getTimeElapsed=function(){if(a)return Math.abs(Date.now().valueOf()-a.valueOf())/1e3},this.stopClock=function(){return a&&null===b?(b=Date.now(),this.timeSpent=Math.abs(b.valueOf()-a.valueOf())/1e3,this._startTime=this._endTime=null,this.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("english",{FORM_SUCCESS:"Form entry successfully submitted!",REVIEW:"Review",BACK_TO_FORM:"Go back to Form",EDIT_FORM:"Edit this TellForm",CREATE_FORM:"Create this TellForm",ADVANCEMENT:"{{done}} out of {{total}} answered",CONTINUE_FORM:"Continue to Form",REQUIRED:"required",COMPLETING_NEEDED:"{{answers_not_completed}} answer(s) need completing",OPTIONAL:"optional",ERROR_EMAIL_INVALID:"Please enter a valid email address",ERROR_NOT_A_NUMBER:"Please enter valid numbers only",ERROR_URL_INVALID:"Please a valid url",OK:"OK",ENTER:"press ENTER",YES:"Yes",NO:"No",NEWLINE:"press SHIFT+ENTER to create a newline",CONTINUE:"Continue",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Delete",CANCEL:"Cancel",SUBMIT:"Submit",UPLOAD_FILE:"Upload your File"}),a.preferredLanguage("english").fallbackLanguage("english").useSanitizeValueStrategy("escape")}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("french",{FORM_SUCCESS:"Votre formulaire a été enregistré!",REVIEW:"Incomplet",BACK_TO_FORM:"Retourner au formulaire",EDIT_FORM:"Éditer le Tellform",CREATE_FORM:"Créer un TellForm",ADVANCEMENT:"{{done}} complétés sur {{total}}",CONTINUE_FORM:"Aller au formulaire",REQUIRED:"obligatoire",COMPLETING_NEEDED:"{{answers_not_completed}} réponse(s) doive(nt) être complétée(s)",OPTIONAL:"facultatif",ERROR_EMAIL_INVALID:"Merci de rentrer une adresse mail valide",ERROR_NOT_A_NUMBER:"Merce de ne rentrer que des nombres",ERROR_URL_INVALID:"Merci de rentrer une url valide",OK:"OK",ENTER:"presser ENTRÉE",YES:"Oui",NO:"Non",NEWLINE:"presser SHIFT+ENTER pour créer une nouvelle ligne",CONTINUE:"Continuer",LEGAL_ACCEPT:"J’accepte",LEGAL_NO_ACCEPT:"Je n’accepte pas",DELETE:"Supprimer",CANCEL:"Réinitialiser",SUBMIT:"Enregistrer",UPLOAD_FILE:"Envoyer un fichier",Y:"O",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("german",{FORM_SUCCESS:"Ihre Angaben wurden gespeichert.",REVIEW:"Unvollständig",BACK_TO_FORM:"Zurück zum Formular",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} von {{total}} beantwortet",CONTINUE_FORM:"Zum Formular",REQUIRED:"verpflichtend",COMPLETING_NEEDED:"Es fehlen/fehtl noch {{answers_not_completed}} Antwort(en)",OPTIONAL:"fakultativ",ERROR_EMAIL_INVALID:"Bitte gültige Mailadresse eingeben",ERROR_NOT_A_NUMBER:"Bitte nur Zahlen eingeben",ERROR_URL_INVALID:"Bitte eine gültige URL eingeben",OK:"Okay",ENTER:"Eingabetaste drücken",YES:"Ja",NO:"Nein",NEWLINE:"Für eine neue Zeile SHIFT+ENTER drücken",CONTINUE:"Weiter",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Entfernen",CANCEL:"Canceln",SUBMIT:"Speichern",UPLOAD_FILE:"Datei versenden",Y:"J",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("italian",{FORM_SUCCESS:"Il formulario è stato inviato con successo!",REVIEW:"Incompleto",BACK_TO_FORM:"Ritorna al formulario",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} su {{total}} completate",CONTINUE_FORM:"Vai al formulario",REQUIRED:"obbligatorio",COMPLETING_NEEDED:"{{answers_not_completed}} risposta/e deve/ono essere completata/e",OPTIONAL:"opzionale",ERROR_EMAIL_INVALID:"Si prega di inserire un indirizzo email valido",ERROR_NOT_A_NUMBER:"Si prega di inserire solo numeri",ERROR_URL_INVALID:"Grazie per inserire un URL valido",OK:"OK",ENTER:"premere INVIO",YES:"Sì",NO:"No",NEWLINE:"premere SHIFT+INVIO per creare una nuova linea",CONTINUE:"Continua",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Cancella",CANCEL:"Reset",SUBMIT:"Registra",UPLOAD_FILE:"Invia un file",Y:"S",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("spanish",{FORM_SUCCESS:"¡El formulario ha sido enviado con éxito!",REVIEW:"Revisar",BACK_TO_FORM:"Regresar al formulario",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} de {{total}} contestadas",CONTINUE_FORM:"Continuar al formulario",REQUIRED:"Información requerida",COMPLETING_NEEDED:"{{answers_not_completed}} respuesta(s) necesita(n) ser completada(s)",OPTIONAL:"Opcional",ERROR_EMAIL_INVALID:"Favor de proporcionar un correo electrónico válido",ERROR_NOT_A_NUMBER:"Por favor, introduzca sólo números válidos",ERROR_URL_INVALID:"Favor de proporcionar un url válido",OK:"OK",ENTER:"pulse INTRO",YES:"Si",NO:"No",NEWLINE:"presione SHIFT+INTRO para crear una nueva línea",CONTINUE:"Continuar",LEGAL_ACCEPT:"Yo acepto",LEGAL_NO_ACCEPT:"Yo no acepto",DELETE:"Eliminar",CANCEL:"Cancelar",SUBMIT:"Registrar",UPLOAD_FILE:"Cargar el archivo",Y:"S",N:"N"})}]); \ No newline at end of file +"use strict";var ApplicationConfiguration=function(){var a="TellForm-Form",b=["duScroll","ui.select","ngSanitize","vButton","ngResource","TellForm-Form.form_templates","ui.router","ui.bootstrap","pascalprecht.translate"],c=function(b,c){angular.module(b,c||[]),angular.module(a).requires.push(b)};return{applicationModuleName:a,applicationModuleVendorDependencies:b,registerModule:c}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function(a){a.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("FORM_URL","/forms/:formId"),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),angular.module("TellForm-Form.form_templates",[]).run(["$templateCache",function(a){a.put("form_modules/forms/base/views/form-not-found.client.view.html",'<script>$(".loader").fadeOut("slow");</script><section class="public-form auth sigin-view valign-wrapper"><div class="row valign"><h3 class="col-md-12 text-center">404 - Form Does not Exist</h3><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px">The form you are trying to access does not exist. Sorry about that!</div></div></div></section>'),a.put("form_modules/forms/base/views/form-unauthorized.client.view.html",'<script>$(".loader").fadeOut("slow");</script><section class="public-form auth sigin-view valign-wrapper"><div class="row valign"><h3 class="col-md-12 text-center">Not Authorized to Access Form</h3><div class="col-md-4 col-md-offset-4"><div class="col-md-12 text-center" style="padding-bottom: 50px">The form you are trying to access is currently private and not accesible publically.<br>If you are the owner of the form, you can set it to "Public" in the "Configuration" panel in the form admin.</div></div></div></section>'),a.put("form_modules/forms/base/views/submit-form.client.view.html","<section class=public-form><submit-form-directive myform=myform></submit-form-directive></section><script ng-if=myform.analytics.gaCode>window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;\n\tga('create', '{{myform.analytics.gaCode}}', 'auto'); ga('send', 'pageview');</script><script ng-if=myform.analytics.gaCode src=https://www.google-analytics.com/analytics.js async defer></script>"),a.put("form_modules/forms/base/views/directiveViews/entryPage/startPage.html",'<div class="field row text-center"><div class="col-xs-12 text-center"><h1>{{pageData.introTitle}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-left"><p style=color:#ddd>{{pageData.introParagraph}}</p></div></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in pageData.buttons" class=text-center style=display:inline><button class="btn btn-info" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none; color: inherit">{{button.text}}</a></button></p></div><div class="row form-actions"><p class="col-xs-3 col-xs-offset-3 text-center"><button class="btn btn-info" type=button><a ng-click=exitpageData() style="color:white; font-size: 1.6em; text-decoration: none">{{ \'CONTINUE_FORM\' | translate }}</a></button></p></div>'),a.put("form_modules/forms/base/views/directiveViews/field/date.html",'<div class="field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show="!field.required && !field.fieldValue">{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><div class="control-group input-append"><input class=focusOn ng-focus="setActiveField(field._id, null, false)" ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" ng-class="{ \'no-border\': !!field.fieldValue }" ui-date=dateOptions ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required placeholder=MM/DD/YYYY on-tab-key=nextField() on-tab-and-shift-key=prevField() ng-change=nextField()></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/dropdown.html",'<div class="field row dropdown" ng-if="field.fieldOptions.length > 0"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><ui-select ng-model=field.fieldValue ng-focus="setActiveField(field._id, null, false)" theme=selectize search-enabled=true search-by=option_value set-search-to-answer=true ng-required=field.required on-tab-and-shift-key=prevField() on-tab-key=nextField() ng-change=nextField()><ui-select-match placeholder="Type or select an option"></ui-select-match><ui-select-choices repeat="option in field.fieldOptions | filter: $select.search" ng-class="{\'active\': option.option_value === field.fieldValue }"><span ng-bind-html="option.option_value | highlight: $select.search"></span></ui-select-choices></ui-select></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/hidden.html","<input type=hidden>"),a.put("form_modules/forms/base/views/directiveViews/field/legal.html",'<div class="field row radio legal" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-valid-key=nextField()><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><br><p class=col-xs-12>{{field.description}}</p></div><div class="col-xs-12 field-input container"><div class=row-fluid><label class="btn col-md-5 col-xs-12" ng-class="{activeBtn: field.fieldValue == \'true\'}"><input class=focusOn ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" type=radio value=true ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter style=float:left>Y</div><span>{{ \'LEGAL_ACCEPT\' | translate }}</span></label><label class="btn col-md-5 col-md-offset-1 col-xs-12" ng-class="{activeBtn: field.fieldValue == \'false\'}"><input class=focusOn ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" type=radio value=false ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter style=float:left>N</div><span>{{ \'LEGAL_NO_ACCEPT\' | translate }}</span></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/radio.html",'<div class="field row radio" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-option field=field ng-if="field.fieldOptions.length > 0"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><div ng-repeat="option in field.fieldOptions" class=row-fluid><label class="btn col-md-4 col-xs-12 col-sm-12" style="margin: 0.5em; padding-left:30px" ng-class="{activeBtn: field.fieldValue == field.fieldOptions[$index].option_value}"><div class=letter style=float:left>{{$index+1}}</div><input ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" ng-focus="setActiveField(field._id, null, false)" type=radio class=focusOn value={{option.option_value}} ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="$root.nextField()"> <span ng-bind=option.option_value></span></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/field/rating.html",'<div class="textfield field row"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><input-stars max={{field.ratingOptions.steps}} ng-init="field.fieldValue = 1" on-shape-click=true on-star-click=nextField() icon-full={{field.ratingOptions.shape}} icon-base="fa fa-3x" icon-empty={{field.ratingOptions.shape}} ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() class="angular-input-stars focusOn"></input-stars></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/statement.html",'<div class="statement field row" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField()><div class="row field-title field-title"><div class=col-xs-1><i class="fa fa-quote-left fa-1"></i></div><h2 class="text-left col-xs-9">{{field.title}}</h2><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="row field-title field-input"><p class=col-xs-12 ng-if=field.description.length>{{field.description}}</p><br><div class="col-xs-offset-1 col-xs-11"><button class="btn focusOn" ng-style="{\'font-size\': \'1.3em\', \'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click=nextField()>{{ \'CONTINUE\' | translate }}</button></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/textarea.html",'<div class="field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><small>{{ \'NEWLINE\' | translate }}</small><p><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><small style=font-size:0.6em>Press SHIFT+ENTER to add a newline</small><textarea class="textarea focusOn" type=text ng-focus="setActiveField(field._id, null, false)" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-class="{ \'no-border\': !!field.fieldValue }" value={{field.fieldValue}} ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() style="border: none; border-left: lightgrey dashed 2px">\n\t\t</textarea></div></div><div><div class="btn btn-lg btn-default" style="padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)"><button ng-disabled="!field.fieldValue || forms.myForm.{{field.fieldType}}{{$index}}.$invalid" ng-style="{\'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click=$root.nextField() class="btn col-sm-5 col-xs-5">{{ \'OK\' | translate }} <i class="fa fa-check"></i></button><div class="col-sm-3 col-xs-6" style=margin-top:0.2em><small style="color:#ddd; font-size:70%">{{ \'ENTER\' | translate }}</small></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/textfield.html",'<div class="textfield field row" ng-click="setActiveField(field._id, index, true)"><div class="col-xs-12 field-title row-fluid" ng-style="{\'color\': design.colors.questionColor}"><h3 class=col-xs-12><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>({{ \'OPTIONAL\' | translate }})</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class="col-xs-12 field-input"><input ng-style="{\'color\': design.colors.answerColor, \'border-color\': design.colors.answerColor}" name={{field.fieldType}}{{index}} type={{input_type}} ng-pattern=validateRegex placeholder={{placeholder}} ng-class="{ \'no-border\': !!field.fieldValue }" class="focusOn text-field-input" ng-focus="setActiveField(field._id, null, false)" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" value=field.fieldValue on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() ng-required=field.required aria-describedby="inputError2Status"></div><div class=col-xs-12><div ng-show="forms.myForm.{{field.fieldType}}{{index}}.$invalid && !!forms.myForm.{{field.fieldType}}{{index}}.$viewValue " class="alert alert-danger" role=alert><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>Error:</span> <span ng-if="field.fieldType == \'email\'">{{ \'ERROR_EMAIL_INVALID\' | translate }}</span> <span ng-if="field.fieldType == \'number\'">{{ \'ERROR_NOT_A_NUMBER\' | translate }}</span> <span ng-if="field.fieldType == \'link\'">{{ \'ERROR_URL_INVALID\' | translate }}</span></div></div></div><div><div class="btn btn-lg btn-default" ng-disabled="!field.fieldValue || field.$invalid" style="padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)"><button ng-disabled="!field.fieldValue || field.$invalid" ng-style="{\'background-color\':design.colors.buttonColor, \'color\':design.colors.buttonTextColor}" ng-click=nextField() class="btn col-sm-5 col-xs-5">{{ \'OK\' | translate }} <i class="fa fa-check"></i></button><div class="col-xs-6 col-sm-3" style=margin-top:0.2em><small style="color:#ddd; font-size:70%">{{ \'ENTER\' | translate }}</small></div></div></div>'),a.put("form_modules/forms/base/views/directiveViews/field/yes_no.html",'<div class="field row radio" ng-click="setActiveField(field._id, index, true)" key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-tab-key=nextField() on-tab-and-shift-key=prevField() on-valid-key=nextField()><div class="col-xs-12 field-title" ng-style="{\'color\': design.colors.questionColor}"><h3 class=row><small class=field-number>{{index+1}} <i class="fa fa-angle-double-right" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ \'OPTIONAL\' | translate }}</span></h3><p class=row>{{field.description}}</p></div><div class="col-xs-12 field-input"><div class=row><label class="btn btn-default col-md-2 col-sm-3 col-xs-7" style="background: rgba(0,0,0,0.1); text-align:left"><input type=radio value=true class=focusOn style="opacity: 0; margin-left: 0px" ng-focus="setActiveField(field._id, null, false)" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter>{{ \'Y\' | translate }}</div><span>{{ \'YES\' | translate }}</span> <i ng-show="field.fieldValue === \'true\'" class="fa fa-check" aria-hidden=true></i></label></div><div class=row style="margin-top: 10px"><label class="btn btn-default col-md-2 col-sm-3 col-xs-7" style="background: rgba(0,0,0,0.1); text-align:left"><input type=radio value=false style="opacity:0; margin-left:0px" ng-focus="setActiveField(field._id, null, false)" ng-model=field.fieldValue ng-model-options="{ debounce: 250 }" ng-required=field.required ng-change="nextField()"><div class=letter>{{ \'N\' | translate }}</div><span>{{ \'NO\' | translate }}</span> <i ng-show="field.fieldValue === \'false\'" class="fa fa-check" aria-hidden=true></i></label></div></div></div><br>'),a.put("form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",'<div ng-show="!myform.submitted && myform.startPage.showStart" class=form-submitted style="padding-top: 35vh"><div class=row><div class="col-xs-12 text-center" style="overflow-wrap: break-word"><h1 style="font-weight: 400; nont-size: 25px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.startPage.introTitle}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-center" style="overflow-wrap: break-word"><p style="font-weight: 100; font-size: 16px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.startPage.introParagraph}}</p></div></div><div class="row form-actions text-center" style="padding: 5px 25px 5px 25px"><button ng-click=exitStartPage() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{myform.startPage.introButtonText}}</span></button></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in myform.startPage.buttons" class=text-center style=display:inline><button class=btn style="background-color:rgb(156, 226, 235)" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none" ng-style="{\'color\':button.color}">{{button.text}}</a></button></p></div></div><div class=form-fields ng-show="!myform.submitted && !myform.startPage.showStart" ng-style="{ \'border-color\': myform.design.colors.buttonTextColor }"><div class="row form-field-wrapper"><form name=forms.myForm novalidate class=submission-form><div ng-repeat="field in myform.form_fields" ng-if=!field.deletePreserved data-index={{$index}} data-id={{field._id}} ng-class="{activeField: selected._id == field._id }" class="row field-directive"><field-directive field=field design=myform.design index=$index forms=forms></field-directive></div><div class="row form-actions" id=submit_field ng-class="{activeField: selected._id == \'submit_field\' }" ng-style="{ \'background-color\':myform.design.colors.buttonColor}" style="border-top: 1px solid #ddd; margin-top: 30vh; height: 100vh; margin-left: 1%; margin-right: 1%" on-tab-and-shift-key=prevField() on-tab-key=nextField() on-enter-key=submitForm()><div class="col-xs-12 text-left" style="background-color:#990000; color:white" ng-if=forms.myForm.$invalid>{{ \'COMPLETING_NEEDED\' | translate:translateAdvancementData }}</div><button ng-if=!forms.myForm.$invalid class="Button btn col-sm-2 col-xs-8 focusOn" v-busy=loading v-busy-label="Please wait" v-pressable ng-disabled="loading || forms.myForm.$invalid" ng-click=submitForm() on-enter-key-disabled="loading || forms.myForm.$invalid" ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" style="font-size: 1.6em; margin-left: 1em; margin-top: 1em">{{ \'SUBMIT\' | translate }}</button> <button ng-if=forms.myForm.$invalid class="Button btn col-sm-2 col-xs-8 focusOn" ng-click=goToInvalid() on-enter-key=goToInvalid() on-enter-key-disabled=!forms.myForm.$invalid style="font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white">{{ \'REVIEW\' | translate }}</button><div class="col-sm-2 hidden-xs" style="font-size: 75%; margin-top:3.25em"><small>{{ \'ENTER\' | translate }}</small></div></div></form></div><section ng-if=!myform.hideFooter class="navbar navbar-fixed-bottom" ng-style="{ \'background-color\':myform.design.colors.buttonColor, \'padding-top\': \'15px\', \'border-top\': \'2px \'+ myform.design.colors.buttonTextColor +\' solid\', \'color\':myform.design.colors.buttonTextColor}"><div class=container-fluid><div class=row><div class="col-sm-5 col-md-6 col-xs-5" ng-show=!myform.submitted><p class=lead>{{ \'ADVANCEMENT\' | translate:translateAdvancementData }}</p></div><div class="col-md-6 col-md-offset-0 col-sm-offset-2 col-sm-3 col-xs-offset-1 col-xs-6 row"><div class="col-md-4 col-md-offset-2 hidden-sm hidden-xs"><a href=/#!/forms class=btn ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}">{{ \'CREATE_FORM\' | translate }}</a></div><div class="col-md-4 col-sm-10 col-md-offset-0 col-sm-offset-2 col-xs-12 row"><button class="btn btn-lg col-xs-6" id=focusDownButton ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" ng-click=nextField() ng-disabled="selected.index > myform.form_fields.length-1"><i class="fa fa-chevron-down"></i></button> <button class="btn btn-lg col-xs-6" id=focusUpButton ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}" ng-click=prevField() ng-disabled="selected.index == 0"><i class="fa fa-chevron-up"></i></button></div></div></div></div></section></div><div ng-if="myform.submitted && !loading && !myform.endPage.showEnd" class=form-submitted ng-style="{\'color\':myform.design.colors.buttonTextColor}" style="padding-top: 5vh"><div class="field row text-center" ng-style="{\'color\': myform.design.colors.questionColor}"><div class="col-xs-12 col-sm-12 col-md-6 col-md-offset-3 text-center">{{ \'FORM_SUCCESS\' | translate }}</div></div><div class="row form-actions"><p class=text-center><button ng-click=reloadForm() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{ \'BACK_TO_FORM\' | translate }}</span></button></p></div></div><div ng-if="myform.submitted && !loading && myform.endPage.showEnd" class=form-submitted ng-style="{\'color\':myform.design.colors.buttonTextColor}" style="padding-top: 5vh"><div class=row><div class="col-xs-12 text-center" style="overflow-wrap: break-word"><h1 style="font-weight: 400; font-size: 25px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.endPage.title}}</h1></div><div class="col-xs-10 col-xs-offset-1 text-center" style="overflow-wrap: break-word"><p style="font-weight: 100; font-size: 16px" ng-style="{\'color\': myform.design.colors.questionColor}">{{myform.endPage.paragraph}}</p></div></div><div class="row form-actions text-center" style="padding: 5px 25px 5px 25px"><button ng-click=reloadForm() class=btn type=button ng-style="{\'background-color\':myform.design.colors.buttonColor, \'color\':myform.design.colors.buttonTextColor}"><span style="font-size: 1.6em">{{myform.endPage.buttonText}}</span></button></div><div class="row form-actions" style="padding-bottom:3em; padding-left: 1em; padding-right: 1em"><p ng-repeat="button in myform.endPage.buttons" class=text-center style=display:inline><button class=btn style="background-color:rgb(156, 226, 235)" type=button ng-style="{\'background-color\':button.bgColor, \'color\':button.color}"><a href={{button.url}} style="font-size: 1.6em; text-decoration: none" ng-style="{\'color\':button.color}">{{button.text}}</a></button></p></div></div>')}]),ApplicationConfiguration.registerModule("view-form",["ngFileUpload","ui.date","angular-input-stars"]),angular.module("view-form").config(["$stateProvider",function(a){a.state("submitForm",{url:"/forms/:formId",templateUrl:"/static/form_modules/forms/base/views/submit-form.client.view.html",resolve:{Forms:"Forms",myForm:["Forms","$q","$state","$stateParams",function(a,b,c,d){var e=b.defer();return a.get({formId:d.formId}).$promise.then(function(a){e.resolve(a)},function(a){c.go("unauthorizedFormAccess"),e.reject({redirectTo:"unauthorizedFormAccess"})}),e.promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("unauthorizedFormAccess",{url:"/forms/unauthorized",templateUrl:"/static/form_modules/forms/base/views/form-unauthorized.client.view.html"}).state("formNotFound",{url:"*path",templateUrl:"/static/form_modules/forms/base/views/form-not-found.client.view.html"})}]),function(){function a(a,b){function c(b,c,d){var e=window.navigator.userLanguage||window.navigator.language;e=e.slice(0,2);var f=navigator.userAgent,g=new MobileDetect(f),h="other";g.tablet()?h="tablet":g.mobile()?h="mobile":g.is("bot")||(h="desktop");var i={referrer:document.referrer,isSubmitted:b.submitted,formId:b._id,lastActiveField:b.form_fields[c]._id,timeElapsed:d,language:e,deviceType:h,ipAddr:null,geoLocation:null};a.emit("form-visitor-data",i)}function d(){a.socket||a.connect(),a.on("disconnect",function(){a.connect()})}var e={send:c};return d(),e}angular.module("view-form").factory("SendVisitorData",a),a.$inject=["Socket","$state"]}(),angular.module("view-form").directive("keyToOption",function(){return{restrict:"A",scope:{field:"="},link:function(a,b,c,d){b.bind("keydown keypress",function(b){var c=b.which||b.keyCode,d=parseInt(String.fromCharCode(c))-1;d<a.field.fieldOptions.length&&(b.preventDefault(),a.$apply(function(){a.field.fieldValue=a.field.fieldOptions[d].option_value}))})}}}),angular.module("view-form").directive("keyToTruthy",["$rootScope",function(a){return{restrict:"A",scope:{field:"=",nextField:"&"},link:function(a,b,c){b.bind("keydown keypress",function(b){var d=b.which||b.keyCode,e=c.keyCharTruthy.charCodeAt(0)-32,f=c.keyCharFalsey.charCodeAt(0)-32;d===e?(b.preventDefault(),a.$apply(function(){a.field.fieldValue="true",c.onValidKey&&a.$root.$eval(c.onValidKey)})):d===f&&(b.preventDefault(),a.$apply(function(){a.field.fieldValue="false",c.onValidKey&&a.$root.$eval(c.onValidKey)}))})}}}]),angular.module("view-form").filter("formValidity",function(){return function(a){if(a&&a.form_fields&&a.visible_form_fields){var b=Object.keys(a),c=(b.filter(function(a){return"$"!==a[0]}),a.form_fields),d=c.filter(function(a){return"object"==typeof a&&"rating"!==a.fieldType&&"statement"!==a.fieldType?!!a.fieldValue:"rating"===a.fieldType||void 0}).length;return d-(a.form_fields.length-a.visible_form_fields.length)}return 0}}),angular.module("view-form").value("supportedFields",["textfield","textarea","date","dropdown","hidden","password","radio","legal","statement","rating","yes_no","number","natural"]),angular.module("view-form").constant("VIEW_FORM_URL","/forms/:formId/render"),angular.module("view-form").controller("SubmitFormController",["$scope","$rootScope","$state","$translate","myForm",function(a,b,c,d,e){a.myform=e,$(".loader").fadeOut("slow"),document.body.style.background=e.design.colors.backgroundColor,d.use(e.language)}]),angular.module("view-form").directive("fieldIconDirective",function(){return{template:'<i class="{{typeIcon}}"></i>',restrict:"E",scope:{typeName:"@"},controller:["$scope",function(a){var b={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card",statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};a.typeIcon=b[a.typeName]}]}});var __indexOf=[].indexOf||function(a){for(var b=0,c=this.length;b<c;b++)if(b in this&&this[b]===a)return b;return-1};angular.module("view-form").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache","supportedFields",function(a,b,c,d,e){var f=function(a){var b=a,c="form_modules/forms/base/views/directiveViews/field/";return __indexOf.call(e,b)>=0&&(c=c+b+".html"),d.get(c)};return{template:"<div>{{field.title}}</div>",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(a,d){c.chooseDefaultOption=a.chooseDefaultOption=function(b){"yes_no"===b?a.field.fieldValue="true":"rating"===b?a.field.fieldValue=0:"radio"===a.field.fieldType?a.field.fieldValue=a.field.fieldOptions[0].option_value:"legal"===b&&(a.field.fieldValue="true",c.nextField())},a.nextField=c.nextField,a.setActiveField=c.setActiveField,"date"===a.field.fieldType&&(a.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var e=a.field.fieldType;if("number"===a.field.fieldType||"textfield"===a.field.fieldType||"email"===a.field.fieldType||"link"===a.field.fieldType){switch(a.field.fieldType){case"textfield":a.input_type="text";break;case"email":a.input_type="email",a.placeholder="joesmith@example.com";break;case"number":a.input_type="text",a.validateRegex=/^-?\d+$/;break;default:a.input_type="url",a.placeholder="http://example.com"}e="textfield"}var g=f(e);d.html(g).show();b(d.contents())(a)}}}]),angular.module("view-form").directive("onEnterKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode,e=!1;null!==d.onEnterKeyDisabled&&(e=d.onEnterKeyDisabled),13!==c||b.shiftKey||e||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterKey)}))})}}}]).directive("onTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keyup keypress",function(b){var c=b.which||b.keyCode;9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onTabKey)}))})}}}]).directive("onEnterOrTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;13!==c&&9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterOrTabKey)}))})}}}]).directive("onTabAndShiftKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;9===c&&b.shiftKey&&(console.log("onTabAndShiftKey"),b.preventDefault(),a.$apply(function(){a.$eval(d.onTabAndShiftKey)}))})}}}]),angular.module("view-form").directive("onFinishRender",["$rootScope","$timeout",function(a,b){return{restrict:"A",link:function(b,c,d){if(c.attr("ng-repeat")||c.attr("data-ng-repeat")){var e=d.onFinishRender||"ngRepeat";b.$first&&!b.$last?b.$evalAsync(function(){a.$broadcast(e+" Started")}):b.$last&&b.$evalAsync(function(){a.$broadcast(e+" Finished")})}}}}]),jsep.addBinaryOp("contains",10),jsep.addBinaryOp("!contains",10),jsep.addBinaryOp("begins",10),jsep.addBinaryOp("!begins",10),jsep.addBinaryOp("ends",10),jsep.addBinaryOp("!ends",10),angular.module("view-form").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","SendVisitorData","$translate","$timeout",function(a,b,c,d,e,f,g){return{templateUrl:"form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"=",ispreview:"="},controller:["$document","$window","$scope",function(f,g,h){var i=!1,j="submit_field";h.forms={},h.ispreview&&b.restartClock();var k=h.myform.visible_form_fields.filter(function(a){return"statement"!==a.fieldType}).length,l=c("formValidity")(h.myform);h.translateAdvancementData={done:l,total:k,answers_not_completed:k-l},h.reloadForm=function(){h.myform.submitted=!1,h.myform.form_fields=_.chain(h.myform.visible_form_fields).map(function(a){return a.fieldValue="",a}).value(),h.loading=!1,h.error="",h.selected={_id:"",index:0},h.setActiveField(h.myform.visible_form_fields[0]._id,0,!1),b.restartClock()};var m=function(a){var b=a.logicJump;if(b.enabled&&b.expressionString&&b.valueB&&a.fieldValue){var c,d,e=jsep(b.expressionString); +if("field"===e.left.name?(c=a.fieldValue,d=b.valueB):(c=b.valueB,d=a.fieldValue),"number"===a.fieldType||"scale"===a.fieldType||"rating"===a.fieldType)switch(e.operator){case"==":return parseInt(c)===parseInt(d);case"!==":return parseInt(c)!==parseInt(d);case">":return parseInt(c)>parseInt(d);case">=":return parseInt(c)>parseInt(d);case"<":return parseInt(c)<parseInt(d);case"<=":return parseInt(c)<=parseInt(d);default:return!1}else switch(e.operator){case"==":return c===d;case"!==":return c!==d;case"contains":return c.indexOf(d)>-1;case"!contains":return!(c.indexOf(d)>-1);case"begins":return c.startsWith(d);case"!begins":return!c.startsWith(d);case"ends":return c.endsWith(d);case"!ends":return c.endsWith(d);default:return!1}}},n=function(){if(null===h.selected)throw console.error("current active field is null"),new Error("current active field is null");return h.selected._id===j?h.myform.form_fields.length-1:h.selected.index};h.isActiveField=function(a){return h.selected._id===a._id},h.setActiveField=d.setActiveField=function(a,b,d){if(null!==h.selected&&(a||null!==b)){if(a){if(null===b){b=h.myform.visible_form_fields.length;for(var e=0;e<h.myform.visible_form_fields.length;e++){var g=h.myform.visible_form_fields[e];if(g._id==a){b=e;break}}}}else a=h.myform.visible_form_fields[b]._id;if(h.selected._id!==a){h.selected._id=a,h.selected.index=b;var j=c("formValidity")(h.myform);h.translateAdvancementData={done:j,total:k,answers_not_completed:k-j},d&&(i=!0,setTimeout(function(){f.scrollToElement(angular.element(".activeField"),-10,200).then(function(){i=!1,setTimeout(function(){document.querySelectorAll(".activeField .focusOn").length?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input").length?document.querySelectorAll(".activeField input")[0].focus():document.querySelectorAll(".activeField .selectize-input")[0].focus()})})}))}}},h.$watch("selected.index",function(a,c){a!==c&&c<h.myform.form_fields.length&&(h.myform.submitted||(console.log("SendVisitorData.send()"),e.send(h.myform,c,b.getTimeElapsed())))}),g.onscroll=function(){if(!i){var a,b=$(window).scrollTop(),c=document.getElementsByClassName("activeField")[0].getBoundingClientRect(),d=c.top,e=c.bottom,f=$(".activeField").height(),g=$(".form-actions").height(),k=$(document).height()-$(window).height(),l=($("form_fields").height(),"form > .field-directive:nth-of-type("+String(h.myform.visible_form_fields.length-1)+")"),m=$(l).height(),n=k-g-1.2*m,o=.9;h.selected.index===h.myform.visible_form_fields.length?b<n&&(a=h.selected.index-1,h.setActiveField(null,a,!1)):h.selected.index===h.myform.visible_form_fields.length-1&&b>n?(a=h.selected.index+1,h.setActiveField(j,a,!1)):e<f*o&&h.selected.index<h.myform.visible_form_fields.length-1?(a=h.selected.index+1,h.setActiveField(null,a,!1)):0!==h.selected.index&&d>f*o&&(a=h.selected.index-1,h.setActiveField(null,a,!1))}h.$apply()},d.nextField=h.nextField=function(){if(h.selected&&h.selected.index>-1)if(h.selected._id!==j){var a=h.myform.visible_form_fields[h.selected.index];a.logicJump&&a.logicJump.jumpTo&&m(a)?h.setActiveField(a.logicJump.jumpTo,null,!0):h.selected.index<h.myform.visible_form_fields.length-1?h.setActiveField(null,h.selected.index+1,!0):h.setActiveField(j,null,!0)}else d.setActiveField(null,0,!0);else d.setActiveField(null,0,!0)},d.prevField=h.prevField=function(){console.log("prevField"),console.log(h.selected);var a=h.selected.index-1;h.selected.index>0&&h.setActiveField(null,a,!0)},d.goToInvalid=h.goToInvalid=function(){var a=$(".row.field-directive .ng-invalid.focusOn, .row.field-directive .ng-untouched.focusOn:not(.ng-valid)").first().parents(".row.field-directive").first().attr("data-id");h.setActiveField(a,null,!0)},h.exitStartPage=function(){h.myform.startPage.showStart=!1,h.myform.visible_form_fields.length>0&&(h.selected._id=h.myform.visible_form_fields[0]._id)};var o=function(){var a=new MobileDetect(window.navigator.userAgent),b="other";return a.tablet()?b="tablet":a.mobile()?b="mobile":a.is("bot")||(b="desktop"),{type:b,name:window.navigator.platform}},p=function(){$.ajaxSetup({async:!1});var a=$.getJSON("https://freegeoip.net/json/").responseJSON;return $.ajaxSetup({async:!0}),a&&a.ip||(a={ip:"Adblocker"}),{ipAddr:a.ip,geoLocation:{City:a.city,Country:a.country_name}}};d.submitForm=h.submitForm=function(){if(h.forms.myForm.$invalid)return void h.goToInvalid();var d=b.stopClock();h.loading=!0;var f=_.cloneDeep(h.myform),g=o();f.device=g;var i=p();f.ipAddr=i.ipAddr,f.geoLocation=i.geoLocation,f.timeElapsed=d,f.percentageComplete=c("formValidity")(h.myform)/h.myform.visible_form_fields.length*100,delete f.endPage,delete f.isLive,delete f.provider,delete f.startPage,delete f.visible_form_fields,delete f.analytics,delete f.design,delete f.submissions,delete f.submitted;for(var j=0;j<h.myform.form_fields.length;j++)"dropdown"!==h.myform.form_fields[j].fieldType||h.myform.form_fields[j].deletePreserved||(h.myform.form_fields[j].fieldValue=h.myform.form_fields[j].fieldValue.option_value),delete f.form_fields[j].submissionId,delete f.form_fields[j].disabled,delete f.form_fields[j].ratingOptions,delete f.form_fields[j].fieldOptions,delete f.form_fields[j].logicJump,delete f.form_fields[j].description,delete f.form_fields[j].validFieldTypes,delete f.form_fields[j].fieldType;setTimeout(function(){h.submitPromise=a.post("/forms/"+h.myform._id,f).success(function(a,b){h.myform.submitted=!0,h.loading=!1,e.send(f,n(),d)}).error(function(a){h.loading=!1,console.error(a),h.error=a.message})},500)},h.reloadForm()}]}}]),angular.module("view-form").service("CurrentForm",function(){var a={};this.getForm=function(){return a},this.setForm=function(b){a=b}}),angular.module("view-form").factory("Forms",["$resource","VIEW_FORM_URL",function(a,b){return a(b,{formId:"@_id"},{get:{method:"GET",transformResponse:function(a,b){var c=angular.fromJson(a);return c.visible_form_fields=_.filter(c.form_fields,function(a){return a.deletePreserved===!1}),c}},update:{method:"PUT"},save:{method:"POST"}})}]),function(){function a(a,b){function c(){var a="";a=b.socketUrl&&b.socketPort?window.location.protocol+"//"+b.socketUrl+":"+b.socketPort:b.socketUrl?window.location.protocol+"//"+b.socketUrl:b.socketPort?window.location.protocol+"//"+window.location.hostname+":"+b.socketPort:window.location.protocol+"//"+window.location.hostname,g.socket=io(a,{transports:["websocket","polling"]})}function d(a,b){g.socket&&g.socket.emit(a,b)}function e(b,c){g.socket&&g.socket.on(b,function(b){a(function(){c(b)})})}function f(a){g.socket&&g.socket.removeListener(a)}var g={socket:null};return c(),g={connect:c,emit:d,on:e,removeListener:f,socket:null}}angular.module("view-form").factory("Socket",a),a.$inject=["$timeout","$window"]}(),angular.module("view-form").service("TimeCounter",[function(){var a,b=null;this.timeSpent=0,this.restartClock=function(){a=Date.now(),b=null},this.getTimeElapsed=function(){if(a)return Math.abs(Date.now().valueOf()-a.valueOf())/1e3},this.stopClock=function(){return a&&null===b?(b=Date.now(),this.timeSpent=Math.abs(b.valueOf()-a.valueOf())/1e3,this._startTime=this._endTime=null,this.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("english",{FORM_SUCCESS:"Form entry successfully submitted!",REVIEW:"Review",BACK_TO_FORM:"Go back to Form",EDIT_FORM:"Edit this TellForm",CREATE_FORM:"Create this TellForm",ADVANCEMENT:"{{done}} out of {{total}} answered",CONTINUE_FORM:"Continue to Form",REQUIRED:"required",COMPLETING_NEEDED:"{{answers_not_completed}} answer(s) need completing",OPTIONAL:"optional",ERROR_EMAIL_INVALID:"Please enter a valid email address",ERROR_NOT_A_NUMBER:"Please enter valid numbers only",ERROR_URL_INVALID:"Please a valid url",OK:"OK",ENTER:"press ENTER",YES:"Yes",NO:"No",NEWLINE:"press SHIFT+ENTER to create a newline",CONTINUE:"Continue",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Delete",CANCEL:"Cancel",SUBMIT:"Submit",UPLOAD_FILE:"Upload your File"}),a.preferredLanguage("english").fallbackLanguage("english").useSanitizeValueStrategy("escape")}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("french",{FORM_SUCCESS:"Votre formulaire a été enregistré!",REVIEW:"Incomplet",BACK_TO_FORM:"Retourner au formulaire",EDIT_FORM:"Éditer le Tellform",CREATE_FORM:"Créer un TellForm",ADVANCEMENT:"{{done}} complétés sur {{total}}",CONTINUE_FORM:"Aller au formulaire",REQUIRED:"obligatoire",COMPLETING_NEEDED:"{{answers_not_completed}} réponse(s) doive(nt) être complétée(s)",OPTIONAL:"facultatif",ERROR_EMAIL_INVALID:"Merci de rentrer une adresse mail valide",ERROR_NOT_A_NUMBER:"Merce de ne rentrer que des nombres",ERROR_URL_INVALID:"Merci de rentrer une url valide",OK:"OK",ENTER:"presser ENTRÉE",YES:"Oui",NO:"Non",NEWLINE:"presser SHIFT+ENTER pour créer une nouvelle ligne",CONTINUE:"Continuer",LEGAL_ACCEPT:"J’accepte",LEGAL_NO_ACCEPT:"Je n’accepte pas",DELETE:"Supprimer",CANCEL:"Réinitialiser",SUBMIT:"Enregistrer",UPLOAD_FILE:"Envoyer un fichier",Y:"O",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("german",{FORM_SUCCESS:"Ihre Angaben wurden gespeichert.",REVIEW:"Unvollständig",BACK_TO_FORM:"Zurück zum Formular",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} von {{total}} beantwortet",CONTINUE_FORM:"Zum Formular",REQUIRED:"verpflichtend",COMPLETING_NEEDED:"Es fehlen/fehtl noch {{answers_not_completed}} Antwort(en)",OPTIONAL:"fakultativ",ERROR_EMAIL_INVALID:"Bitte gültige Mailadresse eingeben",ERROR_NOT_A_NUMBER:"Bitte nur Zahlen eingeben",ERROR_URL_INVALID:"Bitte eine gültige URL eingeben",OK:"Okay",ENTER:"Eingabetaste drücken",YES:"Ja",NO:"Nein",NEWLINE:"Für eine neue Zeile SHIFT+ENTER drücken",CONTINUE:"Weiter",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Entfernen",CANCEL:"Canceln",SUBMIT:"Speichern",UPLOAD_FILE:"Datei versenden",Y:"J",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("italian",{FORM_SUCCESS:"Il formulario è stato inviato con successo!",REVIEW:"Incompleto",BACK_TO_FORM:"Ritorna al formulario",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} su {{total}} completate",CONTINUE_FORM:"Vai al formulario",REQUIRED:"obbligatorio",COMPLETING_NEEDED:"{{answers_not_completed}} risposta/e deve/ono essere completata/e",OPTIONAL:"opzionale",ERROR_EMAIL_INVALID:"Si prega di inserire un indirizzo email valido",ERROR_NOT_A_NUMBER:"Si prega di inserire solo numeri",ERROR_URL_INVALID:"Grazie per inserire un URL valido",OK:"OK",ENTER:"premere INVIO",YES:"Sì",NO:"No",NEWLINE:"premere SHIFT+INVIO per creare una nuova linea",CONTINUE:"Continua",LEGAL_ACCEPT:"I accept",LEGAL_NO_ACCEPT:"I don’t accept",DELETE:"Cancella",CANCEL:"Reset",SUBMIT:"Registra",UPLOAD_FILE:"Invia un file",Y:"S",N:"N"})}]),angular.module("view-form").config(["$translateProvider",function(a){a.translations("spanish",{FORM_SUCCESS:"¡El formulario ha sido enviado con éxito!",REVIEW:"Revisar",BACK_TO_FORM:"Regresar al formulario",EDIT_FORM:"",CREATE_FORM:"",ADVANCEMENT:"{{done}} de {{total}} contestadas",CONTINUE_FORM:"Continuar al formulario",REQUIRED:"Información requerida",COMPLETING_NEEDED:"{{answers_not_completed}} respuesta(s) necesita(n) ser completada(s)",OPTIONAL:"Opcional",ERROR_EMAIL_INVALID:"Favor de proporcionar un correo electrónico válido",ERROR_NOT_A_NUMBER:"Por favor, introduzca sólo números válidos",ERROR_URL_INVALID:"Favor de proporcionar un url válido",OK:"OK",ENTER:"pulse INTRO",YES:"Si",NO:"No",NEWLINE:"presione SHIFT+INTRO para crear una nueva línea",CONTINUE:"Continuar",LEGAL_ACCEPT:"Yo acepto",LEGAL_NO_ACCEPT:"Yo no acepto",DELETE:"Eliminar",CANCEL:"Cancelar",SUBMIT:"Registrar",UPLOAD_FILE:"Cargar el archivo",Y:"S",N:"N"})}]); \ No newline at end of file diff --git a/public/dist/form_populate_template_cache.js b/public/dist/form_populate_template_cache.js index 2e0669d5..5aed5566 100644 --- a/public/dist/form_populate_template_cache.js +++ b/public/dist/form_populate_template_cache.js @@ -1,33 +1,35 @@ angular.module('TellForm-Form.form_templates', []).run(['$templateCache', function($templateCache) { "use strict"; + $templateCache.put("form_modules/forms/base/views/form-not-found.client.view.html", + "<script>$(\".loader\").fadeOut(\"slow\");</script><section class=\"public-form auth sigin-view valign-wrapper\"><div class=\"row valign\"><h3 class=\"col-md-12 text-center\">404 - Form Does not Exist</h3><div class=\"col-md-4 col-md-offset-4\"><div class=\"col-md-12 text-center\" style=\"padding-bottom: 50px\">The form you are trying to access does not exist. Sorry about that!</div></div></div></section>"); $templateCache.put("form_modules/forms/base/views/form-unauthorized.client.view.html", - "<section class=\"auth sigin-view valign-wrapper\"><div class=\"row valign\"><h3 class=\"col-md-12 text-center\">Not Authorized to Access Form</h3><div class=\"col-md-4 col-md-offset-4\"><div class=\"col-md-12 text-center\" style=\"padding-bottom: 50px\">The form you are trying to access is currently private and not accesible publically.<br>If you are the owner of the form, you can set it to \"Public\" in the \"Configuration\" panel in the form admin.</div></div></div></section>"); + "<script>$(\".loader\").fadeOut(\"slow\");</script><section class=\"public-form auth sigin-view valign-wrapper\"><div class=\"row valign\"><h3 class=\"col-md-12 text-center\">Not Authorized to Access Form</h3><div class=\"col-md-4 col-md-offset-4\"><div class=\"col-md-12 text-center\" style=\"padding-bottom: 50px\">The form you are trying to access is currently private and not accesible publically.<br>If you are the owner of the form, you can set it to \"Public\" in the \"Configuration\" panel in the form admin.</div></div></div></section>"); $templateCache.put("form_modules/forms/base/views/submit-form.client.view.html", - "<section class=public-form ng-style=\"{ 'background-color': myform.design.colors.backgroundColor }\"><submit-form-directive myform=myform></submit-form-directive></section><script ng-if=myform.analytics.gaCode>window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;\n" + + "<section class=public-form><submit-form-directive myform=myform></submit-form-directive></section><script ng-if=myform.analytics.gaCode>window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;\n" + " ga('create', '{{myform.analytics.gaCode}}', 'auto'); ga('send', 'pageview');</script><script ng-if=myform.analytics.gaCode src=https://www.google-analytics.com/analytics.js async defer></script>"); $templateCache.put("form_modules/forms/base/views/directiveViews/entryPage/startPage.html", "<div class=\"field row text-center\"><div class=\"col-xs-12 text-center\"><h1>{{pageData.introTitle}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-left\"><p style=color:#ddd>{{pageData.introParagraph}}</p></div></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in pageData.buttons\" class=text-center style=display:inline><button class=\"btn btn-info\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none; color: inherit\">{{button.text}}</a></button></p></div><div class=\"row form-actions\"><p class=\"col-xs-3 col-xs-offset-3 text-center\"><button class=\"btn btn-info\" type=button><a ng-click=exitpageData() style=\"color:white; font-size: 1.6em; text-decoration: none\">{{ 'CONTINUE_FORM' | translate }}</a></button></p></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/date.html", - "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=\"!field.required && !field.fieldValue\">{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div class=\"control-group input-append\"><input class=focusOn ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" ng-class=\"{ 'no-border': !!field.fieldValue }\" ui-date=dateOptions ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required placeholder=MM/DD/YYYY on-tab-key=nextField() on-tab-and-shift-key=prevField() ng-change=nextField()></div></div></div>"); + "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=\"!field.required && !field.fieldValue\">{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div class=\"control-group input-append\"><input class=focusOn ng-focus=\"setActiveField(field._id, null, false)\" ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" ng-class=\"{ 'no-border': !!field.fieldValue }\" ui-date=dateOptions ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required placeholder=MM/DD/YYYY on-tab-key=nextField() on-tab-and-shift-key=prevField() ng-change=nextField()></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/dropdown.html", - "<div class=\"field row dropdown\" ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><ui-select ng-model=field.fieldValue theme=selectize search-enabled=true search-by=option_value set-search-to-answer=true ng-required=field.required on-tab-and-shift-key=prevField() on-tab-key=nextField() ng-change=nextField()><ui-select-match placeholder=\"Type or select an option\"></ui-select-match><ui-select-choices repeat=\"option in field.fieldOptions | filter: $select.search\" ng-class=\"{'active': option.option_value === field.fieldValue }\"><span ng-bind-html=\"option.option_value | highlight: $select.search\"></span></ui-select-choices></ui-select></div></div><br>"); + "<div class=\"field row dropdown\" ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><ui-select ng-model=field.fieldValue ng-focus=\"setActiveField(field._id, null, false)\" theme=selectize search-enabled=true search-by=option_value set-search-to-answer=true ng-required=field.required on-tab-and-shift-key=prevField() on-tab-key=nextField() ng-change=nextField()><ui-select-match placeholder=\"Type or select an option\"></ui-select-match><ui-select-choices repeat=\"option in field.fieldOptions | filter: $select.search\" ng-class=\"{'active': option.option_value === field.fieldValue }\"><span ng-bind-html=\"option.option_value | highlight: $select.search\"></span></ui-select-choices></ui-select></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/hidden.html", "<input type=hidden>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/legal.html", "<div class=\"field row radio legal\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-valid-key=nextField()><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><br><p class=col-xs-12>{{field.description}}</p></div><div class=\"col-xs-12 field-input container\"><div class=row-fluid><label class=\"btn col-md-5 col-xs-12\" ng-class=\"{activeBtn: field.fieldValue == 'true'}\"><input class=focusOn ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" type=radio value=true ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter style=float:left>Y</div><span>{{ 'LEGAL_ACCEPT' | translate }}</span></label><label class=\"btn col-md-5 col-md-offset-1 col-xs-12\" ng-class=\"{activeBtn: field.fieldValue == 'false'}\"><input class=focusOn ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" type=radio value=false ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter style=float:left>N</div><span>{{ 'LEGAL_NO_ACCEPT' | translate }}</span></label></div></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/radio.html", - "<div class=\"field row radio\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-option field=field ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div ng-repeat=\"option in field.fieldOptions\" class=row-fluid><label class=\"btn col-md-4 col-xs-12 col-sm-12\" style=\"margin: 0.5em; padding-left:30px\" ng-class=\"{activeBtn: field.fieldValue == field.fieldOptions[$index].option_value}\"><div class=letter style=float:left>{{$index+1}}</div><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" type=radio class=focusOn value={{option.option_value}} ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"$root.nextField()\"> <span ng-bind=option.option_value></span></label></div></div></div><br>"); + "<div class=\"field row radio\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() key-to-option field=field ng-if=\"field.fieldOptions.length > 0\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><div ng-repeat=\"option in field.fieldOptions\" class=row-fluid><label class=\"btn col-md-4 col-xs-12 col-sm-12\" style=\"margin: 0.5em; padding-left:30px\" ng-class=\"{activeBtn: field.fieldValue == field.fieldOptions[$index].option_value}\"><div class=letter style=float:left>{{$index+1}}</div><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" ng-focus=\"setActiveField(field._id, null, false)\" type=radio class=focusOn value={{option.option_value}} ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"$root.nextField()\"> <span ng-bind=option.option_value></span></label></div></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/rating.html", "<div class=\"textfield field row\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><input-stars max={{field.ratingOptions.steps}} ng-init=\"field.fieldValue = 1\" on-shape-click=true on-star-click=nextField() icon-full={{field.ratingOptions.shape}} icon-base=\"fa fa-3x\" icon-empty={{field.ratingOptions.shape}} ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() class=\"angular-input-stars focusOn\"></input-stars></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/statement.html", - "<div class=\"statement field row\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField()><div class=\"row field-title field-title\"><div class=col-xs-1><i class=\"fa fa-quote-left fa-1\"></i></div><h2 class=\"text-left col-xs-9\">{{field.title}}</h2><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"row field-title field-input\"><p class=col-xs-12 ng-if=field.description.length>{{field.description}}</p><br><div class=\"col-xs-offset-1 col-xs-11\"><button class=\"btn focusOn\">ng-style=\"{'font-size': '1.3em', 'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=\"nextField()\"> {{ 'CONTINUE' | translate }}</button></div></div></div>"); + "<div class=\"statement field row\" on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField()><div class=\"row field-title field-title\"><div class=col-xs-1><i class=\"fa fa-quote-left fa-1\"></i></div><h2 class=\"text-left col-xs-9\">{{field.title}}</h2><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"row field-title field-input\"><p class=col-xs-12 ng-if=field.description.length>{{field.description}}</p><br><div class=\"col-xs-offset-1 col-xs-11\"><button class=\"btn focusOn\" ng-style=\"{'font-size': '1.3em', 'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=nextField()>{{ 'CONTINUE' | translate }}</button></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/textarea.html", - "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><small>{{ 'NEWLINE' | translate }}</small><p><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><small style=font-size:0.6em>Press SHIFT+ENTER to add a newline</small><textarea class=\"textarea focusOn\" type=text ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-class=\"{ 'no-border': !!field.fieldValue }\" value={{field.fieldValue}} ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() style=\"border: none; border-left: lightgrey dashed 2px\">\n" + + "<div class=\"field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><small>{{ 'NEWLINE' | translate }}</small><p><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><small style=font-size:0.6em>Press SHIFT+ENTER to add a newline</small><textarea class=\"textarea focusOn\" type=text ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-class=\"{ 'no-border': !!field.fieldValue }\" value={{field.fieldValue}} ng-required=field.required on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() style=\"border: none; border-left: lightgrey dashed 2px\">\n" + " </textarea></div></div><div><div class=\"btn btn-lg btn-default\" style=\"padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)\"><button ng-disabled=\"!field.fieldValue || forms.myForm.{{field.fieldType}}{{$index}}.$invalid\" ng-style=\"{'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=$root.nextField() class=\"btn col-sm-5 col-xs-5\">{{ 'OK' | translate }} <i class=\"fa fa-check\"></i></button><div class=\"col-sm-3 col-xs-6\" style=margin-top:0.2em><small style=\"color:#ddd; font-size:70%\">{{ 'ENTER' | translate }}</small></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/textfield.html", - "<div class=\"textfield field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title row-fluid\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=col-xs-12><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>({{ 'OPTIONAL' | translate }})</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" name={{field.fieldType}}{{index}} type={{input_type}} ng-pattern=validateRegex placeholder={{placeholder}} ng-class=\"{ 'no-border': !!field.fieldValue }\" class=\"focusOn text-field-input\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" value=field.fieldValue on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() ng-required=field.required aria-describedby=\"inputError2Status\"></div><div class=col-xs-12><div ng-show=\"forms.myForm.{{field.fieldType}}{{index}}.$invalid && !!forms.myForm.{{field.fieldType}}{{index}}.$viewValue \" class=\"alert alert-danger\" role=alert><span class=\"glyphicon glyphicon-exclamation-sign\" aria-hidden=true></span> <span class=sr-only>Error:</span> <span ng-if=\"field.fieldType == 'email'\">{{ 'ERROR_EMAIL_INVALID' | translate }}</span> <span ng-if=\"field.fieldType == 'number'\">{{ 'ERROR_NOT_A_NUMBER' | translate }}</span> <span ng-if=\"field.fieldType == 'link'\">{{ 'ERROR_URL_INVALID' | translate }}</span></div></div></div><div><div class=\"btn btn-lg btn-default\" style=\"padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)\"><button ng-disabled=\"!field.fieldValue || field.$invalid\" ng-style=\"{'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=nextField() class=\"btn col-sm-5 col-xs-5\">{{ 'OK' | translate }} <i class=\"fa fa-check\"></i></button><div class=\"col-xs-6 col-sm-3\" style=margin-top:0.2em><small style=\"color:#ddd; font-size:70%\">{{ 'ENTER' | translate }}</small></div></div></div>"); + "<div class=\"textfield field row\" ng-click=\"setActiveField(field._id, index, true)\"><div class=\"col-xs-12 field-title row-fluid\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=col-xs-12><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>({{ 'OPTIONAL' | translate }})</span></h3><p class=col-xs-12><small>{{field.description}}</small></p></div><div class=\"col-xs-12 field-input\"><input ng-style=\"{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}\" name={{field.fieldType}}{{index}} type={{input_type}} ng-pattern=validateRegex placeholder={{placeholder}} ng-class=\"{ 'no-border': !!field.fieldValue }\" class=\"focusOn text-field-input\" ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" value=field.fieldValue on-enter-or-tab-key=nextField() on-tab-and-shift-key=prevField() ng-required=field.required aria-describedby=\"inputError2Status\"></div><div class=col-xs-12><div ng-show=\"forms.myForm.{{field.fieldType}}{{index}}.$invalid && !!forms.myForm.{{field.fieldType}}{{index}}.$viewValue \" class=\"alert alert-danger\" role=alert><span class=\"glyphicon glyphicon-exclamation-sign\" aria-hidden=true></span> <span class=sr-only>Error:</span> <span ng-if=\"field.fieldType == 'email'\">{{ 'ERROR_EMAIL_INVALID' | translate }}</span> <span ng-if=\"field.fieldType == 'number'\">{{ 'ERROR_NOT_A_NUMBER' | translate }}</span> <span ng-if=\"field.fieldType == 'link'\">{{ 'ERROR_URL_INVALID' | translate }}</span></div></div></div><div><div class=\"btn btn-lg btn-default\" ng-disabled=\"!field.fieldValue || field.$invalid\" style=\"padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)\"><button ng-disabled=\"!field.fieldValue || field.$invalid\" ng-style=\"{'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}\" ng-click=nextField() class=\"btn col-sm-5 col-xs-5\">{{ 'OK' | translate }} <i class=\"fa fa-check\"></i></button><div class=\"col-xs-6 col-sm-3\" style=margin-top:0.2em><small style=\"color:#ddd; font-size:70%\">{{ 'ENTER' | translate }}</small></div></div></div>"); $templateCache.put("form_modules/forms/base/views/directiveViews/field/yes_no.html", - "<div class=\"field row radio\" ng-click=\"setActiveField(field._id, index, true)\" key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-tab-key=nextField() on-tab-and-shift-key=prevField() on-valid-key=nextField()><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=row><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=row>{{field.description}}</p></div><div class=\"col-xs-12 field-input\"><div class=row><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=true class=focusOn style=\"opacity: 0; margin-left: 0px\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'Y' | translate }}</div><span>{{ 'YES' | translate }}</span> <i ng-show=\"field.fieldValue === 'true'\" class=\"fa fa-check\" aria-hidden=true></i></label></div><div class=row style=\"margin-top: 10px\"><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=false style=\"opacity:0; margin-left:0px\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'N' | translate }}</div><span>{{ 'NO' | translate }}</span> <i ng-show=\"field.fieldValue === 'false'\" class=\"fa fa-check\" aria-hidden=true></i></label></div></div></div><br>"); + "<div class=\"field row radio\" ng-click=\"setActiveField(field._id, index, true)\" key-to-truthy key-char-truthy=y key-char-falsey=n field=field on-tab-key=nextField() on-tab-and-shift-key=prevField() on-valid-key=nextField()><div class=\"col-xs-12 field-title\" ng-style=\"{'color': design.colors.questionColor}\"><h3 class=row><small class=field-number>{{index+1}} <i class=\"fa fa-angle-double-right\" aria-hidden=true></i></small> {{field.title}} <span class=required-error ng-show=!field.required>{{ 'OPTIONAL' | translate }}</span></h3><p class=row>{{field.description}}</p></div><div class=\"col-xs-12 field-input\"><div class=row><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=true class=focusOn style=\"opacity: 0; margin-left: 0px\" ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'Y' | translate }}</div><span>{{ 'YES' | translate }}</span> <i ng-show=\"field.fieldValue === 'true'\" class=\"fa fa-check\" aria-hidden=true></i></label></div><div class=row style=\"margin-top: 10px\"><label class=\"btn btn-default col-md-2 col-sm-3 col-xs-7\" style=\"background: rgba(0,0,0,0.1); text-align:left\"><input type=radio value=false style=\"opacity:0; margin-left:0px\" ng-focus=\"setActiveField(field._id, null, false)\" ng-model=field.fieldValue ng-model-options=\"{ debounce: 250 }\" ng-required=field.required ng-change=\"nextField()\"><div class=letter>{{ 'N' | translate }}</div><span>{{ 'NO' | translate }}</span> <i ng-show=\"field.fieldValue === 'false'\" class=\"fa fa-check\" aria-hidden=true></i></label></div></div></div><br>"); $templateCache.put("form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html", - "<section class=\"overlay submitform\" ng-if=\"!ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))\"></section><section class=\"overlay previewform submitform\" ng-if=\"ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))\"></section><div ng-show=\"!myform.submitted && myform.startPage.showStart\" class=form-submitted style=\"padding-top: 35vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; nont-size: 25px\" ng-style=\"{'color': form.design.colors.questionColor}\">{{myform.startPage.introTitle}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': form.design.colors.questionColor}\">{{myform.startPage.introParagraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=exitStartPage() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.startPage.introButtonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.startPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div><div class=form-fields ng-show=\"!myform.submitted && !myform.startPage.showStart\" ng-style=\"{ 'border-color': myform.design.colors.buttonTextColor }\"><div class=row><form name=forms.myForm novalidate class=\"submission-form col-sm-12 col-md-offset-1 col-md-10\"><div ng-repeat=\"field in myform.form_fields\" ng-if=!field.deletePreserved data-index={{$index}} data-id={{field._id}} ng-class=\"{activeField: selected._id == field._id }\" class=\"row field-directive\"><field-directive field=field design=myform.design index=$index forms=forms></field-directive></div></form></div><div class=\"row form-actions\" id=submit_field ng-class=\"{activeField: selected._id == 'submit_field' }\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor}\" style=\"border-top: 1px solid #ddd; margin-right: -13%; margin-left: -13%; margin-top: 30vh; height: 100vh\"><div class=\"col-xs-12 text-left\" style=\"background-color:#990000; color:white\" ng-if=forms.myForm.$invalid>{{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }}</div><button ng-if=!forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" v-busy=loading v-busy-label=\"Please wait\" v-pressable ng-disabled=\"loading || forms.myForm.$invalid\" ng-click=submitForm() on-enter-key=submitForm() on-enter-key-disabled=\"loading || forms.myForm.$invalid\" ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em\">{{ 'SUBMIT' | translate }}</button> <button ng-if=forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" ng-click=goToInvalid() on-enter-key=goToInvalid() on-enter-key-disabled=!forms.myForm.$invalid style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white\">{{ 'REVIEW' | translate }}</button><div class=\"col-sm-2 hidden-xs\" style=\"font-size: 75%; margin-top:3.25em\"><small>{{ 'ENTER' | translate }}</small></div></div><section ng-if=!myform.hideFooter class=\"navbar navbar-fixed-bottom\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor, 'padding-top': '15px', 'border-top': '2px '+ myform.design.colors.buttonTextColor +' solid', 'color':myform.design.colors.buttonTextColor}\"><div class=container-fluid><div class=row><div class=\"col-sm-5 col-md-6 col-xs-5\" ng-show=!myform.submitted><p class=lead>{{ 'ADVANCEMENT' | translate:translateAdvancementData }}</p></div><div class=\"col-md-6 col-md-offset-0 col-sm-offset-2 col-sm-3 col-xs-offset-1 col-xs-6 row\"><div class=\"col-md-4 col-md-offset-2 hidden-sm hidden-xs\"><a href=/#!/forms class=btn ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\">{{ 'CREATE_FORM' | translate }}</a></div><div class=\"col-md-4 col-sm-10 col-md-offset-0 col-sm-offset-2 col-xs-12 row\"><button class=\"btn btn-lg col-xs-6\" id=focusDownButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=nextField() ng-disabled=\"selected.index > myform.form_fields.length-1\"><i class=\"fa fa-chevron-down\"></i></button> <button class=\"btn btn-lg col-xs-6\" id=focusUpButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=prevField() ng-disabled=\"selected.index == 0\"><i class=\"fa fa-chevron-up\"></i></button></div></div></div></div></section></div><div ng-if=\"myform.submitted && !loading && !myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=\"field row text-center\" ng-style=\"{'color': myform.design.colors.questionColor}\"><div class=\"col-xs-12 col-sm-12 col-md-6 col-md-offset-3 text-center\">{{ 'FORM_SUCCESS' | translate }}</div></div><div class=\"row form-actions\"><p class=text-center><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{ 'BACK_TO_FORM' | translate }}</span></button></p></div></div><div ng-if=\"myform.submitted && !loading && myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; font-size: 25px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.title}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.paragraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.endPage.buttonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.endPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div>"); + "<div ng-show=\"!myform.submitted && myform.startPage.showStart\" class=form-submitted style=\"padding-top: 35vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; nont-size: 25px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.startPage.introTitle}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.startPage.introParagraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=exitStartPage() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.startPage.introButtonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.startPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div><div class=form-fields ng-show=\"!myform.submitted && !myform.startPage.showStart\" ng-style=\"{ 'border-color': myform.design.colors.buttonTextColor }\"><div class=\"row form-field-wrapper\"><form name=forms.myForm novalidate class=submission-form><div ng-repeat=\"field in myform.form_fields\" ng-if=!field.deletePreserved data-index={{$index}} data-id={{field._id}} ng-class=\"{activeField: selected._id == field._id }\" class=\"row field-directive\"><field-directive field=field design=myform.design index=$index forms=forms></field-directive></div><div class=\"row form-actions\" id=submit_field ng-class=\"{activeField: selected._id == 'submit_field' }\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor}\" style=\"border-top: 1px solid #ddd; margin-top: 30vh; height: 100vh; margin-left: 1%; margin-right: 1%\" on-tab-and-shift-key=prevField() on-tab-key=nextField() on-enter-key=submitForm()><div class=\"col-xs-12 text-left\" style=\"background-color:#990000; color:white\" ng-if=forms.myForm.$invalid>{{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }}</div><button ng-if=!forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" v-busy=loading v-busy-label=\"Please wait\" v-pressable ng-disabled=\"loading || forms.myForm.$invalid\" ng-click=submitForm() on-enter-key-disabled=\"loading || forms.myForm.$invalid\" ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em\">{{ 'SUBMIT' | translate }}</button> <button ng-if=forms.myForm.$invalid class=\"Button btn col-sm-2 col-xs-8 focusOn\" ng-click=goToInvalid() on-enter-key=goToInvalid() on-enter-key-disabled=!forms.myForm.$invalid style=\"font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white\">{{ 'REVIEW' | translate }}</button><div class=\"col-sm-2 hidden-xs\" style=\"font-size: 75%; margin-top:3.25em\"><small>{{ 'ENTER' | translate }}</small></div></div></form></div><section ng-if=!myform.hideFooter class=\"navbar navbar-fixed-bottom\" ng-style=\"{ 'background-color':myform.design.colors.buttonColor, 'padding-top': '15px', 'border-top': '2px '+ myform.design.colors.buttonTextColor +' solid', 'color':myform.design.colors.buttonTextColor}\"><div class=container-fluid><div class=row><div class=\"col-sm-5 col-md-6 col-xs-5\" ng-show=!myform.submitted><p class=lead>{{ 'ADVANCEMENT' | translate:translateAdvancementData }}</p></div><div class=\"col-md-6 col-md-offset-0 col-sm-offset-2 col-sm-3 col-xs-offset-1 col-xs-6 row\"><div class=\"col-md-4 col-md-offset-2 hidden-sm hidden-xs\"><a href=/#!/forms class=btn ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\">{{ 'CREATE_FORM' | translate }}</a></div><div class=\"col-md-4 col-sm-10 col-md-offset-0 col-sm-offset-2 col-xs-12 row\"><button class=\"btn btn-lg col-xs-6\" id=focusDownButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=nextField() ng-disabled=\"selected.index > myform.form_fields.length-1\"><i class=\"fa fa-chevron-down\"></i></button> <button class=\"btn btn-lg col-xs-6\" id=focusUpButton ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\" ng-click=prevField() ng-disabled=\"selected.index == 0\"><i class=\"fa fa-chevron-up\"></i></button></div></div></div></div></section></div><div ng-if=\"myform.submitted && !loading && !myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=\"field row text-center\" ng-style=\"{'color': myform.design.colors.questionColor}\"><div class=\"col-xs-12 col-sm-12 col-md-6 col-md-offset-3 text-center\">{{ 'FORM_SUCCESS' | translate }}</div></div><div class=\"row form-actions\"><p class=text-center><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{ 'BACK_TO_FORM' | translate }}</span></button></p></div></div><div ng-if=\"myform.submitted && !loading && myform.endPage.showEnd\" class=form-submitted ng-style=\"{'color':myform.design.colors.buttonTextColor}\" style=\"padding-top: 5vh\"><div class=row><div class=\"col-xs-12 text-center\" style=\"overflow-wrap: break-word\"><h1 style=\"font-weight: 400; font-size: 25px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.title}}</h1></div><div class=\"col-xs-10 col-xs-offset-1 text-center\" style=\"overflow-wrap: break-word\"><p style=\"font-weight: 100; font-size: 16px\" ng-style=\"{'color': myform.design.colors.questionColor}\">{{myform.endPage.paragraph}}</p></div></div><div class=\"row form-actions text-center\" style=\"padding: 5px 25px 5px 25px\"><button ng-click=reloadForm() class=btn type=button ng-style=\"{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}\"><span style=\"font-size: 1.6em\">{{myform.endPage.buttonText}}</span></button></div><div class=\"row form-actions\" style=\"padding-bottom:3em; padding-left: 1em; padding-right: 1em\"><p ng-repeat=\"button in myform.endPage.buttons\" class=text-center style=display:inline><button class=btn style=\"background-color:rgb(156, 226, 235)\" type=button ng-style=\"{'background-color':button.bgColor, 'color':button.color}\"><a href={{button.url}} style=\"font-size: 1.6em; text-decoration: none\" ng-style=\"{'color':button.color}\">{{button.text}}</a></button></p></div></div>"); }]); diff --git a/public/dist/vendor.min.js b/public/dist/vendor.min.js index 0e01a1b0..a7a47ac7 100644 --- a/public/dist/vendor.min.js +++ b/public/dist/vendor.min.js @@ -9,11 +9,11 @@ a.put("bootstrap/no-choice.tpl.html",'<ul class="ui-select-no-choice dropdown-me this.seconds=+a}},s:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.seconds=+a}},a:{regex:b.DATETIME_FORMATS.AMPMS.join("|"),apply:function(a){12===this.hours&&(this.hours=0),"PM"===a&&(this.hours+=12)}}}},this.init(),this.parse=function(c,g,i){if(!angular.isString(c)||!g)return c;g=b.DATETIME_FORMATS[g]||g,g=g.replace(h,"\\$&"),b.id!==f&&this.init(),this.parsers[g]||(this.parsers[g]=d(g));var j=this.parsers[g],k=j.regex,l=j.map,m=c.match(k);if(m&&m.length){var n,o;angular.isDate(i)&&!isNaN(i.getTime())?n={year:i.getFullYear(),month:i.getMonth(),date:i.getDate(),hours:i.getHours(),minutes:i.getMinutes(),seconds:i.getSeconds(),milliseconds:i.getMilliseconds()}:(i&&a.warn("dateparser:","baseDate is not a valid date"),n={year:1900,month:0,date:1,hours:0,minutes:0,seconds:0,milliseconds:0});for(var p=1,q=m.length;p<q;p++){var r=l[p-1];r.apply&&r.apply.call(n,m[p])}return e(n.year,n.month,n.date)&&(angular.isDate(i)&&!isNaN(i.getTime())?(o=new Date(i),o.setFullYear(n.year,n.month,n.date,n.hours,n.minutes,n.seconds,n.milliseconds||0)):o=new Date(n.year,n.month,n.date,n.hours,n.minutes,n.seconds,n.milliseconds||0)),o}}}]),angular.module("ui.bootstrap.dateparser").value("$dateParserSuppressWarning",!1).service("dateParser",["$log","$dateParserSuppressWarning","uibDateParser",function(a,b,c){b||a.warn("dateParser is now deprecated. Use uibDateParser instead."),angular.extend(this,c)}]),angular.module("ui.bootstrap.position",[]).factory("$uibPosition",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.position").value("$positionSuppressWarning",!1).service("$position",["$log","$positionSuppressWarning","$uibPosition",function(a,b,c){b||a.warn("$position is now deprecated. Use $uibPosition instead."),angular.extend(this,c)}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).value("$datepickerSuppressError",!1).constant("uibDatepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null,shortcutPropagation:!1}).controller("UibDatepickerController",["$scope","$attrs","$parse","$interpolate","$log","dateFilter","uibDatepickerConfig","$datepickerSuppressError",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","showWeeks","startingDay","yearRange","shortcutPropagation"],function(c,e){i[c]=angular.isDefined(b[c])?e<6?d(b[c])(a.$parent):a.$parent.$eval(b[c]):g[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=g[d]?new Date(g[d]):null}),angular.forEach(["minMode","maxMode"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(c){i[d]=angular.isDefined(c)?c:b[d],a[d]=i[d],("minMode"==d&&i.modes.indexOf(a.datepickerMode)<i.modes.indexOf(i[d])||"maxMode"==d&&i.modes.indexOf(a.datepickerMode)>i.modes.indexOf(i[d]))&&(a.datepickerMode=i[d])}):(i[d]=g[d]||null,a[d]=i[d])}),a.datepickerMode=a.datepickerMode||g.datepickerMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),angular.isDefined(b.initDate)?(this.activeDate=a.$parent.$eval(b.initDate)||new Date,a.$parent.$watch(b.initDate,function(a){a&&(j.$isEmpty(j.$modelValue)||j.$invalid)&&(i.activeDate=a,i.refreshView())})):this.activeDate=new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)&&(a.activeDateId=b.uid,!0)},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$viewValue){var a=new Date(j.$viewValue),b=!isNaN(a);b?this.activeDate=a:h||e.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$viewValue?new Date(j.$viewValue):null;j.$setValidity("dateDisabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$viewValue?new Date(j.$viewValue):null;return{date:a,label:f(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date),customClass:this.customClass(a)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.customClass=function(b){return a.customClass({date:b,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$viewValue?new Date(j.$viewValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&b===-1||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){i.element[0].focus()};a.$on("uib:datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),i.shortcutPropagation||b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate)}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):a.toggleMode("up"===c?1:-1)}}]).controller("UibDaypickerController",["$scope","$element","dateFilter",function(a,b,c){function d(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?f[b]:29}function e(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}var f=[31,28,31,30,31,30,31,31,30,31,30,31];this.step={months:1},this.element=b,this.init=function(b){angular.extend(b,this),a.showWeeks=b.showWeeks,b.refreshView()},this.getDates=function(a,b){for(var c,d=new Array(b),e=new Date(a),f=0;f<b;)c=new Date(e),d[f++]=c,e.setDate(e.getDate()+1);return d},this._refreshView=function(){var b=this.activeDate.getFullYear(),d=this.activeDate.getMonth(),f=new Date(this.activeDate);f.setFullYear(b,d,1);var g=this.startingDay-f.getDay(),h=g>0?7-g:-g,i=new Date(f);h>0&&i.setDate(-h+1);for(var j=this.getDates(i,42),k=0;k<42;k++)j[k]=angular.extend(this.createDateObject(j[k],this.formatDay),{secondary:j[k].getMonth()!==d,uid:a.uniqueId+"-"+k});a.labels=new Array(7);for(var l=0;l<7;l++)a.labels[l]={abbr:c(j[l].date,this.formatDayHeader),full:c(j[l].date,"EEEE")};if(a.title=c(this.activeDate,this.formatDayTitle),a.rows=this.split(j,7),a.showWeeks){a.weekNumbers=[];for(var m=(11-this.startingDay)%7,n=a.rows.length,o=0;o<n;o++)a.weekNumbers.push(e(a.rows[o][m].date))}},this.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},this.handleKeyDown=function(a,b){var c=this.activeDate.getDate();if("left"===a)c-=1;else if("up"===a)c-=7;else if("right"===a)c+=1;else if("down"===a)c+=7;else if("pageup"===a||"pagedown"===a){var e=this.activeDate.getMonth()+("pageup"===a?-1:1);this.activeDate.setMonth(e,1),c=Math.min(d(this.activeDate.getFullYear(),this.activeDate.getMonth()),c)}else"home"===a?c=1:"end"===a&&(c=d(this.activeDate.getFullYear(),this.activeDate.getMonth()));this.activeDate.setDate(c)}}]).controller("UibMonthpickerController",["$scope","$element","dateFilter",function(a,b,c){this.step={years:1},this.element=b,this.init=function(a){angular.extend(a,this),a.refreshView()},this._refreshView=function(){for(var b,d=new Array(12),e=this.activeDate.getFullYear(),f=0;f<12;f++)b=new Date(this.activeDate),b.setFullYear(e,f,1),d[f]=angular.extend(this.createDateObject(b,this.formatMonth),{uid:a.uniqueId+"-"+f});a.title=c(this.activeDate,this.formatMonthTitle),a.rows=this.split(d,3)},this.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},this.handleKeyDown=function(a,b){var c=this.activeDate.getMonth();if("left"===a)c-=1;else if("up"===a)c-=3;else if("right"===a)c+=1;else if("down"===a)c+=3;else if("pageup"===a||"pagedown"===a){var d=this.activeDate.getFullYear()+("pageup"===a?-1:1);this.activeDate.setFullYear(d)}else"home"===a?c=0:"end"===a&&(c=11);this.activeDate.setMonth(c)}}]).controller("UibYearpickerController",["$scope","$element","dateFilter",function(a,b,c){function d(a){return parseInt((a-1)/e,10)*e+1}var e;this.element=b,this.yearpickerInit=function(){e=this.yearRange,this.step={years:e}},this._refreshView=function(){for(var b,c=new Array(e),f=0,g=d(this.activeDate.getFullYear());f<e;f++)b=new Date(this.activeDate),b.setFullYear(g+f,0,1),c[f]=angular.extend(this.createDateObject(b,this.formatYear),{uid:a.uniqueId+"-"+f});a.title=[c[0].label,c[e-1].label].join(" - "),a.rows=this.split(c,5)},this.compare=function(a,b){return a.getFullYear()-b.getFullYear()},this.handleKeyDown=function(a,b){var c=this.activeDate.getFullYear();"left"===a?c-=1:"up"===a?c-=5:"right"===a?c+=1:"down"===a?c+=5:"pageup"===a||"pagedown"===a?c+=("pageup"===a?-1:1)*this.step.years:"home"===a?c=d(this.activeDate.getFullYear()):"end"===a&&(c=d(this.activeDate.getFullYear())+e-1),this.activeDate.setFullYear(c)}}]).directive("uibDatepicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"template/datepicker/datepicker.html"},scope:{datepickerMode:"=?",dateDisabled:"&",customClass:"&",shortcutPropagation:"&?"},require:["uibDatepicker","^ngModel"],controller:"UibDatepickerController",controllerAs:"datepicker",link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}).directive("uibDaypicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"template/datepicker/day.html"},require:["^?uibDatepicker","uibDaypicker","^?datepicker"],controller:"UibDaypickerController",link:function(a,b,c,d){var e=d[0]||d[2],f=d[1];f.init(e)}}}).directive("uibMonthpicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"template/datepicker/month.html"},require:["^?uibDatepicker","uibMonthpicker","^?datepicker"],controller:"UibMonthpickerController",link:function(a,b,c,d){var e=d[0]||d[2],f=d[1];f.init(e)}}}).directive("uibYearpicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"template/datepicker/year.html"},require:["^?uibDatepicker","uibYearpicker","^?datepicker"],controller:"UibYearpickerController",link:function(a,b,c,d){var e=d[0]||d[2];angular.extend(e,d[1]),e.yearpickerInit(),e.refreshView()}}}).constant("uibDatepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",datepickerPopupTemplateUrl:"template/datepicker/popup.html",datepickerTemplateUrl:"template/datepicker/datepicker.html",html5Types:{date:"yyyy-MM-dd","datetime-local":"yyyy-MM-ddTHH:mm:ss.sss",month:"yyyy-MM"},currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0,onOpenFocus:!0}).controller("UibDatepickerPopupController",["$scope","$element","$attrs","$compile","$parse","$document","$rootScope","$uibPosition","dateFilter","uibDateParser","uibDatepickerPopupConfig","$timeout",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function n(b){angular.isNumber(b)&&(b=new Date(b));{if(!b)return null;if(angular.isDate(b)&&!isNaN(b))return b;if(angular.isString(b)){var c=j.parse(b,r,a.date);return isNaN(c)?void 0:c}}}function o(a,b){var d=a||b;if(!c.ngRequired&&!d)return!0;if(angular.isNumber(d)&&(d=new Date(d)),d){if(angular.isDate(d)&&!isNaN(d))return!0;if(angular.isString(d)){var e=j.parse(d,r);return!isNaN(e)}return!1}return!0}function p(c){var d=A[0],e=b[0].contains(c.target),f=void 0!==d.contains&&d.contains(c.target);!a.isOpen||e||f||a.$apply(function(){a.isOpen=!1})}function q(c){27===c.which&&a.isOpen?(c.preventDefault(),c.stopPropagation(),a.$apply(function(){a.isOpen=!1}),b[0].focus()):40!==c.which||a.isOpen||(c.preventDefault(),c.stopPropagation(),a.$apply(function(){a.isOpen=!0}))}var r,s,t,u,v,w,x,y,z,A,B={},C=!1;a.watchData={},this.init=function(h){if(z=h,s=angular.isDefined(c.closeOnDateSelection)?a.$parent.$eval(c.closeOnDateSelection):k.closeOnDateSelection,t=angular.isDefined(c.datepickerAppendToBody)?a.$parent.$eval(c.datepickerAppendToBody):k.appendToBody,u=angular.isDefined(c.onOpenFocus)?a.$parent.$eval(c.onOpenFocus):k.onOpenFocus,v=angular.isDefined(c.datepickerPopupTemplateUrl)?c.datepickerPopupTemplateUrl:k.datepickerPopupTemplateUrl,w=angular.isDefined(c.datepickerTemplateUrl)?c.datepickerTemplateUrl:k.datepickerTemplateUrl,a.showButtonBar=angular.isDefined(c.showButtonBar)?a.$parent.$eval(c.showButtonBar):k.showButtonBar,k.html5Types[c.type]?(r=k.html5Types[c.type],C=!0):(r=c.datepickerPopup||c.uibDatepickerPopup||k.datepickerPopup,c.$observe("uibDatepickerPopup",function(a,b){var c=a||k.datepickerPopup;if(c!==r&&(r=c,z.$modelValue=null,!r))throw new Error("uibDatepickerPopup must have a date format specified.")})),!r)throw new Error("uibDatepickerPopup must have a date format specified.");if(C&&c.datepickerPopup)throw new Error("HTML5 date input types do not support custom formats.");if(x=angular.element("<div uib-datepicker-popup-wrap><div uib-datepicker></div></div>"),x.attr({"ng-model":"date","ng-change":"dateSelection(date)","template-url":v}),y=angular.element(x.children()[0]),y.attr("template-url",w),C&&"month"===c.type&&(y.attr("datepicker-mode",'"month"'),y.attr("min-mode","month")),c.datepickerOptions){var l=a.$parent.$eval(c.datepickerOptions);l&&l.initDate&&(a.initDate=l.initDate,y.attr("init-date","initDate"),delete l.initDate),angular.forEach(l,function(a,b){y.attr(m(b),a)})}angular.forEach(["minMode","maxMode","minDate","maxDate","datepickerMode","initDate","shortcutPropagation"],function(b){if(c[b]){var d=e(c[b]);if(a.$parent.$watch(d,function(c){a.watchData[b]=c,"minDate"!==b&&"maxDate"!==b||(B[b]=new Date(c))}),y.attr(m(b),"watchData."+b),"datepickerMode"===b){var f=d.assign;a.$watch("watchData."+b,function(b,c){angular.isFunction(f)&&b!==c&&f(a.$parent,b)})}}}),c.dateDisabled&&y.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),c.showWeeks&&y.attr("show-weeks",c.showWeeks),c.customClass&&y.attr("custom-class","customClass({ date: date, mode: mode })"),C?z.$formatters.push(function(b){return a.date=b,b}):(z.$$parserName="date",z.$validators.date=o,z.$parsers.unshift(n),z.$formatters.push(function(b){return a.date=b,z.$isEmpty(b)?b:i(b,r)})),z.$viewChangeListeners.push(function(){a.date=j.parse(z.$viewValue,r,a.date)}),b.bind("keydown",q),A=d(x)(a),x.remove(),t?f.find("body").append(A):b.after(A),a.$on("$destroy",function(){a.isOpen===!0&&(g.$$phase||a.$apply(function(){a.isOpen=!1})),A.remove(),b.unbind("keydown",q),f.unbind("click",p)})},a.getText=function(b){return a[b+"Text"]||k[b+"Text"]},a.isDisabled=function(b){return"today"===b&&(b=new Date),a.watchData.minDate&&a.compare(b,B.minDate)<0||a.watchData.maxDate&&a.compare(b,B.maxDate)>0},a.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},a.dateSelection=function(c){angular.isDefined(c)&&(a.date=c);var d=a.date?i(a.date,r):null;b.val(d),z.$setViewValue(d),s&&(a.isOpen=!1,b[0].focus())},a.keydown=function(c){27===c.which&&(a.isOpen=!1,b[0].focus())},a.select=function(b){if("today"===b){var c=new Date;angular.isDate(a.date)?(b=new Date(a.date),b.setFullYear(c.getFullYear(),c.getMonth(),c.getDate())):b=new Date(c.setHours(0,0,0,0))}a.dateSelection(b)},a.close=function(){a.isOpen=!1,b[0].focus()},a.$watch("isOpen",function(c){c?(a.position=t?h.offset(b):h.position(b),a.position.top=a.position.top+b.prop("offsetHeight"),l(function(){u&&a.$broadcast("uib:datepicker.focus"),f.bind("click",p)},0,!1)):f.unbind("click",p)})}]).directive("uibDatepickerPopup",function(){return{require:["ngModel","uibDatepickerPopup"],controller:"UibDatepickerPopupController",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&",customClass:"&"},link:function(a,b,c,d){var e=d[0],f=d[1];f.init(e)}}}).directive("uibDatepickerPopupWrap",function(){return{replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"template/datepicker/popup.html"}}}),angular.module("ui.bootstrap.datepicker").value("$datepickerSuppressWarning",!1).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$log","dateFilter","uibDatepickerConfig","$datepickerSuppressError","$datepickerSuppressWarning",function(a,b,c,d,e,f,g,h,i){i||e.warn("DatepickerController is now deprecated. Use UibDatepickerController instead.");var j=this,k={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","showWeeks","startingDay","yearRange","shortcutPropagation"],function(c,e){j[c]=angular.isDefined(b[c])?e<6?d(b[c])(a.$parent):a.$parent.$eval(b[c]):g[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){j[d]=a?new Date(a):null,j.refreshView()}):j[d]=g[d]?new Date(g[d]):null}),angular.forEach(["minMode","maxMode"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(c){j[d]=angular.isDefined(c)?c:b[d],a[d]=j[d],("minMode"==d&&j.modes.indexOf(a.datepickerMode)<j.modes.indexOf(j[d])||"maxMode"==d&&j.modes.indexOf(a.datepickerMode)>j.modes.indexOf(j[d]))&&(a.datepickerMode=j[d])}):(j[d]=g[d]||null,a[d]=j[d])}),a.datepickerMode=a.datepickerMode||g.datepickerMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),angular.isDefined(b.initDate)?(this.activeDate=a.$parent.$eval(b.initDate)||new Date,a.$parent.$watch(b.initDate,function(a){a&&(k.$isEmpty(k.$modelValue)||k.$invalid)&&(j.activeDate=a,j.refreshView())})):this.activeDate=new Date,a.isActive=function(b){return 0===j.compare(b.date,j.activeDate)&&(a.activeDateId=b.uid,!0)},this.init=function(a){k=a,k.$render=function(){j.render()}},this.render=function(){if(k.$viewValue){var a=new Date(k.$viewValue),b=!isNaN(a);b?this.activeDate=a:h||e.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=k.$viewValue?new Date(k.$viewValue):null;k.$setValidity("dateDisabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=k.$viewValue?new Date(k.$viewValue):null;return{date:a,label:f(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date),customClass:this.customClass(a)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.customClass=function(b){return a.customClass({date:b,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},this.fixTimeZone=function(a){var b=a.getHours();a.setHours(23===b?b+2:0)},a.select=function(b){if(a.datepickerMode===j.minMode){var c=k.$viewValue?new Date(k.$viewValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),k.$setViewValue(c),k.$render()}else j.activeDate=b,a.datepickerMode=j.modes[j.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=j.activeDate.getFullYear()+a*(j.step.years||0),c=j.activeDate.getMonth()+a*(j.step.months||0);j.activeDate.setFullYear(b,c,1),j.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===j.maxMode&&1===b||a.datepickerMode===j.minMode&&b===-1||(a.datepickerMode=j.modes[j.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var l=function(){j.element[0].focus()};a.$on("uib:datepicker.focus",l),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),j.shortcutPropagation||b.stopPropagation(),"enter"===c||"space"===c){if(j.isDisabled(j.activeDate))return;a.select(j.activeDate)}else!b.ctrlKey||"up"!==c&&"down"!==c?(j.handleKeyDown(c,b),j.refreshView()):a.toggleMode("up"===c?1:-1)}}]).directive("datepicker",["$log","$datepickerSuppressWarning",function(a,b){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"template/datepicker/datepicker.html"},scope:{datepickerMode:"=?",dateDisabled:"&",customClass:"&",shortcutPropagation:"&?"},require:["datepicker","^ngModel"],controller:"DatepickerController",controllerAs:"datepicker",link:function(c,d,e,f){b||a.warn("datepicker is now deprecated. Use uib-datepicker instead.");var g=f[0],h=f[1];g.init(h)}}}]).directive("daypicker",["$log","$datepickerSuppressWarning",function(a,b){return{replace:!0,templateUrl:"template/datepicker/day.html",require:["^datepicker","daypicker"],controller:"UibDaypickerController",link:function(c,d,e,f){b||a.warn("daypicker is now deprecated. Use uib-daypicker instead.");var g=f[0],h=f[1];h.init(g)}}}]).directive("monthpicker",["$log","$datepickerSuppressWarning",function(a,b){return{replace:!0,templateUrl:"template/datepicker/month.html",require:["^datepicker","monthpicker"],controller:"UibMonthpickerController",link:function(c,d,e,f){b||a.warn("monthpicker is now deprecated. Use uib-monthpicker instead.");var g=f[0],h=f[1];h.init(g)}}}]).directive("yearpicker",["$log","$datepickerSuppressWarning",function(a,b){return{replace:!0,templateUrl:"template/datepicker/year.html",require:["^datepicker","yearpicker"],controller:"UibYearpickerController",link:function(c,d,e,f){b||a.warn("yearpicker is now deprecated. Use uib-yearpicker instead.");var g=f[0];angular.extend(g,f[1]),g.yearpickerInit(),g.refreshView()}}}]).directive("datepickerPopup",["$log","$datepickerSuppressWarning",function(a,b){return{require:["ngModel","datepickerPopup"],controller:"UibDatepickerPopupController",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&",customClass:"&"},link:function(c,d,e,f){b||a.warn("datepicker-popup is now deprecated. Use uib-datepicker-popup instead.");var g=f[0],h=f[1];h.init(g)}}}]).directive("datepickerPopupWrap",["$log","$datepickerSuppressWarning",function(a,b){return{replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"template/datepicker/popup.html"},link:function(){b||a.warn("datepicker-popup-wrap is now deprecated. Use uib-datepicker-popup-wrap instead.")}}}]),angular.module("ui.bootstrap.dropdown",["ui.bootstrap.position"]).constant("uibDropdownConfig",{openClass:"open"}).service("uibDropdownService",["$document","$rootScope",function(a,b){var c=null;this.open=function(b){c||(a.bind("click",d),a.bind("keydown",e)),c&&c!==b&&(c.isOpen=!1),c=b},this.close=function(b){c===b&&(c=null,a.unbind("click",d),a.unbind("keydown",e))};var d=function(a){if(c&&(!a||"disabled"!==c.getAutoClose())){var d=c.getToggleElement();if(!(a&&d&&d[0].contains(a.target))){var e=c.getDropdownElement();a&&"outsideClick"===c.getAutoClose()&&e&&e[0].contains(a.target)||(c.isOpen=!1,b.$$phase||c.$apply())}}},e=function(a){27===a.which?(c.focusToggleElement(),d()):c.isKeynavEnabled()&&/(38|40)/.test(a.which)&&c.isOpen&&(a.preventDefault(),a.stopPropagation(),c.focusDropdownEntry(a.which))}}]).controller("UibDropdownController",["$scope","$element","$attrs","$parse","uibDropdownConfig","uibDropdownService","$animate","$uibPosition","$document","$compile","$templateRequest",function(a,b,c,d,e,f,g,h,i,j,k){var l,m,n=this,o=a.$new(),p=e.openClass,q=angular.noop,r=c.onToggle?d(c.onToggle):angular.noop,s=!1,t=!1;b.addClass("dropdown"),this.init=function(){c.isOpen&&(m=d(c.isOpen),q=m.assign,a.$watch(m,function(a){o.isOpen=!!a})),s=angular.isDefined(c.dropdownAppendToBody),t=angular.isDefined(c.uibKeyboardNav),s&&n.dropdownMenu&&(i.find("body").append(n.dropdownMenu),b.on("$destroy",function(){n.dropdownMenu.remove()}))},this.toggle=function(a){return o.isOpen=arguments.length?!!a:!o.isOpen},this.isOpen=function(){return o.isOpen},o.getToggleElement=function(){return n.toggleElement},o.getAutoClose=function(){return c.autoClose||"always"},o.getElement=function(){return b},o.isKeynavEnabled=function(){return t},o.focusDropdownEntry=function(a){var c=n.dropdownMenu?angular.element(n.dropdownMenu).find("a"):angular.element(b).find("ul").eq(0).find("a");switch(a){case 40:angular.isNumber(n.selectedOption)?n.selectedOption=n.selectedOption===c.length-1?n.selectedOption:n.selectedOption+1:n.selectedOption=0;break;case 38:angular.isNumber(n.selectedOption)?n.selectedOption=0===n.selectedOption?0:n.selectedOption-1:n.selectedOption=c.length-1}c[n.selectedOption].focus()},o.getDropdownElement=function(){return n.dropdownMenu},o.focusToggleElement=function(){n.toggleElement&&n.toggleElement[0].focus()},o.$watch("isOpen",function(c,d){if(s&&n.dropdownMenu){var e=h.positionElements(b,n.dropdownMenu,"bottom-left",!0),i={top:e.top+"px",display:c?"block":"none"},m=n.dropdownMenu.hasClass("dropdown-menu-right");m?(i.left="auto",i.right=window.innerWidth-(e.left+b.prop("offsetWidth"))+"px"):(i.left=e.left+"px",i.right="auto"),n.dropdownMenu.css(i)}if(g[c?"addClass":"removeClass"](b,p).then(function(){angular.isDefined(c)&&c!==d&&r(a,{open:!!c})}),c)n.dropdownMenuTemplateUrl&&k(n.dropdownMenuTemplateUrl).then(function(a){l=o.$new(),j(a.trim())(l,function(a){var b=a;n.dropdownMenu.replaceWith(b),n.dropdownMenu=b})}),o.focusToggleElement(),f.open(o);else{if(n.dropdownMenuTemplateUrl){l&&l.$destroy();var t=angular.element('<ul class="dropdown-menu"></ul>');n.dropdownMenu.replaceWith(t),n.dropdownMenu=t}f.close(o),n.selectedOption=null}angular.isFunction(q)&&q(a,c)}),a.$on("$locationChangeSuccess",function(){"disabled"!==o.getAutoClose()&&(o.isOpen=!1)});var u=a.$on("$destroy",function(){o.$destroy()});o.$on("$destroy",u)}]).directive("uibDropdown",function(){return{controller:"UibDropdownController",link:function(a,b,c,d){d.init()}}}).directive("uibDropdownMenu",function(){return{restrict:"AC",require:"?^uibDropdown",link:function(a,b,c,d){if(d&&!angular.isDefined(c.dropdownNested)){b.addClass("dropdown-menu");var e=c.templateUrl;e&&(d.dropdownMenuTemplateUrl=e),d.dropdownMenu||(d.dropdownMenu=b)}}}}).directive("uibKeyboardNav",function(){return{restrict:"A",require:"?^uibDropdown",link:function(a,b,c,d){b.bind("keydown",function(a){if([38,40].indexOf(a.which)!==-1){a.preventDefault(),a.stopPropagation();var b=d.dropdownMenu.find("a");switch(a.which){case 40:angular.isNumber(d.selectedOption)?d.selectedOption=d.selectedOption===b.length-1?d.selectedOption:d.selectedOption+1:d.selectedOption=0;break;case 38:angular.isNumber(d.selectedOption)?d.selectedOption=0===d.selectedOption?0:d.selectedOption-1:d.selectedOption=b.length-1}b[d.selectedOption].focus()}})}}}).directive("uibDropdownToggle",function(){return{require:"?^uibDropdown",link:function(a,b,c,d){if(d){b.addClass("dropdown-toggle"),d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.dropdown").value("$dropdownSuppressWarning",!1).service("dropdownService",["$log","$dropdownSuppressWarning","uibDropdownService",function(a,b,c){b||a.warn("dropdownService is now deprecated. Use uibDropdownService instead."),angular.extend(this,c)}]).controller("DropdownController",["$scope","$element","$attrs","$parse","uibDropdownConfig","uibDropdownService","$animate","$uibPosition","$document","$compile","$templateRequest","$log","$dropdownSuppressWarning",function(a,b,c,d,e,f,g,h,i,j,k,l,m){m||l.warn("DropdownController is now deprecated. Use UibDropdownController instead.");var n,o,p=this,q=a.$new(),r=e.openClass,s=angular.noop,t=c.onToggle?d(c.onToggle):angular.noop,u=!1,v=!1;b.addClass("dropdown"),this.init=function(){c.isOpen&&(o=d(c.isOpen),s=o.assign,a.$watch(o,function(a){q.isOpen=!!a})),u=angular.isDefined(c.dropdownAppendToBody),v=angular.isDefined(c.uibKeyboardNav),u&&p.dropdownMenu&&(i.find("body").append(p.dropdownMenu),b.on("$destroy",function(){p.dropdownMenu.remove()}))},this.toggle=function(a){return q.isOpen=arguments.length?!!a:!q.isOpen},this.isOpen=function(){return q.isOpen},q.getToggleElement=function(){return p.toggleElement},q.getAutoClose=function(){return c.autoClose||"always"},q.getElement=function(){return b},q.isKeynavEnabled=function(){return v},q.focusDropdownEntry=function(a){var c=p.dropdownMenu?angular.element(p.dropdownMenu).find("a"):angular.element(b).find("ul").eq(0).find("a");switch(a){case 40:angular.isNumber(p.selectedOption)?p.selectedOption=p.selectedOption===c.length-1?p.selectedOption:p.selectedOption+1:p.selectedOption=0;break;case 38:angular.isNumber(p.selectedOption)?p.selectedOption=0===p.selectedOption?0:p.selectedOption-1:p.selectedOption=c.length-1}c[p.selectedOption].focus()},q.getDropdownElement=function(){return p.dropdownMenu},q.focusToggleElement=function(){p.toggleElement&&p.toggleElement[0].focus()},q.$watch("isOpen",function(c,d){if(u&&p.dropdownMenu){var e=h.positionElements(b,p.dropdownMenu,"bottom-left",!0),i={top:e.top+"px",display:c?"block":"none"},l=p.dropdownMenu.hasClass("dropdown-menu-right");l?(i.left="auto",i.right=window.innerWidth-(e.left+b.prop("offsetWidth"))+"px"):(i.left=e.left+"px",i.right="auto"),p.dropdownMenu.css(i)}if(g[c?"addClass":"removeClass"](b,r).then(function(){angular.isDefined(c)&&c!==d&&t(a,{open:!!c})}),c)p.dropdownMenuTemplateUrl&&k(p.dropdownMenuTemplateUrl).then(function(a){n=q.$new(),j(a.trim())(n,function(a){var b=a;p.dropdownMenu.replaceWith(b),p.dropdownMenu=b})}),q.focusToggleElement(),f.open(q);else{if(p.dropdownMenuTemplateUrl){n&&n.$destroy();var m=angular.element('<ul class="dropdown-menu"></ul>');p.dropdownMenu.replaceWith(m), p.dropdownMenu=m}f.close(q),p.selectedOption=null}angular.isFunction(s)&&s(a,c)}),a.$on("$locationChangeSuccess",function(){"disabled"!==q.getAutoClose()&&(q.isOpen=!1)});var w=a.$on("$destroy",function(){q.$destroy()});q.$on("$destroy",w)}]).directive("dropdown",["$log","$dropdownSuppressWarning",function(a,b){return{controller:"DropdownController",link:function(c,d,e,f){b||a.warn("dropdown is now deprecated. Use uib-dropdown instead."),f.init()}}}]).directive("dropdownMenu",["$log","$dropdownSuppressWarning",function(a,b){return{restrict:"AC",require:"?^dropdown",link:function(c,d,e,f){if(f&&!angular.isDefined(e.dropdownNested)){b||a.warn("dropdown-menu is now deprecated. Use uib-dropdown-menu instead."),d.addClass("dropdown-menu");var g=e.templateUrl;g&&(f.dropdownMenuTemplateUrl=g),f.dropdownMenu||(f.dropdownMenu=d)}}}}]).directive("keyboardNav",["$log","$dropdownSuppressWarning",function(a,b){return{restrict:"A",require:"?^dropdown",link:function(c,d,e,f){b||a.warn("keyboard-nav is now deprecated. Use uib-keyboard-nav instead."),d.bind("keydown",function(a){if([38,40].indexOf(a.which)!==-1){a.preventDefault(),a.stopPropagation();var b=f.dropdownMenu.find("a");switch(a.which){case 40:angular.isNumber(f.selectedOption)?f.selectedOption=f.selectedOption===b.length-1?f.selectedOption:f.selectedOption+1:f.selectedOption=0;break;case 38:angular.isNumber(f.selectedOption)?f.selectedOption=0===f.selectedOption?0:f.selectedOption-1:f.selectedOption=b.length-1}b[f.selectedOption].focus()}})}}}]).directive("dropdownToggle",["$log","$dropdownSuppressWarning",function(a,b){return{require:"?^dropdown",link:function(c,d,e,f){if(b||a.warn("dropdown-toggle is now deprecated. Use uib-dropdown-toggle instead."),f){d.addClass("dropdown-toggle"),f.toggleElement=d;var g=function(a){a.preventDefault(),d.hasClass("disabled")||e.disabled||c.$apply(function(){f.toggle()})};d.bind("click",g),d.attr({"aria-haspopup":!0,"aria-expanded":!1}),c.$watch(f.isOpen,function(a){d.attr("aria-expanded",!!a)}),c.$on("$destroy",function(){d.unbind("click",g)})}}}}]),angular.module("ui.bootstrap.stackedMap",[]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c<a.length;c++)if(b==a[c].key)return a[c]},keys:function(){for(var b=[],c=0;c<a.length;c++)b.push(a[c].key);return b},top:function(){return a[a.length-1]},remove:function(b){for(var c=-1,d=0;d<a.length;d++)if(b==a[d].key){c=d;break}return a.splice(c,1)[0]},removeTop:function(){return a.splice(a.length-1,1)[0]},length:function(){return a.length}}}}}),angular.module("ui.bootstrap.modal",["ui.bootstrap.stackedMap"]).factory("$$multiMap",function(){return{createNew:function(){var a={};return{entries:function(){return Object.keys(a).map(function(b){return{key:b,value:a[b]}})},get:function(b){return a[b]},hasKey:function(b){return!!a[b]},keys:function(){return Object.keys(a)},put:function(b,c){a[b]||(a[b]=[]),a[b].push(c)},remove:function(b,c){var d=a[b];if(d){var e=d.indexOf(c);e!==-1&&d.splice(e,1),d.length||delete a[b]}}}}}}).directive("uibModalBackdrop",["$animate","$injector","$uibModalStack",function(a,b,c){function d(b,d,f){d.addClass("modal-backdrop"),f.modalInClass&&(e?e(d,{addClass:f.modalInClass}).start():a.addClass(d,f.modalInClass),b.$on(c.NOW_CLOSING_EVENT,function(b,c){var g=c();e?e(d,{removeClass:f.modalInClass}).start().then(g):a.removeClass(d,f.modalInClass).then(g)}))}var e=null;return b.has("$animateCss")&&(e=b.get("$animateCss")),{replace:!0,templateUrl:"template/modal/backdrop.html",compile:function(a,b){return a.addClass(b.backdropClass),d}}}]).directive("uibModalWindow",["$uibModalStack","$q","$animate","$injector",function(a,b,c,d){var e=null;return d.has("$animateCss")&&(e=d.get("$animateCss")),{scope:{index:"@"},replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"template/modal/window.html"},link:function(d,f,g){f.addClass(g.windowClass||""),f.addClass(g.windowTopClass||""),d.size=g.size,d.close=function(b){var c=a.getTop();c&&c.value.backdrop&&"static"!==c.value.backdrop&&b.target===b.currentTarget&&(b.preventDefault(),b.stopPropagation(),a.dismiss(c.key,"backdrop click"))},f.on("click",d.close),d.$isRendered=!0;var h=b.defer();g.$observe("modalRender",function(a){"true"==a&&h.resolve()}),h.promise.then(function(){var h=null;g.modalInClass&&(h=e?e(f,{addClass:g.modalInClass}).start():c.addClass(f,g.modalInClass),d.$on(a.NOW_CLOSING_EVENT,function(a,b){var d=b();e?e(f,{removeClass:g.modalInClass}).start().then(d):c.removeClass(f,g.modalInClass).then(d)})),b.when(h).then(function(){var a=f[0].querySelector("[autofocus]");a?a.focus():f[0].focus()});var i=a.getTop();i&&a.modalRendered(i.key)})}}}]).directive("uibModalAnimationClass",function(){return{compile:function(a,b){b.modalAnimation&&a.addClass(b.uibModalAnimationClass)}}}).directive("uibModalTransclude",function(){return{link:function(a,b,c,d,e){e(a.$parent,function(a){b.empty(),b.append(a)})}}}).factory("$uibModalStack",["$animate","$timeout","$document","$compile","$rootScope","$q","$injector","$$multiMap","$$stackedMap",function(a,b,c,d,e,f,g,h,i){function j(){for(var a=-1,b=u.keys(),c=0;c<b.length;c++)u.get(b[c]).value.backdrop&&(a=c);return a}function k(a,b){var d=c.find("body").eq(0),e=u.get(a).value;u.remove(a),n(e.modalDomEl,e.modalScope,function(){var b=e.openedClass||t;v.remove(b,a),d.toggleClass(b,v.hasKey(b)),l(!0)}),m(),b&&b.focus?b.focus():d.focus()}function l(a){var b;u.length()>0&&(b=u.top().value,b.modalDomEl.toggleClass(b.windowTopClass||"",a))}function m(){if(q&&j()==-1){var a=r;n(q,r,function(){a=null}),q=void 0,r=void 0}}function n(b,c,d){function e(){e.done||(e.done=!0,p?p(b,{event:"leave"}).start().then(function(){b.remove()}):a.leave(b),c.$destroy(),d&&d())}var g,h=null,i=function(){return g||(g=f.defer(),h=g.promise),function(){g.resolve()}};return c.$broadcast(w.NOW_CLOSING_EVENT,i),f.when(h).then(e)}function o(a,b,c){return!a.value.modalScope.$broadcast("modal.closing",b,c).defaultPrevented}var p=null;g.has("$animateCss")&&(p=g.get("$animateCss"));var q,r,s,t="modal-open",u=i.createNew(),v=h.createNew(),w={NOW_CLOSING_EVENT:"modal.stack.now-closing"},x=0,y="a[href], area[href], input:not([disabled]), button:not([disabled]),select:not([disabled]), textarea:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable=true]";return e.$watch(j,function(a){r&&(r.index=a)}),c.bind("keydown",function(a){if(a.isDefaultPrevented())return a;var b=u.top();if(b&&b.value.keyboard)switch(a.which){case 27:a.preventDefault(),e.$apply(function(){w.dismiss(b.key,"escape key press")});break;case 9:w.loadFocusElementList(b);var c=!1;a.shiftKey?w.isFocusInFirstItem(a)&&(c=w.focusLastFocusableElement()):w.isFocusInLastItem(a)&&(c=w.focusFirstFocusableElement()),c&&(a.preventDefault(),a.stopPropagation())}}),w.open=function(a,b){var f=c[0].activeElement,g=b.openedClass||t;l(!1),u.add(a,{deferred:b.deferred,renderDeferred:b.renderDeferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard,openedClass:b.openedClass,windowTopClass:b.windowTopClass}),v.put(g,a);var h=c.find("body").eq(0),i=j();if(i>=0&&!q){r=e.$new(!0),r.index=i;var k=angular.element('<div uib-modal-backdrop="modal-backdrop"></div>');k.attr("backdrop-class",b.backdropClass),b.animation&&k.attr("modal-animation","true"),q=d(k)(r),h.append(q)}var m=angular.element('<div uib-modal-window="modal-window"></div>');m.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,"window-top-class":b.windowTopClass,size:b.size,index:u.length()-1,animate:"animate"}).html(b.content),b.animation&&m.attr("modal-animation","true");var n=d(m)(b.scope);u.top().value.modalDomEl=n,u.top().value.modalOpener=f,h.append(n),h.addClass(g),w.clearFocusListCache()},w.close=function(a,b){var c=u.get(a);return c&&o(c,b,!0)?(c.value.modalScope.$$uibDestructionScheduled=!0,c.value.deferred.resolve(b),k(a,c.value.modalOpener),!0):!c},w.dismiss=function(a,b){var c=u.get(a);return c&&o(c,b,!1)?(c.value.modalScope.$$uibDestructionScheduled=!0,c.value.deferred.reject(b),k(a,c.value.modalOpener),!0):!c},w.dismissAll=function(a){for(var b=this.getTop();b&&this.dismiss(b.key,a);)b=this.getTop()},w.getTop=function(){return u.top()},w.modalRendered=function(a){var b=u.get(a);b&&b.value.renderDeferred.resolve()},w.focusFirstFocusableElement=function(){return s.length>0&&(s[0].focus(),!0)},w.focusLastFocusableElement=function(){return s.length>0&&(s[s.length-1].focus(),!0)},w.isFocusInFirstItem=function(a){return s.length>0&&(a.target||a.srcElement)==s[0]},w.isFocusInLastItem=function(a){return s.length>0&&(a.target||a.srcElement)==s[s.length-1]},w.clearFocusListCache=function(){s=[],x=0},w.loadFocusElementList=function(a){if((void 0===s||!s.length)&&a){var b=a.value.modalDomEl;b&&b.length&&(s=b[0].querySelectorAll(y))}},w}]).provider("$uibModal",function(){var a={options:{animation:!0,backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$templateRequest","$controller","$uibModalStack","$modalSuppressWarning","$log",function(b,c,d,e,f,g,h,i){function j(a){return a.template?d.when(a.template):e(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl)}function k(a){var c=[];return angular.forEach(a,function(a){angular.isFunction(a)||angular.isArray(a)?c.push(d.when(b.invoke(a))):angular.isString(a)?c.push(d.when(b.get(a))):c.push(d.when(a))}),c}var l={},m=null;return l.getPromiseChain=function(){return m},l.open=function(b){function e(){return r}var l=d.defer(),n=d.defer(),o=d.defer(),p={result:l.promise,opened:n.promise,rendered:o.promise,close:function(a){return g.close(p,a)},dismiss:function(a){return g.dismiss(p,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var q,r=d.all([j(b)].concat(k(b.resolve)));return q=m=d.all([m]).then(e,e).then(function(a){var d=(b.scope||c).$new();d.$close=p.close,d.$dismiss=p.dismiss,d.$on("$destroy",function(){d.$$uibDestructionScheduled||d.$dismiss("$uibUnscheduledDestruction")});var e,j={},k=1;b.controller&&(j.$scope=d,j.$uibModalInstance=p,Object.defineProperty(j,"$modalInstance",{get:function(){return h||i.warn("$modalInstance is now deprecated. Use $uibModalInstance instead."),p}}),angular.forEach(b.resolve,function(b,c){j[c]=a[k++]}),e=f(b.controller,j),b.controllerAs&&(b.bindToController&&angular.extend(e,d),d[b.controllerAs]=e)),g.open(p,{scope:d,deferred:l,renderDeferred:o,content:a[0],animation:b.animation,backdrop:b.backdrop,keyboard:b.keyboard,backdropClass:b.backdropClass,windowTopClass:b.windowTopClass,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size,openedClass:b.openedClass}),n.resolve(!0)},function(a){n.reject(a),l.reject(a)})["finally"](function(){m===q&&(m=null)}),p},l}]};return a}),angular.module("ui.bootstrap.modal").value("$modalSuppressWarning",!1).directive("modalBackdrop",["$animate","$injector","$modalStack","$log","$modalSuppressWarning",function(a,b,c,d,e){function f(b,f,h){e||d.warn("modal-backdrop is now deprecated. Use uib-modal-backdrop instead."),f.addClass("modal-backdrop"),h.modalInClass&&(g?g(f,{addClass:h.modalInClass}).start():a.addClass(f,h.modalInClass),b.$on(c.NOW_CLOSING_EVENT,function(b,c){var d=c();g?g(f,{removeClass:h.modalInClass}).start().then(d):a.removeClass(f,h.modalInClass).then(d)}))}var g=null;return b.has("$animateCss")&&(g=b.get("$animateCss")),{replace:!0,templateUrl:"template/modal/backdrop.html",compile:function(a,b){return a.addClass(b.backdropClass),f}}}]).directive("modalWindow",["$modalStack","$q","$animate","$injector","$log","$modalSuppressWarning",function(a,b,c,d,e,f){var g=null;return d.has("$animateCss")&&(g=d.get("$animateCss")),{scope:{index:"@"},replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"template/modal/window.html"},link:function(d,h,i){f||e.warn("modal-window is now deprecated. Use uib-modal-window instead."),h.addClass(i.windowClass||""),h.addClass(i.windowTopClass||""),d.size=i.size,d.close=function(b){var c=a.getTop();c&&c.value.backdrop&&"static"!==c.value.backdrop&&b.target===b.currentTarget&&(b.preventDefault(),b.stopPropagation(),a.dismiss(c.key,"backdrop click"))},h.on("click",d.close),d.$isRendered=!0;var j=b.defer();i.$observe("modalRender",function(a){"true"==a&&j.resolve()}),j.promise.then(function(){var e=null;i.modalInClass&&(e=g?g(h,{addClass:i.modalInClass}).start():c.addClass(h,i.modalInClass),d.$on(a.NOW_CLOSING_EVENT,function(a,b){var d=b();g?g(h,{removeClass:i.modalInClass}).start().then(d):c.removeClass(h,i.modalInClass).then(d)})),b.when(e).then(function(){var a=h[0].querySelector("[autofocus]");a?a.focus():h[0].focus()});var f=a.getTop();f&&a.modalRendered(f.key)})}}}]).directive("modalAnimationClass",["$log","$modalSuppressWarning",function(a,b){return{compile:function(c,d){b||a.warn("modal-animation-class is now deprecated. Use uib-modal-animation-class instead."),d.modalAnimation&&c.addClass(d.modalAnimationClass)}}}]).directive("modalTransclude",["$log","$modalSuppressWarning",function(a,b){return{link:function(c,d,e,f,g){b||a.warn("modal-transclude is now deprecated. Use uib-modal-transclude instead."),g(c.$parent,function(a){d.empty(),d.append(a)})}}}]).service("$modalStack",["$animate","$timeout","$document","$compile","$rootScope","$q","$injector","$$multiMap","$$stackedMap","$uibModalStack","$log","$modalSuppressWarning",function(a,b,c,d,e,f,g,h,i,j,k,l){l||k.warn("$modalStack is now deprecated. Use $uibModalStack instead."),angular.extend(this,j)}]).provider("$modal",["$uibModalProvider",function(a){angular.extend(this,a),this.$get=["$injector","$log","$modalSuppressWarning",function(b,c,d){return d||c.warn("$modal is now deprecated. Use $uibModal instead."),b.invoke(a.$get)}]}]),angular.module("ui.bootstrap.pagination",[]).controller("UibPaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(g,h){e=g,this.config=h,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=h.itemsPerPage,a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b,c){c&&c.preventDefault();var d=!a.ngDisabled||!c;d&&a.page!==b&&b>0&&b<=a.totalPages&&(c&&c.target&&c.target.blur(),e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages}}]).constant("uibPaginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("uibPagination",["$parse","uibPaginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@",ngDisabled:"="},require:["uibPagination","?ngModel"],controller:"UibPaginationController",controllerAs:"pagination",templateUrl:function(a,b){return b.templateUrl||"template/pagination/pagination.html"},replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&k<b;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;h<=e;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(e<b){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render()});var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("uibPagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("uibPager",["uibPagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@",ngDisabled:"="},require:["uibPager","?ngModel"],controller:"UibPaginationController",controllerAs:"pagination",templateUrl:function(a,b){return b.templateUrl||"template/pagination/pager.html"},replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.pagination").value("$paginationSuppressWarning",!1).controller("PaginationController",["$scope","$attrs","$parse","$log","$paginationSuppressWarning",function(a,b,c,d,e){e||d.warn("PaginationController is now deprecated. Use UibPaginationController instead.");var f=this,g={$setViewValue:angular.noop},h=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(d,e){g=d,this.config=e,g.$render=function(){f.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){f.itemsPerPage=parseInt(b,10),a.totalPages=f.calculateTotalPages()}):this.itemsPerPage=e.itemsPerPage,a.$watch("totalItems",function(){a.totalPages=f.calculateTotalPages()}),a.$watch("totalPages",function(b){h(a.$parent,b),a.page>b?a.selectPage(b):g.$render()})},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(g.$viewValue,10)||1},a.selectPage=function(b,c){c&&c.preventDefault();var d=!a.ngDisabled||!c;d&&a.page!==b&&b>0&&b<=a.totalPages&&(c&&c.target&&c.target.blur(),g.$setViewValue(b),g.$render())},a.getText=function(b){return a[b+"Text"]||f.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages}}]).directive("pagination",["$parse","uibPaginationConfig","$log","$paginationSuppressWarning",function(a,b,c,d){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@",ngDisabled:"="},require:["pagination","?ngModel"],controller:"PaginationController",controllerAs:"pagination",templateUrl:function(a,b){return b.templateUrl||"template/pagination/pagination.html"},replace:!0,link:function(e,f,g,h){function i(a,b,c){return{number:a,text:b,active:c}}function j(a,b){var c=[],d=1,e=b,f=angular.isDefined(m)&&m<b;f&&(n?(d=Math.max(a-Math.floor(m/2),1),e=d+m-1,e>b&&(e=b,d=e-m+1)):(d=(Math.ceil(a/m)-1)*m+1,e=Math.min(d+m-1,b)));for(var g=d;g<=e;g++){var h=i(g,g,g===a);c.push(h)}if(f&&!n){if(d>1){var j=i(d-1,"...",!1);c.unshift(j)}if(e<b){var k=i(e+1,"...",!1);c.push(k)}}return c}d||c.warn("pagination is now deprecated. Use uib-pagination instead.");var k=h[0],l=h[1];if(l){var m=angular.isDefined(g.maxSize)?e.$parent.$eval(g.maxSize):b.maxSize,n=angular.isDefined(g.rotate)?e.$parent.$eval(g.rotate):b.rotate;e.boundaryLinks=angular.isDefined(g.boundaryLinks)?e.$parent.$eval(g.boundaryLinks):b.boundaryLinks,e.directionLinks=angular.isDefined(g.directionLinks)?e.$parent.$eval(g.directionLinks):b.directionLinks,k.init(l,b),g.maxSize&&e.$parent.$watch(a(g.maxSize),function(a){m=parseInt(a,10),k.render()});var o=k.render;k.render=function(){o(),e.page>0&&e.page<=e.totalPages&&(e.pages=j(e.page,e.totalPages))}}}}}]).directive("pager",["uibPagerConfig","$log","$paginationSuppressWarning",function(a,b,c){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@",ngDisabled:"="},require:["pager","?ngModel"],controller:"PaginationController",controllerAs:"pagination",templateUrl:function(a,b){return b.templateUrl||"template/pagination/pager.html"},replace:!0,link:function(d,e,f,g){c||b.warn("pager is now deprecated. Use uib-pager instead.");var h=g[0],i=g[1];i&&(d.align=angular.isDefined(f.align)?d.$parent.$eval(f.align):a.align,h.init(i,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.stackedMap"]).provider("$uibTooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0,popupCloseDelay:0,useContentExp:!1},c={mouseenter:"mouseleave",click:"click",focus:"blur",none:""},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$uibPosition","$interpolate","$rootScope","$parse","$$stackedMap",function(e,f,g,h,i,j,k,l,m){var n=m.createNew();return h.on("keypress",function(a){if(27===a.which){var b=n.top();b&&(b.value.close(),n.removeTop(),b=null)}}),function(e,k,m,o){function p(a){var b=(a||o.trigger||m).split(" "),d=b.map(function(a){return c[a]||a});return{show:b,hide:d}}o=angular.extend({},b,d,o);var q=a(e),r=j.startSymbol(),s=j.endSymbol(),t="<div "+q+'-popup title="'+r+"title"+s+'" '+(o.useContentExp?'content-exp="contentExp()" ':'content="'+r+"content"+s+'" ')+'placement="'+r+"placement"+s+'" popup-class="'+r+"popupClass"+s+'" animation="animation" is-open="isOpen"origin-scope="origScope" style="visibility: hidden; display: block; top: -9999px; left: -9999px;"></div>';return{compile:function(a,b){var c=f(t);return function(a,b,d,f){function j(){L.isOpen?q():m()}function m(){K&&!a.$eval(d[k+"Enable"])||(u(),x(),L.popupDelay?F||(F=g(r,L.popupDelay,!1)):r())}function q(){s(),L.popupCloseDelay?G||(G=g(t,L.popupCloseDelay,!1)):t()}function r(){return s(),u(),L.content?(v(),void L.$evalAsync(function(){L.isOpen=!0,y(!0),Q()})):angular.noop}function s(){F&&(g.cancel(F),F=null),H&&(g.cancel(H),H=null)}function t(){s(),u(),L&&L.$evalAsync(function(){L.isOpen=!1,y(!1),L.animation?E||(E=g(w,150,!1)):w()})}function u(){G&&(g.cancel(G),G=null),E&&(g.cancel(E),E=null)}function v(){C||(D=L.$new(),C=c(D,function(a){I?h.find("body").append(a):b.after(a)}),z())}function w(){A(),E=null,C&&(C.remove(),C=null),D&&(D.$destroy(),D=null)}function x(){L.title=d[k+"Title"],O?L.content=O(a):L.content=d[e],L.popupClass=d[k+"Class"],L.placement=angular.isDefined(d[k+"Placement"])?d[k+"Placement"]:o.placement;var b=parseInt(d[k+"PopupDelay"],10),c=parseInt(d[k+"PopupCloseDelay"],10);L.popupDelay=isNaN(b)?o.popupDelay:b,L.popupCloseDelay=isNaN(c)?o.popupCloseDelay:c}function y(b){N&&angular.isFunction(N.assign)&&N.assign(a,b)}function z(){P.length=0,O?(P.push(a.$watch(O,function(a){L.content=a,!a&&L.isOpen&&t()})),P.push(D.$watch(function(){M||(M=!0,D.$$postDigest(function(){M=!1,L&&L.isOpen&&Q()}))}))):P.push(d.$observe(e,function(a){L.content=a,!a&&L.isOpen?t():Q()})),P.push(d.$observe(k+"Title",function(a){L.title=a,L.isOpen&&Q()})),P.push(d.$observe(k+"Placement",function(a){L.placement=a?a:o.placement,L.isOpen&&Q()}))}function A(){P.length&&(angular.forEach(P,function(a){a()}),P.length=0)}function B(){var a=d[k+"Trigger"];R(),J=p(a),"none"!==J.show&&J.show.forEach(function(a,c){a===J.hide[c]?b[0].addEventListener(a,j):a&&(b[0].addEventListener(a,m),J.hide[c].split(" ").forEach(function(a){b[0].addEventListener(a,q)})),b.on("keypress",function(a){27===a.which&&q()})})}var C,D,E,F,G,H,I=!!angular.isDefined(o.appendToBody)&&o.appendToBody,J=p(void 0),K=angular.isDefined(d[k+"Enable"]),L=a.$new(!0),M=!1,N=!!angular.isDefined(d[k+"IsOpen"])&&l(d[k+"IsOpen"]),O=!!o.useContentExp&&l(d[e]),P=[],Q=function(){C&&C.html()&&(H||(H=g(function(){C.css({top:0,left:0});var a=i.positionElements(b,C,L.placement,I);a.top+="px",a.left+="px",a.visibility="visible",C.css(a),H=null},0,!1)))};L.origScope=a,L.isOpen=!1,n.add(L,{close:t}),L.contentExp=function(){return L.content},d.$observe("disabled",function(a){a&&s(),a&&L.isOpen&&t()}),N&&a.$watch(N,function(a){L&&!a===L.isOpen&&j()});var R=function(){J.show.forEach(function(a){b.unbind(a,m)}),J.hide.forEach(function(a){a.split(" ").forEach(function(a){b[0].removeEventListener(a,q)})})};B();var S=a.$eval(d[k+"Animation"]);L.animation=angular.isDefined(S)?!!S:o.animation;var T=a.$eval(d[k+"AppendToBody"]);I=angular.isDefined(T)?T:I,I&&a.$on("$locationChangeSuccess",function(){L.isOpen&&t()}),a.$on("$destroy",function(){s(),u(),R(),w(),n.remove(L),L=null})}}}}}]}).directive("uibTooltipTemplateTransclude",["$animate","$sce","$compile","$templateRequest",function(a,b,c,d){return{link:function(e,f,g){var h,i,j,k=e.$eval(g.tooltipTemplateTranscludeScope),l=0,m=function(){i&&(i.remove(),i=null),h&&(h.$destroy(),h=null),j&&(a.leave(j).then(function(){i=null}),i=j,j=null)};e.$watch(b.parseAsResourceUrl(g.uibTooltipTemplateTransclude),function(b){var g=++l;b?(d(b,!0).then(function(d){if(g===l){var e=k.$new(),i=d,n=c(i)(e,function(b){m(),a.enter(b,f)});h=e,j=n,h.$emit("$includeContentLoaded",b)}},function(){g===l&&(m(),e.$emit("$includeContentError",b))}),e.$emit("$includeContentRequested",b)):m()}),e.$on("$destroy",m)}}}]).directive("uibTooltipClasses",function(){return{restrict:"A",link:function(a,b,c){a.placement&&b.addClass(a.placement),a.popupClass&&b.addClass(a.popupClass),a.animation()&&b.addClass(c.tooltipAnimationClass)}}}).directive("uibTooltipPopup",function(){return{replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html",link:function(a,b){b.addClass("tooltip")}}}).directive("uibTooltip",["$uibTooltip",function(a){return a("uibTooltip","tooltip","mouseenter")}]).directive("uibTooltipTemplatePopup",function(){return{replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/tooltip/tooltip-template-popup.html",link:function(a,b){b.addClass("tooltip")}}}).directive("uibTooltipTemplate",["$uibTooltip",function(a){return a("uibTooltipTemplate","tooltip","mouseenter",{useContentExp:!0})}]).directive("uibTooltipHtmlPopup",function(){return{replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-popup.html",link:function(a,b){b.addClass("tooltip")}}}).directive("uibTooltipHtml",["$uibTooltip",function(a){return a("uibTooltipHtml","tooltip","mouseenter",{useContentExp:!0})}]),angular.module("ui.bootstrap.tooltip").value("$tooltipSuppressWarning",!1).provider("$tooltip",["$uibTooltipProvider",function(a){angular.extend(this,a),this.$get=["$log","$tooltipSuppressWarning","$injector",function(b,c,d){return c||b.warn("$tooltip is now deprecated. Use $uibTooltip instead."),d.invoke(a.$get)}]}]).directive("tooltipTemplateTransclude",["$animate","$sce","$compile","$templateRequest","$log","$tooltipSuppressWarning",function(a,b,c,d,e,f){return{link:function(g,h,i){f||e.warn("tooltip-template-transclude is now deprecated. Use uib-tooltip-template-transclude instead.");var j,k,l,m=g.$eval(i.tooltipTemplateTranscludeScope),n=0,o=function(){k&&(k.remove(),k=null),j&&(j.$destroy(),j=null),l&&(a.leave(l).then(function(){k=null}),k=l,l=null)};g.$watch(b.parseAsResourceUrl(i.tooltipTemplateTransclude),function(b){var e=++n;b?(d(b,!0).then(function(d){if(e===n){var f=m.$new(),g=d,i=c(g)(f,function(b){o(),a.enter(b,h)});j=f,l=i,j.$emit("$includeContentLoaded",b)}},function(){e===n&&(o(),g.$emit("$includeContentError",b))}),g.$emit("$includeContentRequested",b)):o()}),g.$on("$destroy",o)}}}]).directive("tooltipClasses",["$log","$tooltipSuppressWarning",function(a,b){return{restrict:"A",link:function(c,d,e){b||a.warn("tooltip-classes is now deprecated. Use uib-tooltip-classes instead."),c.placement&&d.addClass(c.placement),c.popupClass&&d.addClass(c.popupClass),c.animation()&&d.addClass(e.tooltipAnimationClass)}}}]).directive("tooltipPopup",["$log","$tooltipSuppressWarning",function(a,b){return{replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html",link:function(c,d){b||a.warn("tooltip-popup is now deprecated. Use uib-tooltip-popup instead."),d.addClass("tooltip")}}}]).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipTemplatePopup",["$log","$tooltipSuppressWarning",function(a,b){return{replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/tooltip/tooltip-template-popup.html",link:function(c,d){b||a.warn("tooltip-template-popup is now deprecated. Use uib-tooltip-template-popup instead."),d.addClass("tooltip")}}}]).directive("tooltipTemplate",["$tooltip",function(a){return a("tooltipTemplate","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlPopup",["$log","$tooltipSuppressWarning",function(a,b){return{replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-popup.html",link:function(c,d){b||a.warn("tooltip-html-popup is now deprecated. Use uib-tooltip-html-popup instead."),d.addClass("tooltip")}}}]).directive("tooltipHtml",["$tooltip",function(a){return a("tooltipHtml","tooltip","mouseenter",{useContentExp:!0})}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("uibPopoverTemplatePopup",function(){return{replace:!0,scope:{title:"@",contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/popover/popover-template.html",link:function(a,b){b.addClass("popover")}}}).directive("uibPopoverTemplate",["$uibTooltip",function(a){return a("uibPopoverTemplate","popover","click",{useContentExp:!0})}]).directive("uibPopoverHtmlPopup",function(){return{replace:!0,scope:{contentExp:"&",title:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover-html.html",link:function(a,b){b.addClass("popover")}}}).directive("uibPopoverHtml",["$uibTooltip",function(a){return a("uibPopoverHtml","popover","click",{useContentExp:!0})}]).directive("uibPopoverPopup",function(){return{replace:!0,scope:{title:"@",content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html",link:function(a,b){b.addClass("popover")}}}).directive("uibPopover",["$uibTooltip",function(a){return a("uibPopover","popover","click")}]),angular.module("ui.bootstrap.popover").value("$popoverSuppressWarning",!1).directive("popoverTemplatePopup",["$log","$popoverSuppressWarning",function(a,b){return{replace:!0,scope:{title:"@",contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/popover/popover-template.html",link:function(c,d){b||a.warn("popover-template-popup is now deprecated. Use uib-popover-template-popup instead."),d.addClass("popover")}}}]).directive("popoverTemplate",["$tooltip",function(a){return a("popoverTemplate","popover","click",{useContentExp:!0})}]).directive("popoverHtmlPopup",["$log","$popoverSuppressWarning",function(a,b){return{replace:!0,scope:{contentExp:"&",title:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover-html.html",link:function(c,d){b||a.warn("popover-html-popup is now deprecated. Use uib-popover-html-popup instead."),d.addClass("popover")}}}]).directive("popoverHtml",["$tooltip",function(a){return a("popoverHtml","popover","click",{useContentExp:!0})}]).directive("popoverPopup",["$log","$popoverSuppressWarning",function(a,b){return{replace:!0,scope:{title:"@",content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html",link:function(c,d){b||a.warn("popover-popup is now deprecated. Use uib-popover-popup instead."),d.addClass("popover")}}}]).directive("popover",["$tooltip",function(a){ return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("uibProgressConfig",{animate:!0,max:100}).controller("UibProgressController",["$scope","$attrs","uibProgressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(a.max)?a.max:c.max,this.addBar=function(b,c,f){e||c.css({transition:"none"}),this.bars.push(b),b.max=a.max,b.title=f&&angular.isDefined(f.title)?f.title:"progressbar",b.$watch("value",function(a){b.recalculatePercentage()}),b.recalculatePercentage=function(){var a=d.bars.reduce(function(a,b){return b.percent=+(100*b.value/b.max).toFixed(2),a+b.percent},0);a>100&&(b.percent-=a-100)},b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1),this.bars.forEach(function(a){a.recalculatePercentage()})},a.$watch("max",function(b){d.bars.forEach(function(b){b.max=a.max,b.recalculatePercentage()})})}]).directive("uibProgress",function(){return{replace:!0,transclude:!0,controller:"UibProgressController",require:"uibProgress",scope:{max:"=?"},templateUrl:"template/progressbar/progress.html"}}).directive("uibBar",function(){return{replace:!0,transclude:!0,require:"^uibProgress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b,c)}}}).directive("uibProgressbar",function(){return{replace:!0,transclude:!0,controller:"UibProgressController",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]),{title:c.title})}}}),angular.module("ui.bootstrap.progressbar").value("$progressSuppressWarning",!1).controller("ProgressController",["$scope","$attrs","uibProgressConfig","$log","$progressSuppressWarning",function(a,b,c,d,e){e||d.warn("ProgressController is now deprecated. Use UibProgressController instead.");var f=this,g=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(a.max)?a.max:c.max,this.addBar=function(b,c,d){g||c.css({transition:"none"}),this.bars.push(b),b.max=a.max,b.title=d&&angular.isDefined(d.title)?d.title:"progressbar",b.$watch("value",function(a){b.recalculatePercentage()}),b.recalculatePercentage=function(){b.percent=+(100*b.value/b.max).toFixed(2);var a=f.bars.reduce(function(a,b){return a+b.percent},0);a>100&&(b.percent-=a-100)},b.$on("$destroy",function(){c=null,f.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)},a.$watch("max",function(b){f.bars.forEach(function(b){b.max=a.max,b.recalculatePercentage()})})}]).directive("progress",["$log","$progressSuppressWarning",function(a,b){return{replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{max:"=?",title:"@?"},templateUrl:"template/progressbar/progress.html",link:function(){b||a.warn("progress is now deprecated. Use uib-progress instead.")}}}]).directive("bar",["$log","$progressSuppressWarning",function(a,b){return{replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(c,d,e,f){b||a.warn("bar is now deprecated. Use uib-bar instead."),f.addBar(c,d)}}}]).directive("progressbar",["$log","$progressSuppressWarning",function(a,b){return{replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(c,d,e,f){b||a.warn("progressbar is now deprecated. Use uib-progressbar instead."),f.addBar(c,angular.element(d.children()[0]),{title:e.title})}}}]),angular.module("ui.bootstrap.rating",[]).constant("uibRatingConfig",{max:5,stateOn:null,stateOff:null,titles:["one","two","three","four","five"]}).controller("UibRatingController",["$scope","$attrs","uibRatingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,d.$formatters.push(function(a){return angular.isNumber(a)&&a<<0!==a&&(a=Math.round(a)),a}),this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.titles)?a.$parent.$eval(b.titles):c.titles;this.titles=angular.isArray(f)&&f.length>0?f:c.titles;var g=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(g)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;b<c;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff,title:this.getTitle(b)},a[b]);return a},this.getTitle=function(a){return a>=this.titles.length?a+1:this.titles[a]},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(d.$viewValue===b?0:b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("uibRating",function(){return{require:["uibRating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"UibRatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}),angular.module("ui.bootstrap.rating").value("$ratingSuppressWarning",!1).controller("RatingController",["$scope","$attrs","$controller","$log","$ratingSuppressWarning",function(a,b,c,d,e){e||d.warn("RatingController is now deprecated. Use UibRatingController instead."),angular.extend(this,c("UibRatingController",{$scope:a,$attrs:b}))}]).directive("rating",["$log","$ratingSuppressWarning",function(a,b){return{require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(c,d,e,f){b||a.warn("rating is now deprecated. Use uib-rating instead.");var g=f[0],h=f[1];g.init(h)}}}]),angular.module("ui.bootstrap.tabs",[]).controller("UibTabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect(),a.selectCalled=!1)}),a.active=!0,a.selectCalled||(a.onSelect(),a.selectCalled=!0)},b.addTab=function(a){c.push(a),1===c.length&&a.active!==!1?a.active=!0:a.active?b.select(a):a.active=!1},b.removeTab=function(a){var e=c.indexOf(a);if(a.active&&c.length>1&&!d){var f=e==c.length-1?e-1:e+1;b.select(c[f])}c.splice(e,1)};var d;a.$on("$destroy",function(){d=!0})}]).directive("uibTabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"UibTabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=!!angular.isDefined(c.vertical)&&a.$parent.$eval(c.vertical),a.justified=!!angular.isDefined(c.justified)&&a.$parent.$eval(c.justified)}}}).directive("uibTab",["$parse",function(a){return{require:"^uibTabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},link:function(b,c,d,e,f){b.$watch("active",function(a){a&&e.select(b)}),b.disabled=!1,d.disable&&b.$parent.$watch(a(d.disable),function(a){b.disabled=!!a}),b.select=function(){b.disabled||(b.active=!0)},e.addTab(b),b.$on("$destroy",function(){e.removeTab(b)}),b.$transcludeFn=f}}}]).directive("uibTabHeadingTransclude",function(){return{restrict:"A",require:["?^uibTab","?^tab"],link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}).directive("uibTabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||a.hasAttribute("x-tab-heading")||a.hasAttribute("uib-tab-heading")||a.hasAttribute("data-uib-tab-heading")||a.hasAttribute("x-uib-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase()||"x-tab-heading"===a.tagName.toLowerCase()||"uib-tab-heading"===a.tagName.toLowerCase()||"data-uib-tab-heading"===a.tagName.toLowerCase()||"x-uib-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:["?^uibTabset","?^tabset"],link:function(b,c,d){var e=b.$eval(d.uibTabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.tabs").value("$tabsSuppressWarning",!1).controller("TabsetController",["$scope","$controller","$log","$tabsSuppressWarning",function(a,b,c,d){d||c.warn("TabsetController is now deprecated. Use UibTabsetController instead."),angular.extend(this,b("UibTabsetController",{$scope:a}))}]).directive("tabset",["$log","$tabsSuppressWarning",function(a,b){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(c,d,e){b||a.warn("tabset is now deprecated. Use uib-tabset instead."),c.vertical=!!angular.isDefined(e.vertical)&&c.$parent.$eval(e.vertical),c.justified=!!angular.isDefined(e.justified)&&c.$parent.$eval(e.justified)}}}]).directive("tab",["$parse","$log","$tabsSuppressWarning",function(a,b,c){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},link:function(d,e,f,g,h){c||b.warn("tab is now deprecated. Use uib-tab instead."),d.$watch("active",function(a){a&&g.select(d)}),d.disabled=!1,f.disable&&d.$parent.$watch(a(f.disable),function(a){d.disabled=!!a}),d.select=function(){d.disabled||(d.active=!0)},g.addTab(d),d.$on("$destroy",function(){g.removeTab(d)}),d.$transcludeFn=h}}}]).directive("tabHeadingTransclude",["$log","$tabsSuppressWarning",function(a,b){return{restrict:"A",require:"^tab",link:function(c,d){b||a.warn("tab-heading-transclude is now deprecated. Use uib-tab-heading-transclude instead."),c.$watch("headingElement",function(a){a&&(d.html(""),d.append(a))})}}}]).directive("tabContentTransclude",["$log","$tabsSuppressWarning",function(a,b){function c(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||a.hasAttribute("x-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase()||"x-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(d,e,f){b||a.warn("tab-content-transclude is now deprecated. Use uib-tab-content-transclude instead.");var g=d.$eval(f.tabContentTransclude);g.$transcludeFn(g.$parent,function(a){angular.forEach(a,function(a){c(a)?g.headingElement=a:e.append(a)})})}}}]),angular.module("ui.bootstrap.timepicker",[]).constant("uibTimepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0,arrowkeys:!0,showSpinners:!0}).controller("UibTimepickerController",["$scope","$element","$attrs","$parse","$log","$locale","uibTimepickerConfig",function(a,b,c,d,e,f,g){function h(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&b<13:b>=0&&b<24;if(c)return a.showMeridian&&(12===b&&(b=0),a.meridian===r[1]&&(b+=12)),b}function i(){var b=parseInt(a.minutes,10);return b>=0&&b<60?b:void 0}function j(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a.toString()}function k(a){l(),q.$setViewValue(new Date(p)),m(a)}function l(){q.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function m(b){var c=p.getHours(),d=p.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:j(c),"m"!==b&&(a.minutes=j(d)),a.meridian=p.getHours()<12?r[0]:r[1]}function n(a,b){var c=new Date(a.getTime()+6e4*b),d=new Date(a);return d.setHours(c.getHours(),c.getMinutes()),d}function o(a){p=n(p,a),k()}var p=new Date,q={$setViewValue:angular.noop},r=angular.isDefined(c.meridians)?a.$parent.$eval(c.meridians):g.meridians||f.DATETIME_FORMATS.AMPMS;a.tabindex=angular.isDefined(c.tabindex)?c.tabindex:0,b.removeAttr("tabindex"),this.init=function(b,d){q=b,q.$render=this.render,q.$formatters.unshift(function(a){return a?new Date(a):null});var e=d.eq(0),f=d.eq(1),h=angular.isDefined(c.mousewheel)?a.$parent.$eval(c.mousewheel):g.mousewheel;h&&this.setupMousewheelEvents(e,f);var i=angular.isDefined(c.arrowkeys)?a.$parent.$eval(c.arrowkeys):g.arrowkeys;i&&this.setupArrowkeyEvents(e,f),a.readonlyInput=angular.isDefined(c.readonlyInput)?a.$parent.$eval(c.readonlyInput):g.readonlyInput,this.setupInputEvents(e,f)};var s=g.hourStep;c.hourStep&&a.$parent.$watch(d(c.hourStep),function(a){s=parseInt(a,10)});var t=g.minuteStep;c.minuteStep&&a.$parent.$watch(d(c.minuteStep),function(a){t=parseInt(a,10)});var u;a.$parent.$watch(d(c.min),function(a){var b=new Date(a);u=isNaN(b)?void 0:b});var v;a.$parent.$watch(d(c.max),function(a){var b=new Date(a);v=isNaN(b)?void 0:b}),a.noIncrementHours=function(){var a=n(p,60*s);return a>v||a<p&&a<u},a.noDecrementHours=function(){var a=n(p,60*-s);return a<u||a>p&&a>v},a.noIncrementMinutes=function(){var a=n(p,t);return a>v||a<p&&a<u},a.noDecrementMinutes=function(){var a=n(p,-t);return a<u||a>p&&a>v},a.noToggleMeridian=function(){return p.getHours()<13?n(p,720)>v:n(p,-720)<u},a.showMeridian=g.showMeridian,c.showMeridian&&a.$parent.$watch(d(c.showMeridian),function(b){if(a.showMeridian=!!b,q.$error.time){var c=h(),d=i();angular.isDefined(c)&&angular.isDefined(d)&&(p.setHours(c),k())}else m()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupArrowkeyEvents=function(b,c){b.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementHours(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementHours(),a.$apply())}),c.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementMinutes(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementMinutes(),a.$apply())})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){q.$setViewValue(null),q.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=h(),b=i();angular.isDefined(a)&&angular.isDefined(b)?(p.setHours(a),p<u||p>v?d(!0):k("h")):d(!0)},b.bind("blur",function(b){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=j(a.hours)})}),a.updateMinutes=function(){var a=i(),b=h();angular.isDefined(a)&&angular.isDefined(b)?(p.setMinutes(a),p<u||p>v?d(void 0,!0):k("m")):d(void 0,!0)},c.bind("blur",function(b){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=j(a.minutes)})})},this.render=function(){var b=q.$viewValue;isNaN(b)?(q.$setValidity("time",!1),e.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(b&&(p=b),p<u||p>v?(q.$setValidity("time",!1),a.invalidHours=!0,a.invalidMinutes=!0):l(),m())},a.showSpinners=angular.isDefined(c.showSpinners)?a.$parent.$eval(c.showSpinners):g.showSpinners,a.incrementHours=function(){a.noIncrementHours()||o(60*s)},a.decrementHours=function(){a.noDecrementHours()||o(60*-s)},a.incrementMinutes=function(){a.noIncrementMinutes()||o(t)},a.decrementMinutes=function(){a.noDecrementMinutes()||o(-t)},a.toggleMeridian=function(){a.noToggleMeridian()||o(720*(p.getHours()<12?1:-1))}}]).directive("uibTimepicker",function(){return{restrict:"EA",require:["uibTimepicker","?^ngModel"],controller:"UibTimepickerController",controllerAs:"timepicker",replace:!0,scope:{},templateUrl:function(a,b){return b.templateUrl||"template/timepicker/timepicker.html"},link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.timepicker").value("$timepickerSuppressWarning",!1).controller("TimepickerController",["$scope","$element","$attrs","$controller","$log","$timepickerSuppressWarning",function(a,b,c,d,e,f){f||e.warn("TimepickerController is now deprecated. Use UibTimepickerController instead."),angular.extend(this,d("UibTimepickerController",{$scope:a,$element:b,$attrs:c}))}]).directive("timepicker",["$log","$timepickerSuppressWarning",function(a,b){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",controllerAs:"timepicker",replace:!0,scope:{},templateUrl:function(a,b){return b.templateUrl||"template/timepicker/timepicker.html"},link:function(c,d,e,f){b||a.warn("timepicker is now deprecated. Use uib-timepicker instead.");var g=f[0],h=f[1];h&&g.init(h,d.find("input"))}}}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position"]).factory("uibTypeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).controller("UibTypeaheadController",["$scope","$element","$attrs","$compile","$parse","$q","$timeout","$document","$window","$rootScope","$uibPosition","uibTypeaheadParser",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(){K.moveInProgress||(K.moveInProgress=!0,K.$digest()),S&&g.cancel(S),S=g(function(){K.matches.length&&n(),K.moveInProgress=!1},r)}function n(){K.position=C?k.offset(b):k.position(b),K.position.top+=b.prop("offsetHeight")}var o,p,q=[9,13,27,38,40],r=200,s=a.$eval(c.typeaheadMinLength);s||0===s||(s=1);var t,u,v=a.$eval(c.typeaheadWaitMs)||0,w=a.$eval(c.typeaheadEditable)!==!1,x=e(c.typeaheadLoading).assign||angular.noop,y=e(c.typeaheadOnSelect),z=!!angular.isDefined(c.typeaheadSelectOnBlur)&&a.$eval(c.typeaheadSelectOnBlur),A=e(c.typeaheadNoResults).assign||angular.noop,B=c.typeaheadInputFormatter?e(c.typeaheadInputFormatter):void 0,C=!!c.typeaheadAppendToBody&&a.$eval(c.typeaheadAppendToBody),D=c.typeaheadAppendToElementId||!1,E=a.$eval(c.typeaheadFocusFirst)!==!1,F=!!c.typeaheadSelectOnExact&&a.$eval(c.typeaheadSelectOnExact),G=e(c.ngModel),H=e(c.ngModel+"($$$p)"),I=function(b,c){return angular.isFunction(G(a))&&p&&p.$options&&p.$options.getterSetter?H(b,{$$$p:c}):G.assign(b,c)},J=l.parse(c.uibTypeahead),K=a.$new(),L=a.$on("$destroy",function(){K.$destroy()});K.$on("$destroy",L);var M="typeahead-"+K.$id+"-"+Math.floor(1e4*Math.random());b.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":M});var N=angular.element("<div uib-typeahead-popup></div>");N.attr({id:M,matches:"matches",active:"activeIdx",select:"select(activeIdx)","move-in-progress":"moveInProgress",query:"query",position:"position"}),angular.isDefined(c.typeaheadTemplateUrl)&&N.attr("template-url",c.typeaheadTemplateUrl),angular.isDefined(c.typeaheadPopupTemplateUrl)&&N.attr("popup-template-url",c.typeaheadPopupTemplateUrl);var O=function(){K.matches=[],K.activeIdx=-1,b.attr("aria-expanded",!1)},P=function(a){return M+"-option-"+a};K.$watch("activeIdx",function(a){a<0?b.removeAttr("aria-activedescendant"):b.attr("aria-activedescendant",P(a))});var Q=function(a,b){return!!(K.matches.length>b&&a)&&a.toUpperCase()===K.matches[b].label.toUpperCase()},R=function(c){var d={$viewValue:c};x(a,!0),A(a,!1),f.when(J.source(a,d)).then(function(e){var f=c===o.$viewValue;if(f&&t)if(e&&e.length>0){K.activeIdx=E?0:-1,A(a,!1),K.matches.length=0;for(var g=0;g<e.length;g++)d[J.itemName]=e[g],K.matches.push({id:P(g),label:J.viewMapper(K,d),model:e[g]});K.query=c,n(),b.attr("aria-expanded",!0),F&&1===K.matches.length&&Q(c,0)&&K.select(0)}else O(),A(a,!0);f&&x(a,!1)},function(){O(),x(a,!1),A(a,!0)})};C&&(angular.element(i).bind("resize",m),h.find("body").bind("scroll",m));var S;K.moveInProgress=!1,K.query=void 0;var T,U=function(a){T=g(function(){R(a)},v)},V=function(){T&&g.cancel(T)};O(),K.select=function(d){var e,f,h={};u=!0,h[J.itemName]=f=K.matches[d].model,e=J.modelMapper(a,h),I(a,e),o.$setValidity("editable",!0),o.$setValidity("parse",!0),y(a,{$item:f,$model:e,$label:J.viewMapper(a,h)}),O(),K.$eval(c.typeaheadFocusOnSelect)!==!1&&g(function(){b[0].focus()},0,!1)},b.bind("keydown",function(a){if(0!==K.matches.length&&q.indexOf(a.which)!==-1){if(K.activeIdx===-1&&(9===a.which||13===a.which))return O(),void K.$digest();a.preventDefault(),40===a.which?(K.activeIdx=(K.activeIdx+1)%K.matches.length,K.$digest()):38===a.which?(K.activeIdx=(K.activeIdx>0?K.activeIdx:K.matches.length)-1,K.$digest()):13===a.which||9===a.which?K.$apply(function(){K.select(K.activeIdx)}):27===a.which&&(a.stopPropagation(),O(),K.$digest())}}),b.bind("blur",function(){z&&K.matches.length&&K.activeIdx!==-1&&!u&&(u=!0,K.$apply(function(){K.select(K.activeIdx)})),t=!1,u=!1});var W=function(a){b[0]!==a.target&&3!==a.which&&0!==K.matches.length&&(O(),j.$$phase||K.$digest())};h.bind("click",W),a.$on("$destroy",function(){h.unbind("click",W),(C||D)&&X.remove(),C&&(angular.element(i).unbind("resize",m),h.find("body").unbind("scroll",m)),N.remove()});var X=d(N)(K);C?h.find("body").append(X):D!==!1?angular.element(h[0].getElementById(D)).append(X):b.after(X),this.init=function(b,c){o=b,p=c,o.$parsers.unshift(function(b){return t=!0,0===s||b&&b.length>=s?v>0?(V(),U(b)):R(b):(x(a,!1),V(),O()),w?b:b?void o.$setValidity("editable",!1):(o.$setValidity("editable",!0),null)}),o.$formatters.push(function(b){var c,d,e={};return w||o.$setValidity("editable",!0),B?(e.$model=b,B(a,e)):(e[J.itemName]=b,c=J.viewMapper(a,e),e[J.itemName]=void 0,d=J.viewMapper(a,e),c!==d?c:b)})}}]).directive("uibTypeahead",function(){return{controller:"UibTypeaheadController",require:["ngModel","^?ngModelOptions","uibTypeahead"],link:function(a,b,c,d){d[2].init(d[0],d[1])}}}).directive("uibTypeaheadPopup",function(){return{scope:{matches:"=",query:"=",active:"=",position:"&",moveInProgress:"=",select:"&"},replace:!0,templateUrl:function(a,b){return b.popupTemplateUrl||"template/typeahead/typeahead-popup.html"},link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("uibTypeaheadMatch",["$templateRequest","$compile","$parse",function(a,b,c){return{scope:{index:"=",match:"=",query:"="},link:function(d,e,f){var g=c(f.templateUrl)(d.$parent)||"template/typeahead/typeahead-match.html";a(g).then(function(a){b(a.trim())(d,function(a){e.replaceWith(a)})})}}}]).filter("uibTypeaheadHighlight",["$sce","$injector","$log",function(a,b,c){function d(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function e(a){return/<.*>/g.test(a)}var f;return f=b.has("$sanitize"),function(b,g){return!f&&e(b)&&c.warn("Unsafe use of typeahead please use ngSanitize"),b=g?(""+b).replace(new RegExp(d(g),"gi"),"<strong>$&</strong>"):b,f||(b=a.trustAsHtml(b)),b}}]),angular.module("ui.bootstrap.typeahead").value("$typeaheadSuppressWarning",!1).service("typeaheadParser",["$parse","uibTypeaheadParser","$log","$typeaheadSuppressWarning",function(a,b,c,d){return d||c.warn("typeaheadParser is now deprecated. Use uibTypeaheadParser instead."),b}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$window","$rootScope","$uibPosition","typeaheadParser","$log","$typeaheadSuppressWarning",function(a,b,c,d,e,f,g,h,i,j,k){var l=[9,13,27,38,40],m=200;return{require:["ngModel","^?ngModelOptions"],link:function(n,o,p,q){function r(){N.moveInProgress||(N.moveInProgress=!0,N.$digest()),V&&d.cancel(V),V=d(function(){N.matches.length&&s(),N.moveInProgress=!1},m)}function s(){N.position=F?h.offset(o):h.position(o),N.position.top+=o.prop("offsetHeight")}k||j.warn("typeahead is now deprecated. Use uib-typeahead instead.");var t=q[0],u=q[1],v=n.$eval(p.typeaheadMinLength);v||0===v||(v=1);var w,x,y=n.$eval(p.typeaheadWaitMs)||0,z=n.$eval(p.typeaheadEditable)!==!1,A=b(p.typeaheadLoading).assign||angular.noop,B=b(p.typeaheadOnSelect),C=!!angular.isDefined(p.typeaheadSelectOnBlur)&&n.$eval(p.typeaheadSelectOnBlur),D=b(p.typeaheadNoResults).assign||angular.noop,E=p.typeaheadInputFormatter?b(p.typeaheadInputFormatter):void 0,F=!!p.typeaheadAppendToBody&&n.$eval(p.typeaheadAppendToBody),G=p.typeaheadAppendToElementId||!1,H=n.$eval(p.typeaheadFocusFirst)!==!1,I=!!p.typeaheadSelectOnExact&&n.$eval(p.typeaheadSelectOnExact),J=b(p.ngModel),K=b(p.ngModel+"($$$p)"),L=function(a,b){return angular.isFunction(J(n))&&u&&u.$options&&u.$options.getterSetter?K(a,{$$$p:b}):J.assign(a,b)},M=i.parse(p.typeahead),N=n.$new(),O=n.$on("$destroy",function(){N.$destroy()});N.$on("$destroy",O);var P="typeahead-"+N.$id+"-"+Math.floor(1e4*Math.random());o.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":P});var Q=angular.element("<div typeahead-popup></div>");Q.attr({id:P,matches:"matches",active:"activeIdx",select:"select(activeIdx)","move-in-progress":"moveInProgress",query:"query",position:"position"}),angular.isDefined(p.typeaheadTemplateUrl)&&Q.attr("template-url",p.typeaheadTemplateUrl),angular.isDefined(p.typeaheadPopupTemplateUrl)&&Q.attr("popup-template-url",p.typeaheadPopupTemplateUrl);var R=function(){N.matches=[],N.activeIdx=-1,o.attr("aria-expanded",!1)},S=function(a){return P+"-option-"+a};N.$watch("activeIdx",function(a){a<0?o.removeAttr("aria-activedescendant"):o.attr("aria-activedescendant",S(a))});var T=function(a,b){return!!(N.matches.length>b&&a)&&a.toUpperCase()===N.matches[b].label.toUpperCase()},U=function(a){var b={$viewValue:a};A(n,!0),D(n,!1),c.when(M.source(n,b)).then(function(c){var d=a===t.$viewValue;if(d&&w)if(c&&c.length>0){N.activeIdx=H?0:-1,D(n,!1),N.matches.length=0;for(var e=0;e<c.length;e++)b[M.itemName]=c[e],N.matches.push({id:S(e),label:M.viewMapper(N,b),model:c[e]});N.query=a,s(),o.attr("aria-expanded",!0),I&&1===N.matches.length&&T(a,0)&&N.select(0)}else R(),D(n,!0);d&&A(n,!1)},function(){R(),A(n,!1),D(n,!0)})};F&&(angular.element(f).bind("resize",r),e.find("body").bind("scroll",r));var V;N.moveInProgress=!1,R(),N.query=void 0;var W,X=function(a){W=d(function(){U(a)},y)},Y=function(){W&&d.cancel(W)};t.$parsers.unshift(function(a){return w=!0,0===v||a&&a.length>=v?y>0?(Y(),X(a)):U(a):(A(n,!1),Y(),R()),z?a:a?void t.$setValidity("editable",!1):(t.$setValidity("editable",!0),null)}),t.$formatters.push(function(a){var b,c,d={};return z||t.$setValidity("editable",!0),E?(d.$model=a,E(n,d)):(d[M.itemName]=a,b=M.viewMapper(n,d),d[M.itemName]=void 0,c=M.viewMapper(n,d),b!==c?b:a)}),N.select=function(a){var b,c,e={};x=!0,e[M.itemName]=c=N.matches[a].model,b=M.modelMapper(n,e),L(n,b),t.$setValidity("editable",!0),t.$setValidity("parse",!0),B(n,{$item:c,$model:b,$label:M.viewMapper(n,e)}),R(),N.$eval(p.typeaheadFocusOnSelect)!==!1&&d(function(){o[0].focus()},0,!1)},o.bind("keydown",function(a){if(0!==N.matches.length&&l.indexOf(a.which)!==-1){if(N.activeIdx===-1&&(9===a.which||13===a.which))return R(),void N.$digest();a.preventDefault(),40===a.which?(N.activeIdx=(N.activeIdx+1)%N.matches.length,N.$digest()):38===a.which?(N.activeIdx=(N.activeIdx>0?N.activeIdx:N.matches.length)-1,N.$digest()):13===a.which||9===a.which?N.$apply(function(){N.select(N.activeIdx)}):27===a.which&&(a.stopPropagation(),R(),N.$digest())}}),o.bind("blur",function(){C&&N.matches.length&&N.activeIdx!==-1&&!x&&(x=!0,N.$apply(function(){N.select(N.activeIdx)})),w=!1,x=!1});var Z=function(a){o[0]!==a.target&&3!==a.which&&0!==N.matches.length&&(R(),g.$$phase||N.$digest())};e.bind("click",Z),n.$on("$destroy",function(){e.unbind("click",Z),(F||G)&&$.remove(),F&&(angular.element(f).unbind("resize",r),e.find("body").unbind("scroll",r)),Q.remove()});var $=a(Q)(N);F?e.find("body").append($):G!==!1?angular.element(e[0].getElementById(G)).append($):o.after($)}}}]).directive("typeaheadPopup",["$typeaheadSuppressWarning","$log",function(a,b){return{scope:{matches:"=",query:"=",active:"=",position:"&",moveInProgress:"=",select:"&"},replace:!0,templateUrl:function(a,b){return b.popupTemplateUrl||"template/typeahead/typeahead-popup.html"},link:function(c,d,e){a||b.warn("typeahead-popup is now deprecated. Use uib-typeahead-popup instead."),c.templateUrl=e.templateUrl,c.isOpen=function(){return c.matches.length>0},c.isActive=function(a){return c.active==a},c.selectActive=function(a){c.active=a},c.selectMatch=function(a){c.select({activeIdx:a})}}}}]).directive("typeaheadMatch",["$templateRequest","$compile","$parse","$typeaheadSuppressWarning","$log",function(a,b,c,d,e){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(f,g,h){d||e.warn("typeahead-match is now deprecated. Use uib-typeahead-match instead.");var i=c(h.templateUrl)(f.$parent)||"template/typeahead/typeahead-match.html";a(i).then(function(a){b(a.trim())(f,function(a){g.replaceWith(a)})})}}}]).filter("typeaheadHighlight",["$sce","$injector","$log","$typeaheadSuppressWarning",function(a,b,c,d){function e(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function f(a){return/<.*>/g.test(a)}var g;return g=b.has("$sanitize"),function(b,h){return d||c.warn("typeaheadHighlight is now deprecated. Use uibTypeaheadHighlight instead."),!g&&f(b)&&c.warn("Unsafe use of typeahead please use ngSanitize"),b=h?(""+b).replace(new RegExp(e(h),"gi"),"<strong>$&</strong>"):b,g||(b=a.trustAsHtml(b)),b}}]),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'<div class="panel {{panelClass || \'panel-default\'}}">\n <div class="panel-heading" ng-keypress="toggleOpen($event)">\n <h4 class="panel-title">\n <a href tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" uib-accordion-transclude="heading"><span ng-class="{\'text-muted\': isDisabled}">{{heading}}</span></a>\n </h4>\n </div>\n <div class="panel-collapse collapse" uib-collapse="!isOpen">\n\t <div class="panel-body" ng-transclude></div>\n </div>\n</div>\n')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'<div class="panel-group" ng-transclude></div>')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html",'<div class="alert" ng-class="[\'alert-\' + (type || \'warning\'), closeable ? \'alert-dismissible\' : null]" role="alert">\n <button ng-show="closeable" type="button" class="close" ng-click="close({$event: $event})">\n <span aria-hidden="true">×</span>\n <span class="sr-only">Close</span>\n </button>\n <div ng-transclude></div>\n</div>\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'<div ng-mouseenter="pause()" ng-mouseleave="play()" class="carousel" ng-swipe-right="prev()" ng-swipe-left="next()">\n <div class="carousel-inner" ng-transclude></div>\n <a role="button" href class="left carousel-control" ng-click="prev()" ng-show="slides.length > 1">\n <span aria-hidden="true" class="glyphicon glyphicon-chevron-left"></span>\n <span class="sr-only">previous</span>\n </a>\n <a role="button" href class="right carousel-control" ng-click="next()" ng-show="slides.length > 1">\n <span aria-hidden="true" class="glyphicon glyphicon-chevron-right"></span>\n <span class="sr-only">next</span>\n </a>\n <ol class="carousel-indicators" ng-show="slides.length > 1">\n <li ng-repeat="slide in slides | orderBy:indexOfSlide track by $index" ng-class="{ active: isActive(slide) }" ng-click="select(slide)">\n <span class="sr-only">slide {{ $index + 1 }} of {{ slides.length }}<span ng-if="isActive(slide)">, currently active</span></span>\n </li>\n </ol>\n</div>'); -}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html",'<div ng-class="{\n \'active\': active\n }" class="item text-center" ng-transclude></div>\n')}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'<div ng-switch="datepickerMode" role="application" ng-keydown="keydown($event)">\n <uib-daypicker ng-switch-when="day" tabindex="0"></uib-daypicker>\n <uib-monthpicker ng-switch-when="month" tabindex="0"></uib-monthpicker>\n <uib-yearpicker ng-switch-when="year" tabindex="0"></uib-yearpicker>\n</div>')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th colspan="{{::5 + showWeeks}}"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n <tr>\n <th ng-if="showWeeks" class="text-center"></th>\n <th ng-repeat="label in ::labels track by $index" class="text-center"><small aria-label="{{::label.full}}">{{::label.abbr}}</small></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="row in rows track by $index">\n <td ng-if="showWeeks" class="text-center h6"><em>{{ weekNumbers[$index] }}</em></td>\n <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{::dt.uid}}" ng-class="::dt.customClass">\n <button type="button" style="min-width:100%;" class="btn btn-default btn-sm" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="::{\'text-muted\': dt.secondary, \'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="row in rows track by $index">\n <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{::dt.uid}}" ng-class="::dt.customClass">\n <button type="button" style="min-width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'<ul class="dropdown-menu" dropdown-nested ng-if="isOpen" style="display: block" ng-style="{top: position.top+\'px\', left: position.left+\'px\'}" ng-keydown="keydown($event)" ng-click="$event.stopPropagation()">\n\t<li ng-transclude></li>\n\t<li ng-if="showButtonBar" style="padding:10px 9px 2px">\n\t\t<span class="btn-group pull-left">\n\t\t\t<button type="button" class="btn btn-sm btn-info" ng-click="select(\'today\')" ng-disabled="isDisabled(\'today\')">{{ getText(\'current\') }}</button>\n\t\t\t<button type="button" class="btn btn-sm btn-danger" ng-click="select(null)">{{ getText(\'clear\') }}</button>\n\t\t</span>\n\t\t<button type="button" class="btn btn-sm btn-success pull-right" ng-click="close()">{{ getText(\'close\') }}</button>\n\t</li>\n</ul>\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th colspan="3"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="row in rows track by $index">\n <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{::dt.uid}}" ng-class="::dt.customClass">\n <button type="button" style="min-width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'<div uib-modal-animation-class="fade"\n modal-in-class="in"\n ng-style="{\'z-index\': 1040 + (index && 1 || 0) + index*10}"\n></div>\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'<div modal-render="{{$isRendered}}" tabindex="-1" role="dialog" class="modal"\n uib-modal-animation-class="fade"\n modal-in-class="in"\n ng-style="{\'z-index\': 1050 + index*10, display: \'block\'}">\n <div class="modal-dialog" ng-class="size ? \'modal-\' + size : \'\'"><div class="modal-content" uib-modal-transclude></div></div>\n</div>\n')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'<ul class="pager">\n <li ng-class="{disabled: noPrevious()||ngDisabled, previous: align}"><a href ng-click="selectPage(page - 1, $event)">{{::getText(\'previous\')}}</a></li>\n <li ng-class="{disabled: noNext()||ngDisabled, next: align}"><a href ng-click="selectPage(page + 1, $event)">{{::getText(\'next\')}}</a></li>\n</ul>\n')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'<ul class="pagination">\n <li ng-if="::boundaryLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-first"><a href ng-click="selectPage(1, $event)">{{::getText(\'first\')}}</a></li>\n <li ng-if="::directionLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-prev"><a href ng-click="selectPage(page - 1, $event)">{{::getText(\'previous\')}}</a></li>\n <li ng-repeat="page in pages track by $index" ng-class="{active: page.active,disabled: ngDisabled&&!page.active}" class="pagination-page"><a href ng-click="selectPage(page.number, $event)">{{page.text}}</a></li>\n <li ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next"><a href ng-click="selectPage(page + 1, $event)">{{::getText(\'next\')}}</a></li>\n <li ng-if="::boundaryLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-last"><a href ng-click="selectPage(totalPages, $event)">{{::getText(\'last\')}}</a></li>\n</ul>\n')}]),angular.module("template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-popup.html",'<div\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner" ng-bind-html="contentExp()"></div>\n</div>\n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'<div\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner" ng-bind="content"></div>\n</div>\n')}]),angular.module("template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-template-popup.html",'<div\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner"\n uib-tooltip-template-transclude="contentExp()"\n tooltip-template-transclude-scope="originScope()"></div>\n</div>\n')}]),angular.module("template/popover/popover-html.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-html.html",'<div tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n <div class="popover-content" ng-bind-html="contentExp()"></div>\n </div>\n</div>\n')}]),angular.module("template/popover/popover-template.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-template.html",'<div tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n <div class="popover-content"\n uib-tooltip-template-transclude="contentExp()"\n tooltip-template-transclude-scope="originScope()"></div>\n </div>\n</div>\n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'<div tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n <div class="popover-content" ng-bind="content"></div>\n </div>\n</div>\n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'<div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" aria-labelledby="{{::title}}" style="min-width: 0;" ng-transclude></div>\n')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'<div class="progress" ng-transclude aria-labelledby="{{::title}}"></div>')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'<div class="progress">\n <div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" aria-labelledby="{{::title}}" style="min-width: 0;" ng-transclude></div>\n</div>\n')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'<span ng-mouseleave="reset()" ng-keydown="onKeydown($event)" tabindex="0" role="slider" aria-valuemin="0" aria-valuemax="{{range.length}}" aria-valuenow="{{value}}">\n <span ng-repeat-start="r in range track by $index" class="sr-only">({{ $index < value ? \'*\' : \' \' }})</span>\n <i ng-repeat-end ng-mouseenter="enter($index + 1)" ng-click="rate($index + 1)" class="glyphicon" ng-class="$index < value && (r.stateOn || \'glyphicon-star\') || (r.stateOff || \'glyphicon-star-empty\')" ng-attr-title="{{r.title}}" aria-valuetext="{{r.title}}"></i>\n</span>\n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'<li ng-class="{active: active, disabled: disabled}">\n <a href ng-click="select()" uib-tab-heading-transclude>{{heading}}</a>\n</li>\n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'<div>\n <ul class="nav nav-{{type || \'tabs\'}}" ng-class="{\'nav-stacked\': vertical, \'nav-justified\': justified}" ng-transclude></ul>\n <div class="tab-content">\n <div class="tab-pane" \n ng-repeat="tab in tabs" \n ng-class="{active: tab.active}"\n uib-tab-content-transclude="tab">\n </div>\n </div>\n</div>\n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'<table>\n <tbody>\n <tr class="text-center" ng-show="::showSpinners">\n <td><a ng-click="incrementHours()" ng-class="{disabled: noIncrementHours()}" class="btn btn-link" ng-disabled="noIncrementHours()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n <td> </td>\n <td><a ng-click="incrementMinutes()" ng-class="{disabled: noIncrementMinutes()}" class="btn btn-link" ng-disabled="noIncrementMinutes()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n <td ng-show="showMeridian"></td>\n </tr>\n <tr>\n <td class="form-group" ng-class="{\'has-error\': invalidHours}">\n <input style="width:50px;" type="text" ng-model="hours" ng-change="updateHours()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}">\n </td>\n <td>:</td>\n <td class="form-group" ng-class="{\'has-error\': invalidMinutes}">\n <input style="width:50px;" type="text" ng-model="minutes" ng-change="updateMinutes()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}">\n </td>\n <td ng-show="showMeridian"><button type="button" ng-class="{disabled: noToggleMeridian()}" class="btn btn-default text-center" ng-click="toggleMeridian()" ng-disabled="noToggleMeridian()" tabindex="{{::tabindex}}">{{meridian}}</button></td>\n </tr>\n <tr class="text-center" ng-show="::showSpinners">\n <td><a ng-click="decrementHours()" ng-class="{disabled: noDecrementHours()}" class="btn btn-link" ng-disabled="noDecrementHours()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n <td> </td>\n <td><a ng-click="decrementMinutes()" ng-class="{disabled: noDecrementMinutes()}" class="btn btn-link" ng-disabled="noDecrementMinutes()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n <td ng-show="showMeridian"></td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'<a href tabindex="-1" ng-bind-html="match.label | uibTypeaheadHighlight:query"></a>\n')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'<ul class="dropdown-menu" ng-show="isOpen() && !moveInProgress" ng-style="{top: position().top+\'px\', left: position().left+\'px\'}" style="display: block;" role="listbox" aria-hidden="{{!isOpen()}}">\n <li ng-repeat="match in matches track by $index" ng-class="{active: isActive($index) }" ng-mouseenter="selectActive($index)" ng-click="selectMatch($index)" role="option" id="{{::match.id}}">\n <div uib-typeahead-match index="$index" match="match" query="query" template-url="templateUrl"></div>\n </li>\n</ul>\n')}]),!angular.$$csp()&&angular.element(document).find("head").prepend('<style type="text/css">.ng-animate.item:not(.left):not(.right){-webkit-transition:0s ease-in-out left;transition:0s ease-in-out left}</style>'),!function(a,b){"function"==typeof define&&define.amd?define([],function(){return b()}):"object"==typeof exports?module.exports=b():b()}(this,function(){function a(a){var b=a.storageKey(),c=a.storage(),d=function(){var d=a.preferredLanguage();angular.isString(d)?a.use(d):c.put(b,a.use())};d.displayName="fallbackFromIncorrectStorageValue",c?c.get(b)?a.use(c.get(b))["catch"](d):d():angular.isString(a.preferredLanguage())&&a.use(a.preferredLanguage())}function b(){var a,b,c=null,d=!1,e=!1;b={sanitize:function(a,b){return"text"===b&&(a=g(a)),a},escape:function(a,b){return"text"===b&&(a=f(a)),a},sanitizeParameters:function(a,b){return"params"===b&&(a=h(a,g)),a},escapeParameters:function(a,b){return"params"===b&&(a=h(a,f)),a}},b.escaped=b.escapeParameters,this.addStrategy=function(a,c){return b[a]=c,this},this.removeStrategy=function(a){return delete b[a],this},this.useStrategy=function(a){return d=!0,c=a,this},this.$get=["$injector","$log",function(f,g){var h={},i=function(a,c,d){return angular.forEach(d,function(d){if(angular.isFunction(d))a=d(a,c);else if(angular.isFunction(b[d]))a=b[d](a,c);else{if(!angular.isString(b[d]))throw new Error("pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: '"+d+"'");if(!h[b[d]])try{h[b[d]]=f.get(b[d])}catch(e){throw h[b[d]]=function(){},new Error("pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: '"+d+"'")}a=h[b[d]](a,c)}}),a},j=function(){d||e||(g.warn("pascalprecht.translate.$translateSanitization: No sanitization strategy has been configured. This can have serious security implications. See http://angular-translate.github.io/docs/#/guide/19_security for details."),e=!0)};return f.has("$sanitize")&&(a=f.get("$sanitize")),{useStrategy:function(a){return function(b){a.useStrategy(b)}}(this),sanitize:function(a,b,d){if(c||j(),arguments.length<3&&(d=c),!d)return a;var e=angular.isArray(d)?d:[d];return i(a,b,e)}}}];var f=function(a){var b=angular.element("<div></div>");return b.text(a),b.html()},g=function(b){if(!a)throw new Error("pascalprecht.translate.$translateSanitization: Error cannot find $sanitize service. Either include the ngSanitize module (https://docs.angularjs.org/api/ngSanitize) or use a sanitization strategy which does not depend on $sanitize, such as 'escape'.");return a(b)},h=function(a,b,c){if(angular.isObject(a)){var d=angular.isArray(a)?[]:{};if(c){if(c.indexOf(a)>-1)throw new Error("pascalprecht.translate.$translateSanitization: Error cannot interpolate parameter due recursive object")}else c=[];return c.push(a),angular.forEach(a,function(a,e){angular.isFunction(a)||(d[e]=h(a,b,c))}),c.splice(-1,1),d}return angular.isNumber(a)?a:b(a)}}function c(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u={},v=[],w=a,x=[],y="translate-cloak",z=!1,A=!1,B=".",C=!1,D=!1,E=0,F=!0,G="default",H={"default":function(a){return(a||"").split("-").join("_")},java:function(a){var b=(a||"").split("-").join("_"),c=b.split("_");return c.length>1?c[0].toLowerCase()+"_"+c[1].toUpperCase():b},bcp47:function(a){var b=(a||"").split("_").join("-"),c=b.split("-");return c.length>1?c[0].toLowerCase()+"-"+c[1].toUpperCase():b},"iso639-1":function(a){var b=(a||"").split("_").join("-"),c=b.split("-");return c[0].toLowerCase()}},I="2.11.1",J=function(){if(angular.isFunction(d.getLocale))return d.getLocale();var a,c,e=b.$get().navigator,f=["language","browserLanguage","systemLanguage","userLanguage"];if(angular.isArray(e.languages))for(a=0;a<e.languages.length;a++)if(c=e.languages[a],c&&c.length)return c;for(a=0;a<f.length;a++)if(c=e[f[a]],c&&c.length)return c;return null};J.displayName="angular-translate/service: getFirstBrowserLanguage";var K=function(){var a=J()||"";return H[G]&&(a=H[G](a)),a};K.displayName="angular-translate/service: getLocale";var L=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},M=function(){return this.toString().replace(/^\s+|\s+$/g,"")},N=function(a){if(a){for(var b=[],c=angular.lowercase(a),d=0,e=v.length;d<e;d++)b.push(angular.lowercase(v[d]));if(L(b,c)>-1)return a;if(f){var g;for(var h in f)if(f.hasOwnProperty(h)){var i=!1,j=Object.prototype.hasOwnProperty.call(f,h)&&angular.lowercase(h)===angular.lowercase(a);if("*"===h.slice(-1)&&(i=h.slice(0,-1)===a.slice(0,h.length-1)),(j||i)&&(g=f[h],L(b,angular.lowercase(g))>-1))return g}}var k=a.split("_");return k.length>1&&L(b,angular.lowercase(k[0]))>-1?k[0]:void 0}},O=function(a,b){if(!a&&!b)return u;if(a&&!b){if(angular.isString(a))return u[a]}else angular.isObject(u[a])||(u[a]={}),angular.extend(u[a],P(b));return this};this.translations=O,this.cloakClassName=function(a){return a?(y=a,this):y},this.nestedObjectDelimeter=function(a){return a?(B=a,this):B};var P=function(a,b,c,d){var e,f,g,h;b||(b=[]),c||(c={});for(e in a)Object.prototype.hasOwnProperty.call(a,e)&&(h=a[e],angular.isObject(h)?P(h,b.concat(e),c,e):(f=b.length?""+b.join(B)+B+e:e,b.length&&e===d&&(g=""+b.join(B),c[g]="@:"+f),c[f]=h));return c};P.displayName="flatObject",this.addInterpolation=function(a){return x.push(a),this},this.useMessageFormatInterpolation=function(){return this.useInterpolation("$translateMessageFormatInterpolation")},this.useInterpolation=function(a){return n=a,this},this.useSanitizeValueStrategy=function(a){return c.useStrategy(a),this},this.preferredLanguage=function(a){return a?(Q(a),this):e};var Q=function(a){return a&&(e=a),e};this.translationNotFoundIndicator=function(a){return this.translationNotFoundIndicatorLeft(a),this.translationNotFoundIndicatorRight(a),this},this.translationNotFoundIndicatorLeft=function(a){return a?(q=a,this):q},this.translationNotFoundIndicatorRight=function(a){return a?(r=a,this):r},this.fallbackLanguage=function(a){return R(a),this};var R=function(a){return a?(angular.isString(a)?(h=!0,g=[a]):angular.isArray(a)&&(h=!1,g=a),angular.isString(e)&&L(g,e)<0&&g.push(e),this):h?g[0]:g};this.use=function(a){if(a){if(!u[a]&&!o)throw new Error("$translateProvider couldn't find translationTable for langKey: '"+a+"'");return i=a,this}return i},this.resolveClientLocale=function(){return K()};var S=function(a){return a?(w=a,this):l?l+w:w};this.storageKey=S,this.useUrlLoader=function(a,b){return this.useLoader("$translateUrlLoader",angular.extend({url:a},b))},this.useStaticFilesLoader=function(a){return this.useLoader("$translateStaticFilesLoader",a)},this.useLoader=function(a,b){return o=a,p=b||{},this},this.useLocalStorage=function(){return this.useStorage("$translateLocalStorage")},this.useCookieStorage=function(){return this.useStorage("$translateCookieStorage")},this.useStorage=function(a){return k=a,this},this.storagePrefix=function(a){return a?(l=a,this):a},this.useMissingTranslationHandlerLog=function(){return this.useMissingTranslationHandler("$translateMissingTranslationHandlerLog")},this.useMissingTranslationHandler=function(a){return m=a,this},this.usePostCompiling=function(a){return z=!!a,this},this.forceAsyncReload=function(a){return A=!!a,this},this.uniformLanguageTag=function(a){return a?angular.isString(a)&&(a={standard:a}):a={},G=a.standard,this},this.determinePreferredLanguage=function(a){var b=a&&angular.isFunction(a)?a():K();return e=v.length?N(b)||b:b,this},this.registerAvailableLanguageKeys=function(a,b){return a?(v=a,b&&(f=b),this):v},this.useLoaderCache=function(a){return a===!1?s=void 0:a===!0?s=!0:"undefined"==typeof a?s="$translationCache":a&&(s=a),this},this.directivePriority=function(a){return void 0===a?E:(E=a,this)},this.statefulFilter=function(a){return void 0===a?F:(F=a,this)},this.postProcess=function(a){return t=a?a:void 0,this},this.keepContent=function(a){return D=!!a,this},this.$get=["$log","$injector","$rootScope","$q",function(a,b,c,d){var f,l,G,H=b.get(n||"$translateDefaultInterpolation"),J=!1,T={},U={},V=function(a,b,c,h,j){!i&&e&&(i=e);var m=j&&j!==i?N(j)||j:i;if(j&&ka(j),angular.isArray(a)){var n=function(a){for(var e={},f=[],g=function(a){var f=d.defer(),g=function(b){e[a]=b,f.resolve([a,b])};return V(a,b,c,h,j).then(g,g),f.promise},i=0,k=a.length;i<k;i++)f.push(g(a[i]));return d.all(f).then(function(){return e})};return n(a)}var o=d.defer();a&&(a=M.apply(a));var p=function(){var a=e?U[e]:U[m];if(l=0,k&&!a){var b=f.get(w);if(a=U[b],g&&g.length){var c=L(g,b);l=0===c?1:0,L(g,e)<0&&g.push(e)}}return a}();if(p){var q=function(){j||(m=i),ga(a,b,c,h,m).then(o.resolve,o.reject)};q.displayName="promiseResolved",p["finally"](q)}else ga(a,b,c,h,m).then(o.resolve,o.reject);return o.promise},W=function(a){return q&&(a=[q,a].join(" ")),r&&(a=[a,r].join(" ")),a},X=function(a){i=a,k&&f.put(V.storageKey(),i),c.$emit("$translateChangeSuccess",{language:a}),H.setLocale(i);var b=function(a,b){T[b].setLocale(i)};b.displayName="eachInterpolatorLocaleSetter",angular.forEach(T,b),c.$emit("$translateChangeEnd",{language:a})},Y=function(a){if(!a)throw"No language key specified for loading.";var e=d.defer();c.$emit("$translateLoadingStart",{language:a}),J=!0;var f=s;"string"==typeof f&&(f=b.get(f));var g=angular.extend({},p,{key:a,$http:angular.extend({},{cache:f},p.$http)}),h=function(b){var d={};c.$emit("$translateLoadingSuccess",{language:a}),angular.isArray(b)?angular.forEach(b,function(a){angular.extend(d,P(a))}):angular.extend(d,P(b)),J=!1,e.resolve({key:a,table:d}),c.$emit("$translateLoadingEnd",{language:a})};h.displayName="onLoaderSuccess";var i=function(a){c.$emit("$translateLoadingError",{language:a}),e.reject(a),c.$emit("$translateLoadingEnd",{language:a})};return i.displayName="onLoaderError",b.get(o)(g).then(h,i),e.promise};if(k&&(f=b.get(k),!f.get||!f.put))throw new Error("Couldn't use storage '"+k+"', missing get() or put() method!");if(x.length){var Z=function(a){var c=b.get(a);c.setLocale(e||i),T[c.getInterpolationIdentifier()]=c};Z.displayName="interpolationFactoryAdder",angular.forEach(x,Z)}var $=function(a){var b=d.defer();if(Object.prototype.hasOwnProperty.call(u,a))b.resolve(u[a]);else if(U[a]){var c=function(a){O(a.key,a.table),b.resolve(a.table)};c.displayName="translationTableResolver",U[a].then(c,b.reject)}else b.reject();return b.promise},_=function(a,b,c,e){var f=d.defer(),g=function(d){if(Object.prototype.hasOwnProperty.call(d,b)){e.setLocale(a);var g=d[b];if("@:"===g.substr(0,2))_(a,g.substr(2),c,e).then(f.resolve,f.reject);else{var h=e.interpolate(d[b],c);h=ja(b,d[b],h,c,a),f.resolve(h)}e.setLocale(i)}else f.reject()};return g.displayName="fallbackTranslationResolver",$(a).then(g,f.reject),f.promise},aa=function(a,b,c,d){var e,f=u[a];if(f&&Object.prototype.hasOwnProperty.call(f,b)){if(d.setLocale(a),e=d.interpolate(f[b],c),e=ja(b,f[b],e,c,a),"@:"===e.substr(0,2))return aa(a,e.substr(2),c,d);d.setLocale(i)}return e},ba=function(a,c,d){if(m){var e=b.get(m)(a,i,c,d);return void 0!==e?e:a}return a},ca=function(a,b,c,e,f){var h=d.defer();if(a<g.length){var i=g[a];_(i,b,c,e).then(function(a){h.resolve(a)},function(){return ca(a+1,b,c,e,f).then(h.resolve,h.reject)})}else f?h.resolve(f):m?h.resolve(ba(b,c)):h.reject(ba(b,c));return h.promise},da=function(a,b,c,d){var e;if(a<g.length){var f=g[a];e=aa(f,b,c,d),e||(e=da(a+1,b,c,d))}return e},ea=function(a,b,c,d){return ca(G>0?G:l,a,b,c,d)},fa=function(a,b,c){return da(G>0?G:l,a,b,c)},ga=function(a,b,c,e,f){var h=d.defer(),i=f?u[f]:u,j=c?T[c]:H;if(i&&Object.prototype.hasOwnProperty.call(i,a)){var k=i[a];if("@:"===k.substr(0,2))V(k.substr(2),b,c,e,f).then(h.resolve,h.reject);else{var l=j.interpolate(k,b);l=ja(a,k,l,b,f),h.resolve(l)}}else{var n;m&&!J&&(n=ba(a,b,e)),f&&g&&g.length?ea(a,b,j,e).then(function(a){h.resolve(a)},function(a){h.reject(W(a))}):m&&!J&&n?e?h.resolve(e):h.resolve(n):e?h.resolve(e):h.reject(W(a))}return h.promise},ha=function(a,b,c,d){var e,f=d?u[d]:u,h=H;if(T&&Object.prototype.hasOwnProperty.call(T,c)&&(h=T[c]),f&&Object.prototype.hasOwnProperty.call(f,a)){var i=f[a];"@:"===i.substr(0,2)?e=ha(i.substr(2),b,c,d):(e=h.interpolate(i,b),e=ja(a,i,e,b,d))}else{var j;m&&!J&&(j=ba(a,b)),d&&g&&g.length?(l=0,e=fa(a,b,h)):e=m&&!J&&j?j:W(a)}return e},ia=function(a){j===a&&(j=void 0),U[a]=void 0},ja=function(a,c,d,e,f){var g=t;return g&&("string"==typeof g&&(g=b.get(g)),g)?g(a,c,d,e,f):d},ka=function(a){u[a]||!o||U[a]||(U[a]=Y(a).then(function(a){return O(a.key,a.table),a}))};V.preferredLanguage=function(a){return a&&Q(a),e},V.cloakClassName=function(){return y},V.nestedObjectDelimeter=function(){return B},V.fallbackLanguage=function(a){if(void 0!==a&&null!==a){if(R(a),o&&g&&g.length)for(var b=0,c=g.length;b<c;b++)U[g[b]]||(U[g[b]]=Y(g[b]));V.use(V.use())}return h?g[0]:g},V.useFallbackLanguage=function(a){if(void 0!==a&&null!==a)if(a){var b=L(g,a);b>-1&&(G=b)}else G=0},V.proposedLanguage=function(){return j},V.storage=function(){return f},V.negotiateLocale=N,V.use=function(a){if(!a)return i;var b=d.defer();c.$emit("$translateChangeStart",{language:a});var e=N(a);return v.length>0&&!e?d.reject(a):(e&&(a=e),j=a,!A&&u[a]||!o||U[a]?U[a]?U[a].then(function(a){return j===a.key&&X(a.key),b.resolve(a.key),a},function(a){return!i&&g&&g.length>0?V.use(g[0]).then(b.resolve,b.reject):b.reject(a)}):(b.resolve(a),X(a)):(U[a]=Y(a).then(function(c){return O(c.key,c.table),b.resolve(c.key),j===a&&X(c.key),c},function(a){return c.$emit("$translateChangeError",{language:a}),b.reject(a),c.$emit("$translateChangeEnd",{language:a}),d.reject(a)}),U[a]["finally"](function(){ia(a)})),b.promise)},V.resolveClientLocale=function(){return K()},V.storageKey=function(){return S()},V.isPostCompilingEnabled=function(){return z},V.isForceAsyncReloadEnabled=function(){return A},V.isKeepContent=function(){return D},V.refresh=function(a){function b(){f.resolve(),c.$emit("$translateRefreshEnd",{language:a})}function e(){f.reject(),c.$emit("$translateRefreshEnd",{language:a})}if(!o)throw new Error("Couldn't refresh translation table, no loader registered!");var f=d.defer();if(c.$emit("$translateRefreshStart",{language:a}),a)if(u[a]){var h=function(c){return O(c.key,c.table),a===i&&X(i),b(),c};h.displayName="refreshPostProcessor",Y(a).then(h,e)}else e();else{var j=[],k={};if(g&&g.length)for(var l=0,m=g.length;l<m;l++)j.push(Y(g[l])),k[g[l]]=!0;i&&!k[i]&&j.push(Y(i));var n=function(a){u={},angular.forEach(a,function(a){O(a.key,a.table)}),i&&X(i),b()};n.displayName="refreshPostProcessor",d.all(j).then(n,e)}return f.promise},V.instant=function(a,b,c,d){var f=d&&d!==i?N(d)||d:i;if(null===a||angular.isUndefined(a))return a;if(d&&ka(d),angular.isArray(a)){for(var h={},j=0,k=a.length;j<k;j++)h[a[j]]=V.instant(a[j],b,c,d);return h}if(angular.isString(a)&&a.length<1)return a;a&&(a=M.apply(a));var l,n=[];e&&n.push(e),f&&n.push(f),g&&g.length&&(n=n.concat(g));for(var o=0,p=n.length;o<p;o++){var s=n[o];if(u[s]&&"undefined"!=typeof u[s][a]&&(l=ha(a,b,c,f)),"undefined"!=typeof l)break}return l||""===l||(q||r?l=W(a):(l=H.interpolate(a,b),m&&!J&&(l=ba(a,b)))),l},V.versionInfo=function(){return I},V.loaderCache=function(){return s},V.directivePriority=function(){return E},V.statefulFilter=function(){return F},V.isReady=function(){ -return C};var la=d.defer();la.promise.then(function(){C=!0}),V.onReady=function(a){var b=d.defer();return angular.isFunction(a)&&b.promise.then(a),C?b.resolve():la.promise.then(b.resolve),b.promise},V.getAvailableLanguageKeys=function(){return v.length>0?v:null};var ma=c.$on("$translateReady",function(){la.resolve(),ma(),ma=null}),na=c.$on("$translateChangeEnd",function(){la.resolve(),na(),na=null});if(o){if(angular.equals(u,{})&&V.use()&&V.use(V.use()),g&&g.length)for(var oa=function(a){return O(a.key,a.table),c.$emit("$translateChangeEnd",{language:a.key}),a},pa=0,qa=g.length;pa<qa;pa++){var ra=g[pa];!A&&u[ra]||(U[ra]=Y(ra).then(oa))}}else c.$emit("$translateReady",{language:V.use()});return V}]}function d(a,b){var c,d={},e="default";return d.setLocale=function(a){c=a},d.getInterpolationIdentifier=function(){return e},d.useSanitizeValueStrategy=function(a){return b.useStrategy(a),this},d.interpolate=function(c,d){d=d||{},d=b.sanitize(d,"params");var e;return angular.isNumber(c)?e=""+c:angular.isString(c)?(e=a(c)(d),e=b.sanitize(e,"text")):e="",e},d}function e(a,b,c,d,e,g){var h=function(){return this.toString().replace(/^\s+|\s+$/g,"")};return{restrict:"AE",scope:!0,priority:a.directivePriority(),compile:function(b,i){var j=i.translateValues?i.translateValues:void 0,k=i.translateInterpolation?i.translateInterpolation:void 0,l=b[0].outerHTML.match(/translate-value-+/i),m="^(.*)("+c.startSymbol()+".*"+c.endSymbol()+")(.*)",n="^(.*)"+c.startSymbol()+"(.*)"+c.endSymbol()+"(.*)";return function(b,o,p){b.interpolateParams={},b.preText="",b.postText="",b.translateNamespace=f(b);var q={},r=function(a,c,d){if(c.translateValues&&angular.extend(a,e(c.translateValues)(b.$parent)),l)for(var f in d)if(Object.prototype.hasOwnProperty.call(c,f)&&"translateValue"===f.substr(0,14)&&"translateValues"!==f){var g=angular.lowercase(f.substr(14,1))+f.substr(15);a[g]=d[f]}},s=function(a){if(angular.isFunction(s._unwatchOld)&&(s._unwatchOld(),s._unwatchOld=void 0),angular.equals(a,"")||!angular.isDefined(a)){var d=h.apply(o.text()),e=d.match(m);if(angular.isArray(e)){b.preText=e[1],b.postText=e[3],q.translate=c(e[2])(b.$parent);var f=d.match(n);angular.isArray(f)&&f[2]&&f[2].length&&(s._unwatchOld=b.$watch(f[2],function(a){q.translate=a,y()}))}else q.translate=d?d:void 0}else q.translate=a;y()},t=function(a){p.$observe(a,function(b){q[a]=b,y()})};r(b.interpolateParams,p,i);var u=!0;p.$observe("translate",function(a){"undefined"==typeof a?s(""):""===a&&u||(q.translate=a,y()),u=!1});for(var v in p)p.hasOwnProperty(v)&&"translateAttr"===v.substr(0,13)&&t(v);if(p.$observe("translateDefault",function(a){b.defaultText=a,y()}),j&&p.$observe("translateValues",function(a){a&&b.$parent.$watch(function(){angular.extend(b.interpolateParams,e(a)(b.$parent))})}),l){var w=function(a){p.$observe(a,function(c){var d=angular.lowercase(a.substr(14,1))+a.substr(15);b.interpolateParams[d]=c})};for(var x in p)Object.prototype.hasOwnProperty.call(p,x)&&"translateValue"===x.substr(0,14)&&"translateValues"!==x&&w(x)}var y=function(){for(var a in q)q.hasOwnProperty(a)&&void 0!==q[a]&&z(a,q[a],b,b.interpolateParams,b.defaultText,b.translateNamespace)},z=function(b,c,d,e,f,g){c?(g&&"."===c.charAt(0)&&(c=g+c),a(c,e,k,f,d.translateLanguage).then(function(a){A(a,d,!0,b)},function(a){A(a,d,!1,b)})):A(c,d,!1,b)},A=function(b,c,e,f){if(e||"undefined"!=typeof c.defaultText&&(b=c.defaultText),"translate"===f){(e||!e&&!a.isKeepContent()&&"undefined"==typeof p.translateKeepContent)&&o.empty().append(c.preText+b+c.postText);var g=a.isPostCompilingEnabled(),h="undefined"!=typeof i.translateCompile,j=h&&"false"!==i.translateCompile;(g&&!h||j)&&d(o.contents())(c)}else{var k=p.$attr[f];"data-"===k.substr(0,5)&&(k=k.substr(5)),k=k.substr(15),o.attr(k,b)}};(j||l||p.translateDefault)&&b.$watch("interpolateParams",y,!0);var B=b.$on("translateLanguageChanged",y),C=g.$on("$translateChangeSuccess",y);o.text().length?s(p.translate?p.translate:""):p.translate&&s(p.translate),y(),b.$on("$destroy",function(){B(),C()})}}}}function f(a){return a.translateNamespace?a.translateNamespace:a.$parent?f(a.$parent):void 0}function g(a,b){return{compile:function(c){var d=function(){c.addClass(a.cloakClassName())},e=function(){c.removeClass(a.cloakClassName())};return a.onReady(function(){e()}),d(),function(c,f,g){g.translateCloak&&g.translateCloak.length&&(g.$observe("translateCloak",function(b){a(b).then(e,d)}),b.$on("$translateChangeSuccess",function(){a(g.translateCloak).then(e,d)}))}}}}function h(){return{restrict:"A",scope:!0,compile:function(){return{pre:function(a,b,c){a.translateNamespace=f(a),a.translateNamespace&&"."===c.translateNamespace.charAt(0)?a.translateNamespace+=c.translateNamespace:a.translateNamespace=c.translateNamespace}}}}}function f(a){return a.translateNamespace?a.translateNamespace:a.$parent?f(a.$parent):void 0}function i(){return{restrict:"A",scope:!0,compile:function(){return function(a,b,c){c.$observe("translateLanguage",function(b){a.translateLanguage=b}),a.$watch("translateLanguage",function(){a.$broadcast("translateLanguageChanged")})}}}}function j(a,b){var c=function(c,d,e,f){return angular.isObject(d)||(d=a(d)(this)),b.instant(c,d,e,f)};return b.statefulFilter()&&(c.$stateful=!0),c}function k(a){return a("translations")}return a.$inject=["$translate"],c.$inject=["$STORAGE_KEY","$windowProvider","$translateSanitizationProvider","pascalprechtTranslateOverrider"],d.$inject=["$interpolate","$translateSanitization"],e.$inject=["$translate","$q","$interpolate","$compile","$parse","$rootScope"],g.$inject=["$translate","$rootScope"],j.$inject=["$parse","$translate"],k.$inject=["$cacheFactory"],angular.module("pascalprecht.translate",["ng"]).run(a),a.displayName="runTranslate",angular.module("pascalprecht.translate").provider("$translateSanitization",b),angular.module("pascalprecht.translate").constant("pascalprechtTranslateOverrider",{}).provider("$translate",c),c.displayName="displayName",angular.module("pascalprecht.translate").factory("$translateDefaultInterpolation",d),d.displayName="$translateDefaultInterpolation",angular.module("pascalprecht.translate").constant("$STORAGE_KEY","NG_TRANSLATE_LANG_KEY"),angular.module("pascalprecht.translate").directive("translate",e),e.displayName="translateDirective",angular.module("pascalprecht.translate").directive("translateCloak",g),g.displayName="translateCloakDirective",angular.module("pascalprecht.translate").directive("translateNamespace",h),h.displayName="translateNamespaceDirective",angular.module("pascalprecht.translate").directive("translateLanguage",i),i.displayName="translateLanguageDirective",angular.module("pascalprecht.translate").filter("translate",j),j.displayName="translateFilterFactory",angular.module("pascalprecht.translate").factory("$translationCache",k),k.displayName="$translationCache","pascalprecht.translate"}),!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}if(window.FileAPI||(window.FileAPI={}),!window.XMLHttpRequest)throw"AJAX is not supported. XMLHttpRequest is not defined.";if(FileAPI.shouldLoad=!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){a&&angular.isString(a)&&-1!==a.indexOf("#2174")&&(a=null),c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}}}}(),function(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!==navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.hasFlash=b(),FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i)}FileAPI.ngfFixIE=function(d,e,f){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var g=function(){var b=e.parent();d.attr("disabled")?b&&b.removeClass("js-fileapi-wrapper"):(e.attr("__ngf_flash_")||(e.unbind("change"),e.unbind("click"),e.bind("change",function(a){h.apply(this,[a]),f.apply(this,[a])}),e.attr("__ngf_flash_","true")),b.addClass("js-fileapi-wrapper"),a(d)||(b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible"),e.css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("position","absolute").css("top","0px").css("left","0px")))};d.bind("mouseenter",g);var h=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}}(),window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(e=c("error",d),a.onerror&&a.onerror(e),a.dispatchEvent(e))};this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="12.2.13",ngFileUpload.service("UploadBase",["$http","$q","$timeout",function(a,b,c){function d(d){function e(a){j.notify&&j.notify(a),k.progressFunc&&c(function(){k.progressFunc(a)})}function h(a){return null!=d._start&&g?{loaded:a.loaded+d._start,total:d._file&&d._file.size||a.total,type:a.type,config:d,lengthComputable:!0,target:a.target}:a}function i(){a(d).then(function(a){if(g&&d._chunkSize&&!d._finished&&d._file){var b=d._file&&d._file.size||0;e({loaded:Math.min(d._end,b),total:b,config:d,type:"progress"}),f.upload(d,!0)}else d._finished&&delete d._finished,j.resolve(a)},function(a){j.reject(a)},function(a){j.notify(a)})}d.method=d.method||"POST",d.headers=d.headers||{};var j=d._deferred=d._deferred||b.defer(),k=j.promise;return d.disableProgress||(d.headers.__setXHR_=function(){return function(a){a&&a.upload&&a.upload.addEventListener&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e(h(a))},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e(h(a)))},!1))}}),g?d._chunkSize&&d._end&&!d._finished?(d._start=d._end,d._end+=d._chunkSize,i()):d.resumeSizeUrl?a.get(d.resumeSizeUrl).then(function(a){d._start=d.resumeSizeResponseReader?d.resumeSizeResponseReader(a.data):parseInt((null==a.data.size?a.data:a.data.size).toString()),d._chunkSize&&(d._end=d._start+d._chunkSize),i()},function(a){throw a}):d.resumeSize?d.resumeSize().then(function(a){d._start=a,d._chunkSize&&(d._end=d._start+d._chunkSize),i()},function(a){throw a}):(d._chunkSize&&(d._start=0,d._end=d._start+d._chunkSize),i()):i(),k.success=function(a){return k.then(function(b){a(b.data,b.status,b.headers,d)}),k},k.error=function(a){return k.then(null,function(b){a(b.data,b.status,b.headers,d)}),k},k.progress=function(a){return k.progressFunc=a,k.then(null,null,function(b){a(b)}),k},k.abort=k.pause=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),k},k.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(k,arguments),a.apply(k,arguments)}}(d.xhrFn),k},f.promisesCount++,k["finally"]&&k["finally"]instanceof Function&&k["finally"](function(){f.promisesCount--}),k}function e(a){var b={};for(var c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return b}var f=this;f.promisesCount=0,this.isResumeSupported=function(){return window.Blob&&window.Blob.prototype.slice};var g=this.isResumeSupported();this.isUploadInProgress=function(){return f.promisesCount>0},this.rename=function(a,b){return a.ngfName=b,a},this.jsonBlob=function(a){null==a||angular.isString(a)||(a=JSON.stringify(a));var b=new window.Blob([a],{type:"application/json"});return b._ngfBlob=!0,b},this.json=function(a){return angular.toJson(a)},this.isFile=function(a){return null!=a&&(a instanceof window.Blob||a.flashId&&a.name&&a.size)},this.upload=function(a,b){function c(b,c){if(b._ngfBlob)return b;if(a._file=a._file||b,null!=a._start&&g){a._end&&a._end>=b.size&&(a._finished=!0,a._end=b.size);var d=b.slice(a._start,a._end||b.size);return d.name=b.name,d.ngfName=b.ngfName,a._chunkSize&&(c.append("_chunkSize",a._chunkSize),c.append("_currentChunkSize",a._end-a._start),c.append("_chunkNumber",Math.floor(a._start/a._chunkSize)),c.append("_totalSize",a._file.size)),d}return b}function h(b,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))b.append(e,d);else if(f.isFile(d)){var g=c(d,b),i=e.split(",");i[1]&&(g.ngfName=i[1].replace(/^\s+|\s+$/g,""),e=i[0]),a._fileKey=a._fileKey||e,b.append(e,g,g.ngfName||g.name)}else if(angular.isObject(d)){if(d.$$ngfCircularDetection)throw"ngFileUpload: Circular reference in config.data. Make sure specified data for Upload.upload() has no circular reference: "+e;d.$$ngfCircularDetection=!0;try{for(var j in d)if(d.hasOwnProperty(j)&&"$$ngfCircularDetection"!==j){var k=null==a.objectKey?"[i]":a.objectKey;d.length&&parseInt(j)>-1&&(k=null==a.arrayKey?k:a.arrayKey),h(b,d[j],e+k.replace(/[ik]/g,j))}}finally{delete d.$$ngfCircularDetection}}else b.append(e,d)}function i(){a._chunkSize=f.translateScalars(a.resumeChunkSize),a._chunkSize=a._chunkSize?parseInt(a._chunkSize.toString()):null,a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(b){var c,d=new window.FormData;b=b||a.fields||{},a.file&&(b.file=a.file);for(c in b)if(b.hasOwnProperty(c)){var e=b[c];a.formDataAppender?a.formDataAppender(d,c,e):h(d,e,c)}return d})}return b||(a=e(a)),a._isDigested||(a._isDigested=!0,i()),d(a)},this.http=function(b){return b=e(b),b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof window.Blob?b:a.defaults.transformRequest[0].apply(this,arguments)},b._chunkSize=f.translateScalars(b.resumeChunkSize),b._chunkSize=b._chunkSize?parseInt(b._chunkSize.toString()):null,d(b)},this.translateScalars=function(a){if(angular.isString(a)){if(a.search(/kb/i)===a.length-2)return parseFloat(1024*a.substring(0,a.length-2));if(a.search(/mb/i)===a.length-2)return parseFloat(1048576*a.substring(0,a.length-2));if(a.search(/gb/i)===a.length-2)return parseFloat(1073741824*a.substring(0,a.length-2));if(a.search(/b/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/s/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/m/i)===a.length-1)return parseFloat(60*a.substring(0,a.length-1));if(a.search(/h/i)===a.length-1)return parseFloat(3600*a.substring(0,a.length-1))}return a},this.urlToBlob=function(c){var d=b.defer();return a({url:c,method:"get",responseType:"arraybuffer"}).then(function(a){var b=new Uint8Array(a.data),e=a.headers("content-type")||"image/WebP",f=new window.Blob([b],{type:e}),g=c.match(/.*\/(.+?)(\?.*)?$/);g.length>1&&(f.name=g[1]),d.resolve(f)},function(a){d.reject(a)}),d.promise},this.setDefaults=function(a){this.defaults=a||{}},this.defaults={},this.version=ngFileUpload.version}]),ngFileUpload.service("Upload",["$parse","$timeout","$compile","$q","UploadExif",function(a,b,c,d,e){function f(a,b,c){var e=[i.emptyPromise()];return angular.forEach(a,function(d,f){0===d.type.indexOf("image/jpeg")&&i.attrGetter("ngfFixOrientation",b,c,{$file:d})&&e.push(i.happyPromise(i.applyExifRotation(d),d).then(function(b){a.splice(f,1,b)}))}),d.all(e)}function g(a,b,c,e){var f=i.attrGetter("ngfResize",b,c);if(!f||!i.isResizeSupported()||!a.length)return i.emptyPromise();if(f instanceof Function){var g=d.defer();return f(a).then(function(d){h(d,a,b,c,e).then(function(a){g.resolve(a)},function(a){g.reject(a)})},function(a){g.reject(a)})}return h(f,a,b,c,e)}function h(a,b,c,e,f){function g(d,g){if(0===d.type.indexOf("image")){if(a.pattern&&!i.validatePattern(d,a.pattern))return;a.resizeIf=function(a,b){return i.attrGetter("ngfResizeIf",c,e,{$width:a,$height:b,$file:d})};var j=i.resize(d,a);h.push(j),j.then(function(a){b.splice(g,1,a)},function(a){d.$error="resize",(d.$errorMessages=d.$errorMessages||{}).resize=!0,d.$errorParam=(a?(a.message?a.message:a)+": ":"")+(d&&d.name),f.$ngfValidations.push({name:"resize",valid:!1}),i.applyModelValidation(f,b)})}}for(var h=[i.emptyPromise()],j=0;j<b.length;j++)g(b[j],j);return d.all(h)}var i=e;return i.getAttrWithDefaults=function(a,b){if(null!=a[b])return a[b];var c=i.defaults[b];return null==c?c:angular.isString(c)?c:JSON.stringify(c)},i.attrGetter=function(b,c,d,e){var f=this.getAttrWithDefaults(c,b);if(!d)return f;try{return e?a(f)(d,e):a(f)(d)}catch(g){if(b.search(/min|max|pattern/i))return f;throw g}},i.shouldUpdateOn=function(a,b,c){var d=i.attrGetter("ngfModelOptions",b,c);return!d||!d.updateOn||d.updateOn.split(" ").indexOf(a)>-1},i.emptyPromise=function(){var a=d.defer(),c=arguments;return b(function(){a.resolve.apply(a,c)}),a.promise},i.rejectPromise=function(){var a=d.defer(),c=arguments;return b(function(){a.reject.apply(a,c)}),a.promise},i.happyPromise=function(a,c){var e=d.defer();return a.then(function(a){e.resolve(a)},function(a){b(function(){throw a}),e.resolve(c)}),e.promise},i.updateModel=function(c,d,e,h,j,k,l){function m(f,g,j,l,m){d.$$ngfPrevValidFiles=f,d.$$ngfPrevInvalidFiles=g;var n=f&&f.length?f[0]:null,o=g&&g.length?g[0]:null;c&&(i.applyModelValidation(c,f),c.$setViewValue(m?n:f)),h&&a(h)(e,{$files:f,$file:n,$newFiles:j,$duplicateFiles:l,$invalidFiles:g,$invalidFile:o,$event:k});var p=i.attrGetter("ngfModelInvalid",d);p&&b(function(){a(p).assign(e,m?o:g)}),b(function(){})}function n(){function a(a,b){return a.name===b.name&&(a.$ngfOrigSize||a.size)===(b.$ngfOrigSize||b.size)&&a.type===b.type}function b(b){var c;for(c=0;c<r.length;c++)if(a(b,r[c]))return!0;for(c=0;c<s.length;c++)if(a(b,s[c]))return!0;return!1}if(j){q=[],t=[];for(var c=0;c<j.length;c++)b(j[c])?t.push(j[c]):q.push(j[c])}}function o(a){return angular.isArray(a)?a:[a]}function p(){function a(){b(function(){m(w?r.concat(v):v,w?s.concat(u):u,j,t,x)},z&&z.debounce?z.debounce.change||z.debounce:0)}var f=y?q:v;g(f,d,e,c).then(function(){y?i.validate(q,w?r.length:0,c,d,e).then(function(b){v=b.validsFiles,u=b.invalidsFiles,a()}):a()},function(){for(var b=0;b<f.length;b++){var c=f[b];if("resize"===c.$error){var d=v.indexOf(c);d>-1&&(v.splice(d,1),u.push(c)),a()}}})}var q,r,s,t=[],u=[],v=[];r=d.$$ngfPrevValidFiles||[],s=d.$$ngfPrevInvalidFiles||[],c&&c.$modelValue&&(r=o(c.$modelValue));var w=i.attrGetter("ngfKeep",d,e);q=(j||[]).slice(0),("distinct"===w||i.attrGetter("ngfKeepDistinct",d,e)===!0)&&n(d,e);var x=!w&&!i.attrGetter("ngfMultiple",d,e)&&!i.attrGetter("multiple",d);if(!w||q.length){i.attrGetter("ngfBeforeModelChange",d,e,{$files:j,$file:j&&j.length?j[0]:null,$newFiles:q,$duplicateFiles:t,$event:k});var y=i.attrGetter("ngfValidateAfterResize",d,e),z=i.attrGetter("ngfModelOptions",d,e);i.validate(q,w?r.length:0,c,d,e).then(function(a){l?m(q,[],j,t,x):(z&&z.allowInvalid||y?v=q:(v=a.validFiles,u=a.invalidFiles),i.attrGetter("ngfFixOrientation",d,e)&&i.isExifSupported()?f(v,d,e).then(function(){p()}):p())})}},i}]),ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile","Upload",function(a,b,c,d){function e(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=d.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}function f(a,b,c,d,f,h,i,j){function k(){return"input"===b[0].tagName.toLowerCase()&&c.type&&"file"===c.type.toLowerCase()}function l(){return t("ngfChange")||t("ngfSelect")}function m(b){if(j.shouldUpdateOn("change",c,a)){var e=b.__files_||b.target&&b.target.files,f=[];if(!e)return;for(var g=0;g<e.length;g++)f.push(e[g]);j.updateModel(d,c,a,l(),f.length?f:null,b)}}function n(a,d){function e(b){a.attr("id","ngf-"+b),d.attr("id","ngf-label-"+b)}for(var f=0;f<b[0].attributes.length;f++){var g=b[0].attributes[f];"type"!==g.name&&"class"!==g.name&&"style"!==g.name&&("id"===g.name?(e(g.value),u.push(c.$observe("id",e))):a.attr(g.name,g.value||"required"!==g.name&&"multiple"!==g.name?g.value:g.name))}}function o(){if(k())return b;var a=angular.element('<input type="file">'),c=angular.element("<label>upload</label>");return c.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),n(a,c),g.push({el:b,ref:c}),document.body.appendChild(c.append(a)[0]),a}function p(c){if(b.attr("disabled"))return!1;if(!t("ngfSelectDisabled",a)){var d=q(c);if(null!=d)return d;r(c);try{k()||document.body.contains(x[0])||(g.push({el:b,ref:x.parent()}),document.body.appendChild(x.parent()[0]),x.bind("change",m))}catch(f){}return e(navigator.userAgent)?setTimeout(function(){x[0].click()},0):x[0].click(),!1}}function q(a){var b=a.changedTouches||a.originalEvent&&a.originalEvent.changedTouches;if(b){if("touchstart"===a.type)return w=b[0].clientX,v=b[0].clientY,!0;if("touchend"===a.type){var c=b[0].clientX,d=b[0].clientY;if(Math.abs(c-w)>20||Math.abs(d-v)>20)return a.stopPropagation(),a.preventDefault(),!1}return!0}}function r(b){j.shouldUpdateOn("click",c,a)&&x.val()&&(x.val(null),j.updateModel(d,c,a,l(),null,b,!0))}function s(a){if(x&&!x.attr("__ngf_ie10_Fix_")){if(!x[0].parentNode)return void(x=null);a.preventDefault(),a.stopPropagation(),x.unbind("click");var b=x.clone();return x.replaceWith(b),x=b,x.attr("__ngf_ie10_Fix_","true"),x.bind("change",m),x.bind("click",s),x[0].click(),!1}x.removeAttr("__ngf_ie10_Fix_")}var t=function(a,b){return j.attrGetter(a,c,b)};j.registerModelChangeValidator(d,c,a);var u=[];t("ngfMultiple")&&u.push(a.$watch(t("ngfMultiple"),function(){x.attr("multiple",t("ngfMultiple",a))})),t("ngfCapture")&&u.push(a.$watch(t("ngfCapture"),function(){x.attr("capture",t("ngfCapture",a))})),t("ngfAccept")&&u.push(a.$watch(t("ngfAccept"),function(){x.attr("accept",t("ngfAccept",a))})),u.push(c.$observe("accept",function(){x.attr("accept",t("accept"))}));var v=0,w=0,x=b;k()||(x=o()),x.bind("change",m),k()?b.bind("click",r):b.bind("click touchstart touchend",p),-1!==navigator.appVersion.indexOf("MSIE 10")&&x.bind("click",s),d&&d.$formatters.push(function(a){return(null==a||0===a.length)&&x.val()&&x.val(null),a}),a.$on("$destroy",function(){k()||x.parent().remove(),angular.forEach(u,function(a){a()})}),h(function(){for(var a=0;a<g.length;a++){var b=g[a];document.body.contains(b.el[0])||(g.splice(a,1),b.ref.remove())}}),window.FileAPI&&window.FileAPI.ngfFixIE&&window.FileAPI.ngfFixIE(b,x,m)}var g=[];return{restrict:"AEC",require:"?ngModel",link:function(e,g,h,i){f(e,g,h,i,a,b,c,d)}}}]),function(){function a(a){return"img"===a.tagName.toLowerCase()?"image":"audio"===a.tagName.toLowerCase()?"audio":"video"===a.tagName.toLowerCase()?"video":/./}function b(b,c,d,e,f,g,h,i){function j(a){var g=b.attrGetter("ngfNoObjectUrl",f,d);b.dataUrl(a,g)["finally"](function(){c(function(){var b=(g?a.$ngfDataUrl:a.$ngfBlobUrl)||a.$ngfDataUrl;i?e.css("background-image","url('"+(b||"")+"')"):e.attr("src",b),b?e.removeClass("ng-hide"):e.addClass("ng-hide")})})}c(function(){var c=d.$watch(f[g],function(c){var k=h;if("ngfThumbnail"===g&&(k||(k={width:e[0].naturalWidth||e[0].clientWidth,height:e[0].naturalHeight||e[0].clientHeight}),0===k.width&&window.getComputedStyle)){var l=getComputedStyle(e[0]);l.width&&l.width.indexOf("px")>-1&&l.height&&l.height.indexOf("px")>-1&&(k={width:parseInt(l.width.slice(0,-2)),height:parseInt(l.height.slice(0,-2))})}return angular.isString(c)?(e.removeClass("ng-hide"),i?e.css("background-image","url('"+c+"')"):e.attr("src",c)):void(!c||!c.type||0!==c.type.search(a(e[0]))||i&&0!==c.type.indexOf("image")?e.addClass("ng-hide"):k&&b.isResizeSupported()?(k.resizeIf=function(a,e){return b.attrGetter("ngfResizeIf",f,d,{$width:a,$height:e,$file:c})},b.resize(c,k).then(function(a){j(a)},function(a){throw a})):j(c))});d.$on("$destroy",function(){c()})})}ngFileUpload.service("UploadDataUrl",["UploadBase","$timeout","$q",function(a,b,c){var d=a;return d.base64DataUrl=function(a){if(angular.isArray(a)){var b=c.defer(),e=0;return angular.forEach(a,function(c){d.dataUrl(c,!0)["finally"](function(){if(e++,e===a.length){var c=[];angular.forEach(a,function(a){c.push(a.$ngfDataUrl)}),b.resolve(c,a)}})}),b.promise}return d.dataUrl(a,!0)},d.dataUrl=function(a,e){if(!a)return d.emptyPromise(a,a);if(e&&null!=a.$ngfDataUrl||!e&&null!=a.$ngfBlobUrl)return d.emptyPromise(e?a.$ngfDataUrl:a.$ngfBlobUrl,a);var f=e?a.$$ngfDataUrlPromise:a.$$ngfBlobUrlPromise;if(f)return f;var g=c.defer();return b(function(){if(window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)){var c=window.URL||window.webkitURL;if(c&&c.createObjectURL&&!e){var f;try{f=c.createObjectURL(a)}catch(h){return void b(function(){a.$ngfBlobUrl="",g.reject()})}b(function(){if(a.$ngfBlobUrl=f,f){g.resolve(f,a),d.blobUrls=d.blobUrls||[],d.blobUrlsTotalSize=d.blobUrlsTotalSize||0,d.blobUrls.push({url:f,size:a.size}),d.blobUrlsTotalSize+=a.size||0;for(var b=d.defaults.blobUrlsMaxMemory||268435456,e=d.defaults.blobUrlsMaxQueueSize||200;(d.blobUrlsTotalSize>b||d.blobUrls.length>e)&&d.blobUrls.length>1;){var h=d.blobUrls.splice(0,1)[0];c.revokeObjectURL(h.url),d.blobUrlsTotalSize-=h.size}}})}else{var i=new FileReader;i.onload=function(c){b(function(){a.$ngfDataUrl=c.target.result,g.resolve(c.target.result,a),b(function(){delete a.$ngfDataUrl},1e3)})},i.onerror=function(){b(function(){a.$ngfDataUrl="",g.reject()})},i.readAsDataURL(a)}}else b(function(){a[e?"$ngfDataUrl":"$ngfBlobUrl"]="",g.reject()})}),f=e?a.$$ngfDataUrlPromise=g.promise:a.$$ngfBlobUrlPromise=g.promise,f["finally"](function(){delete a[e?"$$ngfDataUrlPromise":"$$ngfBlobUrlPromise"]}),f},d}]),ngFileUpload.directive("ngfSrc",["Upload","$timeout",function(a,c){return{restrict:"AE",link:function(d,e,f){b(a,c,d,e,f,"ngfSrc",a.attrGetter("ngfResize",f,d),!1)}}}]),ngFileUpload.directive("ngfBackground",["Upload","$timeout",function(a,c){return{restrict:"AE",link:function(d,e,f){b(a,c,d,e,f,"ngfBackground",a.attrGetter("ngfResize",f,d),!0)}}}]),ngFileUpload.directive("ngfThumbnail",["Upload","$timeout",function(a,c){return{restrict:"AE",link:function(d,e,f){var g=a.attrGetter("ngfSize",f,d);b(a,c,d,e,f,"ngfThumbnail",g,a.attrGetter("ngfAsBackground",f,d))}}}]),ngFileUpload.config(["$compileProvider",function(a){a.imgSrcSanitizationWhitelist&&a.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|webcal|local|file|data|blob):/),a.aHrefSanitizationWhitelist&&a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|webcal|local|file|data|blob):/); -}]),ngFileUpload.filter("ngfDataUrl",["UploadDataUrl","$sce",function(a,b){return function(c,d,e){if(angular.isString(c))return b.trustAsResourceUrl(c);var f=c&&((d?c.$ngfDataUrl:c.$ngfBlobUrl)||c.$ngfDataUrl);return c&&!f?(!c.$ngfDataUrlFilterInProgress&&angular.isObject(c)&&(c.$ngfDataUrlFilterInProgress=!0,a.dataUrl(c,d)),""):(c&&delete c.$ngfDataUrlFilterInProgress,(c&&f?e?b.trustAsResourceUrl(f):f:c)||"")}}])}(),ngFileUpload.service("UploadValidate",["UploadDataUrl","$q","$timeout",function(a,b,c){function d(a){var b="",c=[];if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])b=a.substring(1,a.length-1);else{var e=a.split(",");if(e.length>1)for(var f=0;f<e.length;f++){var g=d(e[f]);g.regexp?(b+="("+g.regexp+")",f<e.length-1&&(b+="|")):c=c.concat(g.excludes)}else 0===a.indexOf("!")?c.push("^((?!"+d(a.substring(1)).regexp+").)*$"):(0===a.indexOf(".")&&(a="*"+a),b="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",b=b.replace(/\\\*/g,".*").replace(/\\\?/g,"."))}return{regexp:b,excludes:c}}function e(a,b){null==b||a.$dirty||(a.$setDirty?a.$setDirty():a.$dirty=!0)}var f=a;return f.validatePattern=function(a,b){if(!b)return!0;var c=d(b),e=!0;if(c.regexp&&c.regexp.length){var f=new RegExp(c.regexp,"i");e=null!=a.type&&f.test(a.type)||null!=a.name&&f.test(a.name)}for(var g=c.excludes.length;g--;){var h=new RegExp(c.excludes[g],"i");e=e&&(null==a.type||h.test(a.type))&&(null==a.name||h.test(a.name))}return e},f.ratioToFloat=function(a){var b=a.toString(),c=b.search(/[x:]/i);return b=c>-1?parseFloat(b.substring(0,c))/parseFloat(b.substring(c+1)):parseFloat(b)},f.registerModelChangeValidator=function(a,b,c){a&&a.$formatters.push(function(d){if(a.$dirty){var e=d;d&&!angular.isArray(d)&&(e=[d]),f.validate(e,0,a,b,c).then(function(){f.applyModelValidation(a,e)})}return d})},f.applyModelValidation=function(a,b){e(a,b),angular.forEach(a.$ngfValidations,function(b){a.$setValidity(b.name,b.valid)})},f.getValidationAttr=function(a,b,c,d,e){var g="ngf"+c[0].toUpperCase()+c.substr(1),h=f.attrGetter(g,a,b,{$file:e});if(null==h&&(h=f.attrGetter("ngfValidate",a,b,{$file:e}))){var i=(d||c).split(".");h=h[i[0]],i.length>1&&(h=h&&h[i[1]])}return h},f.validate=function(a,c,d,e,g){function h(b,c,h){if(a){for(var i=a.length,j=null;i--;){var n=a[i];if(n){var o=f.getValidationAttr(e,g,b,c,n);null!=o&&(h(n,o,i)||(-1===k.indexOf(b)?(n.$error=b,(n.$errorMessages=n.$errorMessages||{})[b]=!0,n.$errorParam=o,-1===m.indexOf(n)&&m.push(n),l||a.splice(i,1),j=!1):a.splice(i,1)))}}null!==j&&d.$ngfValidations.push({name:b,valid:j})}}function i(c,h,i,n,o){function p(b,d,e){function f(f){if(f())if(-1===k.indexOf(c)){if(d.$error=c,(d.$errorMessages=d.$errorMessages||{})[c]=!0,d.$errorParam=e,-1===m.indexOf(d)&&m.push(d),!l){var g=a.indexOf(d);g>-1&&a.splice(g,1)}b.resolve(!1)}else{var h=a.indexOf(d);h>-1&&a.splice(h,1),b.resolve(!0)}else b.resolve(!0)}null!=e?n(d,e).then(function(a){f(function(){return!o(a,e)})},function(){f(function(){return j("ngfValidateForce",{$file:d})})}):b.resolve(!0)}var q=[f.emptyPromise(!0)];a&&(a=void 0===a.length?[a]:a,angular.forEach(a,function(a){var d=b.defer();return q.push(d.promise),!i||null!=a.type&&0===a.type.search(i)?void("dimensions"===c&&null!=f.attrGetter("ngfDimensions",e)?f.imageDimensions(a).then(function(b){p(d,a,j("ngfDimensions",{$file:a,$width:b.width,$height:b.height}))},function(){d.resolve(!1)}):"duration"===c&&null!=f.attrGetter("ngfDuration",e)?f.mediaDuration(a).then(function(b){p(d,a,j("ngfDuration",{$file:a,$duration:b}))},function(){d.resolve(!1)}):p(d,a,f.getValidationAttr(e,g,c,h,a))):void d.resolve(!0)}));var r=b.defer();return b.all(q).then(function(a){for(var b=!0,e=0;e<a.length;e++)if(!a[e]){b=!1;break}d.$ngfValidations.push({name:c,valid:b}),r.resolve(b)}),r.promise}d=d||{},d.$ngfValidations=d.$ngfValidations||[],angular.forEach(d.$ngfValidations,function(a){a.valid=!0});var j=function(a,b){return f.attrGetter(a,e,g,b)},k=(f.attrGetter("ngfIgnoreInvalid",e,g)||"").split(" "),l=f.attrGetter("ngfRunAllValidations",e,g);if(null==a||0===a.length)return f.emptyPromise({validFiles:a,invalidFiles:[]});a=void 0===a.length?[a]:a.slice(0);var m=[];h("pattern",null,f.validatePattern),h("minSize","size.min",function(a,b){return a.size+.1>=f.translateScalars(b)}),h("maxSize","size.max",function(a,b){return a.size-.1<=f.translateScalars(b)});var n=0;if(h("maxTotalSize",null,function(b,c){return n+=b.size,!(n>f.translateScalars(c))||(a.splice(0,a.length),!1)}),h("validateFn",null,function(a,b){return b===!0||null===b||""===b}),!a.length)return f.emptyPromise({validFiles:[],invalidFiles:m});var o=b.defer(),p=[];return p.push(i("maxHeight","height.max",/image/,this.imageDimensions,function(a,b){return a.height<=b})),p.push(i("minHeight","height.min",/image/,this.imageDimensions,function(a,b){return a.height>=b})),p.push(i("maxWidth","width.max",/image/,this.imageDimensions,function(a,b){return a.width<=b})),p.push(i("minWidth","width.min",/image/,this.imageDimensions,function(a,b){return a.width>=b})),p.push(i("dimensions",null,/image/,function(a,b){return f.emptyPromise(b)},function(a){return a})),p.push(i("ratio",null,/image/,this.imageDimensions,function(a,b){for(var c=b.toString().split(","),d=!1,e=0;e<c.length;e++)Math.abs(a.width/a.height-f.ratioToFloat(c[e]))<.01&&(d=!0);return d})),p.push(i("maxRatio","ratio.max",/image/,this.imageDimensions,function(a,b){return a.width/a.height-f.ratioToFloat(b)<1e-4})),p.push(i("minRatio","ratio.min",/image/,this.imageDimensions,function(a,b){return a.width/a.height-f.ratioToFloat(b)>-1e-4})),p.push(i("maxDuration","duration.max",/audio|video/,this.mediaDuration,function(a,b){return a<=f.translateScalars(b)})),p.push(i("minDuration","duration.min",/audio|video/,this.mediaDuration,function(a,b){return a>=f.translateScalars(b)})),p.push(i("duration",null,/audio|video/,function(a,b){return f.emptyPromise(b)},function(a){return a})),p.push(i("validateAsyncFn",null,null,function(a,b){return b},function(a){return a===!0||null===a||""===a})),b.all(p).then(function(){if(l)for(var b=0;b<a.length;b++){var d=a[b];d.$error&&a.splice(b--,1)}l=!1,h("maxFiles",null,function(a,b,d){return b>c+d}),o.resolve({validFiles:a,invalidFiles:m})}),o.promise},f.imageDimensions=function(a){if(a.$ngfWidth&&a.$ngfHeight){var d=b.defer();return c(function(){d.resolve({width:a.$ngfWidth,height:a.$ngfHeight})}),d.promise}if(a.$ngfDimensionPromise)return a.$ngfDimensionPromise;var e=b.defer();return c(function(){return 0!==a.type.indexOf("image")?void e.reject("not image"):void f.dataUrl(a).then(function(b){function d(){var b=h[0].naturalWidth||h[0].clientWidth,c=h[0].naturalHeight||h[0].clientHeight;h.remove(),a.$ngfWidth=b,a.$ngfHeight=c,e.resolve({width:b,height:c})}function f(){h.remove(),e.reject("load error")}function g(){c(function(){h[0].parentNode&&(h[0].clientWidth?d():i++>10?f():g())},1e3)}var h=angular.element("<img>").attr("src",b).css("visibility","hidden").css("position","fixed").css("max-width","none !important").css("max-height","none !important");h.on("load",d),h.on("error",f);var i=0;g(),angular.element(document.getElementsByTagName("body")[0]).append(h)},function(){e.reject("load error")})}),a.$ngfDimensionPromise=e.promise,a.$ngfDimensionPromise["finally"](function(){delete a.$ngfDimensionPromise}),a.$ngfDimensionPromise},f.mediaDuration=function(a){if(a.$ngfDuration){var d=b.defer();return c(function(){d.resolve(a.$ngfDuration)}),d.promise}if(a.$ngfDurationPromise)return a.$ngfDurationPromise;var e=b.defer();return c(function(){return 0!==a.type.indexOf("audio")&&0!==a.type.indexOf("video")?void e.reject("not media"):void f.dataUrl(a).then(function(b){function d(){var b=h[0].duration;a.$ngfDuration=b,h.remove(),e.resolve(b)}function f(){h.remove(),e.reject("load error")}function g(){c(function(){h[0].parentNode&&(h[0].duration?d():i>10?f():g())},1e3)}var h=angular.element(0===a.type.indexOf("audio")?"<audio>":"<video>").attr("src",b).css("visibility","none").css("position","fixed");h.on("loadedmetadata",d),h.on("error",f);var i=0;g(),angular.element(document.body).append(h)},function(){e.reject("load error")})}),a.$ngfDurationPromise=e.promise,a.$ngfDurationPromise["finally"](function(){delete a.$ngfDurationPromise}),a.$ngfDurationPromise},f}]),ngFileUpload.service("UploadResize",["UploadValidate","$q",function(a,b){var c=a,d=function(a,b,c,d,e){var f=e?Math.max(c/a,d/b):Math.min(c/a,d/b);return{width:a*f,height:b*f,marginX:a*f-c,marginY:b*f-d}},e=function(a,e,f,g,h,i,j,k){var l=b.defer(),m=document.createElement("canvas"),n=document.createElement("img");return n.setAttribute("style","visibility:hidden;position:fixed;z-index:-100000"),document.body.appendChild(n),n.onload=function(){var a=n.width,b=n.height;if(n.parentNode.removeChild(n),null!=k&&k(a,b)===!1)return void l.reject("resizeIf");try{if(i){var o=c.ratioToFloat(i),p=a/b;o>p?(e=a,f=e/o):(f=b,e=f*o)}e||(e=a),f||(f=b);var q=d(a,b,e,f,j);m.width=Math.min(q.width,e),m.height=Math.min(q.height,f);var r=m.getContext("2d");r.drawImage(n,Math.min(0,-q.marginX/2),Math.min(0,-q.marginY/2),q.width,q.height),l.resolve(m.toDataURL(h||"image/WebP",g||.934))}catch(s){l.reject(s)}},n.onerror=function(){n.parentNode.removeChild(n),l.reject()},n.src=a,l.promise};return c.dataUrltoBlob=function(a,b,c){for(var d=a.split(","),e=d[0].match(/:(.*?);/)[1],f=atob(d[1]),g=f.length,h=new Uint8Array(g);g--;)h[g]=f.charCodeAt(g);var i=new window.Blob([h],{type:e});return i.name=b,i.$ngfOrigSize=c,i},c.isResizeSupported=function(){var a=document.createElement("canvas");return window.atob&&a.getContext&&a.getContext("2d")&&window.Blob},c.isResizeSupported()&&Object.defineProperty(window.Blob.prototype,"name",{get:function(){return this.$ngfName},set:function(a){this.$ngfName=a},configurable:!0}),c.resize=function(a,d){if(0!==a.type.indexOf("image"))return c.emptyPromise(a);var f=b.defer();return c.dataUrl(a,!0).then(function(b){e(b,d.width,d.height,d.quality,d.type||a.type,d.ratio,d.centerCrop,d.resizeIf).then(function(e){if("image/jpeg"===a.type&&d.restoreExif!==!1)try{e=c.restoreExif(b,e)}catch(g){setTimeout(function(){throw g},1)}try{var h=c.dataUrltoBlob(e,a.name,a.size);f.resolve(h)}catch(g){f.reject(g)}},function(b){"resizeIf"===b&&f.resolve(a),f.reject(b)})},function(a){f.reject(a)}),f.promise},c}]),function(){function a(a,c,d,e,f,g,h,i,j,k){function l(){return c.attr("disabled")||s("ngfDropDisabled",a)}function m(b,c,d){if(b){var e;try{e=b&&b.getData&&b.getData("text/html")}catch(f){}q(b.items,b.files,s("ngfAllowDir",a)!==!1,s("multiple")||s("ngfMultiple",a)).then(function(a){a.length?n(a,c):o(d,e).then(function(a){n(a,c)})})}}function n(b,c){i.updateModel(e,d,a,s("ngfChange")||s("ngfDrop"),b,c)}function o(b,c){if(!i.shouldUpdateOn(b,d,a)||"string"!=typeof c)return i.rejectPromise([]);var e=[];c.replace(/<(img src|img [^>]* src) *=\"([^\"]*)\"/gi,function(a,b,c){e.push(c)});var f=[],g=[];if(e.length){angular.forEach(e,function(a){f.push(i.urlToBlob(a).then(function(a){g.push(a)}))});var h=k.defer();return k.all(f).then(function(){h.resolve(g)},function(a){h.reject(a)}),h.promise}return i.emptyPromise()}function p(a,b,c,d){var e=s("ngfDragOverClass",a,{$event:c}),f="dragover";if(angular.isString(e))f=e;else if(e&&(e.delay&&(w=e.delay),e.accept||e.reject)){var g=c.dataTransfer.items;if(null!=g&&g.length)for(var h=e.pattern||s("ngfPattern",a,{$event:c}),j=g.length;j--;){if(!i.validatePattern(g[j],h)){f=e.reject;break}f=e.accept}else f=e.accept}d(f)}function q(b,c,e,f){function g(a,b){var c=k.defer();if(null!=a)if(a.isDirectory){var d=[i.emptyPromise()];if(m){var e={type:"directory"};e.name=e.path=(b||"")+a.name,n.push(e)}var f=a.createReader(),h=[],p=function(){f.readEntries(function(e){try{e.length?(h=h.concat(Array.prototype.slice.call(e||[],0)),p()):(angular.forEach(h.slice(0),function(c){n.length<=j&&l>=o&&d.push(g(c,(b?b:"")+a.name+"/"))}),k.all(d).then(function(){c.resolve()},function(a){c.reject(a)}))}catch(f){c.reject(f)}},function(a){c.reject(a)})};p()}else a.file(function(a){try{a.path=(b?b:"")+a.name,m&&(a=i.rename(a,a.path)),n.push(a),o+=a.size,c.resolve()}catch(d){c.reject(d)}},function(a){c.reject(a)});return c.promise}var j=i.getValidationAttr(d,a,"maxFiles");null==j&&(j=Number.MAX_VALUE);var l=i.getValidationAttr(d,a,"maxTotalSize");null==l&&(l=Number.MAX_VALUE);var m=s("ngfIncludeDir",a),n=[],o=0,p=[i.emptyPromise()];if(b&&b.length>0&&"file:"!==h.location.protocol)for(var q=0;q<b.length;q++){if(b[q].webkitGetAsEntry&&b[q].webkitGetAsEntry()&&b[q].webkitGetAsEntry().isDirectory){var r=b[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&p.push(g(r))}else{var t=b[q].getAsFile();null!=t&&(n.push(t),o+=t.size)}if(n.length>j||o>l||!f&&n.length>0)break}else if(null!=c)for(var u=0;u<c.length;u++){var v=c.item(u);if((v.type||v.size>0)&&(n.push(v),o+=v.size),n.length>j||o>l||!f&&n.length>0)break}var w=k.defer();return k.all(p).then(function(){if(f||m||!n.length)w.resolve(n);else{for(var a=0;n[a]&&"directory"===n[a].type;)a++;w.resolve([n[a]])}},function(a){w.reject(a)}),w.promise}var r=b(),s=function(a,b,c){return i.attrGetter(a,d,b,c)};if(s("dropAvailable")&&g(function(){a[s("dropAvailable")]?a[s("dropAvailable")].value=r:a[s("dropAvailable")]=r}),!r)return void(s("ngfHideOnDropNotAvailable",a)===!0&&c.css("display","none"));null==s("ngfSelect")&&i.registerModelChangeValidator(e,d,a);var t,u=null,v=f(s("ngfStopPropagation")),w=1;c[0].addEventListener("dragover",function(b){if(!l()&&i.shouldUpdateOn("drop",d,a)){if(b.preventDefault(),v(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var e=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===e||"linkMove"===e?"move":"copy"}g.cancel(u),t||(t="C",p(a,d,b,function(d){t=d,c.addClass(t),s("ngfDrag",a,{$isDragging:!0,$class:t,$event:b})}))}},!1),c[0].addEventListener("dragenter",function(b){!l()&&i.shouldUpdateOn("drop",d,a)&&(b.preventDefault(),v(a)&&b.stopPropagation())},!1),c[0].addEventListener("dragleave",function(b){!l()&&i.shouldUpdateOn("drop",d,a)&&(b.preventDefault(),v(a)&&b.stopPropagation(),u=g(function(){t&&c.removeClass(t),t=null,s("ngfDrag",a,{$isDragging:!1,$event:b})},w||100))},!1),c[0].addEventListener("drop",function(b){!l()&&i.shouldUpdateOn("drop",d,a)&&(b.preventDefault(),v(a)&&b.stopPropagation(),t&&c.removeClass(t),t=null,m(b.dataTransfer,b,"dropUrl"))},!1),c[0].addEventListener("paste",function(b){navigator.userAgent.toLowerCase().indexOf("firefox")>-1&&s("ngfEnableFirefoxPaste",a)&&b.preventDefault(),!l()&&i.shouldUpdateOn("paste",d,a)&&m(b.clipboardData||b.originalEvent.clipboardData,b,"pasteUrl")},!1),navigator.userAgent.toLowerCase().indexOf("firefox")>-1&&s("ngfEnableFirefoxPaste",a)&&(c.attr("contenteditable",!0),c.on("keypress",function(a){a.metaKey||a.ctrlKey||a.preventDefault()}))}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a&&!/Edge\/12./i.test(navigator.userAgent)}ngFileUpload.directive("ngfDrop",["$parse","$timeout","$window","Upload","$http","$q",function(b,c,d,e,f,g){return{restrict:"AEC",require:"?ngModel",link:function(h,i,j,k){a(h,i,j,k,b,c,d,e,f,g)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout","Upload",function(a,c,d){return function(e,f,g){if(b()){var h=a(d.attrGetter("ngfDropAvailable",g));c(function(){h(e),h.assign&&h.assign(e,!0)})}}}])}(),ngFileUpload.service("UploadExif",["UploadResize","$q",function(a,b){function c(a,b,c,d){switch(b){case 2:return a.transform(-1,0,0,1,c,0);case 3:return a.transform(-1,0,0,-1,c,d);case 4:return a.transform(1,0,0,-1,0,d);case 5:return a.transform(0,1,1,0,0,0);case 6:return a.transform(0,1,-1,0,d,0);case 7:return a.transform(0,-1,-1,0,d,c);case 8:return a.transform(0,-1,1,0,0,c)}}function d(a){for(var b="",c=new Uint8Array(a),d=c.byteLength,e=0;d>e;e++)b+=String.fromCharCode(c[e]);return window.btoa(b)}var e=a;return e.isExifSupported=function(){return window.FileReader&&(new FileReader).readAsArrayBuffer&&e.isResizeSupported()},e.readOrientation=function(a){var c=b.defer(),d=new FileReader,e=a.slice?a.slice(0,65536):a;return d.readAsArrayBuffer(e),d.onerror=function(a){return c.reject(a)},d.onload=function(a){var b={orientation:1},d=new DataView(this.result);if(65496!==d.getUint16(0,!1))return c.resolve(b);for(var e=d.byteLength,f=2;e>f;){var g=d.getUint16(f,!1);if(f+=2,65505===g){if(1165519206!==d.getUint32(f+=2,!1))return c.resolve(b);var h=18761===d.getUint16(f+=6,!1);f+=d.getUint32(f+4,h);var i=d.getUint16(f,h);f+=2;for(var j=0;i>j;j++)if(274===d.getUint16(f+12*j,h)){var k=d.getUint16(f+12*j+8,h);return k>=2&&8>=k&&(d.setUint16(f+12*j+8,1,h),b.fixedArrayBuffer=a.target.result),b.orientation=k,c.resolve(b)}}else{if(65280!==(65280&g))break;f+=d.getUint16(f,!1)}}return c.resolve(b)},c.promise},e.applyExifRotation=function(a){if(0!==a.type.indexOf("image/jpeg"))return e.emptyPromise(a);var f=b.defer();return e.readOrientation(a).then(function(b){return b.orientation<2||b.orientation>8?f.resolve(a):void e.dataUrl(a,!0).then(function(g){var h=document.createElement("canvas"),i=document.createElement("img");i.onload=function(){try{h.width=b.orientation>4?i.height:i.width,h.height=b.orientation>4?i.width:i.height;var g=h.getContext("2d");c(g,b.orientation,i.width,i.height),g.drawImage(i,0,0);var j=h.toDataURL(a.type||"image/WebP",.934);j=e.restoreExif(d(b.fixedArrayBuffer),j);var k=e.dataUrltoBlob(j,a.name);f.resolve(k)}catch(l){return f.reject(l)}},i.onerror=function(){f.reject()},i.src=g},function(a){f.reject(a)})},function(a){f.reject(a)}),f.promise},e.restoreExif=function(a,b){var c={};return c.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c.encode64=function(a){var b,c,d,e,f,g="",h="",i="",j=0;do b=a[j++],c=a[j++],h=a[j++],d=b>>2,e=(3&b)<<4|c>>4,f=(15&c)<<2|h>>6,i=63&h,isNaN(c)?f=i=64:isNaN(h)&&(i=64),g=g+this.KEY_STR.charAt(d)+this.KEY_STR.charAt(e)+this.KEY_STR.charAt(f)+this.KEY_STR.charAt(i),b=c=h="",d=e=f=i="";while(j<a.length);return g},c.restore=function(a,b){a.match("data:image/jpeg;base64,")&&(a=a.replace("data:image/jpeg;base64,",""));var c=this.decode64(a),d=this.slice2Segments(c),e=this.exifManipulation(b,d);return"data:image/jpeg;base64,"+this.encode64(e)},c.exifManipulation=function(a,b){var c=this.getExifArray(b),d=this.insertExif(a,c);return new Uint8Array(d)},c.getExifArray=function(a){for(var b,c=0;c<a.length;c++)if(b=a[c],255===b[0]&225===b[1])return b;return[]},c.insertExif=function(a,b){var c=a.replace("data:image/jpeg;base64,",""),d=this.decode64(c),e=d.indexOf(255,3),f=d.slice(0,e),g=d.slice(e),h=f;return h=h.concat(b),h=h.concat(g)},c.slice2Segments=function(a){for(var b=0,c=[];!(255===a[b]&218===a[b+1]);){if(255===a[b]&216===a[b+1])b+=2;else{var d=256*a[b+2]+a[b+3],e=b+d+2,f=a.slice(b,e);c.push(f),b=e}if(b>a.length)break}return c},c.decode64=function(a){var b,c,d,e,f,g="",h="",i=0,j=[],k=/[^A-Za-z0-9\+\/\=]/g;k.exec(a)&&console.log("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, NaNExpect errors in decoding."),a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");do d=this.KEY_STR.indexOf(a.charAt(i++)),e=this.KEY_STR.indexOf(a.charAt(i++)),f=this.KEY_STR.indexOf(a.charAt(i++)),h=this.KEY_STR.indexOf(a.charAt(i++)),b=d<<2|e>>4,c=(15&e)<<4|f>>2,g=(3&f)<<6|h,j.push(b),64!==f&&j.push(c),64!==h&&j.push(g),b=c=g="",d=e=f=h="";while(i<a.length);return j},c.restore(a,b)},e}]),"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.date"),function(a){a.module("ui.date",[]).constant("uiDateConfig",{}).constant("uiDateFormatConfig","").factory("uiDateConverter",["uiDateFormatConfig",function(b){function c(a,c){if(a=a||b,c){if(a)try{return jQuery.datepicker.formatDate(a,c)}catch(d){return}if(c.toISOString)return c.toISOString()}return null}function d(c,d){if(c=c||b,a.isDate(d)&&!isNaN(d))return d;if(a.isString(d)){if(c)return jQuery.datepicker.parseDate(c,d);var e=new Date(d);return isNaN(e.getTime())?null:e}return a.isNumber(d)?new Date(d):null}return{stringToDate:d,dateToString:c}}]).directive("uiDate",["uiDateConfig","uiDateConverter",function(b,c){return{require:"?ngModel",link:function(d,e,f,g){var h=function(){return a.extend({},b,d.$eval(f.uiDate))},i=function(){function b(){var b=["Hours","Minutes","Seconds","Milliseconds"],c=a.isDate(g.$modelValue),d={};c&&g.$modelValue.toDateString()===e.datepicker("getDate").toDateString()||(c&&a.forEach(b,function(a){d[a]=g.$modelValue["get"+a]()}),g.$setViewValue(e.datepicker("getDate")),c&&a.forEach(b,function(a){g.$viewValue["set"+a](d[a])}))}var i=!1,j=h();if(g){var k=j.onSelect||a.noop;j.onSelect=function(a,c){d.$apply(function(){i=!0,b(),k(a,c),e.blur()})};var l=j.beforeShow||a.noop;j.beforeShow=function(a,b){i=!0,l(a,b)};var m=j.onClose||a.noop;j.onClose=function(a,b){i=!1,m(a,b)},e.off("blur.datepicker").on("blur.datepicker",function(){i||d.$apply(function(){e.datepicker("setDate",e.datepicker("getDate")),b()})}),g.$validators.uiDateValidator=function(b,d){return a.isDate(c.stringToDate(f.uiDateFormat,d))},g.$parsers.push(function(a){return c.stringToDate(f.uiDateFormat,a)}),g.$render=function(){e.datepicker("setDate",g.$modelValue)}}e.data("datepicker")?(e.datepicker("option",j),e.datepicker("refresh")):(e.datepicker(j),e.on("$destroy",function(){e.datepicker("hide"),e.datepicker("destroy")})),g&&g.$render()};d.$watch(h,i,!0)}}}]).directive("uiDateFormat",["uiDateConverter",function(a){return{require:"ngModel",link:function(b,c,d,e){var f=d.uiDateFormat;e.$formatters.unshift(function(b){return a.stringToDate(f,b)}),e.$parsers.push(function(b){return a.dateToString(f,b)})}}}])}(angular),angular.module("angular-input-stars",[]).service("FontAwesomeIcons",["$http","$q",function(a,b){this.get=function(){var c=b.defer();return a.get("https://raw.githubusercontent.com/FortAwesome/Font-Awesome/gh-pages/icons.yml").then(function(a){for(var b=jsyaml.load(a.data),d={iconMap:{},iconList:[],iconCategoryList:[]},e=b.icons,f=0;f<e.length;f++){d.iconMap[e[f].name]=e[f].id,d.iconList.push(e[f].name);for(var g=0;g<e[f].categories.length;g++)d.iconCategoryList[e[f].categories[g]]||(d.iconCategoryList[e[f].categories[g]]=[]),d.iconCategoryList[e[f].categories[g]].push(e[f].name)}c.resolve(d)},function(a){var b="Could not fetch FontAwesome Github Repo";a||(b=a.data||a),c.reject(b)}),c.promise}}]).filter("toFaIcon",["FontAwesomeIcons","$timeout",function(a,b){var c=function(a,b){var c={full:"",empty:""};return __indexOf.call(b.iconList,a)>=0?(c.full="fa-"+b.iconMap[a],c.empty="fa-"+b.iconMap[a]+"-o","thumbs-up"==a||"thumbs-down"==a?c.empty="fa-"+b.iconMap[a].split("-")[0]+"-o-"+b.iconMap[a].split("-")[1]:"Smile Outlined"==a&&(c.empty="fa-frown-o"),c):(console.error("Error no shape of type: "+a+" for rating input"),c)};return function(a,b,d){var e=c(a,d);return b?e.empty:e.full}}]).directive("inputStars",["$rootScope","$filter","FontAwesomeIcons","$q",function(a,b,c,d){function e(a,e,f,g){var h={};(function(){var a=d.defer();return c.get().then(function(b){a.resolve(b)},function(b){a.reject(new Error("toShapeIcon Error: "+b))}),a.promise})().then(function(c){!function(){a.items=new Array((+f.max)),h.emptyIcon=b("toFaIcon")(f.iconEmpty,!0,c)||f.iconEmpty||"fa-stars-o",h.iconHover=f.iconHover||"angular-input-stars-hover",h.fullIcon=b("toFaIcon")(f.iconFull,!1,c)||f.iconEmpty||"fa-stars",h.iconBase=f.iconBase||"fa fa-fw",a.listClass=f.listClass||"angular-input-stars",a.readonly=!(void 0===f.readonly)}(),f.$observe("max",function(b){a.items=new Array((+b))}),f.$observe("iconEmpty",function(a){h.emptyIcon=b("toFaIcon")(a,!0,c)||a||"fa-stars-o"}),f.$observe("iconFull",function(a){h.fullIcon=b("toFaIcon")(a,!1,c)||a||"fa-stars"}),g.$render=function(){a.last_value=g.$viewValue||0},a.getClass=function(b){return b>=a.last_value?h.iconBase+" "+h.emptyIcon:h.iconBase+" "+h.fullIcon+" active "},a.unpaintStars=function(b,c){a.paintStars(a.last_value-1,c)},a.paintStars=function(b,c){if(!a.readonly){for(var d=e.find("li").find("i"),f=0;f<d.length;f++){var g=angular.element(d[f]);b>=f?(g.removeClass(h.emptyIcon),g.addClass(h.fullIcon),g.addClass("active"),g.addClass(h.iconHover)):(g.removeClass(h.fullIcon),g.removeClass("active"),g.removeClass(h.iconHover),g.addClass(h.emptyIcon))}!c&&d.removeClass(h.iconHover)}},a.setValue=function(b,c){if(!a.readonly){var d=c.target;c.pageX<d.getBoundingClientRect().left+d.offsetWidth/2?a.last_value=b+1:a.last_value=b+1,g.$setViewValue(a.last_value),f.onShapeClick&&a.$eval(f.onStarClick)}}},function(a){console.error("angular-input-stars.js | "+a.message||a)})}var f={restrict:"EA",replace:!0,template:'<ul ng-class="listClass"><li ng-touch="paintStars($index)" ng-mouseenter="paintStars($index, true)" ng-mouseleave="unpaintStars($index, false)" ng-repeat="item in items track by $index"><i ng-class="getClass($index)" ng-click="setValue($index, $event)"></i></li></ul>',require:"ngModel",scope:!0,link:e};return f}]),!function(a){var b="Compound",c="Identifier",d="MemberExpression",e="Literal",f="ThisExpression",g="CallExpression",h="UnaryExpression",i="BinaryExpression",j="LogicalExpression",k="ConditionalExpression",l="ArrayExpression",m=46,n=44,o=39,p=34,q=40,r=41,s=91,t=93,u=63,v=59,w=58,x=function(a,b){var c=new Error(a+" at character "+b);throw c.index=b,c.description=a,c},y=!0,z={"-":y,"!":y,"~":y,"+":y},A={"||":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10},B=function(a){var b,c=0;for(var d in a)(b=d.length)>c&&a.hasOwnProperty(d)&&(c=b);return c},C=B(z),D=B(A),E={"true":!0,"false":!1,"null":null},F="this",G=function(a){return A[a]||0},H=function(a,b,c){var d="||"===a||"&&"===a?j:i;return{type:d,operator:a,left:b,right:c}},I=function(a){return a>=48&&a<=57},J=function(a){return 36===a||95===a||a>=65&&a<=90||a>=97&&a<=122||a>=128&&!A[String.fromCharCode(a)]},K=function(a){return 36===a||95===a||a>=65&&a<=90||a>=97&&a<=122||a>=48&&a<=57||a>=128&&!A[String.fromCharCode(a)]},L=function(a){for(var i,j,y=0,B=a.charAt,L=a.charCodeAt,M=function(b){return B.call(a,b)},N=function(b){return L.call(a,b)},O=a.length,P=function(){for(var a=N(y);32===a||9===a;)a=N(++y)},Q=function(){var a,b,c=S();return P(),N(y)!==u?c:(y++,a=Q(),a||x("Expected expression",y),P(),N(y)===w?(y++,b=Q(),b||x("Expected expression",y),{type:k,test:c,consequent:a,alternate:b}):void x("Expected :",y))},R=function(){P();for(var b=a.substr(y,D),c=b.length;c>0;){if(A.hasOwnProperty(b))return y+=c,b;b=b.substr(0,--c)}return!1},S=function(){var a,b,c,d,e,f,g,h;if(f=T(),b=R(),!b)return f;for(e={value:b,prec:G(b)},g=T(),g||x("Expected expression after "+b,y),d=[f,e,g];(b=R())&&(c=G(b),0!==c);){for(e={value:b,prec:c};d.length>2&&c<=d[d.length-2].prec;)g=d.pop(),b=d.pop().value,f=d.pop(),a=H(b,f,g),d.push(a);a=T(),a||x("Expected expression after "+b,y),d.push(e,a)}for(h=d.length-1,a=d[h];h>1;)a=H(d[h-1].value,d[h-2],a),h-=2;return a},T=function(){var b,c,d;if(P(),b=N(y),I(b)||b===m)return U();if(b===o||b===p)return V();if(J(b)||b===q)return Y();if(b===s)return $();for(c=a.substr(y,C),d=c.length;d>0;){if(z.hasOwnProperty(c))return y+=d,{type:h,operator:c,argument:T(),prefix:!0};c=c.substr(0,--d)}return!1},U=function(){for(var a,b,c="";I(N(y));)c+=M(y++);if(N(y)===m)for(c+=M(y++);I(N(y));)c+=M(y++);if(a=M(y),"e"===a||"E"===a){for(c+=M(y++),a=M(y),"+"!==a&&"-"!==a||(c+=M(y++));I(N(y));)c+=M(y++);I(N(y-1))||x("Expected exponent ("+c+M(y)+")",y)}return b=N(y),J(b)?x("Variable names cannot start with a number ("+c+M(y)+")",y):b===m&&x("Unexpected period",y),{type:e,value:parseFloat(c),raw:c}},V=function(){for(var a,b="",c=M(y++),d=!1;y<O;){if(a=M(y++),a===c){d=!0;break}if("\\"===a)switch(a=M(y++)){case"n":b+="\n";break;case"r":b+="\r";break;case"t":b+="\t";break;case"b":b+="\b";break;case"f":b+="\f";break;case"v":b+="\x0B";break;default:b+="\\"+a}else b+=a}return d||x('Unclosed quote after "'+b+'"',y),{type:e,value:b,raw:c+b+c}},W=function(){var b,d=N(y),g=y;for(J(d)?y++:x("Unexpected "+M(y),y);y<O&&(d=N(y),K(d));)y++;return b=a.slice(g,y),E.hasOwnProperty(b)?{type:e,value:E[b],raw:b}:b===F?{type:f}:{type:c,name:b}},X=function(a){for(var c,d,e=[],f=!1;y<O;){if(P(),c=N(y),c===a){f=!0,y++;break}c===n?y++:(d=Q(),d&&d.type!==b||x("Expected comma",y),e.push(d))}return f||x("Expected "+String.fromCharCode(a),y),e},Y=function(){var a,b;for(a=N(y),b=a===q?Z():W(),P(),a=N(y);a===m||a===s||a===q;)y++,a===m?(P(),b={type:d,computed:!1,object:b,property:W()}):a===s?(b={type:d,computed:!0,object:b,property:Q()},P(),a=N(y),a!==t&&x("Unclosed [",y),y++):a===q&&(b={type:g,arguments:X(r),callee:b}),P(),a=N(y);return b},Z=function(){y++;var a=Q();return P(),N(y)===r?(y++,a):void x("Unclosed (",y)},$=function(){return y++,{type:l,elements:X(t)}},_=[];y<O;)i=N(y),i===v||i===n?y++:(j=Q())?_.push(j):y<O&&x('Unexpected "'+M(y)+'"',y);return 1===_.length?_[0]:{type:b,body:_}};if(L.version="0.3.1",L.toString=function(){return"JavaScript Expression Parser (JSEP) v"+L.version},L.addUnaryOp=function(a){return C=Math.max(a.length,C),z[a]=y,this},L.addBinaryOp=function(a,b){return D=Math.max(a.length,D),A[a]=b,this},L.addLiteral=function(a,b){return E[a]=b,this},L.removeUnaryOp=function(a){return delete z[a],a.length===C&&(C=B(z)),this},L.removeBinaryOp=function(a){return delete A[a],a.length===D&&(D=B(A)),this},L.removeLiteral=function(a){return delete E[a],this},"undefined"==typeof exports){var M=a.jsep;a.jsep=L,L.noConflict=function(){return a.jsep===L&&(a.jsep=M),L}}else"undefined"!=typeof module&&module.exports?exports=module.exports=L:exports.parse=L}(this),!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.Raven=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){function d(a){this.name="RavenConfigError",this.message=a}d.prototype=new Error,d.prototype.constructor=d,b.exports=d},{}],2:[function(a,b,c){var d=function(a,b,c){var d=a[b],e=a;if(b in a){var f="warn"===b?"warning":b;a[b]=function(){var a=[].slice.call(arguments),b=""+a.join(" "),g={level:f,logger:"console",extra:{arguments:a}};c&&c(b,g),d&&Function.prototype.apply.call(d,e,a)}}};b.exports={wrapMethod:d}},{}],3:[function(a,b,c){(function(c){function d(){return+new Date}function e(){this.a=!("object"!=typeof JSON||!JSON.stringify),this.b=!f(H),this.c=!f(I),this.d=null,this.e=null,this.f=null,this.g=null,this.h=null,this.i=null,this.j={},this.k={logger:"javascript",ignoreErrors:[],ignoreUrls:[],whitelistUrls:[],includePaths:[],crossOrigin:"anonymous",collectWindowErrors:!0,maxMessageLength:0,stackTraceLimit:50,autoBreadcrumbs:!0,sampleRate:1},this.l=0,this.m=!1,this.n=Error.stackTraceLimit,this.o=G.console||{},this.p={},this.q=[],this.r=d(),this.s=[],this.t=[],this.u=null,this.v=G.location,this.w=this.v&&this.v.href,this.x();for(var a in this.o)this.p[a]=this.o[a]}function f(a){return void 0===a}function g(a){return"function"==typeof a}function h(a){return"[object String]"===J.toString.call(a)}function i(a){for(var b in a)return!1;return!0}function j(a,b){var c,d;if(f(a.length))for(c in a)m(a,c)&&b.call(null,c,a[c]);else if(d=a.length)for(c=0;c<d;c++)b.call(null,c,a[c])}function k(a,b){return b?(j(b,function(b,c){a[b]=c}),a):a}function l(a,b){return!b||a.length<=b?a:a.substr(0,b)+"…"}function m(a,b){return J.hasOwnProperty.call(a,b)}function n(a){for(var b,c=[],d=0,e=a.length;d<e;d++)b=a[d], -h(b)?c.push(b.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")):b&&b.source&&c.push(b.source);return new RegExp(c.join("|"),"i")}function o(a){var b=[];return j(a,function(a,c){b.push(encodeURIComponent(a)+"="+encodeURIComponent(c))}),b.join("&")}function p(a){var b=a.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);if(!b)return{};var c=b[6]||"",d=b[8]||"";return{protocol:b[2],host:b[4],path:b[5],relative:b[5]+c+d}}function q(){var a=G.crypto||G.msCrypto;if(!f(a)&&a.getRandomValues){var b=new Uint16Array(8);a.getRandomValues(b),b[3]=4095&b[3]|16384,b[4]=16383&b[4]|32768;var c=function(a){for(var b=a.toString(16);b.length<4;)b="0"+b;return b};return c(b[0])+c(b[1])+c(b[2])+c(b[3])+c(b[4])+c(b[5])+c(b[6])+c(b[7])}return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0,c="x"===a?b:3&b|8;return c.toString(16)})}function r(a){for(var b,c=5,d=80,e=[],f=0,g=0,h=" > ",i=h.length;a&&f++<c&&(b=s(a),!("html"===b||f>1&&g+e.length*i+b.length>=d));)e.push(b),g+=b.length,a=a.parentNode;return e.reverse().join(h)}function s(a){var b,c,d,e,f,g=[];if(!a||!a.tagName)return"";if(g.push(a.tagName.toLowerCase()),a.id&&g.push("#"+a.id),b=a.className,b&&h(b))for(c=b.split(/\s+/),f=0;f<c.length;f++)g.push("."+c[f]);var i=["type","name","title","alt"];for(f=0;f<i.length;f++)d=i[f],e=a.getAttribute(d),e&&g.push("["+d+'="'+e+'"]');return g.join("")}function t(a,b){return!!(!!a^!!b)}function u(a,b){return!t(a,b)&&(a=a.values[0],b=b.values[0],a.type===b.type&&a.value===b.value&&v(a.stacktrace,b.stacktrace))}function v(a,b){if(t(a,b))return!1;var c=a.frames,d=b.frames;if(c.length!==d.length)return!1;for(var e,f,g=0;g<c.length;g++)if(e=c[g],f=d[g],e.filename!==f.filename||e.lineno!==f.lineno||e.colno!==f.colno||e["function"]!==f["function"])return!1;return!0}function w(a,b,c,d){var e=a[b];a[b]=c(e),d&&d.push([a,b,e])}var x=a(6),y=a(7),z=a(1),A=a(5),B=A.isError,C=A.isObject,D=a(2).wrapMethod,E="source protocol user pass host port path".split(" "),F=/^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/,G="undefined"!=typeof window?window:"undefined"!=typeof c?c:"undefined"!=typeof self?self:{},H=G.document,I=G.navigator;e.prototype={VERSION:"3.13.1",debug:!1,TraceKit:x,config:function(a,b){var c=this;if(c.g)return this.y("error","Error: Raven has already been configured"),c;if(!a)return c;var d=c.k;b&&j(b,function(a,b){"tags"===a||"extra"===a||"user"===a?c.j[a]=b:d[a]=b}),c.setDSN(a),d.ignoreErrors.push(/^Script error\.?$/),d.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/),d.ignoreErrors=n(d.ignoreErrors),d.ignoreUrls=!!d.ignoreUrls.length&&n(d.ignoreUrls),d.whitelistUrls=!!d.whitelistUrls.length&&n(d.whitelistUrls),d.includePaths=n(d.includePaths),d.maxBreadcrumbs=Math.max(0,Math.min(d.maxBreadcrumbs||100,100));var e={xhr:!0,console:!0,dom:!0,location:!0},f=d.autoBreadcrumbs;return"[object Object]"==={}.toString.call(f)?f=k(e,f):f!==!1&&(f=e),d.autoBreadcrumbs=f,x.collectWindowErrors=!!d.collectWindowErrors,c},install:function(){var a=this;return a.isSetup()&&!a.m&&(x.report.subscribe(function(){a.z.apply(a,arguments)}),a.A(),a.k.autoBreadcrumbs&&a.B(),a.C(),a.m=!0),Error.stackTraceLimit=a.k.stackTraceLimit,this},setDSN:function(a){var b=this,c=b.D(a),d=c.path.lastIndexOf("/"),e=c.path.substr(1,d);b.E=a,b.h=c.user,b.F=c.pass&&c.pass.substr(1),b.i=c.path.substr(d+1),b.g=b.G(c),b.H=b.g+"/"+e+"api/"+b.i+"/store/",this.x()},context:function(a,b,c){return g(a)&&(c=b||[],b=a,a=void 0),this.wrap(a,b).apply(this,c)},wrap:function(a,b,c){function d(){var d=[],f=arguments.length,h=!a||a&&a.deep!==!1;for(c&&g(c)&&c.apply(this,arguments);f--;)d[f]=h?e.wrap(a,arguments[f]):arguments[f];try{return b.apply(this,d)}catch(i){throw e.I(),e.captureException(i,a),i}}var e=this;if(f(b)&&!g(a))return a;if(g(a)&&(b=a,a=void 0),!g(b))return b;try{if(b.J)return b;if(b.K)return b.K}catch(h){return b}for(var i in b)m(b,i)&&(d[i]=b[i]);return d.prototype=b.prototype,b.K=d,d.J=!0,d.L=b,d},uninstall:function(){return x.report.uninstall(),this.M(),Error.stackTraceLimit=this.n,this.m=!1,this},captureException:function(a,b){if(!B(a))return this.captureMessage(a,k({trimHeadFrames:1,stacktrace:!0},b));this.d=a;try{var c=x.computeStackTrace(a);this.N(c,b)}catch(d){if(a!==d)throw d}return this},captureMessage:function(a,b){if(!this.k.ignoreErrors.test||!this.k.ignoreErrors.test(a)){b=b||{};var c=k({message:a+""},b);if(this.k.stacktrace||b&&b.stacktrace){var d;try{throw new Error(a)}catch(e){d=e}d.name=null,b=k({fingerprint:a,trimHeadFrames:(b.trimHeadFrames||0)+1},b);var f=x.computeStackTrace(d),g=this.O(f,b);c.stacktrace={frames:g.reverse()}}return this.P(c),this}},captureBreadcrumb:function(a){var b=k({timestamp:d()/1e3},a);if(g(this.k.breadcrumbCallback)){var c=this.k.breadcrumbCallback(b);if(C(c)&&!i(c))b=c;else if(c===!1)return this}return this.t.push(b),this.t.length>this.k.maxBreadcrumbs&&this.t.shift(),this},addPlugin:function(a){var b=[].slice.call(arguments,1);return this.q.push([a,b]),this.m&&this.C(),this},setUserContext:function(a){return this.j.user=a,this},setExtraContext:function(a){return this.Q("extra",a),this},setTagsContext:function(a){return this.Q("tags",a),this},clearContext:function(){return this.j={},this},getContext:function(){return JSON.parse(y(this.j))},setEnvironment:function(a){return this.k.environment=a,this},setRelease:function(a){return this.k.release=a,this},setDataCallback:function(a){var b=this.k.dataCallback;return this.k.dataCallback=g(a)?function(c){return a(c,b)}:a,this},setBreadcrumbCallback:function(a){var b=this.k.breadcrumbCallback;return this.k.breadcrumbCallback=g(a)?function(c){return a(c,b)}:a,this},setShouldSendCallback:function(a){var b=this.k.shouldSendCallback;return this.k.shouldSendCallback=g(a)?function(c){return a(c,b)}:a,this},setTransport:function(a){return this.k.transport=a,this},lastException:function(){return this.d},lastEventId:function(){return this.f},isSetup:function(){return!(!this.a||!this.g&&(this.ravenNotConfiguredError||(this.ravenNotConfiguredError=!0,this.y("error","Error: Raven has not been configured.")),1))},afterLoad:function(){var a=G.RavenConfig;a&&this.config(a.dsn,a.config).install()},showReportDialog:function(a){if(H){a=a||{};var b=a.eventId||this.lastEventId();if(!b)throw new z("Missing eventId");var c=a.dsn||this.E;if(!c)throw new z("Missing DSN");var d=encodeURIComponent,e="";e+="?eventId="+d(b),e+="&dsn="+d(c);var f=a.user||this.j.user;f&&(f.name&&(e+="&name="+d(f.name)),f.email&&(e+="&email="+d(f.email)));var g=this.G(this.D(c)),h=H.createElement("script");h.async=!0,h.src=g+"/api/embed/error-page/"+e,(H.head||H.body).appendChild(h)}},I:function(){var a=this;this.l+=1,setTimeout(function(){a.l-=1})},R:function(a,b){var c,d;if(this.b){b=b||{},a="raven"+a.substr(0,1).toUpperCase()+a.substr(1),H.createEvent?(c=H.createEvent("HTMLEvents"),c.initEvent(a,!0,!0)):(c=H.createEventObject(),c.eventType=a);for(d in b)m(b,d)&&(c[d]=b[d]);if(H.createEvent)H.dispatchEvent(c);else try{H.fireEvent("on"+c.eventType.toLowerCase(),c)}catch(e){}}},S:function(a){var b=this;return function(c){if(b.T=null,b.u!==c){b.u=c;var d;try{d=r(c.target)}catch(e){d="<unknown>"}b.captureBreadcrumb({category:"ui."+a,message:d})}}},U:function(){var a=this,b=1e3;return function(c){var d;try{d=c.target}catch(e){return}var f=d&&d.tagName;if(f&&("INPUT"===f||"TEXTAREA"===f||d.isContentEditable)){var g=a.T;g||a.S("input")(c),clearTimeout(g),a.T=setTimeout(function(){a.T=null},b)}}},V:function(a,b){var c=p(this.v.href),d=p(b),e=p(a);this.w=b,c.protocol===d.protocol&&c.host===d.host&&(b=d.relative),c.protocol===e.protocol&&c.host===e.host&&(a=e.relative),this.captureBreadcrumb({category:"navigation",data:{to:b,from:a}})},A:function(){function a(a){return function(b,d){for(var e=new Array(arguments.length),f=0;f<e.length;++f)e[f]=arguments[f];var h=e[0];return g(h)&&(e[0]=c.wrap(h)),a.apply?a.apply(this,e):a(e[0],e[1])}}function b(a){var b=G[a]&&G[a].prototype;b&&b.hasOwnProperty&&b.hasOwnProperty("addEventListener")&&(w(b,"addEventListener",function(b){return function(d,f,g,h){try{f&&f.handleEvent&&(f.handleEvent=c.wrap(f.handleEvent))}catch(i){}var j,k,l;return e&&e.dom&&("EventTarget"===a||"Node"===a)&&(k=c.S("click"),l=c.U(),j=function(a){if(a){var b;try{b=a.type}catch(c){return}return"click"===b?k(a):"keypress"===b?l(a):void 0}}),b.call(this,d,c.wrap(f,void 0,j),g,h)}},d),w(b,"removeEventListener",function(a){return function(b,c,d,e){try{c=c&&(c.K?c.K:c)}catch(f){}return a.call(this,b,c,d,e)}},d))}var c=this,d=c.s,e=this.k.autoBreadcrumbs;w(G,"setTimeout",a,d),w(G,"setInterval",a,d),G.requestAnimationFrame&&w(G,"requestAnimationFrame",function(a){return function(b){return a(c.wrap(b))}},d);for(var f=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"],h=0;h<f.length;h++)b(f[h])},B:function(){function a(a,c){a in c&&g(c[a])&&w(c,a,function(a){return b.wrap(a)})}var b=this,c=this.k.autoBreadcrumbs,d=b.s;if(c.xhr&&"XMLHttpRequest"in G){var e=XMLHttpRequest.prototype;w(e,"open",function(a){return function(c,d){return h(d)&&d.indexOf(b.h)===-1&&(this.W={method:c,url:d,status_code:null}),a.apply(this,arguments)}},d),w(e,"send",function(c){return function(d){function e(){if(f.W&&(1===f.readyState||4===f.readyState)){try{f.W.status_code=f.status}catch(a){}b.captureBreadcrumb({type:"http",category:"xhr",data:f.W})}}for(var f=this,h=["onload","onerror","onprogress"],i=0;i<h.length;i++)a(h[i],f);return"onreadystatechange"in f&&g(f.onreadystatechange)?w(f,"onreadystatechange",function(a){return b.wrap(a,void 0,e)}):f.onreadystatechange=e,c.apply(this,arguments)}},d)}c.xhr&&"fetch"in G&&w(G,"fetch",function(a){return function(c,d){for(var e=new Array(arguments.length),f=0;f<e.length;++f)e[f]=arguments[f];var g="GET";e[1]&&e[1].method&&(g=e[1].method);var h={method:g,url:e[0],status_code:null};return b.captureBreadcrumb({type:"http",category:"fetch",data:h}),a.apply(this,e).then(function(a){return h.status_code=a.status,a})}},d),c.dom&&this.b&&(H.addEventListener?(H.addEventListener("click",b.S("click"),!1),H.addEventListener("keypress",b.U(),!1)):(H.attachEvent("onclick",b.S("click")),H.attachEvent("onkeypress",b.U())));var f=G.chrome,i=f&&f.app&&f.app.runtime,k=!i&&G.history&&history.pushState;if(c.location&&k){var l=G.onpopstate;G.onpopstate=function(){var a=b.v.href;if(b.V(b.w,a),l)return l.apply(this,arguments)},w(history,"pushState",function(a){return function(){var c=arguments.length>2?arguments[2]:void 0;return c&&b.V(b.w,c+""),a.apply(this,arguments)}},d)}if(c.console&&"console"in G&&console.log){var m=function(a,c){b.captureBreadcrumb({message:a,level:c.level,category:"console"})};j(["debug","info","warn","error","log"],function(a,b){D(console,b,m)})}},M:function(){for(var a;this.s.length;){a=this.s.shift();var b=a[0],c=a[1],d=a[2];b[c]=d}},C:function(){var a=this;j(this.q,function(b,c){var d=c[0],e=c[1];d.apply(a,[a].concat(e))})},D:function(a){var b=F.exec(a),c={},d=7;try{for(;d--;)c[E[d]]=b[d]||""}catch(e){throw new z("Invalid DSN: "+a)}if(c.pass&&!this.k.allowSecretKey)throw new z("Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key");return c},G:function(a){var b="//"+a.host+(a.port?":"+a.port:"");return a.protocol&&(b=a.protocol+":"+b),b},z:function(){this.l||this.N.apply(this,arguments)},N:function(a,b){var c=this.O(a,b);this.R("handle",{stackInfo:a,options:b}),this.X(a.name,a.message,a.url,a.lineno,c,b)},O:function(a,b){var c=this,d=[];if(a.stack&&a.stack.length&&(j(a.stack,function(a,b){var e=c.Y(b);e&&d.push(e)}),b&&b.trimHeadFrames))for(var e=0;e<b.trimHeadFrames&&e<d.length;e++)d[e].in_app=!1;return d=d.slice(0,this.k.stackTraceLimit)},Y:function(a){if(a.url){var b={filename:a.url,lineno:a.line,colno:a.column,"function":a.func||"?"};return b.in_app=!(this.k.includePaths.test&&!this.k.includePaths.test(b.filename)||/(Raven|TraceKit)\./.test(b["function"])||/raven\.(min\.)?js$/.test(b.filename)),b}},X:function(a,b,c,d,e,f){var g;if((!this.k.ignoreErrors.test||!this.k.ignoreErrors.test(b))&&(b+="",e&&e.length?(c=e[0].filename||c,e.reverse(),g={frames:e}):c&&(g={frames:[{filename:c,lineno:d,in_app:!0}]}),(!this.k.ignoreUrls.test||!this.k.ignoreUrls.test(c))&&(!this.k.whitelistUrls.test||this.k.whitelistUrls.test(c)))){var h=k({exception:{values:[{type:a,value:b,stacktrace:g}]},culprit:c},f);this.P(h)}},Z:function(a){var b=this.k.maxMessageLength;if(a.message&&(a.message=l(a.message,b)),a.exception){var c=a.exception.values[0];c.value=l(c.value,b)}return a},$:function(){if(this.c||this.b){var a={};return this.c&&I.userAgent&&(a.headers={"User-Agent":navigator.userAgent}),this.b&&(H.location&&H.location.href&&(a.url=H.location.href),H.referrer&&(a.headers||(a.headers={}),a.headers.Referer=H.referrer)),a}},x:function(){this._=0,this.aa=null},ba:function(){return this._&&d()-this.aa<this._},ca:function(a){var b=this.e;return!(!b||a.message!==b.message||a.culprit!==b.culprit)&&(a.stacktrace||b.stacktrace?v(a.stacktrace,b.stacktrace):!a.exception&&!b.exception||u(a.exception,b.exception))},da:function(a){if(!this.ba()){var b=a.status;if(400===b||401===b||429===b){var c;try{c=a.getResponseHeader("Retry-After"),c=1e3*parseInt(c,10)}catch(e){}this._=c?c:2*this._||1e3,this.aa=d()}}},P:function(a){var b=this.k,c={project:this.i,logger:b.logger,platform:"javascript"},e=this.$();if(e&&(c.request=e),a.trimHeadFrames&&delete a.trimHeadFrames,a=k(c,a),a.tags=k(k({},this.j.tags),a.tags),a.extra=k(k({},this.j.extra),a.extra),a.extra["session:duration"]=d()-this.r,this.t&&this.t.length>0&&(a.breadcrumbs={values:[].slice.call(this.t,0)}),i(a.tags)&&delete a.tags,this.j.user&&(a.user=this.j.user),b.environment&&(a.environment=b.environment),b.release&&(a.release=b.release),b.serverName&&(a.server_name=b.serverName),g(b.dataCallback)&&(a=b.dataCallback(a)||a),a&&!i(a)&&(!g(b.shouldSendCallback)||b.shouldSendCallback(a)))return this.ba()?void this.y("warn","Raven dropped error due to backoff: ",a):void("number"==typeof b.sampleRate?Math.random()<b.sampleRate&&this.ea(a):this.ea(a))},fa:function(){return q()},ea:function(a,b){var c=this,d=this.k;if(this.isSetup()){if(this.f=a.event_id||(a.event_id=this.fa()),a=this.Z(a),!this.k.allowDuplicates&&this.ca(a))return void this.y("warn","Raven dropped repeat event: ",a);this.e=a,this.y("debug","Raven about to send:",a);var e={sentry_version:"7",sentry_client:"raven-js/"+this.VERSION,sentry_key:this.h};this.F&&(e.sentry_secret=this.F);var f=a.exception&&a.exception.values[0];this.captureBreadcrumb({category:"sentry",message:f?(f.type?f.type+": ":"")+f.value:a.message,event_id:a.event_id,level:a.level||"error"});var g=this.H;(d.transport||this.ga).call(this,{url:g,auth:e,data:a,options:d,onSuccess:function(){c.x(),c.R("success",{data:a,src:g}),b&&b()},onError:function(d){c.y("error","Raven transport failed to send: ",d),d.request&&c.da(d.request),c.R("failure",{data:a,src:g}),d=d||new Error("Raven send failed (no additional details provided)"),b&&b(d)}})}},ga:function(a){var b=new XMLHttpRequest,c="withCredentials"in b||"undefined"!=typeof XDomainRequest;if(c){var d=a.url;"withCredentials"in b?b.onreadystatechange=function(){if(4===b.readyState)if(200===b.status)a.onSuccess&&a.onSuccess();else if(a.onError){var c=new Error("Sentry error code: "+b.status);c.request=b,a.onError(c)}}:(b=new XDomainRequest,d=d.replace(/^https?:/,""),a.onSuccess&&(b.onload=a.onSuccess),a.onError&&(b.onerror=function(){var c=new Error("Sentry error code: XDomainRequest");c.request=b,a.onError(c)})),b.open("POST",d+"?"+o(a.auth)),b.send(y(a.data))}},y:function(a){this.p[a]&&this.debug&&Function.prototype.apply.call(this.p[a],this.o,[].slice.call(arguments,1))},Q:function(a,b){f(b)?delete this.j[a]:this.j[a]=k(this.j[a]||{},b)}};var J=Object.prototype;e.prototype.setUser=e.prototype.setUserContext,e.prototype.setReleaseContext=e.prototype.setRelease,b.exports=e}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{1:1,2:2,5:5,6:6,7:7}],4:[function(a,b,c){(function(c){var d=a(3),e="undefined"!=typeof window?window:"undefined"!=typeof c?c:"undefined"!=typeof self?self:{},f=e.Raven,g=new d;g.noConflict=function(){return e.Raven=f,g},g.afterLoad(),b.exports=g}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{3:3}],5:[function(a,b,c){function d(a){return"object"==typeof a&&null!==a}function e(a){var b={}.toString.call(a);return d(a)&&"[object Error]"===b||"[object Exception]"===b||a instanceof Error}b.exports={isObject:d,isError:e}},{}],6:[function(a,b,c){(function(c){function d(){return"undefined"==typeof document||"undefined"==typeof document.location?"":document.location.href}var e=a(5),f={collectWindowErrors:!0,debug:!1},g="undefined"!=typeof window?window:"undefined"!=typeof c?c:"undefined"!=typeof self?self:{},h=[].slice,i="?",j=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;f.report=function(){function a(a){m(),s.push(a)}function b(a){for(var b=s.length-1;b>=0;--b)s[b]===a&&s.splice(b,1)}function c(){n(),s=[]}function k(a,b){var c=null;if(!b||f.collectWindowErrors){for(var d in s)if(s.hasOwnProperty(d))try{s[d].apply(null,[a].concat(h.call(arguments,2)))}catch(e){c=e}if(c)throw c}}function l(a,b,c,g,h){var l=null;if(v)f.computeStackTrace.augmentStackTraceWithInitialElement(v,b,c,a),o();else if(h&&e.isError(h))l=f.computeStackTrace(h),k(l,!0);else{var m,n={url:b,line:c,column:g},p=void 0,r=a;if("[object String]"==={}.toString.call(a)){var m=a.match(j);m&&(p=m[1],r=m[2])}n.func=i,l={name:p,message:r,url:d(),stack:[n]},k(l,!0)}return!!q&&q.apply(this,arguments)}function m(){r||(q=g.onerror,g.onerror=l,r=!0)}function n(){r&&(g.onerror=q,r=!1,q=void 0)}function o(){var a=v,b=t;t=null,v=null,u=null,k.apply(null,[a,!1].concat(b))}function p(a,b){var c=h.call(arguments,1);if(v){if(u===a)return;o()}var d=f.computeStackTrace(a);if(v=d,u=a,t=c,setTimeout(function(){u===a&&o()},d.incomplete?2e3:0),b!==!1)throw a}var q,r,s=[],t=null,u=null,v=null;return p.subscribe=a,p.unsubscribe=b,p.uninstall=c,p}(),f.computeStackTrace=function(){function a(a){if("undefined"!=typeof a.stack&&a.stack){for(var b,c,e=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|<anonymous>).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,f=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|resource|\[native).*?)(?::(\d+))?(?::(\d+))?\s*$/i,g=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,h=a.stack.split("\n"),j=[],k=(/^(.*) is undefined$/.exec(a.message),0),l=h.length;k<l;++k){if(b=e.exec(h[k])){var m=b[2]&&b[2].indexOf("native")!==-1;c={url:m?null:b[2],func:b[1]||i,args:m?[b[2]]:[],line:b[3]?+b[3]:null,column:b[4]?+b[4]:null}}else if(b=g.exec(h[k]))c={url:b[2],func:b[1]||i,args:[],line:+b[3],column:b[4]?+b[4]:null};else{if(!(b=f.exec(h[k])))continue;c={url:b[3],func:b[1]||i,args:b[2]?b[2].split(","):[],line:b[4]?+b[4]:null,column:b[5]?+b[5]:null}}!c.func&&c.line&&(c.func=i),j.push(c)}return j.length?(j[0].column||"undefined"==typeof a.columnNumber||(j[0].column=a.columnNumber+1),{name:a.name,message:a.message,url:d(),stack:j}):null}}function b(a,b,c,d){var e={url:b,line:c};if(e.url&&e.line){if(a.incomplete=!1,e.func||(e.func=i),a.stack.length>0&&a.stack[0].url===e.url){if(a.stack[0].line===e.line)return!1;if(!a.stack[0].line&&a.stack[0].func===e.func)return a.stack[0].line=e.line,!1}return a.stack.unshift(e),a.partial=!0,!0}return a.incomplete=!0,!1}function c(a,g){for(var h,j,k=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,l=[],m={},n=!1,o=c.caller;o&&!n;o=o.caller)if(o!==e&&o!==f.report){if(j={url:null,func:i,line:null,column:null},o.name?j.func=o.name:(h=k.exec(o.toString()))&&(j.func=h[1]),"undefined"==typeof j.func)try{j.func=h.input.substring(0,h.input.indexOf("{"))}catch(p){}m[""+o]?n=!0:m[""+o]=!0,l.push(j)}g&&l.splice(0,g);var q={name:a.name,message:a.message,url:d(),stack:l};return b(q,a.sourceURL||a.fileName,a.line||a.lineNumber,a.message||a.description),q}function e(b,e){var g=null;e=null==e?0:+e;try{if(g=a(b))return g}catch(h){if(f.debug)throw h}try{if(g=c(b,e+1))return g}catch(h){if(f.debug)throw h}return{name:b.name,message:b.message,url:d()}}return e.augmentStackTraceWithInitialElement=b,e.computeStackTraceFromStackProp=a,e}(),b.exports=f}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{5:5}],7:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;++c)if(a[c]===b)return c;return-1}function e(a,b,c,d){return JSON.stringify(a,f(b,d),c)}function f(a,b){var c=[],e=[];return null==b&&(b=function(a,b){return c[0]===b?"[Circular ~]":"[Circular ~."+e.slice(0,d(c,b)).join(".")+"]"}),function(f,g){if(c.length>0){var h=d(c,this);~h?c.splice(h+1):c.push(this),~h?e.splice(h,1/0,f):e.push(f),~d(c,g)&&(g=b.call(this,f,g))}else c.push(g);return null==a?g:a.call(this,f,g)}}c=b.exports=e,c.getSerialize=f},{}]},{},[4])(4)}),function(){function a(a,b){if(a!==b){var c=null===a,d=a===u,e=a===a,f=null===b,g=b===u,h=b===b;if(a>b&&!f||!e||c&&!g&&h||d&&h)return 1;if(a<b&&!c||!h||f&&!d&&e||g&&e)return-1}return 0}function b(a,b,c){for(var d=a.length,e=c?d:-1;c?e--:++e<d;)if(b(a[e],e,a))return e;return-1}function c(a,b,c){if(b!==b)return m(a,c);c-=1;for(var d=a.length;++c<d;)if(a[c]===b)return c;return-1}function d(a){return"function"==typeof a||!1}function e(a){return null==a?"":a+""}function f(a,b){for(var c=-1,d=a.length;++c<d&&-1<b.indexOf(a.charAt(c)););return c}function g(a,b){for(var c=a.length;c--&&-1<b.indexOf(a.charAt(c)););return c}function h(b,c){return a(b.a,c.a)||b.b-c.b}function i(a){return Ja[a]}function j(a){return Ka[a]}function k(a,b,c){return b?a=Na[a]:c&&(a=Oa[a]),"\\"+a}function l(a){return"\\"+Oa[a]}function m(a,b,c){var d=a.length;for(b+=c?0:-1;c?b--:++b<d;){var e=a[b];if(e!==e)return b}return-1}function n(a){return!!a&&"object"==typeof a}function o(a){return 160>=a&&9<=a&&13>=a||32==a||160==a||5760==a||6158==a||8192<=a&&(8202>=a||8232==a||8233==a||8239==a||8287==a||12288==a||65279==a)}function p(a,b){for(var c=-1,d=a.length,e=-1,f=[];++c<d;)a[c]===b&&(a[c]=N,f[++e]=c);return f}function q(a){for(var b=-1,c=a.length;++b<c&&o(a.charCodeAt(b)););return b}function r(a){for(var b=a.length;b--&&o(a.charCodeAt(b)););return b}function s(a){return La[a]}function t(o){function Ja(a){if(n(a)&&!(Bf(a)||a instanceof Ma)){if(a instanceof La)return a;if(_d.call(a,"__chain__")&&_d.call(a,"__wrapped__"))return Pc(a)}return new La(a)}function Ka(){}function La(a,b,c){this.__wrapped__=a,this.__actions__=c||[],this.__chain__=!!b}function Ma(a){this.__wrapped__=a,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Ae,this.__views__=[]}function Na(){this.__data__={}}function Oa(a){var b=a?a.length:0;for(this.data={hash:pe(null),set:new je};b--;)this.push(a[b])}function Pa(a,b){var c=a.data;return("string"==typeof b||pd(b)?c.set.has(b):c.hash[b])?0:-1}function Qa(a,b){var c=-1,d=a.length;for(b||(b=Nd(d));++c<d;)b[c]=a[c];return b}function Ra(a,b){for(var c=-1,d=a.length;++c<d&&!1!==b(a[c],c,a););return a}function Sa(a,b){for(var c=-1,d=a.length;++c<d;)if(!b(a[c],c,a))return!1;return!0}function Ta(a,b){for(var c=-1,d=a.length,e=-1,f=[];++c<d;){var g=a[c];b(g,c,a)&&(f[++e]=g)}return f}function Wa(a,b){for(var c=-1,d=a.length,e=Nd(d);++c<d;)e[c]=b(a[c],c,a);return e}function Xa(a,b){for(var c=-1,d=b.length,e=a.length;++c<d;)a[e+c]=b[c];return a}function Ya(a,b,c,d){var e=-1,f=a.length;for(d&&f&&(c=a[++e]);++e<f;)c=b(c,a[e],e,a);return c}function Za(a,b){for(var c=-1,d=a.length;++c<d;)if(b(a[c],c,a))return!0;return!1}function $a(a,b,c,d){return a!==u&&_d.call(d,c)?a:b}function _a(a,b,c){for(var d=-1,e=Mf(b),f=e.length;++d<f;){var g=e[d],h=a[g],i=c(h,b[g],g,a,b);(i===i?i===h:h!==h)&&(h!==u||g in a)||(a[g]=i)}return a}function ab(a,b){return null==b?a:cb(b,Mf(b),a)}function bb(a,b){for(var c=-1,d=null==a,e=!d&&Cc(a),f=e?a.length:0,g=b.length,h=Nd(g);++c<g;){var i=b[c];h[c]=e?Dc(i,f)?a[i]:u:d?u:a[i]}return h}function cb(a,b,c){c||(c={});for(var d=-1,e=b.length;++d<e;){var f=b[d];c[f]=a[f]}return c}function db(a,b,c){var d=typeof a;return"function"==d?b===u?a:Nb(a,b,c):null==a?Id:"object"==d?ub(a):b===u?Md(a):vb(a,b)}function eb(a,b,c,d,e,f,g){var h;if(c&&(h=e?c(a,d,e):c(a)),h!==u)return h;if(!pd(a))return a;if(d=Bf(a)){if(h=yc(a),!b)return Qa(a,h)}else{var i=be.call(a),j=i==T;if(i!=V&&i!=O&&(!j||e))return Ia[i]?Ac(a,i,b):e?a:{};if(h=zc(j?{}:a),!b)return ab(h,a)}for(f||(f=[]),g||(g=[]),e=f.length;e--;)if(f[e]==a)return g[e];return f.push(a),g.push(h),(d?Ra:nb)(a,function(d,e){h[e]=eb(d,b,c,e,a,f,g)}),h}function fb(a,b,c){if("function"!=typeof a)throw new Wd(M);return ke(function(){a.apply(u,c)},b)}function gb(a,b){var d=a?a.length:0,e=[];if(!d)return e;var f=-1,g=vc(),h=g===c,i=h&&b.length>=J&&pe&&je?new Oa(b):null,j=b.length;i&&(g=Pa,h=!1,b=i);a:for(;++f<d;)if(i=a[f],h&&i===i){for(var k=j;k--;)if(b[k]===i)continue a;e.push(i)}else 0>g(b,i,0)&&e.push(i);return e}function hb(a,b){var c=!0;return He(a,function(a,d,e){return c=!!b(a,d,e)}),c}function ib(a,b,c,d){var e=d,f=e;return He(a,function(a,g,h){g=+b(a,g,h),(c(g,e)||g===d&&g===f)&&(e=g,f=a)}),f}function jb(a,b){var c=[];return He(a,function(a,d,e){b(a,d,e)&&c.push(a)}),c}function kb(a,b,c,d){var e;return c(a,function(a,c,f){return b(a,c,f)?(e=d?c:a,!1):void 0}),e}function lb(a,b,c,d){d||(d=[]);for(var e=-1,f=a.length;++e<f;){var g=a[e];n(g)&&Cc(g)&&(c||Bf(g)||ld(g))?b?lb(g,b,c,d):Xa(d,g):c||(d[d.length]=g)}return d}function mb(a,b){Je(a,b,Ad)}function nb(a,b){return Je(a,b,Mf)}function ob(a,b){return Ke(a,b,Mf)}function pb(a,b){for(var c=-1,d=b.length,e=-1,f=[];++c<d;){var g=b[c];od(a[g])&&(f[++e]=g)}return f}function qb(a,b,c){if(null!=a){c!==u&&c in Nc(a)&&(b=[c]),c=0;for(var d=b.length;null!=a&&c<d;)a=a[b[c++]];return c&&c==d?a:u}}function rb(a,b,c,d,e,f){if(a===b)a=!0;else if(null==a||null==b||!pd(a)&&!n(b))a=a!==a&&b!==b;else a:{var g=rb,h=Bf(a),i=Bf(b),j=P,k=P;h||(j=be.call(a),j==O?j=V:j!=V&&(h=vd(a))),i||(k=be.call(b),k==O?k=V:k!=V&&vd(b));var l=j==V,i=k==V,k=j==k;if(!k||h||l){if(!d&&(j=l&&_d.call(a,"__wrapped__"),i=i&&_d.call(b,"__wrapped__"),j||i)){a=g(j?a.value():a,i?b.value():b,c,d,e,f);break a}if(k){for(e||(e=[]),f||(f=[]),j=e.length;j--;)if(e[j]==a){a=f[j]==b;break a}e.push(a),f.push(b),a=(h?qc:sc)(a,b,g,c,d,e,f),e.pop(),f.pop()}else a=!1}else a=rc(a,b,j)}return a}function sb(a,b,c){var d=b.length,e=d,f=!c;if(null==a)return!e;for(a=Nc(a);d--;){var g=b[d];if(f&&g[2]?g[1]!==a[g[0]]:!(g[0]in a))return!1}for(;++d<e;){var g=b[d],h=g[0],i=a[h],j=g[1];if(f&&g[2]){if(i===u&&!(h in a))return!1}else if(g=c?c(i,j,h):u,g===u?!rb(j,i,c,!0):!g)return!1}return!0}function tb(a,b){var c=-1,d=Cc(a)?Nd(a.length):[];return He(a,function(a,e,f){d[++c]=b(a,e,f)}),d}function ub(a){var b=wc(a);if(1==b.length&&b[0][2]){var c=b[0][0],d=b[0][1];return function(a){return null!=a&&(a[c]===d&&(d!==u||c in Nc(a)))}}return function(a){return sb(a,b)}}function vb(a,b){var c=Bf(a),d=Fc(a)&&b===b&&!pd(b),e=a+"";return a=Oc(a),function(f){if(null==f)return!1;var g=e;if(f=Nc(f),!(!c&&d||g in f)){if(f=1==a.length?f:qb(f,Cb(a,0,-1)),null==f)return!1;g=Uc(a),f=Nc(f)}return f[g]===b?b!==u||g in f:rb(b,f[g],u,!0)}}function wb(a,b,c,d,e){if(!pd(a))return a;var f=Cc(b)&&(Bf(b)||vd(b)),g=f?u:Mf(b);return Ra(g||b,function(h,i){if(g&&(i=h,h=b[i]),n(h)){d||(d=[]),e||(e=[]);a:{for(var j=i,k=d,l=e,m=k.length,o=b[j];m--;)if(k[m]==o){a[j]=l[m];break a}var m=a[j],p=c?c(m,o,j,a,b):u,q=p===u;q&&(p=o,Cc(o)&&(Bf(o)||vd(o))?p=Bf(m)?m:Cc(m)?Qa(m):[]:sd(o)||ld(o)?p=ld(m)?yd(m):sd(m)?m:{}:q=!1),k.push(o),l.push(p),q?a[j]=wb(p,o,c,k,l):(p===p?p!==m:m===m)&&(a[j]=p)}}else j=a[i],k=c?c(j,h,i,a,b):u,(l=k===u)&&(k=h),k===u&&(!f||i in a)||!l&&(k===k?k===j:j!==j)||(a[i]=k)}),a}function xb(a){return function(b){return null==b?u:b[a]}}function yb(a){var b=a+"";return a=Oc(a),function(c){return qb(c,a,b)}}function zb(a,b){for(var c=a?b.length:0;c--;){var d=b[c];if(d!=e&&Dc(d)){var e=d;le.call(a,d,1)}}}function Ab(a,b){return a+qe(ye()*(b-a+1))}function Bb(a,b,c,d,e){return e(a,function(a,e,f){c=d?(d=!1,a):b(c,a,e,f)}),c}function Cb(a,b,c){var d=-1,e=a.length;for(b=null==b?0:+b||0,0>b&&(b=-b>e?0:e+b),c=c===u||c>e?e:+c||0,0>c&&(c+=e),e=b>c?0:c-b>>>0,b>>>=0,c=Nd(e);++d<e;)c[d]=a[d+b];return c}function Db(a,b){var c;return He(a,function(a,d,e){return c=b(a,d,e),!c}),!!c}function Eb(a,b){var c=a.length;for(a.sort(b);c--;)a[c]=a[c].c;return a}function Fb(b,c,d){var e=tc(),f=-1;return c=Wa(c,function(a){return e(a)}),b=tb(b,function(a){return{a:Wa(c,function(b){return b(a)}),b:++f,c:a}}),Eb(b,function(b,c){var e;a:{for(var f=-1,g=b.a,h=c.a,i=g.length,j=d.length;++f<i;)if(e=a(g[f],h[f])){if(f>=j)break a;f=d[f],e*="asc"===f||!0===f?1:-1;break a}e=b.b-c.b}return e})}function Gb(a,b){var c=0;return He(a,function(a,d,e){c+=+b(a,d,e)||0}),c}function Hb(a,b){var d=-1,e=vc(),f=a.length,g=e===c,h=g&&f>=J,i=h&&pe&&je?new Oa((void 0)):null,j=[];i?(e=Pa,g=!1):(h=!1,i=b?[]:j);a:for(;++d<f;){var k=a[d],l=b?b(k,d,a):k;if(g&&k===k){for(var m=i.length;m--;)if(i[m]===l)continue a;b&&i.push(l),j.push(k)}else 0>e(i,l,0)&&((b||h)&&i.push(l),j.push(k))}return j}function Ib(a,b){for(var c=-1,d=b.length,e=Nd(d);++c<d;)e[c]=a[b[c]];return e}function Jb(a,b,c,d){for(var e=a.length,f=d?e:-1;(d?f--:++f<e)&&b(a[f],f,a););return c?Cb(a,d?0:f,d?f+1:e):Cb(a,d?f+1:0,d?e:f)}function Kb(a,b){var c=a;c instanceof Ma&&(c=c.value());for(var d=-1,e=b.length;++d<e;)var f=b[d],c=f.func.apply(f.thisArg,Xa([c],f.args));return c}function Lb(a,b,c){var d=0,e=a?a.length:d;if("number"==typeof b&&b===b&&e<=Ce){for(;d<e;){var f=d+e>>>1,g=a[f];(c?g<=b:g<b)&&null!==g?d=f+1:e=f}return e}return Mb(a,b,Id,c)}function Mb(a,b,c,d){b=c(b);for(var e=0,f=a?a.length:0,g=b!==b,h=null===b,i=b===u;e<f;){var j=qe((e+f)/2),k=c(a[j]),l=k!==u,m=k===k;(g?m||d:h?m&&l&&(d||null!=k):i?m&&(d||l):null==k?0:d?k<=b:k<b)?e=j+1:f=j}return ve(f,Be)}function Nb(a,b,c){if("function"!=typeof a)return Id;if(b===u)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 3:return function(c,d,e){return a.call(b,c,d,e)};case 4:return function(c,d,e,f){return a.call(b,c,d,e,f)};case 5:return function(c,d,e,f,g){return a.call(b,c,d,e,f,g)}}return function(){return a.apply(b,arguments)}}function Ob(a){var b=new ee(a.byteLength);return new me(b).set(new me(a)),b}function Pb(a,b,c){for(var d=c.length,e=-1,f=ue(a.length-d,0),g=-1,h=b.length,i=Nd(h+f);++g<h;)i[g]=b[g];for(;++e<d;)i[c[e]]=a[e];for(;f--;)i[g++]=a[e++];return i}function Qb(a,b,c){for(var d=-1,e=c.length,f=-1,g=ue(a.length-e,0),h=-1,i=b.length,j=Nd(g+i);++f<g;)j[f]=a[f];for(g=f;++h<i;)j[g+h]=b[h];for(;++d<e;)j[g+c[d]]=a[f++];return j}function Rb(a,b){return function(c,d,e){var f=b?b():{};if(d=tc(d,e,3),Bf(c)){e=-1;for(var g=c.length;++e<g;){var h=c[e];a(f,h,d(h,e,c),c)}}else He(c,function(b,c,e){a(f,b,d(b,c,e),e)});return f}}function Sb(a){return jd(function(b,c){var d=-1,e=null==b?0:c.length,f=2<e?c[e-2]:u,g=2<e?c[2]:u,h=1<e?c[e-1]:u;for("function"==typeof f?(f=Nb(f,h,5),e-=2):(f="function"==typeof h?h:u,e-=f?1:0),g&&Ec(c[0],c[1],g)&&(f=3>e?u:f,e=1);++d<e;)(g=c[d])&&a(b,g,f);return b})}function Tb(a,b){return function(c,d){var e=c?Ne(c):0;if(!Hc(e))return a(c,d);for(var f=b?e:-1,g=Nc(c);(b?f--:++f<e)&&!1!==d(g[f],f,g););return c}}function Ub(a){return function(b,c,d){var e=Nc(b);d=d(b);for(var f=d.length,g=a?f:-1;a?g--:++g<f;){var h=d[g];if(!1===c(e[h],h,e))break}return b}}function Vb(a,b){function c(){return(this&&this!==Ua&&this instanceof c?d:a).apply(b,arguments)}var d=Xb(a);return c}function Wb(a){ -return function(b){var c=-1;b=Gd(Dd(b));for(var d=b.length,e="";++c<d;)e=a(e,b[c],c);return e}}function Xb(a){return function(){var b=arguments;switch(b.length){case 0:return new a;case 1:return new a(b[0]);case 2:return new a(b[0],b[1]);case 3:return new a(b[0],b[1],b[2]);case 4:return new a(b[0],b[1],b[2],b[3]);case 5:return new a(b[0],b[1],b[2],b[3],b[4]);case 6:return new a(b[0],b[1],b[2],b[3],b[4],b[5]);case 7:return new a(b[0],b[1],b[2],b[3],b[4],b[5],b[6])}var c=Ge(a.prototype),b=a.apply(c,b);return pd(b)?b:c}}function Yb(a){function b(c,d,e){return e&&Ec(c,d,e)&&(d=u),c=pc(c,a,u,u,u,u,u,d),c.placeholder=b.placeholder,c}return b}function Zb(a,b){return jd(function(c){var d=c[0];return null==d?d:(c.push(b),a.apply(u,c))})}function $b(a,b){return function(c,d,e){if(e&&Ec(c,d,e)&&(d=u),d=tc(d,e,3),1==d.length){e=c=Bf(c)?c:Mc(c);for(var f=d,g=-1,h=e.length,i=b,j=i;++g<h;){var k=e[g],l=+f(k);a(l,i)&&(i=l,j=k)}if(e=j,!c.length||e!==b)return e}return ib(c,d,a,b)}}function _b(a,c){return function(d,e,f){return e=tc(e,f,3),Bf(d)?(e=b(d,e,c),-1<e?d[e]:u):kb(d,e,a)}}function ac(a){return function(c,d,e){return c&&c.length?(d=tc(d,e,3),b(c,d,a)):-1}}function bc(a){return function(b,c,d){return c=tc(c,d,3),kb(b,c,a,!0)}}function cc(a){return function(){for(var b,c=arguments.length,d=a?c:-1,e=0,f=Nd(c);a?d--:++d<c;){var g=f[e++]=arguments[d];if("function"!=typeof g)throw new Wd(M);!b&&La.prototype.thru&&"wrapper"==uc(g)&&(b=new La([],(!0)))}for(d=b?-1:c;++d<c;){var g=f[d],e=uc(g),h="wrapper"==e?Me(g):u;b=h&&Gc(h[0])&&h[1]==(D|z|B|E)&&!h[4].length&&1==h[9]?b[uc(h[0])].apply(b,h[3]):1==g.length&&Gc(g)?b[e]():b.thru(g)}return function(){var a=arguments,d=a[0];if(b&&1==a.length&&Bf(d)&&d.length>=J)return b.plant(d).value();for(var e=0,a=c?f[e].apply(this,a):d;++e<c;)a=f[e].call(this,a);return a}}}function dc(a,b){return function(c,d,e){return"function"==typeof d&&e===u&&Bf(c)?a(c,d):b(c,Nb(d,e,3))}}function ec(a){return function(b,c,d){return("function"!=typeof c||d!==u)&&(c=Nb(c,d,3)),a(b,c,Ad)}}function fc(a){return function(b,c,d){return("function"!=typeof c||d!==u)&&(c=Nb(c,d,3)),a(b,c)}}function gc(a){return function(b,c,d){var e={};return c=tc(c,d,3),nb(b,function(b,d,f){f=c(b,d,f),d=a?f:d,b=a?b:f,e[d]=b}),e}}function hc(a){return function(b,c,d){return b=e(b),(a?b:"")+lc(b,c,d)+(a?"":b)}}function ic(a){var b=jd(function(c,d){var e=p(d,b.placeholder);return pc(c,a,u,d,e)});return b}function jc(a,b){return function(c,d,e,f){var g=3>arguments.length;return"function"==typeof d&&f===u&&Bf(c)?a(c,d,e,g):Bb(c,tc(d,f,4),e,g,b)}}function kc(a,b,c,d,e,f,g,h,i,j){function k(){for(var t=arguments.length,v=t,y=Nd(t);v--;)y[v]=arguments[v];if(d&&(y=Pb(y,d,e)),f&&(y=Qb(y,f,g)),o||r){var v=k.placeholder,z=p(y,v),t=t-z.length;if(t<j){var A=h?Qa(h):u,t=ue(j-t,0),D=o?z:u,z=o?u:z,E=o?y:u,y=o?u:y;return b|=o?B:C,b&=~(o?C:B),q||(b&=~(w|x)),y=[a,b,c,E,D,y,z,A,i,t],A=kc.apply(u,y),Gc(a)&&Oe(A,y),A.placeholder=v,A}}if(v=m?c:this,A=n?v[a]:a,h)for(t=y.length,D=ve(h.length,t),z=Qa(y);D--;)E=h[D],y[D]=Dc(E,t)?z[E]:u;return l&&i<y.length&&(y.length=i),this&&this!==Ua&&this instanceof k&&(A=s||Xb(a)),A.apply(v,y)}var l=b&D,m=b&w,n=b&x,o=b&z,q=b&y,r=b&A,s=n?u:Xb(a);return k}function lc(a,b,c){return a=a.length,b=+b,a<b&&se(b)?(b-=a,c=null==c?" ":c+"",Ed(c,oe(b/c.length)).slice(0,b)):""}function mc(a,b,c,d){function e(){for(var b=-1,h=arguments.length,i=-1,j=d.length,k=Nd(j+h);++i<j;)k[i]=d[i];for(;h--;)k[i++]=arguments[++b];return(this&&this!==Ua&&this instanceof e?g:a).apply(f?c:this,k)}var f=b&w,g=Xb(a);return e}function nc(a){var b=Rd[a];return function(a,c){return(c=c===u?0:+c||0)?(c=he(10,c),b(a*c)/c):b(a)}}function oc(a){return function(b,c,d,e){var f=tc(d);return null==d&&f===db?Lb(b,c,a):Mb(b,c,f(d,e,1),a)}}function pc(a,b,c,d,e,f,g,h){var i=b&x;if(!i&&"function"!=typeof a)throw new Wd(M);var j=d?d.length:0;if(j||(b&=~(B|C),d=e=u),j-=e?e.length:0,b&C){var k=d,l=e;d=e=u}var m=i?u:Me(a);return c=[a,b,c,d,e,k,l,f,g,h],m&&(d=c[1],b=m[1],h=d|b,e=b==D&&d==z||b==D&&d==E&&c[7].length<=m[8]||b==(D|E)&&d==z,(h<D||e)&&(b&w&&(c[2]=m[2],h|=d&w?0:y),(d=m[3])&&(e=c[3],c[3]=e?Pb(e,d,m[4]):Qa(d),c[4]=e?p(c[3],N):Qa(m[4])),(d=m[5])&&(e=c[5],c[5]=e?Qb(e,d,m[6]):Qa(d),c[6]=e?p(c[5],N):Qa(m[6])),(d=m[7])&&(c[7]=Qa(d)),b&D&&(c[8]=null==c[8]?m[8]:ve(c[8],m[8])),null==c[9]&&(c[9]=m[9]),c[0]=m[0],c[1]=h),b=c[1],h=c[9]),c[9]=null==h?i?0:a.length:ue(h-j,0)||0,(m?Le:Oe)(b==w?Vb(c[0],c[2]):b!=B&&b!=(w|B)||c[4].length?kc.apply(u,c):mc.apply(u,c),c)}function qc(a,b,c,d,e,f,g){var h=-1,i=a.length,j=b.length;if(i!=j&&(!e||j<=i))return!1;for(;++h<i;){var k=a[h],j=b[h],l=d?d(e?j:k,e?k:j,h):u;if(l!==u){if(l)continue;return!1}if(e){if(!Za(b,function(a){return k===a||c(k,a,d,e,f,g)}))return!1}else if(k!==j&&!c(k,j,d,e,f,g))return!1}return!0}function rc(a,b,c){switch(c){case Q:case R:return+a==+b;case S:return a.name==b.name&&a.message==b.message;case U:return a!=+a?b!=+b:a==+b;case W:case X:return a==b+""}return!1}function sc(a,b,c,d,e,f,g){var h=Mf(a),i=h.length,j=Mf(b).length;if(i!=j&&!e)return!1;for(j=i;j--;){var k=h[j];if(!(e?k in b:_d.call(b,k)))return!1}for(var l=e;++j<i;){var k=h[j],m=a[k],n=b[k],o=d?d(e?n:m,e?m:n,k):u;if(o===u?!c(m,n,d,e,f,g):!o)return!1;l||(l="constructor"==k)}return!(!l&&(c=a.constructor,d=b.constructor,c!=d&&"constructor"in a&&"constructor"in b&&!("function"==typeof c&&c instanceof c&&"function"==typeof d&&d instanceof d)))}function tc(a,b,c){var d=Ja.callback||Hd,d=d===Hd?db:d;return c?d(a,b,c):d}function uc(a){for(var b=a.name+"",c=Fe[b],d=c?c.length:0;d--;){var e=c[d],f=e.func;if(null==f||f==a)return e.name}return b}function vc(a,b,d){var e=Ja.indexOf||Tc,e=e===Tc?c:e;return a?e(a,b,d):e}function wc(a){a=Bd(a);for(var b=a.length;b--;){var c=a[b][1];a[b][2]=c===c&&!pd(c)}return a}function xc(a,b){var c=null==a?u:a[b];return qd(c)?c:u}function yc(a){var b=a.length,c=new a.constructor(b);return b&&"string"==typeof a[0]&&_d.call(a,"index")&&(c.index=a.index,c.input=a.input),c}function zc(a){return a=a.constructor,"function"==typeof a&&a instanceof a||(a=Td),new a}function Ac(a,b,c){var d=a.constructor;switch(b){case Y:return Ob(a);case Q:case R:return new d((+a));case Z:case $:case _:case aa:case ba:case ca:case da:case ea:case fa:return b=a.buffer,new d(c?Ob(b):b,a.byteOffset,a.length);case U:case X:return new d(a);case W:var e=new d(a.source,ya.exec(a));e.lastIndex=a.lastIndex}return e}function Bc(a,b,c){return null==a||Fc(b,a)||(b=Oc(b),a=1==b.length?a:qb(a,Cb(b,0,-1)),b=Uc(b)),b=null==a?a:a[b],null==b?u:b.apply(a,c)}function Cc(a){return null!=a&&Hc(Ne(a))}function Dc(a,b){return a="number"==typeof a||Ba.test(a)?+a:-1,b=null==b?De:b,-1<a&&0==a%1&&a<b}function Ec(a,b,c){if(!pd(c))return!1;var d=typeof b;return!!("number"==d?Cc(c)&&Dc(b,c.length):"string"==d&&b in c)&&(b=c[b],a===a?a===b:b!==b)}function Fc(a,b){var c=typeof a;return!!("string"==c&&ra.test(a)||"number"==c)||!Bf(a)&&(!qa.test(a)||null!=b&&a in Nc(b))}function Gc(a){var b=uc(a),c=Ja[b];return"function"==typeof c&&b in Ma.prototype&&(a===c||(b=Me(c),!!b&&a===b[0]))}function Hc(a){return"number"==typeof a&&-1<a&&0==a%1&&a<=De}function Ic(a,b){return a===u?b:Cf(a,b,Ic)}function Jc(a,b){a=Nc(a);for(var c=-1,d=b.length,e={};++c<d;){var f=b[c];f in a&&(e[f]=a[f])}return e}function Kc(a,b){var c={};return mb(a,function(a,d,e){b(a,d,e)&&(c[d]=a)}),c}function Lc(a){for(var b=Ad(a),c=b.length,d=c&&a.length,e=!!d&&Hc(d)&&(Bf(a)||ld(a)),f=-1,g=[];++f<c;){var h=b[f];(e&&Dc(h,d)||_d.call(a,h))&&g.push(h)}return g}function Mc(a){return null==a?[]:Cc(a)?pd(a)?a:Td(a):Cd(a)}function Nc(a){return pd(a)?a:Td(a)}function Oc(a){if(Bf(a))return a;var b=[];return e(a).replace(sa,function(a,c,d,e){b.push(d?e.replace(wa,"$1"):c||a)}),b}function Pc(a){return a instanceof Ma?a.clone():new La(a.__wrapped__,a.__chain__,Qa(a.__actions__))}function Qc(a,b,c){return a&&a.length?((c?Ec(a,b,c):null==b)&&(b=1),Cb(a,0>b?0:b)):[]}function Rc(a,b,c){var d=a?a.length:0;return d?((c?Ec(a,b,c):null==b)&&(b=1),b=d-(+b||0),Cb(a,0,0>b?0:b)):[]}function Sc(a){return a?a[0]:u}function Tc(a,b,d){var e=a?a.length:0;if(!e)return-1;if("number"==typeof d)d=0>d?ue(e+d,0):d;else if(d)return d=Lb(a,b),d<e&&(b===b?b===a[d]:a[d]!==a[d])?d:-1;return c(a,b,d||0)}function Uc(a){var b=a?a.length:0;return b?a[b-1]:u}function Vc(a){return Qc(a,1)}function Wc(a,b,d,e){if(!a||!a.length)return[];null!=b&&"boolean"!=typeof b&&(e=d,d=Ec(a,b,e)?u:b,b=!1);var f=tc();if((null!=d||f!==db)&&(d=f(d,e,3)),b&&vc()===c){b=d;var g;d=-1,e=a.length;for(var f=-1,h=[];++d<e;){var i=a[d],j=b?b(i,d,a):i;d&&g===j||(g=j,h[++f]=i)}a=h}else a=Hb(a,d);return a}function Xc(a){if(!a||!a.length)return[];var b=-1,c=0;a=Ta(a,function(a){return Cc(a)?(c=ue(a.length,c),!0):void 0});for(var d=Nd(c);++b<c;)d[b]=Wa(a,xb(b));return d}function Yc(a,b,c){return a&&a.length?(a=Xc(a),null==b?a:(b=Nb(b,c,4),Wa(a,function(a){return Ya(a,b,u,!0)}))):[]}function Zc(a,b){var c=-1,d=a?a.length:0,e={};for(!d||b||Bf(a[0])||(b=[]);++c<d;){var f=a[c];b?e[f]=b[c]:f&&(e[f[0]]=f[1])}return e}function $c(a){return a=Ja(a),a.__chain__=!0,a}function _c(a,b,c){return b.call(c,a)}function ad(a,b,c){var d=Bf(a)?Sa:hb;return c&&Ec(a,b,c)&&(b=u),("function"!=typeof b||c!==u)&&(b=tc(b,c,3)),d(a,b)}function bd(a,b,c){var d=Bf(a)?Ta:jb;return b=tc(b,c,3),d(a,b)}function cd(a,b,c,d){var e=a?Ne(a):0;return Hc(e)||(a=Cd(a),e=a.length),c="number"!=typeof c||d&&Ec(b,c,d)?0:0>c?ue(e+c,0):c||0,"string"==typeof a||!Bf(a)&&ud(a)?c<=e&&-1<a.indexOf(b,c):!!e&&-1<vc(a,b,c)}function dd(a,b,c){var d=Bf(a)?Wa:tb;return b=tc(b,c,3),d(a,b)}function ed(a,b,c){if(c?Ec(a,b,c):null==b){a=Mc(a);var d=a.length;return 0<d?a[Ab(0,d-1)]:u}c=-1,a=xd(a);var d=a.length,e=d-1;for(b=ve(0>b?0:+b||0,d);++c<b;){var d=Ab(c,e),f=a[d];a[d]=a[c],a[c]=f}return a.length=b,a}function fd(a,b,c){var d=Bf(a)?Za:Db;return c&&Ec(a,b,c)&&(b=u),("function"!=typeof b||c!==u)&&(b=tc(b,c,3)),d(a,b)}function gd(a,b){var c;if("function"!=typeof b){if("function"!=typeof a)throw new Wd(M);var d=a;a=b,b=d}return function(){return 0<--a&&(c=b.apply(this,arguments)),1>=a&&(b=u),c}}function hd(a,b,c){function d(b,c){c&&fe(c),i=m=n=u,b&&(o=nf(),j=a.apply(l,h),m||i||(h=l=u))}function e(){var a=b-(nf()-k);0>=a||a>b?d(n,i):m=ke(e,a)}function f(){d(q,m)}function g(){if(h=arguments,k=nf(),l=this,n=q&&(m||!r),!1===p)var c=r&&!m;else{i||r||(o=k);var d=p-(k-o),g=0>=d||d>p;g?(i&&(i=fe(i)),o=k,j=a.apply(l,h)):i||(i=ke(f,d))}return g&&m?m=fe(m):m||b===p||(m=ke(e,b)),c&&(g=!0,j=a.apply(l,h)),!g||m||i||(h=l=u),j}var h,i,j,k,l,m,n,o=0,p=!1,q=!0;if("function"!=typeof a)throw new Wd(M);if(b=0>b?0:+b||0,!0===c)var r=!0,q=!1;else pd(c)&&(r=!!c.leading,p="maxWait"in c&&ue(+c.maxWait||0,b),q="trailing"in c?!!c.trailing:q);return g.cancel=function(){m&&fe(m),i&&fe(i),o=0,i=m=n=u},g}function id(a,b){function c(){var d=arguments,e=b?b.apply(this,d):d[0],f=c.cache;return f.has(e)?f.get(e):(d=a.apply(this,d),c.cache=f.set(e,d),d)}if("function"!=typeof a||b&&"function"!=typeof b)throw new Wd(M);return c.cache=new id.Cache,c}function jd(a,b){if("function"!=typeof a)throw new Wd(M);return b=ue(b===u?a.length-1:+b||0,0),function(){for(var c=arguments,d=-1,e=ue(c.length-b,0),f=Nd(e);++d<e;)f[d]=c[b+d];switch(b){case 0:return a.call(this,f);case 1:return a.call(this,c[0],f);case 2:return a.call(this,c[0],c[1],f)}for(e=Nd(b+1),d=-1;++d<b;)e[d]=c[d];return e[b]=f,a.apply(this,e)}}function kd(a,b){return a>b}function ld(a){return n(a)&&Cc(a)&&_d.call(a,"callee")&&!ie.call(a,"callee")}function md(a,b,c,d){return d=(c="function"==typeof c?Nb(c,d,3):u)?c(a,b):u,d===u?rb(a,b,c):!!d}function nd(a){return n(a)&&"string"==typeof a.message&&be.call(a)==S}function od(a){return pd(a)&&be.call(a)==T}function pd(a){var b=typeof a;return!!a&&("object"==b||"function"==b)}function qd(a){return null!=a&&(od(a)?de.test($d.call(a)):n(a)&&Aa.test(a))}function rd(a){return"number"==typeof a||n(a)&&be.call(a)==U}function sd(a){var b;if(!n(a)||be.call(a)!=V||ld(a)||!(_d.call(a,"constructor")||(b=a.constructor,"function"!=typeof b||b instanceof b)))return!1;var c;return mb(a,function(a,b){c=b}),c===u||_d.call(a,c)}function td(a){return pd(a)&&be.call(a)==W}function ud(a){return"string"==typeof a||n(a)&&be.call(a)==X}function vd(a){return n(a)&&Hc(a.length)&&!!Ha[be.call(a)]}function wd(a,b){return a<b}function xd(a){var b=a?Ne(a):0;return Hc(b)?b?Qa(a):[]:Cd(a)}function yd(a){return cb(a,Ad(a))}function zd(a){return pb(a,Ad(a))}function Ad(a){if(null==a)return[];pd(a)||(a=Td(a));for(var b=a.length,b=b&&Hc(b)&&(Bf(a)||ld(a))&&b||0,c=a.constructor,d=-1,c="function"==typeof c&&c.prototype===a,e=Nd(b),f=0<b;++d<b;)e[d]=d+"";for(var g in a)f&&Dc(g,b)||"constructor"==g&&(c||!_d.call(a,g))||e.push(g);return e}function Bd(a){a=Nc(a);for(var b=-1,c=Mf(a),d=c.length,e=Nd(d);++b<d;){var f=c[b];e[b]=[f,a[f]]}return e}function Cd(a){return Ib(a,Mf(a))}function Dd(a){return(a=e(a))&&a.replace(Ca,i).replace(va,"")}function Ed(a,b){var c="";if(a=e(a),b=+b,1>b||!a||!se(b))return c;do b%2&&(c+=a),b=qe(b/2),a+=a;while(b);return c}function Fd(a,b,c){var d=a;return(a=e(a))?(c?Ec(d,b,c):null==b)?a.slice(q(a),r(a)+1):(b+="",a.slice(f(a,b),g(a,b)+1)):a}function Gd(a,b,c){return c&&Ec(a,b,c)&&(b=u),a=e(a),a.match(b||Fa)||[]}function Hd(a,b,c){return c&&Ec(a,b,c)&&(b=u),n(a)?Jd(a):db(a,b)}function Id(a){return a}function Jd(a){return ub(eb(a,!0))}function Kd(a,b,c){if(null==c){var d=pd(b),e=d?Mf(b):u;((e=e&&e.length?pb(b,e):u)?e.length:d)||(e=!1,c=b,b=a,a=this)}e||(e=pb(b,Mf(b)));var f=!0,d=-1,g=od(a),h=e.length;!1===c?f=!1:pd(c)&&"chain"in c&&(f=c.chain);for(;++d<h;){c=e[d];var i=b[c];a[c]=i,g&&(a.prototype[c]=function(b){return function(){var c=this.__chain__;if(f||c){var d=a(this.__wrapped__);return(d.__actions__=Qa(this.__actions__)).push({func:b,args:arguments,thisArg:a}),d.__chain__=c,d}return b.apply(a,Xa([this.value()],arguments))}}(i))}return a}function Ld(){}function Md(a){return Fc(a)?xb(a):yb(a)}o=o?Va.defaults(Ua.Object(),o,Va.pick(Ua,Ga)):Ua;var Nd=o.Array,Od=o.Date,Pd=o.Error,Qd=o.Function,Rd=o.Math,Sd=o.Number,Td=o.Object,Ud=o.RegExp,Vd=o.String,Wd=o.TypeError,Xd=Nd.prototype,Yd=Td.prototype,Zd=Vd.prototype,$d=Qd.prototype.toString,_d=Yd.hasOwnProperty,ae=0,be=Yd.toString,ce=Ua._,de=Ud("^"+$d.call(_d).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),ee=o.ArrayBuffer,fe=o.clearTimeout,ge=o.parseFloat,he=Rd.pow,ie=Yd.propertyIsEnumerable,je=xc(o,"Set"),ke=o.setTimeout,le=Xd.splice,me=o.Uint8Array,ne=xc(o,"WeakMap"),oe=Rd.ceil,pe=xc(Td,"create"),qe=Rd.floor,re=xc(Nd,"isArray"),se=o.isFinite,te=xc(Td,"keys"),ue=Rd.max,ve=Rd.min,we=xc(Od,"now"),xe=o.parseInt,ye=Rd.random,ze=Sd.NEGATIVE_INFINITY,Ae=Sd.POSITIVE_INFINITY,Be=4294967294,Ce=2147483647,De=9007199254740991,Ee=ne&&new ne,Fe={};Ja.support={},Ja.templateSettings={escape:na,evaluate:oa,interpolate:pa,variable:"",imports:{_:Ja}};var Ge=function(){function a(){}return function(b){if(pd(b)){a.prototype=b;var c=new a;a.prototype=u}return c||{}}}(),He=Tb(nb),Ie=Tb(ob,!0),Je=Ub(),Ke=Ub(!0),Le=Ee?function(a,b){return Ee.set(a,b),a}:Id,Me=Ee?function(a){return Ee.get(a)}:Ld,Ne=xb("length"),Oe=function(){var a=0,b=0;return function(c,d){var e=nf(),f=I-(e-b);if(b=e,0<f){if(++a>=H)return c}else a=0;return Le(c,d)}}(),Pe=jd(function(a,b){return n(a)&&Cc(a)?gb(a,lb(b,!1,!0)):[]}),Qe=ac(),Re=ac(!0),Se=jd(function(a){for(var b=a.length,d=b,e=Nd(k),f=vc(),g=f===c,h=[];d--;){var i=a[d]=Cc(i=a[d])?i:[];e[d]=g&&120<=i.length&&pe&&je?new Oa(d&&i):null}var g=a[0],j=-1,k=g?g.length:0,l=e[0];a:for(;++j<k;)if(i=g[j],0>(l?Pa(l,i):f(h,i,0))){for(d=b;--d;){var m=e[d];if(0>(m?Pa(m,i):f(a[d],i,0)))continue a}l&&l.push(i),h.push(i)}return h}),Te=jd(function(b,c){c=lb(c);var d=bb(b,c);return zb(b,c.sort(a)),d}),Ue=oc(),Ve=oc(!0),We=jd(function(a){return Hb(lb(a,!1,!0))}),Xe=jd(function(a,b){return Cc(a)?gb(a,b):[]}),Ye=jd(Xc),Ze=jd(function(a){var b=a.length,c=2<b?a[b-2]:u,d=1<b?a[b-1]:u;return 2<b&&"function"==typeof c?b-=2:(c=1<b&&"function"==typeof d?(--b,d):u,d=u),a.length=b,Yc(a,c,d)}),$e=jd(function(a){return a=lb(a),this.thru(function(b){b=Bf(b)?b:[Nc(b)];for(var c=a,d=-1,e=b.length,f=-1,g=c.length,h=Nd(e+g);++d<e;)h[d]=b[d];for(;++f<g;)h[d++]=c[f];return h})}),_e=jd(function(a,b){return bb(a,lb(b))}),af=Rb(function(a,b,c){_d.call(a,c)?++a[c]:a[c]=1}),bf=_b(He),cf=_b(Ie,!0),df=dc(Ra,He),ef=dc(function(a,b){for(var c=a.length;c--&&!1!==b(a[c],c,a););return a},Ie),ff=Rb(function(a,b,c){_d.call(a,c)?a[c].push(b):a[c]=[b]}),gf=Rb(function(a,b,c){a[c]=b}),hf=jd(function(a,b,c){var d=-1,e="function"==typeof b,f=Fc(b),g=Cc(a)?Nd(a.length):[];return He(a,function(a){var h=e?b:f&&null!=a?a[b]:u;g[++d]=h?h.apply(a,c):Bc(a,b,c)}),g}),jf=Rb(function(a,b,c){a[c?0:1].push(b)},function(){return[[],[]]}),kf=jc(Ya,He),lf=jc(function(a,b,c,d){var e=a.length;for(d&&e&&(c=a[--e]);e--;)c=b(c,a[e],e,a);return c},Ie),mf=jd(function(a,b){if(null==a)return[];var c=b[2];return c&&Ec(b[0],b[1],c)&&(b.length=1),Fb(a,lb(b),[])}),nf=we||function(){return(new Od).getTime()},of=jd(function(a,b,c){var d=w;if(c.length)var e=p(c,of.placeholder),d=d|B;return pc(a,d,b,c,e)}),pf=jd(function(a,b){b=b.length?lb(b):zd(a);for(var c=-1,d=b.length;++c<d;){var e=b[c];a[e]=pc(a[e],w,a)}return a}),qf=jd(function(a,b,c){var d=w|x;if(c.length)var e=p(c,qf.placeholder),d=d|B;return pc(b,d,a,c,e)}),rf=Yb(z),sf=Yb(A),tf=jd(function(a,b){return fb(a,1,b)}),uf=jd(function(a,b,c){return fb(a,b,c)}),vf=cc(),wf=cc(!0),xf=jd(function(a,b){if(b=lb(b),"function"!=typeof a||!Sa(b,d))throw new Wd(M);var c=b.length;return jd(function(d){for(var e=ve(d.length,c);e--;)d[e]=b[e](d[e]);return a.apply(this,d)})}),yf=ic(B),zf=ic(C),Af=jd(function(a,b){return pc(a,E,u,u,u,lb(b))}),Bf=re||function(a){return n(a)&&Hc(a.length)&&be.call(a)==P},Cf=Sb(wb),Df=Sb(function(a,b,c){return c?_a(a,b,c):ab(a,b)}),Ef=Zb(Df,function(a,b){return a===u?b:a}),Ff=Zb(Cf,Ic),Gf=bc(nb),Hf=bc(ob),If=ec(Je),Jf=ec(Ke),Kf=fc(nb),Lf=fc(ob),Mf=te?function(a){var b=null==a?u:a.constructor;return"function"==typeof b&&b.prototype===a||"function"!=typeof a&&Cc(a)?Lc(a):pd(a)?te(a):[]}:Lc,Nf=gc(!0),Of=gc(),Pf=jd(function(a,b){if(null==a)return{};if("function"!=typeof b[0])return b=Wa(lb(b),Vd),Jc(a,gb(Ad(a),b));var c=Nb(b[0],b[1],3);return Kc(a,function(a,b,d){return!c(a,b,d)})}),Qf=jd(function(a,b){return null==a?{}:"function"==typeof b[0]?Kc(a,Nb(b[0],b[1],3)):Jc(a,lb(b))}),Rf=Wb(function(a,b,c){return b=b.toLowerCase(),a+(c?b.charAt(0).toUpperCase()+b.slice(1):b)}),Sf=Wb(function(a,b,c){return a+(c?"-":"")+b.toLowerCase()}),Tf=hc(),Uf=hc(!0),Vf=Wb(function(a,b,c){return a+(c?"_":"")+b.toLowerCase()}),Wf=Wb(function(a,b,c){return a+(c?" ":"")+(b.charAt(0).toUpperCase()+b.slice(1))}),Xf=jd(function(a,b){try{return a.apply(u,b)}catch(c){return nd(c)?c:new Pd(c)}}),Yf=jd(function(a,b){return function(c){return Bc(c,a,b)}}),Zf=jd(function(a,b){return function(c){return Bc(a,c,b)}}),$f=nc("ceil"),_f=nc("floor"),ag=$b(kd,ze),bg=$b(wd,Ae),cg=nc("round");return Ja.prototype=Ka.prototype,La.prototype=Ge(Ka.prototype),La.prototype.constructor=La,Ma.prototype=Ge(Ka.prototype),Ma.prototype.constructor=Ma,Na.prototype["delete"]=function(a){return this.has(a)&&delete this.__data__[a]},Na.prototype.get=function(a){return"__proto__"==a?u:this.__data__[a]},Na.prototype.has=function(a){return"__proto__"!=a&&_d.call(this.__data__,a)},Na.prototype.set=function(a,b){return"__proto__"!=a&&(this.__data__[a]=b),this},Oa.prototype.push=function(a){var b=this.data;"string"==typeof a||pd(a)?b.set.add(a):b.hash[a]=!0},id.Cache=Na,Ja.after=function(a,b){if("function"!=typeof b){if("function"!=typeof a)throw new Wd(M);var c=a;a=b,b=c}return a=se(a=+a)?a:0,function(){return 1>--a?b.apply(this,arguments):void 0}},Ja.ary=function(a,b,c){return c&&Ec(a,b,c)&&(b=u),b=a&&null==b?a.length:ue(+b||0,0),pc(a,D,u,u,u,u,b)},Ja.assign=Df,Ja.at=_e,Ja.before=gd,Ja.bind=of,Ja.bindAll=pf,Ja.bindKey=qf,Ja.callback=Hd,Ja.chain=$c,Ja.chunk=function(a,b,c){b=(c?Ec(a,b,c):null==b)?1:ue(qe(b)||1,1),c=0;for(var d=a?a.length:0,e=-1,f=Nd(oe(d/b));c<d;)f[++e]=Cb(a,c,c+=b);return f},Ja.compact=function(a){for(var b=-1,c=a?a.length:0,d=-1,e=[];++b<c;){var f=a[b];f&&(e[++d]=f)}return e},Ja.constant=function(a){return function(){return a}},Ja.countBy=af,Ja.create=function(a,b,c){var d=Ge(a);return c&&Ec(a,b,c)&&(b=u),b?ab(d,b):d},Ja.curry=rf,Ja.curryRight=sf,Ja.debounce=hd,Ja.defaults=Ef,Ja.defaultsDeep=Ff,Ja.defer=tf,Ja.delay=uf,Ja.difference=Pe,Ja.drop=Qc,Ja.dropRight=Rc,Ja.dropRightWhile=function(a,b,c){return a&&a.length?Jb(a,tc(b,c,3),!0,!0):[]},Ja.dropWhile=function(a,b,c){return a&&a.length?Jb(a,tc(b,c,3),!0):[]},Ja.fill=function(a,b,c,d){var e=a?a.length:0;if(!e)return[];for(c&&"number"!=typeof c&&Ec(a,b,c)&&(c=0,d=e),e=a.length,c=null==c?0:+c||0,0>c&&(c=-c>e?0:e+c),d=d===u||d>e?e:+d||0,0>d&&(d+=e),e=c>d?0:d>>>0,c>>>=0;c<e;)a[c++]=b;return a},Ja.filter=bd,Ja.flatten=function(a,b,c){var d=a?a.length:0;return c&&Ec(a,b,c)&&(b=!1),d?lb(a,b):[]},Ja.flattenDeep=function(a){return a&&a.length?lb(a,!0):[]},Ja.flow=vf,Ja.flowRight=wf,Ja.forEach=df,Ja.forEachRight=ef,Ja.forIn=If,Ja.forInRight=Jf,Ja.forOwn=Kf,Ja.forOwnRight=Lf,Ja.functions=zd,Ja.groupBy=ff,Ja.indexBy=gf,Ja.initial=function(a){return Rc(a,1)},Ja.intersection=Se,Ja.invert=function(a,b,c){c&&Ec(a,b,c)&&(b=u),c=-1;for(var d=Mf(a),e=d.length,f={};++c<e;){var g=d[c],h=a[g];b?_d.call(f,h)?f[h].push(g):f[h]=[g]:f[h]=g}return f},Ja.invoke=hf,Ja.keys=Mf,Ja.keysIn=Ad,Ja.map=dd,Ja.mapKeys=Nf,Ja.mapValues=Of,Ja.matches=Jd,Ja.matchesProperty=function(a,b){return vb(a,eb(b,!0))},Ja.memoize=id,Ja.merge=Cf,Ja.method=Yf,Ja.methodOf=Zf,Ja.mixin=Kd,Ja.modArgs=xf,Ja.negate=function(a){if("function"!=typeof a)throw new Wd(M);return function(){return!a.apply(this,arguments)}},Ja.omit=Pf,Ja.once=function(a){return gd(2,a)},Ja.pairs=Bd,Ja.partial=yf,Ja.partialRight=zf,Ja.partition=jf,Ja.pick=Qf,Ja.pluck=function(a,b){return dd(a,Md(b))},Ja.property=Md,Ja.propertyOf=function(a){return function(b){return qb(a,Oc(b),b+"")}},Ja.pull=function(){var a=arguments,b=a[0];if(!b||!b.length)return b;for(var c=0,d=vc(),e=a.length;++c<e;)for(var f=0,g=a[c];-1<(f=d(b,g,f));)le.call(b,f,1);return b},Ja.pullAt=Te,Ja.range=function(a,b,c){c&&Ec(a,b,c)&&(b=c=u),a=+a||0,c=null==c?1:+c||0,null==b?(b=a,a=0):b=+b||0;var d=-1;b=ue(oe((b-a)/(c||1)),0);for(var e=Nd(b);++d<b;)e[d]=a,a+=c;return e},Ja.rearg=Af,Ja.reject=function(a,b,c){var d=Bf(a)?Ta:jb;return b=tc(b,c,3),d(a,function(a,c,d){return!b(a,c,d)})},Ja.remove=function(a,b,c){var d=[];if(!a||!a.length)return d;var e=-1,f=[],g=a.length;for(b=tc(b,c,3);++e<g;)c=a[e],b(c,e,a)&&(d.push(c),f.push(e));return zb(a,f),d},Ja.rest=Vc,Ja.restParam=jd,Ja.set=function(a,b,c){if(null==a)return a;var d=b+"";b=null!=a[d]||Fc(b,a)?[d]:Oc(b);for(var d=-1,e=b.length,f=e-1,g=a;null!=g&&++d<e;){var h=b[d];pd(g)&&(d==f?g[h]=c:null==g[h]&&(g[h]=Dc(b[d+1])?[]:{})),g=g[h]}return a},Ja.shuffle=function(a){return ed(a,Ae)},Ja.slice=function(a,b,c){var d=a?a.length:0;return d?(c&&"number"!=typeof c&&Ec(a,b,c)&&(b=0,c=d),Cb(a,b,c)):[]},Ja.sortBy=function(a,b,c){if(null==a)return[];c&&Ec(a,b,c)&&(b=u);var d=-1;return b=tc(b,c,3),a=tb(a,function(a,c,e){return{a:b(a,c,e),b:++d,c:a}}),Eb(a,h)},Ja.sortByAll=mf,Ja.sortByOrder=function(a,b,c,d){return null==a?[]:(d&&Ec(b,c,d)&&(c=u),Bf(b)||(b=null==b?[]:[b]),Bf(c)||(c=null==c?[]:[c]),Fb(a,b,c))},Ja.spread=function(a){if("function"!=typeof a)throw new Wd(M);return function(b){return a.apply(this,b)}},Ja.take=function(a,b,c){return a&&a.length?((c?Ec(a,b,c):null==b)&&(b=1),Cb(a,0,0>b?0:b)):[]},Ja.takeRight=function(a,b,c){var d=a?a.length:0;return d?((c?Ec(a,b,c):null==b)&&(b=1),b=d-(+b||0),Cb(a,0>b?0:b)):[]},Ja.takeRightWhile=function(a,b,c){return a&&a.length?Jb(a,tc(b,c,3),!1,!0):[]},Ja.takeWhile=function(a,b,c){return a&&a.length?Jb(a,tc(b,c,3)):[]},Ja.tap=function(a,b,c){return b.call(c,a),a},Ja.throttle=function(a,b,c){var d=!0,e=!0;if("function"!=typeof a)throw new Wd(M);return!1===c?d=!1:pd(c)&&(d="leading"in c?!!c.leading:d,e="trailing"in c?!!c.trailing:e),hd(a,b,{leading:d,maxWait:+b,trailing:e})},Ja.thru=_c,Ja.times=function(a,b,c){if(a=qe(a),1>a||!se(a))return[];var d=-1,e=Nd(ve(a,4294967295));for(b=Nb(b,c,1);++d<a;)4294967295>d?e[d]=b(d):b(d);return e},Ja.toArray=xd,Ja.toPlainObject=yd,Ja.transform=function(a,b,c,d){var e=Bf(a)||vd(a);return b=tc(b,d,4),null==c&&(e||pd(a)?(d=a.constructor,c=e?Bf(a)?new d:[]:Ge(od(d)?d.prototype:u)):c={}),(e?Ra:nb)(a,function(a,d,e){return b(c,a,d,e)}),c},Ja.union=We,Ja.uniq=Wc,Ja.unzip=Xc,Ja.unzipWith=Yc,Ja.values=Cd,Ja.valuesIn=function(a){return Ib(a,Ad(a))},Ja.where=function(a,b){return bd(a,ub(b))},Ja.without=Xe,Ja.wrap=function(a,b){return b=null==b?Id:b,pc(b,B,u,[a],[])},Ja.xor=function(){for(var a=-1,b=arguments.length;++a<b;){var c=arguments[a];if(Cc(c))var d=d?Xa(gb(d,c),gb(c,d)):c}return d?Hb(d):[]},Ja.zip=Ye,Ja.zipObject=Zc,Ja.zipWith=Ze,Ja.backflow=wf,Ja.collect=dd,Ja.compose=wf,Ja.each=df,Ja.eachRight=ef,Ja.extend=Df,Ja.iteratee=Hd,Ja.methods=zd,Ja.object=Zc,Ja.select=bd,Ja.tail=Vc,Ja.unique=Wc,Kd(Ja,Ja),Ja.add=function(a,b){return(+a||0)+(+b||0)},Ja.attempt=Xf,Ja.camelCase=Rf,Ja.capitalize=function(a){return(a=e(a))&&a.charAt(0).toUpperCase()+a.slice(1)},Ja.ceil=$f,Ja.clone=function(a,b,c,d){return b&&"boolean"!=typeof b&&Ec(a,b,c)?b=!1:"function"==typeof b&&(d=c,c=b,b=!1),"function"==typeof c?eb(a,b,Nb(c,d,3)):eb(a,b)},Ja.cloneDeep=function(a,b,c){return"function"==typeof b?eb(a,!0,Nb(b,c,3)):eb(a,!0)},Ja.deburr=Dd,Ja.endsWith=function(a,b,c){a=e(a),b+="";var d=a.length;return c=c===u?d:ve(0>c?0:+c||0,d),c-=b.length,0<=c&&a.indexOf(b,c)==c},Ja.escape=function(a){return(a=e(a))&&ma.test(a)?a.replace(ka,j):a},Ja.escapeRegExp=function(a){return(a=e(a))&&ua.test(a)?a.replace(ta,k):a||"(?:)"},Ja.every=ad,Ja.find=bf,Ja.findIndex=Qe,Ja.findKey=Gf,Ja.findLast=cf,Ja.findLastIndex=Re,Ja.findLastKey=Hf,Ja.findWhere=function(a,b){return bf(a,ub(b))},Ja.first=Sc,Ja.floor=_f,Ja.get=function(a,b,c){return a=null==a?u:qb(a,Oc(b),b+""),a===u?c:a},Ja.gt=kd,Ja.gte=function(a,b){return a>=b},Ja.has=function(a,b){if(null==a)return!1;var c=_d.call(a,b);if(!c&&!Fc(b)){if(b=Oc(b),a=1==b.length?a:qb(a,Cb(b,0,-1)),null==a)return!1;b=Uc(b),c=_d.call(a,b)}return c||Hc(a.length)&&Dc(b,a.length)&&(Bf(a)||ld(a))},Ja.identity=Id,Ja.includes=cd,Ja.indexOf=Tc,Ja.inRange=function(a,b,c){return b=+b||0,c===u?(c=b,b=0):c=+c||0,a>=ve(b,c)&&a<ue(b,c)},Ja.isArguments=ld,Ja.isArray=Bf,Ja.isBoolean=function(a){return!0===a||!1===a||n(a)&&be.call(a)==Q},Ja.isDate=function(a){return n(a)&&be.call(a)==R},Ja.isElement=function(a){return!!a&&1===a.nodeType&&n(a)&&!sd(a)},Ja.isEmpty=function(a){return null==a||(Cc(a)&&(Bf(a)||ud(a)||ld(a)||n(a)&&od(a.splice))?!a.length:!Mf(a).length)},Ja.isEqual=md,Ja.isError=nd,Ja.isFinite=function(a){return"number"==typeof a&&se(a)},Ja.isFunction=od,Ja.isMatch=function(a,b,c,d){return c="function"==typeof c?Nb(c,d,3):u,sb(a,wc(b),c)},Ja.isNaN=function(a){return rd(a)&&a!=+a},Ja.isNative=qd,Ja.isNull=function(a){return null===a},Ja.isNumber=rd,Ja.isObject=pd,Ja.isPlainObject=sd,Ja.isRegExp=td,Ja.isString=ud,Ja.isTypedArray=vd,Ja.isUndefined=function(a){return a===u},Ja.kebabCase=Sf,Ja.last=Uc,Ja.lastIndexOf=function(a,b,c){var d=a?a.length:0;if(!d)return-1;var e=d;if("number"==typeof c)e=(0>c?ue(d+c,0):ve(c||0,d-1))+1;else if(c)return e=Lb(a,b,!0)-1,a=a[e],(b===b?b===a:a!==a)?e:-1;if(b!==b)return m(a,e,!0);for(;e--;)if(a[e]===b)return e;return-1},Ja.lt=wd,Ja.lte=function(a,b){return a<=b},Ja.max=ag,Ja.min=bg,Ja.noConflict=function(){return Ua._=ce,this},Ja.noop=Ld,Ja.now=nf,Ja.pad=function(a,b,c){a=e(a),b=+b;var d=a.length;return d<b&&se(b)?(d=(b-d)/2,b=qe(d),d=oe(d),c=lc("",d,c),c.slice(0,b)+a+c):a},Ja.padLeft=Tf,Ja.padRight=Uf,Ja.parseInt=function(a,b,c){return(c?Ec(a,b,c):null==b)?b=0:b&&(b=+b),a=Fd(a),xe(a,b||(za.test(a)?16:10))},Ja.random=function(a,b,c){c&&Ec(a,b,c)&&(b=c=u);var d=null==a,e=null==b;return null==c&&(e&&"boolean"==typeof a?(c=a,a=1):"boolean"==typeof b&&(c=b,e=!0)),d&&e&&(b=1,e=!1),a=+a||0,e?(b=a,a=0):b=+b||0,c||a%1||b%1?(c=ye(),ve(a+c*(b-a+ge("1e-"+((c+"").length-1))),b)):Ab(a,b)},Ja.reduce=kf,Ja.reduceRight=lf,Ja.repeat=Ed,Ja.result=function(a,b,c){var d=null==a?u:a[b];return d===u&&(null==a||Fc(b,a)||(b=Oc(b),a=1==b.length?a:qb(a,Cb(b,0,-1)),d=null==a?u:a[Uc(b)]),d=d===u?c:d),od(d)?d.call(a):d},Ja.round=cg,Ja.runInContext=t,Ja.size=function(a){var b=a?Ne(a):0;return Hc(b)?b:Mf(a).length},Ja.snakeCase=Vf,Ja.some=fd,Ja.sortedIndex=Ue,Ja.sortedLastIndex=Ve,Ja.startCase=Wf,Ja.startsWith=function(a,b,c){return a=e(a),c=null==c?0:ve(0>c?0:+c||0,a.length),a.lastIndexOf(b,c)==c},Ja.sum=function(a,b,c){if(c&&Ec(a,b,c)&&(b=u),b=tc(b,c,3),1==b.length){a=Bf(a)?a:Mc(a),c=a.length;for(var d=0;c--;)d+=+b(a[c])||0;a=d}else a=Gb(a,b);return a},Ja.template=function(a,b,c){var d=Ja.templateSettings;c&&Ec(a,b,c)&&(b=c=u),a=e(a),b=_a(ab({},c||b),d,$a),c=_a(ab({},b.imports),d.imports,$a);var f,g,h=Mf(c),i=Ib(c,h),j=0;c=b.interpolate||Da;var k="__p+='";c=Ud((b.escape||Da).source+"|"+c.source+"|"+(c===pa?xa:Da).source+"|"+(b.evaluate||Da).source+"|$","g");var m="sourceURL"in b?"//# sourceURL="+b.sourceURL+"\n":"";if(a.replace(c,function(b,c,d,e,h,i){return d||(d=e),k+=a.slice(j,i).replace(Ea,l),c&&(f=!0,k+="'+__e("+c+")+'"),h&&(g=!0,k+="';"+h+";\n__p+='"),d&&(k+="'+((__t=("+d+"))==null?'':__t)+'"),j=i+b.length,b}),k+="';",(b=b.variable)||(k="with(obj){"+k+"}"),k=(g?k.replace(ga,""):k).replace(ha,"$1").replace(ia,"$1;"),k="function("+(b||"obj")+"){"+(b?"":"obj||(obj={});")+"var __t,__p=''"+(f?",__e=_.escape":"")+(g?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+k+"return __p}",b=Xf(function(){return Qd(h,m+"return "+k).apply(u,i)}),b.source=k,nd(b))throw b;return b},Ja.trim=Fd,Ja.trimLeft=function(a,b,c){var d=a;return(a=e(a))?a.slice((c?Ec(d,b,c):null==b)?q(a):f(a,b+"")):a},Ja.trimRight=function(a,b,c){var d=a;return(a=e(a))?(c?Ec(d,b,c):null==b)?a.slice(0,r(a)+1):a.slice(0,g(a,b+"")+1):a},Ja.trunc=function(a,b,c){c&&Ec(a,b,c)&&(b=u);var d=F;if(c=G,null!=b)if(pd(b)){var f="separator"in b?b.separator:f,d="length"in b?+b.length||0:d;c="omission"in b?e(b.omission):c}else d=+b||0;if(a=e(a),d>=a.length)return a;if(d-=c.length,1>d)return c;if(b=a.slice(0,d),null==f)return b+c;if(td(f)){if(a.slice(d).search(f)){var g,h=a.slice(0,d);for(f.global||(f=Ud(f.source,(ya.exec(f)||"")+"g")),f.lastIndex=0;a=f.exec(h);)g=a.index;b=b.slice(0,null==g?d:g)}}else a.indexOf(f,d)!=d&&(f=b.lastIndexOf(f),-1<f&&(b=b.slice(0,f)));return b+c},Ja.unescape=function(a){return(a=e(a))&&la.test(a)?a.replace(ja,s):a},Ja.uniqueId=function(a){var b=++ae;return e(a)+b},Ja.words=Gd,Ja.all=ad,Ja.any=fd,Ja.contains=cd,Ja.eq=md,Ja.detect=bf,Ja.foldl=kf,Ja.foldr=lf,Ja.head=Sc,Ja.include=cd,Ja.inject=kf,Kd(Ja,function(){var a={};return nb(Ja,function(b,c){Ja.prototype[c]||(a[c]=b)}),a}(),!1),Ja.sample=ed,Ja.prototype.sample=function(a){return this.__chain__||null!=a?this.thru(function(b){return ed(b,a)}):ed(this.value())},Ja.VERSION=v,Ra("bind bindKey curry curryRight partial partialRight".split(" "),function(a){Ja[a].placeholder=Ja}),Ra(["drop","take"],function(a,b){Ma.prototype[a]=function(c){var d=this.__filtered__;if(d&&!b)return new Ma(this);c=null==c?1:ue(qe(c)||0,0);var e=this.clone();return d?e.__takeCount__=ve(e.__takeCount__,c):e.__views__.push({size:c,type:a+(0>e.__dir__?"Right":"")}),e},Ma.prototype[a+"Right"]=function(b){return this.reverse()[a](b).reverse()}}),Ra(["filter","map","takeWhile"],function(a,b){var c=b+1,d=c!=L;Ma.prototype[a]=function(a,b){var e=this.clone();return e.__iteratees__.push({iteratee:tc(a,b,1),type:c}),e.__filtered__=e.__filtered__||d,e}}),Ra(["first","last"],function(a,b){var c="take"+(b?"Right":"");Ma.prototype[a]=function(){return this[c](1).value()[0]}}),Ra(["initial","rest"],function(a,b){var c="drop"+(b?"":"Right");Ma.prototype[a]=function(){return this.__filtered__?new Ma(this):this[c](1)}}),Ra(["pluck","where"],function(a,b){var c=b?"filter":"map",d=b?ub:Md;Ma.prototype[a]=function(a){return this[c](d(a))}}),Ma.prototype.compact=function(){return this.filter(Id)},Ma.prototype.reject=function(a,b){ -return a=tc(a,b,1),this.filter(function(b){return!a(b)})},Ma.prototype.slice=function(a,b){a=null==a?0:+a||0;var c=this;return c.__filtered__&&(0<a||0>b)?new Ma(c):(0>a?c=c.takeRight(-a):a&&(c=c.drop(a)),b!==u&&(b=+b||0,c=0>b?c.dropRight(-b):c.take(b-a)),c)},Ma.prototype.takeRightWhile=function(a,b){return this.reverse().takeWhile(a,b).reverse()},Ma.prototype.toArray=function(){return this.take(Ae)},nb(Ma.prototype,function(a,b){var c=/^(?:filter|map|reject)|While$/.test(b),d=/^(?:first|last)$/.test(b),e=Ja[d?"take"+("last"==b?"Right":""):b];e&&(Ja.prototype[b]=function(){function b(a){return d&&g?e(a,1)[0]:e.apply(u,Xa([a],f))}var f=d?[1]:arguments,g=this.__chain__,h=this.__wrapped__,i=!!this.__actions__.length,j=h instanceof Ma,k=f[0],l=j||Bf(h);return l&&c&&"function"==typeof k&&1!=k.length&&(j=l=!1),k={func:_c,args:[b],thisArg:u},i=j&&!i,d&&!g?i?(h=h.clone(),h.__actions__.push(k),a.call(h)):e.call(u,this.value())[0]:!d&&l?(h=i?h:new Ma(this),h=a.apply(h,f),h.__actions__.push(k),new La(h,g)):this.thru(b)})}),Ra("join pop push replace shift sort splice split unshift".split(" "),function(a){var b=(/^(?:replace|split)$/.test(a)?Zd:Xd)[a],c=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",d=/^(?:join|pop|replace|shift)$/.test(a);Ja.prototype[a]=function(){var a=arguments;return d&&!this.__chain__?b.apply(this.value(),a):this[c](function(c){return b.apply(c,a)})}}),nb(Ma.prototype,function(a,b){var c=Ja[b];if(c){var d=c.name+"";(Fe[d]||(Fe[d]=[])).push({name:b,func:c})}}),Fe[kc(u,x).name]=[{name:"wrapper",func:u}],Ma.prototype.clone=function(){var a=new Ma(this.__wrapped__);return a.__actions__=Qa(this.__actions__),a.__dir__=this.__dir__,a.__filtered__=this.__filtered__,a.__iteratees__=Qa(this.__iteratees__),a.__takeCount__=this.__takeCount__,a.__views__=Qa(this.__views__),a},Ma.prototype.reverse=function(){if(this.__filtered__){var a=new Ma(this);a.__dir__=-1,a.__filtered__=!0}else a=this.clone(),a.__dir__*=-1;return a},Ma.prototype.value=function(){var a,b=this.__wrapped__.value(),c=this.__dir__,d=Bf(b),e=0>c,f=d?b.length:0;a=f;for(var g=this.__views__,h=0,i=-1,j=g.length;++i<j;){var k=g[i],l=k.size;switch(k.type){case"drop":h+=l;break;case"dropRight":a-=l;break;case"take":a=ve(a,h+l);break;case"takeRight":h=ue(h,a-l)}}if(a={start:h,end:a},g=a.start,h=a.end,a=h-g,e=e?h:g-1,g=this.__iteratees__,h=g.length,i=0,j=ve(a,this.__takeCount__),!d||f<J||f==a&&j==a)return Kb(b,this.__actions__);d=[];a:for(;a--&&i<j;){for(e+=c,f=-1,k=b[e];++f<h;){var m=g[f],l=m.type,m=m.iteratee(k);if(l==L)k=m;else if(!m){if(l==K)continue a;break a}}d[i++]=k}return d},Ja.prototype.chain=function(){return $c(this)},Ja.prototype.commit=function(){return new La(this.value(),this.__chain__)},Ja.prototype.concat=$e,Ja.prototype.plant=function(a){for(var b,c=this;c instanceof Ka;){var d=Pc(c);b?e.__wrapped__=d:b=d;var e=d,c=c.__wrapped__}return e.__wrapped__=a,b},Ja.prototype.reverse=function(){function a(a){return a.reverse()}var b=this.__wrapped__;return b instanceof Ma?(this.__actions__.length&&(b=new Ma(this)),b=b.reverse(),b.__actions__.push({func:_c,args:[a],thisArg:u}),new La(b,this.__chain__)):this.thru(a)},Ja.prototype.toString=function(){return this.value()+""},Ja.prototype.run=Ja.prototype.toJSON=Ja.prototype.valueOf=Ja.prototype.value=function(){return Kb(this.__wrapped__,this.__actions__)},Ja.prototype.collect=Ja.prototype.map,Ja.prototype.head=Ja.prototype.first,Ja.prototype.select=Ja.prototype.filter,Ja.prototype.tail=Ja.prototype.rest,Ja}var u,v="3.10.1",w=1,x=2,y=4,z=8,A=16,B=32,C=64,D=128,E=256,F=30,G="...",H=150,I=16,J=200,K=1,L=2,M="Expected a function",N="__lodash_placeholder__",O="[object Arguments]",P="[object Array]",Q="[object Boolean]",R="[object Date]",S="[object Error]",T="[object Function]",U="[object Number]",V="[object Object]",W="[object RegExp]",X="[object String]",Y="[object ArrayBuffer]",Z="[object Float32Array]",$="[object Float64Array]",_="[object Int8Array]",aa="[object Int16Array]",ba="[object Int32Array]",ca="[object Uint8Array]",da="[object Uint8ClampedArray]",ea="[object Uint16Array]",fa="[object Uint32Array]",ga=/\b__p\+='';/g,ha=/\b(__p\+=)''\+/g,ia=/(__e\(.*?\)|\b__t\))\+'';/g,ja=/&(?:amp|lt|gt|quot|#39|#96);/g,ka=/[&<>"'`]/g,la=RegExp(ja.source),ma=RegExp(ka.source),na=/<%-([\s\S]+?)%>/g,oa=/<%([\s\S]+?)%>/g,pa=/<%=([\s\S]+?)%>/g,qa=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,ra=/^\w*$/,sa=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g,ta=/^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g,ua=RegExp(ta.source),va=/[\u0300-\u036f\ufe20-\ufe23]/g,wa=/\\(\\)?/g,xa=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ya=/\w*$/,za=/^0[xX]/,Aa=/^\[object .+?Constructor\]$/,Ba=/^\d+$/,Ca=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,Da=/($^)/,Ea=/['\n\r\u2028\u2029\\]/g,Fa=RegExp("[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?=[A-Z\\xc0-\\xd6\\xd8-\\xde][a-z\\xdf-\\xf6\\xf8-\\xff]+)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|[0-9]+","g"),Ga="Array ArrayBuffer Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Math Number Object RegExp Set String _ clearTimeout isFinite parseFloat parseInt setTimeout TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap".split(" "),Ha={};Ha[Z]=Ha[$]=Ha[_]=Ha[aa]=Ha[ba]=Ha[ca]=Ha[da]=Ha[ea]=Ha[fa]=!0,Ha[O]=Ha[P]=Ha[Y]=Ha[Q]=Ha[R]=Ha[S]=Ha[T]=Ha["[object Map]"]=Ha[U]=Ha[V]=Ha[W]=Ha["[object Set]"]=Ha[X]=Ha["[object WeakMap]"]=!1;var Ia={};Ia[O]=Ia[P]=Ia[Y]=Ia[Q]=Ia[R]=Ia[Z]=Ia[$]=Ia[_]=Ia[aa]=Ia[ba]=Ia[U]=Ia[V]=Ia[W]=Ia[X]=Ia[ca]=Ia[da]=Ia[ea]=Ia[fa]=!0,Ia[S]=Ia[T]=Ia["[object Map]"]=Ia["[object Set]"]=Ia["[object WeakMap]"]=!1;var Ja={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"},Ka={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},La={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},Ma={"function":!0,object:!0},Na={0:"x30",1:"x31",2:"x32",3:"x33",4:"x34",5:"x35",6:"x36",7:"x37",8:"x38",9:"x39",A:"x41",B:"x42",C:"x43",D:"x44",E:"x45",F:"x46",a:"x61",b:"x62",c:"x63",d:"x64",e:"x65",f:"x66",n:"x6e",r:"x72",t:"x74",u:"x75",v:"x76",x:"x78"},Oa={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Pa=Ma[typeof exports]&&exports&&!exports.nodeType&&exports,Qa=Ma[typeof module]&&module&&!module.nodeType&&module,Ra=Ma[typeof self]&&self&&self.Object&&self,Sa=Ma[typeof window]&&window&&window.Object&&window,Ta=Qa&&Qa.exports===Pa&&Pa,Ua=Pa&&Qa&&"object"==typeof global&&global&&global.Object&&global||Sa!==(this&&this.window)&&Sa||Ra||this,Va=t();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(Ua._=Va,define(function(){return Va})):Pa&&Qa?Ta?(Qa.exports=Va)._=Va:Pa._=Va:Ua._=Va}.call(this),function(a,b){a(function(){function a(a,b){return null!=a&&null!=b&&a.toLowerCase()===b.toLowerCase()}function c(a,b){var c,d,e=a.length;if(!e||!b)return!1;for(c=b.toLowerCase(),d=0;d<e;++d)if(c===a[d].toLowerCase())return!0;return!1}function d(a){for(var b in a)h.call(a,b)&&(a[b]=new RegExp(a[b],"i"))}function e(a,b){this.ua=a||"",this._cache={},this.maxPhoneWidth=b||600}var f={};f.mobileDetectRules={phones:{iPhone:"\\biPhone\\b|\\biPod\\b",BlackBerry:"BlackBerry|\\bBB10\\b|rim[0-9]+",HTC:"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m",Nexus:"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6",Dell:"Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b",Motorola:"Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\bMoto E\\b",Samsung:"\\bSamsung\\b|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F",LG:"\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)",Sony:"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533",Asus:"Asus.*Galaxy|PadFone.*Mobile",NokiaLumia:"Lumia [0-9]{3,4}",Micromax:"Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b",Palm:"PalmSource|Palm",Vertu:"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature",Pantech:"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790",Fly:"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250",Wiko:"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM",iMobile:"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)",SimValley:"\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b",Wolfgang:"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q",Alcatel:"Alcatel",Nintendo:"Nintendo 3DS",Amoi:"Amoi",INQ:"INQ",GenericPhone:"Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser"},tablets:{iPad:"iPad|iPad.*Mobile",NexusTablet:"Android.*Nexus[\\s]+(7|9|10)",SamsungTablet:"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y|SM-T280",Kindle:"Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI)\\b",SurfaceTablet:"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)",HPTablet:"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10",AsusTablet:"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\bME70C\\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z",BlackBerryTablet:"PlayBook|RIM Tablet",HTCtablet:"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410",MotorolaTablet:"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617",NookTablet:"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2",AcerTablet:"Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b|\\bA3-A20\\b|\\bA3-A30",ToshibaTablet:"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO",LGTablet:"\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b",FujitsuTablet:"Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b",PrestigioTablet:"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002",LenovoTablet:"Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)",DellTablet:"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7",YarvikTablet:"Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b",MedionTablet:"Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB",ArnovaTablet:"97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2",IntensoTablet:"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004",IRUTablet:"M702pro",MegafonTablet:"MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b",EbodaTablet:"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)",AllViewTablet:"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)",ArchosTablet:"\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b",AinolTablet:"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark",NokiaLumiaTablet:"Lumia 2520",SonyTablet:"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31",PhilipsTablet:"\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b",CubeTablet:"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT",CobyTablet:"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010",MIDTablet:"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10",MSITablet:"MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b",SMiTTablet:"Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)",RockChipTablet:"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A",FlyTablet:"IQ310|Fly Vision",bqTablet:"Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris [E|M]10)|Maxwell.*Lite|Maxwell.*Plus",HuaweiTablet:"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim",NecTablet:"\\bN-06D|\\bN-08D",PantechTablet:"Pantech.*P4100",BronchoTablet:"Broncho.*(N701|N708|N802|a710)",VersusTablet:"TOUCHPAD.*[78910]|\\bTOUCHTAB\\b",ZyncTablet:"z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900",PositivoTablet:"TB07STA|TB10STA|TB07FTA|TB10FTA",NabiTablet:"Android.*\\bNabi",KoboTablet:"Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build",DanewTablet:"DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b",TexetTablet:"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE",PlaystationTablet:"Playstation.*(Portable|Vita)",TrekstorTablet:"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab",PyleAudioTablet:"\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b",AdvanTablet:"Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ",DanyTechTablet:"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1",GalapadTablet:"Android.*\\bG1\\b",MicromaxTablet:"Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b",KarbonnTablet:"Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b",AllFineTablet:"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide",PROSCANTablet:"\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b",YONESTablet:"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026",ChangJiaTablet:"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503",GUTablet:"TX-A1301|TX-M9002|Q702|kf026",PointOfViewTablet:"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10",OvermaxTablet:"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)",HCLTablet:"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync",DPSTablet:"DPS Dream 9|DPS Dual 7",VistureTablet:"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10",CrestaTablet:"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989",MediatekTablet:"\\bMT8125|MT8389|MT8135|MT8377\\b",ConcordeTablet:"Concorde([ ]+)?Tab|ConCorde ReadMan",GoCleverTablet:"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042",ModecomTablet:"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003",VoninoTablet:"\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b",ECSTablet:"V07OT2|TM105A|S10OT1|TR10CS1",StorexTablet:"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab",VodafoneTablet:"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497",EssentielBTablet:"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2",RossMoorTablet:"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711",iMobileTablet:"i-mobile i-note",TolinoTablet:"tolino tab [0-9.]+|tolino shine",AudioSonicTablet:"\\bC-22Q|T7-QC|T-17B|T-17P\\b",AMPETablet:"Android.* A78 ",SkkTablet:"Android.* (SKYPAD|PHOENIX|CYCLOPS)",TecnoTablet:"TECNO P9",JXDTablet:"Android.* \\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b",iJoyTablet:"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)",FX2Tablet:"FX2 PAD7|FX2 PAD10",XoroTablet:"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151",ViewsonicTablet:"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a",OdysTablet:"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10",CaptivaTablet:"CAPTIVA PAD",IconbitTablet:"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S",TeclastTablet:"T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air|\\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b|\\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b|\\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b|\\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b|\\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b|\\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b|\\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b|\\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi",OndaTablet:"\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\b[\\s]+",JaytechTablet:"TPC-PA762",BlaupunktTablet:"Endeavour 800NG|Endeavour 1010",DigmaTablet:"\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b",EvolioTablet:"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b",LavaTablet:"QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b", -AocTablet:"MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712",MpmanTablet:"MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\\bMPG7\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010",CelkonTablet:"CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b",WolderTablet:"miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b",MiTablet:"\\bMI PAD\\b|\\bHM NOTE 1W\\b",NibiruTablet:"Nibiru M1|Nibiru Jupiter One",NexoTablet:"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI",LeaderTablet:"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100",UbislateTablet:"UbiSlate[\\s]?7C",PocketBookTablet:"Pocketbook",KocasoTablet:"\\b(TB-1207)\\b",HisenseTablet:"\\b(F5281|E2371)\\b",Hudl:"Hudl HT7S3|Hudl 2",TelstraTablet:"T-Hub2",GenericTablet:"Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bTP750\\b"},oss:{AndroidOS:"Android",BlackBerryOS:"blackberry|\\bBB10\\b|rim tablet os",PalmOS:"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino",SymbianOS:"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b",WindowsMobileOS:"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;",WindowsPhoneOS:"Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;",iOS:"\\biPhone.*Mobile|\\biPod|\\biPad",MeeGoOS:"MeeGo",MaemoOS:"Maemo",JavaOS:"J2ME/|\\bMIDP\\b|\\bCLDC\\b",webOS:"webOS|hpwOS",badaOS:"\\bBada\\b",BREWOS:"BREW"},uas:{Chrome:"\\bCrMo\\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?",Dolfin:"\\bDolfin\\b",Opera:"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+",Skyfire:"Skyfire",Edge:"Mobile Safari/[.0-9]* Edge",IE:"IEMobile|MSIEMobile",Firefox:"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS",Bolt:"bolt",TeaShark:"teashark",Blazer:"Blazer",Safari:"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari",UCBrowser:"UC.*Browser|UCWEB",baiduboxapp:"baiduboxapp",baidubrowser:"baidubrowser",DiigoBrowser:"DiigoBrowser",Puffin:"Puffin",Mercury:"\\bMercury\\b",ObigoBrowser:"Obigo",NetFront:"NF-Browser",GenericBrowser:"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger",PaleMoon:"Android.*PaleMoon|Mobile.*PaleMoon"},props:{Mobile:"Mobile/[VER]",Build:"Build/[VER]",Version:"Version/[VER]",VendorID:"VendorID/[VER]",iPad:"iPad.*CPU[a-z ]+[VER]",iPhone:"iPhone.*CPU[a-z ]+[VER]",iPod:"iPod.*CPU[a-z ]+[VER]",Kindle:"Kindle/[VER]",Chrome:["Chrome/[VER]","CriOS/[VER]","CrMo/[VER]"],Coast:["Coast/[VER]"],Dolfin:"Dolfin/[VER]",Firefox:["Firefox/[VER]","FxiOS/[VER]"],Fennec:"Fennec/[VER]",Edge:"Edge/[VER]",IE:["IEMobile/[VER];","IEMobile [VER]","MSIE [VER];","Trident/[0-9.]+;.*rv:[VER]"],NetFront:"NetFront/[VER]",NokiaBrowser:"NokiaBrowser/[VER]",Opera:[" OPR/[VER]","Opera Mini/[VER]","Version/[VER]"],"Opera Mini":"Opera Mini/[VER]","Opera Mobi":"Version/[VER]","UC Browser":"UC Browser[VER]",MQQBrowser:"MQQBrowser/[VER]",MicroMessenger:"MicroMessenger/[VER]",baiduboxapp:"baiduboxapp/[VER]",baidubrowser:"baidubrowser/[VER]",SamsungBrowser:"SamsungBrowser/[VER]",Iron:"Iron/[VER]",Safari:["Version/[VER]","Safari/[VER]"],Skyfire:"Skyfire/[VER]",Tizen:"Tizen/[VER]",Webkit:"webkit[ /][VER]",PaleMoon:"PaleMoon/[VER]",Gecko:"Gecko/[VER]",Trident:"Trident/[VER]",Presto:"Presto/[VER]",Goanna:"Goanna/[VER]",iOS:" \\bi?OS\\b [VER][ ;]{1}",Android:"Android [VER]",BlackBerry:["BlackBerry[\\w]+/[VER]","BlackBerry.*Version/[VER]","Version/[VER]"],BREW:"BREW [VER]",Java:"Java/[VER]","Windows Phone OS":["Windows Phone OS [VER]","Windows Phone [VER]"],"Windows Phone":"Windows Phone [VER]","Windows CE":"Windows CE/[VER]","Windows NT":"Windows NT [VER]",Symbian:["SymbianOS/[VER]","Symbian/[VER]"],webOS:["webOS/[VER]","hpwOS/[VER];"]},utils:{Bot:"Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom",MobileBot:"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2",DesktopMode:"WPDesktop",TV:"SonyDTV|HbbTV",WebKit:"(webkit)[ /]([\\w.]+)",Console:"\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b",Watch:"SM-V700"}},f.detectMobileBrowsers={fullPattern:/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,shortPattern:/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,tabletPattern:/android|ipad|playbook|silk/i};var g,h=Object.prototype.hasOwnProperty;return f.FALLBACK_PHONE="UnknownPhone",f.FALLBACK_TABLET="UnknownTablet",f.FALLBACK_MOBILE="UnknownMobile",g="isArray"in Array?Array.isArray:function(a){return"[object Array]"===Object.prototype.toString.call(a)},function(){var a,b,c,e,i,j,k=f.mobileDetectRules;for(a in k.props)if(h.call(k.props,a)){for(b=k.props[a],g(b)||(b=[b]),i=b.length,e=0;e<i;++e)c=b[e],j=c.indexOf("[VER]"),j>=0&&(c=c.substring(0,j)+"([\\w._\\+]+)"+c.substring(j+5)),b[e]=new RegExp(c,"i");k.props[a]=b}d(k.oss),d(k.phones),d(k.tablets),d(k.uas),d(k.utils),k.oss0={WindowsPhoneOS:k.oss.WindowsPhoneOS,WindowsMobileOS:k.oss.WindowsMobileOS}}(),f.findMatch=function(a,b){for(var c in a)if(h.call(a,c)&&a[c].test(b))return c;return null},f.findMatches=function(a,b){var c=[];for(var d in a)h.call(a,d)&&a[d].test(b)&&c.push(d);return c},f.getVersionStr=function(a,b){var c,d,e,g,i=f.mobileDetectRules.props;if(h.call(i,a))for(c=i[a],e=c.length,d=0;d<e;++d)if(g=c[d].exec(b),null!==g)return g[1];return null},f.getVersion=function(a,b){var c=f.getVersionStr(a,b);return c?f.prepareVersionNo(c):NaN},f.prepareVersionNo=function(a){var b;return b=a.split(/[a-z._ \/\-]/i),1===b.length&&(a=b[0]),b.length>1&&(a=b[0]+".",b.shift(),a+=b.join("")),Number(a)},f.isMobileFallback=function(a){return f.detectMobileBrowsers.fullPattern.test(a)||f.detectMobileBrowsers.shortPattern.test(a.substr(0,4))},f.isTabletFallback=function(a){return f.detectMobileBrowsers.tabletPattern.test(a)},f.prepareDetectionCache=function(a,c,d){if(a.mobile===b){var g,h,i;return(h=f.findMatch(f.mobileDetectRules.tablets,c))?(a.mobile=a.tablet=h,void(a.phone=null)):(g=f.findMatch(f.mobileDetectRules.phones,c))?(a.mobile=a.phone=g,void(a.tablet=null)):void(f.isMobileFallback(c)?(i=e.isPhoneSized(d),i===b?(a.mobile=f.FALLBACK_MOBILE,a.tablet=a.phone=null):i?(a.mobile=a.phone=f.FALLBACK_PHONE,a.tablet=null):(a.mobile=a.tablet=f.FALLBACK_TABLET,a.phone=null)):f.isTabletFallback(c)?(a.mobile=a.tablet=f.FALLBACK_TABLET,a.phone=null):a.mobile=a.tablet=a.phone=null)}},f.mobileGrade=function(a){var b=null!==a.mobile();return a.os("iOS")&&a.version("iPad")>=4.3||a.os("iOS")&&a.version("iPhone")>=3.1||a.os("iOS")&&a.version("iPod")>=3.1||a.version("Android")>2.1&&a.is("Webkit")||a.version("Windows Phone OS")>=7||a.is("BlackBerry")&&a.version("BlackBerry")>=6||a.match("Playbook.*Tablet")||a.version("webOS")>=1.4&&a.match("Palm|Pre|Pixi")||a.match("hp.*TouchPad")||a.is("Firefox")&&a.version("Firefox")>=12||a.is("Chrome")&&a.is("AndroidOS")&&a.version("Android")>=4||a.is("Skyfire")&&a.version("Skyfire")>=4.1&&a.is("AndroidOS")&&a.version("Android")>=2.3||a.is("Opera")&&a.version("Opera Mobi")>11&&a.is("AndroidOS")||a.is("MeeGoOS")||a.is("Tizen")||a.is("Dolfin")&&a.version("Bada")>=2||(a.is("UC Browser")||a.is("Dolfin"))&&a.version("Android")>=2.3||a.match("Kindle Fire")||a.is("Kindle")&&a.version("Kindle")>=3||a.is("AndroidOS")&&a.is("NookTablet")||a.version("Chrome")>=11&&!b||a.version("Safari")>=5&&!b||a.version("Firefox")>=4&&!b||a.version("MSIE")>=7&&!b||a.version("Opera")>=10&&!b?"A":a.os("iOS")&&a.version("iPad")<4.3||a.os("iOS")&&a.version("iPhone")<3.1||a.os("iOS")&&a.version("iPod")<3.1||a.is("Blackberry")&&a.version("BlackBerry")>=5&&a.version("BlackBerry")<6||a.version("Opera Mini")>=5&&a.version("Opera Mini")<=6.5&&(a.version("Android")>=2.3||a.is("iOS"))||a.match("NokiaN8|NokiaC7|N97.*Series60|Symbian/3")||a.version("Opera Mobi")>=11&&a.is("SymbianOS")?"B":(a.version("BlackBerry")<5||a.match("MSIEMobile|Windows CE.*Mobile")||a.version("Windows Mobile")<=5.2,"C")},f.detectOS=function(a){return f.findMatch(f.mobileDetectRules.oss0,a)||f.findMatch(f.mobileDetectRules.oss,a)},f.getDeviceSmallerSide=function(){return window.screen.width<window.screen.height?window.screen.width:window.screen.height},e.prototype={constructor:e,mobile:function(){return f.prepareDetectionCache(this._cache,this.ua,this.maxPhoneWidth),this._cache.mobile},phone:function(){return f.prepareDetectionCache(this._cache,this.ua,this.maxPhoneWidth),this._cache.phone},tablet:function(){return f.prepareDetectionCache(this._cache,this.ua,this.maxPhoneWidth),this._cache.tablet},userAgent:function(){return this._cache.userAgent===b&&(this._cache.userAgent=f.findMatch(f.mobileDetectRules.uas,this.ua)),this._cache.userAgent},userAgents:function(){return this._cache.userAgents===b&&(this._cache.userAgents=f.findMatches(f.mobileDetectRules.uas,this.ua)),this._cache.userAgents},os:function(){return this._cache.os===b&&(this._cache.os=f.detectOS(this.ua)),this._cache.os},version:function(a){return f.getVersion(a,this.ua)},versionStr:function(a){return f.getVersionStr(a,this.ua)},is:function(b){return c(this.userAgents(),b)||a(b,this.os())||a(b,this.phone())||a(b,this.tablet())||c(f.findMatches(f.mobileDetectRules.utils,this.ua),b)},match:function(a){return a instanceof RegExp||(a=new RegExp(a,"i")),a.test(this.ua)},isPhoneSized:function(a){return e.isPhoneSized(a||this.maxPhoneWidth)},mobileGrade:function(){return this._cache.grade===b&&(this._cache.grade=f.mobileGrade(this)),this._cache.grade}},"undefined"!=typeof window&&window.screen?e.isPhoneSized=function(a){return a<0?b:f.getDeviceSmallerSide()<=a}:e.isPhoneSized=function(){},e._impl=f,e.version="1.3.5 2016-11-14",e})}(function(a){if("undefined"!=typeof module&&module.exports)return function(a){module.exports=a()};if("function"==typeof define&&define.amd)return define;if("undefined"!=typeof window)return function(a){window.MobileDetect=a()};throw new Error("unknown environment")}()),function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.jsyaml=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){function d(a){return function(){throw new Error("Function "+a+" is deprecated and cannot be used.")}}var e=a("./js-yaml/loader"),f=a("./js-yaml/dumper");b.exports.Type=a("./js-yaml/type"),b.exports.Schema=a("./js-yaml/schema"),b.exports.FAILSAFE_SCHEMA=a("./js-yaml/schema/failsafe"),b.exports.JSON_SCHEMA=a("./js-yaml/schema/json"),b.exports.CORE_SCHEMA=a("./js-yaml/schema/core"),b.exports.DEFAULT_SAFE_SCHEMA=a("./js-yaml/schema/default_safe"),b.exports.DEFAULT_FULL_SCHEMA=a("./js-yaml/schema/default_full"),b.exports.load=e.load,b.exports.loadAll=e.loadAll,b.exports.safeLoad=e.safeLoad,b.exports.safeLoadAll=e.safeLoadAll,b.exports.dump=f.dump,b.exports.safeDump=f.safeDump,b.exports.YAMLException=a("./js-yaml/exception"),b.exports.MINIMAL_SCHEMA=a("./js-yaml/schema/failsafe"),b.exports.SAFE_SCHEMA=a("./js-yaml/schema/default_safe"),b.exports.DEFAULT_SCHEMA=a("./js-yaml/schema/default_full"),b.exports.scan=d("scan"),b.exports.parse=d("parse"),b.exports.compose=d("compose"),b.exports.addConstructor=d("addConstructor")},{"./js-yaml/dumper":3,"./js-yaml/exception":4,"./js-yaml/loader":5,"./js-yaml/schema":7,"./js-yaml/schema/core":8,"./js-yaml/schema/default_full":9,"./js-yaml/schema/default_safe":10,"./js-yaml/schema/failsafe":11,"./js-yaml/schema/json":12,"./js-yaml/type":13}],2:[function(a,b,c){function d(a){return"undefined"==typeof a||null===a}function e(a){return"object"==typeof a&&null!==a}function f(a){return Array.isArray(a)?a:d(a)?[]:[a]}function g(a,b){var c,d,e,f;if(b)for(f=Object.keys(b),c=0,d=f.length;c<d;c+=1)e=f[c],a[e]=b[e];return a}function h(a,b){var c,d="";for(c=0;c<b;c+=1)d+=a;return d}function i(a){return 0===a&&Number.NEGATIVE_INFINITY===1/a}b.exports.isNothing=d,b.exports.isObject=e,b.exports.toArray=f,b.exports.repeat=h,b.exports.isNegativeZero=i,b.exports.extend=g},{}],3:[function(a,b,c){function d(a,b){var c,d,e,f,g,h,i;if(null===b)return{};for(c={},d=Object.keys(b),e=0,f=d.length;e<f;e+=1)g=d[e],h=String(b[g]),"!!"===g.slice(0,2)&&(g="tag:yaml.org,2002:"+g.slice(2)),i=a.compiledTypeMap[g],i&&J.call(i.styleAliases,h)&&(h=i.styleAliases[h]),c[g]=h;return c}function e(a){var b,c,d;if(b=a.toString(16).toUpperCase(),a<=255)c="x",d=2;else if(a<=65535)c="u",d=4;else{if(!(a<=4294967295))throw new F("code point within a string may not be greater than 0xFFFFFFFF");c="U",d=8}return"\\"+c+E.repeat("0",d-b.length)+b}function f(a){this.schema=a.schema||G,this.indent=Math.max(1,a.indent||2),this.skipInvalid=a.skipInvalid||!1,this.flowLevel=E.isNothing(a.flowLevel)?-1:a.flowLevel,this.styleMap=d(this.schema,a.styles||null),this.sortKeys=a.sortKeys||!1,this.lineWidth=a.lineWidth||80,this.noRefs=a.noRefs||!1,this.noCompatMode=a.noCompatMode||!1,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function g(a,b){for(var c,d=E.repeat(" ",b),e=0,f=-1,g="",h=a.length;e<h;)f=a.indexOf("\n",e),f===-1?(c=a.slice(e),e=h):(c=a.slice(e,f+1),e=f+1),c.length&&"\n"!==c&&(g+=d),g+=c;return g}function h(a,b){return"\n"+E.repeat(" ",a.indent*b)}function i(a,b){var c,d,e;for(c=0,d=a.implicitTypes.length;c<d;c+=1)if(e=a.implicitTypes[c],e.resolve(b))return!0;return!1}function j(a){return a===M||a===K}function k(a){return 32<=a&&a<=126||161<=a&&a<=55295&&8232!==a&&8233!==a||57344<=a&&a<=65533&&65279!==a||65536<=a&&a<=1114111}function l(a){return k(a)&&65279!==a&&a!==U&&a!==$&&a!==_&&a!==ba&&a!==da&&a!==W&&a!==P}function m(a){return k(a)&&65279!==a&&!j(a)&&a!==V&&a!==Y&&a!==W&&a!==U&&a!==$&&a!==_&&a!==ba&&a!==da&&a!==P&&a!==R&&a!==T&&a!==N&&a!==ca&&a!==X&&a!==S&&a!==O&&a!==Q&&a!==Z&&a!==aa}function n(a,b,c,d,e){var f,g,h=!1,i=!1,n=d!==-1,o=-1,p=m(a.charCodeAt(0))&&!j(a.charCodeAt(a.length-1));if(b)for(f=0;f<a.length;f++){if(g=a.charCodeAt(f),!k(g))return ka;p=p&&l(g)}else{for(f=0;f<a.length;f++){if(g=a.charCodeAt(f),g===L)h=!0,n&&(i=i||f-o-1>d&&" "!==a[o+1],o=f);else if(!k(g))return ka;p=p&&l(g)}i=i||n&&f-o-1>d&&" "!==a[o+1]}return h||i?" "===a[0]&&c>9?ka:i?ja:ia:p&&!e(a)?ga:ha}function o(a,b,c,d){a.dump=function(){function e(b){return i(a,b)}if(0===b.length)return"''";if(!a.noCompatMode&&fa.indexOf(b)!==-1)return"'"+b+"'";var f=a.indent*Math.max(1,c),h=a.lineWidth===-1?-1:Math.max(Math.min(a.lineWidth,40),a.lineWidth-f),j=d||a.flowLevel>-1&&c>=a.flowLevel;switch(n(b,j,a.indent,h,e)){case ga:return b;case ha:return"'"+b.replace(/'/g,"''")+"'";case ia:return"|"+p(b,a.indent)+q(g(b,f));case ja:return">"+p(b,a.indent)+q(g(r(b,h),f));case ka:return'"'+t(b,h)+'"';default:throw new F("impossible error: invalid scalar style")}}()}function p(a,b){var c=" "===a[0]?String(b):"",d="\n"===a[a.length-1],e=d&&("\n"===a[a.length-2]||"\n"===a),f=e?"+":d?"":"-";return c+f+"\n"}function q(a){return"\n"===a[a.length-1]?a.slice(0,-1):a}function r(a,b){for(var c,d,e=/(\n+)([^\n]*)/g,f=function(){var c=a.indexOf("\n");return c=c!==-1?c:a.length,e.lastIndex=c,s(a.slice(0,c),b)}(),g="\n"===a[0]||" "===a[0];d=e.exec(a);){var h=d[1],i=d[2];c=" "===i[0],f+=h+(g||c||""===i?"":"\n")+s(i,b),g=c}return f}function s(a,b){if(""===a||" "===a[0])return a;for(var c,d,e=/ [^ ]/g,f=0,g=0,h=0,i="";c=e.exec(a);)h=c.index,h-f>b&&(d=g>f?g:h,i+="\n"+a.slice(f,d),f=d+1),g=h;return i+="\n",i+=a.length-f>b&&g>f?a.slice(f,g)+"\n"+a.slice(g+1):a.slice(f),i.slice(1)}function t(a){for(var b,c,d="",f=0;f<a.length;f++)b=a.charCodeAt(f),c=ea[b],d+=!c&&k(b)?a[f]:c||e(b);return d}function u(a,b,c){var d,e,f="",g=a.tag;for(d=0,e=c.length;d<e;d+=1)z(a,b,c[d],!1,!1)&&(0!==d&&(f+=", "),f+=a.dump);a.tag=g,a.dump="["+f+"]"}function v(a,b,c,d){var e,f,g="",i=a.tag;for(e=0,f=c.length;e<f;e+=1)z(a,b+1,c[e],!0,!0)&&(d&&0===e||(g+=h(a,b)),g+="- "+a.dump);a.tag=i,a.dump=g||"[]"}function w(a,b,c){var d,e,f,g,h,i="",j=a.tag,k=Object.keys(c);for(d=0,e=k.length;d<e;d+=1)h="",0!==d&&(h+=", "),f=k[d],g=c[f],z(a,b,f,!1,!1)&&(a.dump.length>1024&&(h+="? "),h+=a.dump+": ",z(a,b,g,!1,!1)&&(h+=a.dump,i+=h));a.tag=j,a.dump="{"+i+"}"}function x(a,b,c,d){var e,f,g,i,j,k,l="",m=a.tag,n=Object.keys(c);if(a.sortKeys===!0)n.sort();else if("function"==typeof a.sortKeys)n.sort(a.sortKeys);else if(a.sortKeys)throw new F("sortKeys must be a boolean or a function");for(e=0,f=n.length;e<f;e+=1)k="",d&&0===e||(k+=h(a,b)),g=n[e],i=c[g],z(a,b+1,g,!0,!0,!0)&&(j=null!==a.tag&&"?"!==a.tag||a.dump&&a.dump.length>1024,j&&(k+=a.dump&&L===a.dump.charCodeAt(0)?"?":"? "),k+=a.dump,j&&(k+=h(a,b)),z(a,b+1,i,!0,j)&&(k+=a.dump&&L===a.dump.charCodeAt(0)?":":": ",k+=a.dump,l+=k));a.tag=m,a.dump=l||"{}"}function y(a,b,c){var d,e,f,g,h,i;for(e=c?a.explicitTypes:a.implicitTypes,f=0,g=e.length;f<g;f+=1)if(h=e[f],(h.instanceOf||h.predicate)&&(!h.instanceOf||"object"==typeof b&&b instanceof h.instanceOf)&&(!h.predicate||h.predicate(b))){if(a.tag=c?h.tag:"?",h.represent){if(i=a.styleMap[h.tag]||h.defaultStyle,"[object Function]"===I.call(h.represent))d=h.represent(b,i);else{if(!J.call(h.represent,i))throw new F("!<"+h.tag+'> tag resolver accepts not "'+i+'" style');d=h.represent[i](b,i)}a.dump=d}return!0}return!1}function z(a,b,c,d,e,f){a.tag=null,a.dump=c,y(a,c,!1)||y(a,c,!0);var g=I.call(a.dump);d&&(d=a.flowLevel<0||a.flowLevel>b);var h,i,j="[object Object]"===g||"[object Array]"===g;if(j&&(h=a.duplicates.indexOf(c),i=h!==-1),(null!==a.tag&&"?"!==a.tag||i||2!==a.indent&&b>0)&&(e=!1),i&&a.usedDuplicates[h])a.dump="*ref_"+h;else{if(j&&i&&!a.usedDuplicates[h]&&(a.usedDuplicates[h]=!0),"[object Object]"===g)d&&0!==Object.keys(a.dump).length?(x(a,b,a.dump,e),i&&(a.dump="&ref_"+h+a.dump)):(w(a,b,a.dump),i&&(a.dump="&ref_"+h+" "+a.dump));else if("[object Array]"===g)d&&0!==a.dump.length?(v(a,b,a.dump,e),i&&(a.dump="&ref_"+h+a.dump)):(u(a,b,a.dump),i&&(a.dump="&ref_"+h+" "+a.dump));else{if("[object String]"!==g){if(a.skipInvalid)return!1;throw new F("unacceptable kind of an object to dump "+g)}"?"!==a.tag&&o(a,a.dump,b,f)}null!==a.tag&&"?"!==a.tag&&(a.dump="!<"+a.tag+"> "+a.dump)}return!0}function A(a,b){var c,d,e=[],f=[];for(B(a,e,f),c=0,d=f.length;c<d;c+=1)b.duplicates.push(e[f[c]]);b.usedDuplicates=new Array(d)}function B(a,b,c){var d,e,f;if(null!==a&&"object"==typeof a)if(e=b.indexOf(a),e!==-1)c.indexOf(e)===-1&&c.push(e);else if(b.push(a),Array.isArray(a))for(e=0,f=a.length;e<f;e+=1)B(a[e],b,c);else for(d=Object.keys(a),e=0,f=d.length;e<f;e+=1)B(a[d[e]],b,c)}function C(a,b){b=b||{};var c=new f(b);return c.noRefs||A(a,c),z(c,0,a,!0,!0)?c.dump+"\n":""}function D(a,b){return C(a,E.extend({schema:H},b))}var E=a("./common"),F=a("./exception"),G=a("./schema/default_full"),H=a("./schema/default_safe"),I=Object.prototype.toString,J=Object.prototype.hasOwnProperty,K=9,L=10,M=32,N=33,O=34,P=35,Q=37,R=38,S=39,T=42,U=44,V=45,W=58,X=62,Y=63,Z=64,$=91,_=93,aa=96,ba=123,ca=124,da=125,ea={};ea[0]="\\0",ea[7]="\\a",ea[8]="\\b",ea[9]="\\t",ea[10]="\\n",ea[11]="\\v",ea[12]="\\f",ea[13]="\\r",ea[27]="\\e",ea[34]='\\"',ea[92]="\\\\",ea[133]="\\N",ea[160]="\\_",ea[8232]="\\L",ea[8233]="\\P";var fa=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],ga=1,ha=2,ia=3,ja=4,ka=5;b.exports.dump=C,b.exports.safeDump=D},{"./common":2,"./exception":4,"./schema/default_full":9,"./schema/default_safe":10}],4:[function(a,b,c){function d(a,b){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||"",this.name="YAMLException",this.reason=a,this.mark=b,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():"")}d.prototype=Object.create(Error.prototype),d.prototype.constructor=d,d.prototype.toString=function(a){var b=this.name+": ";return b+=this.reason||"(unknown reason)",!a&&this.mark&&(b+=" "+this.mark.toString()),b},b.exports=d},{}],5:[function(a,b,c){function d(a){return 10===a||13===a}function e(a){return 9===a||32===a}function f(a){return 9===a||32===a||10===a||13===a}function g(a){return 44===a||91===a||93===a||123===a||125===a}function h(a){var b;return 48<=a&&a<=57?a-48:(b=32|a,97<=b&&b<=102?b-97+10:-1)}function i(a){return 120===a?2:117===a?4:85===a?8:0}function j(a){return 48<=a&&a<=57?a-48:-1}function k(a){return 48===a?"\0":97===a?"":98===a?"\b":116===a?"\t":9===a?"\t":110===a?"\n":118===a?"\x0B":102===a?"\f":114===a?"\r":101===a?"":32===a?" ":34===a?'"':47===a?"/":92===a?"\\":78===a?"…":95===a?" ":76===a?"\u2028":80===a?"\u2029":""}function l(a){return a<=65535?String.fromCharCode(a):String.fromCharCode((a-65536>>10)+55296,(a-65536&1023)+56320)}function m(a,b){this.input=a,this.filename=b.filename||null,this.schema=b.schema||S,this.onWarning=b.onWarning||null,this.legacy=b.legacy||!1,this.json=b.json||!1,this.listener=b.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=a.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function n(a,b){return new P(b,new Q(a.filename,a.input,a.position,a.line,a.position-a.lineStart))}function o(a,b){throw n(a,b)}function p(a,b){a.onWarning&&a.onWarning.call(null,n(a,b))}function q(a,b,c,d){var e,f,g,h;if(b<c){if(h=a.input.slice(b,c),d)for(e=0,f=h.length;e<f;e+=1)g=h.charCodeAt(e),9===g||32<=g&&g<=1114111||o(a,"expected valid JSON character");else _.test(h)&&o(a,"the stream contains non-printable characters");a.result+=h}}function r(a,b,c,d){var e,f,g,h;for(O.isObject(c)||o(a,"cannot merge mappings; the provided source object is unacceptable"),e=Object.keys(c),g=0,h=e.length;g<h;g+=1)f=e[g],T.call(b,f)||(b[f]=c[f],d[f]=!0)}function s(a,b,c,d,e,f){var g,h;if(e=String(e),null===b&&(b={}),"tag:yaml.org,2002:merge"===d)if(Array.isArray(f))for(g=0,h=f.length;g<h;g+=1)r(a,b,f[g],c);else r(a,b,f,c);else a.json||T.call(c,e)||!T.call(b,e)||o(a,"duplicated mapping key"),b[e]=f,delete c[e];return b}function t(a){var b;b=a.input.charCodeAt(a.position),10===b?a.position++:13===b?(a.position++,10===a.input.charCodeAt(a.position)&&a.position++):o(a,"a line break is expected"),a.line+=1,a.lineStart=a.position}function u(a,b,c){for(var f=0,g=a.input.charCodeAt(a.position);0!==g;){for(;e(g);)g=a.input.charCodeAt(++a.position);if(b&&35===g)do g=a.input.charCodeAt(++a.position);while(10!==g&&13!==g&&0!==g);if(!d(g))break;for(t(a),g=a.input.charCodeAt(a.position),f++,a.lineIndent=0;32===g;)a.lineIndent++,g=a.input.charCodeAt(++a.position)}return c!==-1&&0!==f&&a.lineIndent<c&&p(a,"deficient indentation"),f}function v(a){var b,c=a.position;return b=a.input.charCodeAt(c),!(45!==b&&46!==b||b!==a.input.charCodeAt(c+1)||b!==a.input.charCodeAt(c+2)||(c+=3,b=a.input.charCodeAt(c),0!==b&&!f(b)))}function w(a,b){1===b?a.result+=" ":b>1&&(a.result+=O.repeat("\n",b-1))}function x(a,b,c){var h,i,j,k,l,m,n,o,p,r=a.kind,s=a.result;if(p=a.input.charCodeAt(a.position),f(p)||g(p)||35===p||38===p||42===p||33===p||124===p||62===p||39===p||34===p||37===p||64===p||96===p)return!1;if((63===p||45===p)&&(i=a.input.charCodeAt(a.position+1),f(i)||c&&g(i)))return!1;for(a.kind="scalar",a.result="",j=k=a.position,l=!1;0!==p;){if(58===p){if(i=a.input.charCodeAt(a.position+1),f(i)||c&&g(i))break}else if(35===p){if(h=a.input.charCodeAt(a.position-1),f(h))break}else{if(a.position===a.lineStart&&v(a)||c&&g(p))break;if(d(p)){if(m=a.line,n=a.lineStart,o=a.lineIndent,u(a,!1,-1),a.lineIndent>=b){l=!0,p=a.input.charCodeAt(a.position);continue}a.position=k,a.line=m,a.lineStart=n,a.lineIndent=o;break}}l&&(q(a,j,k,!1),w(a,a.line-m),j=k=a.position,l=!1),e(p)||(k=a.position+1),p=a.input.charCodeAt(++a.position)}return q(a,j,k,!1),!!a.result||(a.kind=r,a.result=s,!1)}function y(a,b){var c,e,f;if(c=a.input.charCodeAt(a.position),39!==c)return!1;for(a.kind="scalar",a.result="",a.position++,e=f=a.position;0!==(c=a.input.charCodeAt(a.position));)if(39===c){if(q(a,e,a.position,!0),c=a.input.charCodeAt(++a.position),39!==c)return!0;e=f=a.position,a.position++}else d(c)?(q(a,e,f,!0),w(a,u(a,!1,b)),e=f=a.position):a.position===a.lineStart&&v(a)?o(a,"unexpected end of the document within a single quoted scalar"):(a.position++,f=a.position);o(a,"unexpected end of the stream within a single quoted scalar")}function z(a,b){var c,e,f,g,j,k;if(k=a.input.charCodeAt(a.position),34!==k)return!1;for(a.kind="scalar",a.result="",a.position++,c=e=a.position;0!==(k=a.input.charCodeAt(a.position));){if(34===k)return q(a,c,a.position,!0),a.position++,!0;if(92===k){if(q(a,c,a.position,!0),k=a.input.charCodeAt(++a.position),d(k))u(a,!1,b);else if(k<256&&ea[k])a.result+=fa[k],a.position++;else if((j=i(k))>0){for(f=j,g=0;f>0;f--)k=a.input.charCodeAt(++a.position),(j=h(k))>=0?g=(g<<4)+j:o(a,"expected hexadecimal character");a.result+=l(g),a.position++}else o(a,"unknown escape sequence");c=e=a.position}else d(k)?(q(a,c,e,!0),w(a,u(a,!1,b)),c=e=a.position):a.position===a.lineStart&&v(a)?o(a,"unexpected end of the document within a double quoted scalar"):(a.position++,e=a.position)}o(a,"unexpected end of the stream within a double quoted scalar")}function A(a,b){var c,d,e,g,h,i,j,k,l,m,n,p=!0,q=a.tag,r=a.anchor,t={};if(n=a.input.charCodeAt(a.position),91===n)g=93,j=!1,d=[];else{if(123!==n)return!1;g=125,j=!0,d={}}for(null!==a.anchor&&(a.anchorMap[a.anchor]=d),n=a.input.charCodeAt(++a.position);0!==n;){if(u(a,!0,b),n=a.input.charCodeAt(a.position),n===g)return a.position++,a.tag=q,a.anchor=r,a.kind=j?"mapping":"sequence",a.result=d,!0;p||o(a,"missed comma between flow collection entries"),l=k=m=null,h=i=!1,63===n&&(e=a.input.charCodeAt(a.position+1),f(e)&&(h=i=!0,a.position++,u(a,!0,b))),c=a.line,H(a,b,U,!1,!0),l=a.tag,k=a.result,u(a,!0,b),n=a.input.charCodeAt(a.position),!i&&a.line!==c||58!==n||(h=!0,n=a.input.charCodeAt(++a.position),u(a,!0,b),H(a,b,U,!1,!0),m=a.result),j?s(a,d,t,l,k,m):h?d.push(s(a,null,t,l,k,m)):d.push(k),u(a,!0,b),n=a.input.charCodeAt(a.position),44===n?(p=!0,n=a.input.charCodeAt(++a.position)):p=!1}o(a,"unexpected end of the stream within a flow collection")}function B(a,b){var c,f,g,h,i=Y,k=!1,l=!1,m=b,n=0,p=!1;if(h=a.input.charCodeAt(a.position),124===h)f=!1;else{if(62!==h)return!1;f=!0}for(a.kind="scalar",a.result="";0!==h;)if(h=a.input.charCodeAt(++a.position),43===h||45===h)Y===i?i=43===h?$:Z:o(a,"repeat of a chomping mode identifier");else{if(!((g=j(h))>=0))break;0===g?o(a,"bad explicit indentation width of a block scalar; it cannot be less than one"):l?o(a,"repeat of an indentation width identifier"):(m=b+g-1,l=!0)}if(e(h)){do h=a.input.charCodeAt(++a.position);while(e(h));if(35===h)do h=a.input.charCodeAt(++a.position);while(!d(h)&&0!==h)}for(;0!==h;){for(t(a),a.lineIndent=0,h=a.input.charCodeAt(a.position);(!l||a.lineIndent<m)&&32===h;)a.lineIndent++,h=a.input.charCodeAt(++a.position);if(!l&&a.lineIndent>m&&(m=a.lineIndent),d(h))n++;else{if(a.lineIndent<m){i===$?a.result+=O.repeat("\n",k?1+n:n):i===Y&&k&&(a.result+="\n");break}for(f?e(h)?(p=!0,a.result+=O.repeat("\n",k?1+n:n)):p?(p=!1,a.result+=O.repeat("\n",n+1)):0===n?k&&(a.result+=" "):a.result+=O.repeat("\n",n):a.result+=O.repeat("\n",k?1+n:n),k=!0,l=!0,n=0,c=a.position;!d(h)&&0!==h;)h=a.input.charCodeAt(++a.position);q(a,c,a.position,!1)}}return!0}function C(a,b){var c,d,e,g=a.tag,h=a.anchor,i=[],j=!1;for(null!==a.anchor&&(a.anchorMap[a.anchor]=i),e=a.input.charCodeAt(a.position);0!==e&&45===e&&(d=a.input.charCodeAt(a.position+1),f(d));)if(j=!0,a.position++,u(a,!0,-1)&&a.lineIndent<=b)i.push(null),e=a.input.charCodeAt(a.position);else if(c=a.line,H(a,b,W,!1,!0),i.push(a.result),u(a,!0,-1),e=a.input.charCodeAt(a.position),(a.line===c||a.lineIndent>b)&&0!==e)o(a,"bad indentation of a sequence entry");else if(a.lineIndent<b)break;return!!j&&(a.tag=g,a.anchor=h,a.kind="sequence",a.result=i,!0)}function D(a,b,c){var d,g,h,i,j=a.tag,k=a.anchor,l={},m={},n=null,p=null,q=null,r=!1,t=!1;for(null!==a.anchor&&(a.anchorMap[a.anchor]=l),i=a.input.charCodeAt(a.position);0!==i;){if(d=a.input.charCodeAt(a.position+1),h=a.line,63!==i&&58!==i||!f(d)){if(!H(a,c,V,!1,!0))break;if(a.line===h){for(i=a.input.charCodeAt(a.position);e(i);)i=a.input.charCodeAt(++a.position);if(58===i)i=a.input.charCodeAt(++a.position),f(i)||o(a,"a whitespace character is expected after the key-value separator within a block mapping"),r&&(s(a,l,m,n,p,null),n=p=q=null),t=!0,r=!1,g=!1,n=a.tag,p=a.result;else{if(!t)return a.tag=j,a.anchor=k,!0;o(a,"can not read an implicit mapping pair; a colon is missed")}}else{if(!t)return a.tag=j,a.anchor=k,!0;o(a,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===i?(r&&(s(a,l,m,n,p,null),n=p=q=null),t=!0,r=!0,g=!0):r?(r=!1,g=!0):o(a,"incomplete explicit mapping pair; a key node is missed"),a.position+=1,i=d;if((a.line===h||a.lineIndent>b)&&(H(a,b,X,!0,g)&&(r?p=a.result:q=a.result),r||(s(a,l,m,n,p,q),n=p=q=null),u(a,!0,-1),i=a.input.charCodeAt(a.position)),a.lineIndent>b&&0!==i)o(a,"bad indentation of a mapping entry");else if(a.lineIndent<b)break; -}return r&&s(a,l,m,n,p,null),t&&(a.tag=j,a.anchor=k,a.kind="mapping",a.result=l),t}function E(a){var b,c,d,e,g=!1,h=!1;if(e=a.input.charCodeAt(a.position),33!==e)return!1;if(null!==a.tag&&o(a,"duplication of a tag property"),e=a.input.charCodeAt(++a.position),60===e?(g=!0,e=a.input.charCodeAt(++a.position)):33===e?(h=!0,c="!!",e=a.input.charCodeAt(++a.position)):c="!",b=a.position,g){do e=a.input.charCodeAt(++a.position);while(0!==e&&62!==e);a.position<a.length?(d=a.input.slice(b,a.position),e=a.input.charCodeAt(++a.position)):o(a,"unexpected end of the stream within a verbatim tag")}else{for(;0!==e&&!f(e);)33===e&&(h?o(a,"tag suffix cannot contain exclamation marks"):(c=a.input.slice(b-1,a.position+1),ca.test(c)||o(a,"named tag handle cannot contain such characters"),h=!0,b=a.position+1)),e=a.input.charCodeAt(++a.position);d=a.input.slice(b,a.position),ba.test(d)&&o(a,"tag suffix cannot contain flow indicator characters")}return d&&!da.test(d)&&o(a,"tag name cannot contain such characters: "+d),g?a.tag=d:T.call(a.tagMap,c)?a.tag=a.tagMap[c]+d:"!"===c?a.tag="!"+d:"!!"===c?a.tag="tag:yaml.org,2002:"+d:o(a,'undeclared tag handle "'+c+'"'),!0}function F(a){var b,c;if(c=a.input.charCodeAt(a.position),38!==c)return!1;for(null!==a.anchor&&o(a,"duplication of an anchor property"),c=a.input.charCodeAt(++a.position),b=a.position;0!==c&&!f(c)&&!g(c);)c=a.input.charCodeAt(++a.position);return a.position===b&&o(a,"name of an anchor node must contain at least one character"),a.anchor=a.input.slice(b,a.position),!0}function G(a){var b,c,d;if(d=a.input.charCodeAt(a.position),42!==d)return!1;for(d=a.input.charCodeAt(++a.position),b=a.position;0!==d&&!f(d)&&!g(d);)d=a.input.charCodeAt(++a.position);return a.position===b&&o(a,"name of an alias node must contain at least one character"),c=a.input.slice(b,a.position),a.anchorMap.hasOwnProperty(c)||o(a,'unidentified alias "'+c+'"'),a.result=a.anchorMap[c],u(a,!0,-1),!0}function H(a,b,c,d,e){var f,g,h,i,j,k,l,m,n=1,p=!1,q=!1;if(null!==a.listener&&a.listener("open",a),a.tag=null,a.anchor=null,a.kind=null,a.result=null,f=g=h=X===c||W===c,d&&u(a,!0,-1)&&(p=!0,a.lineIndent>b?n=1:a.lineIndent===b?n=0:a.lineIndent<b&&(n=-1)),1===n)for(;E(a)||F(a);)u(a,!0,-1)?(p=!0,h=f,a.lineIndent>b?n=1:a.lineIndent===b?n=0:a.lineIndent<b&&(n=-1)):h=!1;if(h&&(h=p||e),1!==n&&X!==c||(l=U===c||V===c?b:b+1,m=a.position-a.lineStart,1===n?h&&(C(a,m)||D(a,m,l))||A(a,l)?q=!0:(g&&B(a,l)||y(a,l)||z(a,l)?q=!0:G(a)?(q=!0,null===a.tag&&null===a.anchor||o(a,"alias node should not have any properties")):x(a,l,U===c)&&(q=!0,null===a.tag&&(a.tag="?")),null!==a.anchor&&(a.anchorMap[a.anchor]=a.result)):0===n&&(q=h&&C(a,m))),null!==a.tag&&"!"!==a.tag)if("?"===a.tag){for(i=0,j=a.implicitTypes.length;i<j;i+=1)if(k=a.implicitTypes[i],k.resolve(a.result)){a.result=k.construct(a.result),a.tag=k.tag,null!==a.anchor&&(a.anchorMap[a.anchor]=a.result);break}}else T.call(a.typeMap,a.tag)?(k=a.typeMap[a.tag],null!==a.result&&k.kind!==a.kind&&o(a,"unacceptable node kind for !<"+a.tag+'> tag; it should be "'+k.kind+'", not "'+a.kind+'"'),k.resolve(a.result)?(a.result=k.construct(a.result),null!==a.anchor&&(a.anchorMap[a.anchor]=a.result)):o(a,"cannot resolve a node with !<"+a.tag+"> explicit tag")):o(a,"unknown tag !<"+a.tag+">");return null!==a.listener&&a.listener("close",a),null!==a.tag||null!==a.anchor||q}function I(a){var b,c,g,h,i=a.position,j=!1;for(a.version=null,a.checkLineBreaks=a.legacy,a.tagMap={},a.anchorMap={};0!==(h=a.input.charCodeAt(a.position))&&(u(a,!0,-1),h=a.input.charCodeAt(a.position),!(a.lineIndent>0||37!==h));){for(j=!0,h=a.input.charCodeAt(++a.position),b=a.position;0!==h&&!f(h);)h=a.input.charCodeAt(++a.position);for(c=a.input.slice(b,a.position),g=[],c.length<1&&o(a,"directive name must not be less than one character in length");0!==h;){for(;e(h);)h=a.input.charCodeAt(++a.position);if(35===h){do h=a.input.charCodeAt(++a.position);while(0!==h&&!d(h));break}if(d(h))break;for(b=a.position;0!==h&&!f(h);)h=a.input.charCodeAt(++a.position);g.push(a.input.slice(b,a.position))}0!==h&&t(a),T.call(ha,c)?ha[c](a,c,g):p(a,'unknown document directive "'+c+'"')}return u(a,!0,-1),0===a.lineIndent&&45===a.input.charCodeAt(a.position)&&45===a.input.charCodeAt(a.position+1)&&45===a.input.charCodeAt(a.position+2)?(a.position+=3,u(a,!0,-1)):j&&o(a,"directives end mark is expected"),H(a,a.lineIndent-1,X,!1,!0),u(a,!0,-1),a.checkLineBreaks&&aa.test(a.input.slice(i,a.position))&&p(a,"non-ASCII line breaks are interpreted as content"),a.documents.push(a.result),a.position===a.lineStart&&v(a)?void(46===a.input.charCodeAt(a.position)&&(a.position+=3,u(a,!0,-1))):void(a.position<a.length-1&&o(a,"end of the stream or a document separator is expected"))}function J(a,b){a=String(a),b=b||{},0!==a.length&&(10!==a.charCodeAt(a.length-1)&&13!==a.charCodeAt(a.length-1)&&(a+="\n"),65279===a.charCodeAt(0)&&(a=a.slice(1)));var c=new m(a,b);for(c.input+="\0";32===c.input.charCodeAt(c.position);)c.lineIndent+=1,c.position+=1;for(;c.position<c.length-1;)I(c);return c.documents}function K(a,b,c){var d,e,f=J(a,c);for(d=0,e=f.length;d<e;d+=1)b(f[d])}function L(a,b){var c=J(a,b);if(0!==c.length){if(1===c.length)return c[0];throw new P("expected a single document in the stream, but found more")}}function M(a,b,c){K(a,b,O.extend({schema:R},c))}function N(a,b){return L(a,O.extend({schema:R},b))}for(var O=a("./common"),P=a("./exception"),Q=a("./mark"),R=a("./schema/default_safe"),S=a("./schema/default_full"),T=Object.prototype.hasOwnProperty,U=1,V=2,W=3,X=4,Y=1,Z=2,$=3,_=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,aa=/[\x85\u2028\u2029]/,ba=/[,\[\]\{\}]/,ca=/^(?:!|!!|![a-z\-]+!)$/i,da=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i,ea=new Array(256),fa=new Array(256),ga=0;ga<256;ga++)ea[ga]=k(ga)?1:0,fa[ga]=k(ga);var ha={YAML:function(a,b,c){var d,e,f;null!==a.version&&o(a,"duplication of %YAML directive"),1!==c.length&&o(a,"YAML directive accepts exactly one argument"),d=/^([0-9]+)\.([0-9]+)$/.exec(c[0]),null===d&&o(a,"ill-formed argument of the YAML directive"),e=parseInt(d[1],10),f=parseInt(d[2],10),1!==e&&o(a,"unacceptable YAML version of the document"),a.version=c[0],a.checkLineBreaks=f<2,1!==f&&2!==f&&p(a,"unsupported YAML version of the document")},TAG:function(a,b,c){var d,e;2!==c.length&&o(a,"TAG directive accepts exactly two arguments"),d=c[0],e=c[1],ca.test(d)||o(a,"ill-formed tag handle (first argument) of the TAG directive"),T.call(a.tagMap,d)&&o(a,'there is a previously declared suffix for "'+d+'" tag handle'),da.test(e)||o(a,"ill-formed tag prefix (second argument) of the TAG directive"),a.tagMap[d]=e}};b.exports.loadAll=K,b.exports.load=L,b.exports.safeLoadAll=M,b.exports.safeLoad=N},{"./common":2,"./exception":4,"./mark":6,"./schema/default_full":9,"./schema/default_safe":10}],6:[function(a,b,c){function d(a,b,c,d,e){this.name=a,this.buffer=b,this.position=c,this.line=d,this.column=e}var e=a("./common");d.prototype.getSnippet=function(a,b){var c,d,f,g,h;if(!this.buffer)return null;for(a=a||4,b=b||75,c="",d=this.position;d>0&&"\0\r\n…\u2028\u2029".indexOf(this.buffer.charAt(d-1))===-1;)if(d-=1,this.position-d>b/2-1){c=" ... ",d+=5;break}for(f="",g=this.position;g<this.buffer.length&&"\0\r\n…\u2028\u2029".indexOf(this.buffer.charAt(g))===-1;)if(g+=1,g-this.position>b/2-1){f=" ... ",g-=5;break}return h=this.buffer.slice(d,g),e.repeat(" ",a)+c+h+f+"\n"+e.repeat(" ",a+this.position-d+c.length)+"^"},d.prototype.toString=function(a){var b,c="";return this.name&&(c+='in "'+this.name+'" '),c+="at line "+(this.line+1)+", column "+(this.column+1),a||(b=this.getSnippet(),b&&(c+=":\n"+b)),c},b.exports=d},{"./common":2}],7:[function(a,b,c){function d(a,b,c){var e=[];return a.include.forEach(function(a){c=d(a,b,c)}),a[b].forEach(function(a){c.forEach(function(b,c){b.tag===a.tag&&e.push(c)}),c.push(a)}),c.filter(function(a,b){return e.indexOf(b)===-1})}function e(){function a(a){d[a.tag]=a}var b,c,d={};for(b=0,c=arguments.length;b<c;b+=1)arguments[b].forEach(a);return d}function f(a){this.include=a.include||[],this.implicit=a.implicit||[],this.explicit=a.explicit||[],this.implicit.forEach(function(a){if(a.loadKind&&"scalar"!==a.loadKind)throw new h("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")}),this.compiledImplicit=d(this,"implicit",[]),this.compiledExplicit=d(this,"explicit",[]),this.compiledTypeMap=e(this.compiledImplicit,this.compiledExplicit)}var g=a("./common"),h=a("./exception"),i=a("./type");f.DEFAULT=null,f.create=function(){var a,b;switch(arguments.length){case 1:a=f.DEFAULT,b=arguments[0];break;case 2:a=arguments[0],b=arguments[1];break;default:throw new h("Wrong number of arguments for Schema.create function")}if(a=g.toArray(a),b=g.toArray(b),!a.every(function(a){return a instanceof f}))throw new h("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");if(!b.every(function(a){return a instanceof i}))throw new h("Specified list of YAML types (or a single Type object) contains a non-Type object.");return new f({include:a,explicit:b})},b.exports=f},{"./common":2,"./exception":4,"./type":13}],8:[function(a,b,c){var d=a("../schema");b.exports=new d({include:[a("./json")]})},{"../schema":7,"./json":12}],9:[function(a,b,c){var d=a("../schema");b.exports=d.DEFAULT=new d({include:[a("./default_safe")],explicit:[a("../type/js/undefined"),a("../type/js/regexp"),a("../type/js/function")]})},{"../schema":7,"../type/js/function":18,"../type/js/regexp":19,"../type/js/undefined":20,"./default_safe":10}],10:[function(a,b,c){var d=a("../schema");b.exports=new d({include:[a("./core")],implicit:[a("../type/timestamp"),a("../type/merge")],explicit:[a("../type/binary"),a("../type/omap"),a("../type/pairs"),a("../type/set")]})},{"../schema":7,"../type/binary":14,"../type/merge":22,"../type/omap":24,"../type/pairs":25,"../type/set":27,"../type/timestamp":29,"./core":8}],11:[function(a,b,c){var d=a("../schema");b.exports=new d({explicit:[a("../type/str"),a("../type/seq"),a("../type/map")]})},{"../schema":7,"../type/map":21,"../type/seq":26,"../type/str":28}],12:[function(a,b,c){var d=a("../schema");b.exports=new d({include:[a("./failsafe")],implicit:[a("../type/null"),a("../type/bool"),a("../type/int"),a("../type/float")]})},{"../schema":7,"../type/bool":15,"../type/float":16,"../type/int":17,"../type/null":23,"./failsafe":11}],13:[function(a,b,c){function d(a){var b={};return null!==a&&Object.keys(a).forEach(function(c){a[c].forEach(function(a){b[String(a)]=c})}),b}function e(a,b){if(b=b||{},Object.keys(b).forEach(function(b){if(g.indexOf(b)===-1)throw new f('Unknown option "'+b+'" is met in definition of "'+a+'" YAML type.')}),this.tag=a,this.kind=b.kind||null,this.resolve=b.resolve||function(){return!0},this.construct=b.construct||function(a){return a},this.instanceOf=b.instanceOf||null,this.predicate=b.predicate||null,this.represent=b.represent||null,this.defaultStyle=b.defaultStyle||null,this.styleAliases=d(b.styleAliases||null),h.indexOf(this.kind)===-1)throw new f('Unknown kind "'+this.kind+'" is specified for "'+a+'" YAML type.')}var f=a("./exception"),g=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],h=["scalar","sequence","mapping"];b.exports=e},{"./exception":4}],14:[function(a,b,c){function d(a){if(null===a)return!1;var b,c,d=0,e=a.length,f=l;for(c=0;c<e;c++)if(b=f.indexOf(a.charAt(c)),!(b>64)){if(b<0)return!1;d+=6}return d%8===0}function e(a){var b,c,d=a.replace(/[\r\n=]/g,""),e=d.length,f=l,g=0,i=[];for(b=0;b<e;b++)b%4===0&&b&&(i.push(g>>16&255),i.push(g>>8&255),i.push(255&g)),g=g<<6|f.indexOf(d.charAt(b));return c=e%4*6,0===c?(i.push(g>>16&255),i.push(g>>8&255),i.push(255&g)):18===c?(i.push(g>>10&255),i.push(g>>2&255)):12===c&&i.push(g>>4&255),h?new h(i):i}function f(a){var b,c,d="",e=0,f=a.length,g=l;for(b=0;b<f;b++)b%3===0&&b&&(d+=g[e>>18&63],d+=g[e>>12&63],d+=g[e>>6&63],d+=g[63&e]),e=(e<<8)+a[b];return c=f%3,0===c?(d+=g[e>>18&63],d+=g[e>>12&63],d+=g[e>>6&63],d+=g[63&e]):2===c?(d+=g[e>>10&63],d+=g[e>>4&63],d+=g[e<<2&63],d+=g[64]):1===c&&(d+=g[e>>2&63],d+=g[e<<4&63],d+=g[64],d+=g[64]),d}function g(a){return h&&h.isBuffer(a)}var h;try{var i=a;h=i("buffer").Buffer}catch(j){}var k=a("../type"),l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";b.exports=new k("tag:yaml.org,2002:binary",{kind:"scalar",resolve:d,construct:e,predicate:g,represent:f})},{"../type":13}],15:[function(a,b,c){function d(a){if(null===a)return!1;var b=a.length;return 4===b&&("true"===a||"True"===a||"TRUE"===a)||5===b&&("false"===a||"False"===a||"FALSE"===a)}function e(a){return"true"===a||"True"===a||"TRUE"===a}function f(a){return"[object Boolean]"===Object.prototype.toString.call(a)}var g=a("../type");b.exports=new g("tag:yaml.org,2002:bool",{kind:"scalar",resolve:d,construct:e,predicate:f,represent:{lowercase:function(a){return a?"true":"false"},uppercase:function(a){return a?"TRUE":"FALSE"},camelcase:function(a){return a?"True":"False"}},defaultStyle:"lowercase"})},{"../type":13}],16:[function(a,b,c){function d(a){return null!==a&&!!j.test(a)}function e(a){var b,c,d,e;return b=a.replace(/_/g,"").toLowerCase(),c="-"===b[0]?-1:1,e=[],"+-".indexOf(b[0])>=0&&(b=b.slice(1)),".inf"===b?1===c?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===b?NaN:b.indexOf(":")>=0?(b.split(":").forEach(function(a){e.unshift(parseFloat(a,10))}),b=0,d=1,e.forEach(function(a){b+=a*d,d*=60}),c*b):c*parseFloat(b,10)}function f(a,b){var c;if(isNaN(a))switch(b){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===a)switch(b){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===a)switch(b){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(h.isNegativeZero(a))return"-0.0";return c=a.toString(10),k.test(c)?c.replace("e",".e"):c}function g(a){return"[object Number]"===Object.prototype.toString.call(a)&&(a%1!==0||h.isNegativeZero(a))}var h=a("../common"),i=a("../type"),j=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?|\\.[0-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),k=/^[-+]?[0-9]+e/;b.exports=new i("tag:yaml.org,2002:float",{kind:"scalar",resolve:d,construct:e,predicate:g,represent:f,defaultStyle:"lowercase"})},{"../common":2,"../type":13}],17:[function(a,b,c){function d(a){return 48<=a&&a<=57||65<=a&&a<=70||97<=a&&a<=102}function e(a){return 48<=a&&a<=55}function f(a){return 48<=a&&a<=57}function g(a){if(null===a)return!1;var b,c=a.length,g=0,h=!1;if(!c)return!1;if(b=a[g],"-"!==b&&"+"!==b||(b=a[++g]),"0"===b){if(g+1===c)return!0;if(b=a[++g],"b"===b){for(g++;g<c;g++)if(b=a[g],"_"!==b){if("0"!==b&&"1"!==b)return!1;h=!0}return h}if("x"===b){for(g++;g<c;g++)if(b=a[g],"_"!==b){if(!d(a.charCodeAt(g)))return!1;h=!0}return h}for(;g<c;g++)if(b=a[g],"_"!==b){if(!e(a.charCodeAt(g)))return!1;h=!0}return h}for(;g<c;g++)if(b=a[g],"_"!==b){if(":"===b)break;if(!f(a.charCodeAt(g)))return!1;h=!0}return!!h&&(":"!==b||/^(:[0-5]?[0-9])+$/.test(a.slice(g)))}function h(a){var b,c,d=a,e=1,f=[];return d.indexOf("_")!==-1&&(d=d.replace(/_/g,"")),b=d[0],"-"!==b&&"+"!==b||("-"===b&&(e=-1),d=d.slice(1),b=d[0]),"0"===d?0:"0"===b?"b"===d[1]?e*parseInt(d.slice(2),2):"x"===d[1]?e*parseInt(d,16):e*parseInt(d,8):d.indexOf(":")!==-1?(d.split(":").forEach(function(a){f.unshift(parseInt(a,10))}),d=0,c=1,f.forEach(function(a){d+=a*c,c*=60}),e*d):e*parseInt(d,10)}function i(a){return"[object Number]"===Object.prototype.toString.call(a)&&a%1===0&&!j.isNegativeZero(a)}var j=a("../common"),k=a("../type");b.exports=new k("tag:yaml.org,2002:int",{kind:"scalar",resolve:g,construct:h,predicate:i,represent:{binary:function(a){return"0b"+a.toString(2)},octal:function(a){return"0"+a.toString(8)},decimal:function(a){return a.toString(10)},hexadecimal:function(a){return"0x"+a.toString(16).toUpperCase()}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},{"../common":2,"../type":13}],18:[function(a,b,c){function d(a){if(null===a)return!1;try{var b="("+a+")",c=h.parse(b,{range:!0});return"Program"===c.type&&1===c.body.length&&"ExpressionStatement"===c.body[0].type&&"FunctionExpression"===c.body[0].expression.type}catch(d){return!1}}function e(a){var b,c="("+a+")",d=h.parse(c,{range:!0}),e=[];if("Program"!==d.type||1!==d.body.length||"ExpressionStatement"!==d.body[0].type||"FunctionExpression"!==d.body[0].expression.type)throw new Error("Failed to resolve function");return d.body[0].expression.params.forEach(function(a){e.push(a.name)}),b=d.body[0].expression.body.range,new Function(e,c.slice(b[0]+1,b[1]-1))}function f(a){return a.toString()}function g(a){return"[object Function]"===Object.prototype.toString.call(a)}var h;try{var i=a;h=i("esprima")}catch(j){"undefined"!=typeof window&&(h=window.esprima)}var k=a("../../type");b.exports=new k("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:d,construct:e,predicate:g,represent:f})},{"../../type":13}],19:[function(a,b,c){function d(a){if(null===a)return!1;if(0===a.length)return!1;var b=a,c=/\/([gim]*)$/.exec(a),d="";if("/"===b[0]){if(c&&(d=c[1]),d.length>3)return!1;if("/"!==b[b.length-d.length-1])return!1}return!0}function e(a){var b=a,c=/\/([gim]*)$/.exec(a),d="";return"/"===b[0]&&(c&&(d=c[1]),b=b.slice(1,b.length-d.length-1)),new RegExp(b,d)}function f(a){var b="/"+a.source+"/";return a.global&&(b+="g"),a.multiline&&(b+="m"),a.ignoreCase&&(b+="i"),b}function g(a){return"[object RegExp]"===Object.prototype.toString.call(a)}var h=a("../../type");b.exports=new h("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:d,construct:e,predicate:g,represent:f})},{"../../type":13}],20:[function(a,b,c){function d(){return!0}function e(){}function f(){return""}function g(a){return"undefined"==typeof a}var h=a("../../type");b.exports=new h("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:d,construct:e,predicate:g,represent:f})},{"../../type":13}],21:[function(a,b,c){var d=a("../type");b.exports=new d("tag:yaml.org,2002:map",{kind:"mapping",construct:function(a){return null!==a?a:{}}})},{"../type":13}],22:[function(a,b,c){function d(a){return"<<"===a||null===a}var e=a("../type");b.exports=new e("tag:yaml.org,2002:merge",{kind:"scalar",resolve:d})},{"../type":13}],23:[function(a,b,c){function d(a){if(null===a)return!0;var b=a.length;return 1===b&&"~"===a||4===b&&("null"===a||"Null"===a||"NULL"===a)}function e(){return null}function f(a){return null===a}var g=a("../type");b.exports=new g("tag:yaml.org,2002:null",{kind:"scalar",resolve:d,construct:e,predicate:f,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})},{"../type":13}],24:[function(a,b,c){function d(a){if(null===a)return!0;var b,c,d,e,f,i=[],j=a;for(b=0,c=j.length;b<c;b+=1){if(d=j[b],f=!1,"[object Object]"!==h.call(d))return!1;for(e in d)if(g.call(d,e)){if(f)return!1;f=!0}if(!f)return!1;if(i.indexOf(e)!==-1)return!1;i.push(e)}return!0}function e(a){return null!==a?a:[]}var f=a("../type"),g=Object.prototype.hasOwnProperty,h=Object.prototype.toString;b.exports=new f("tag:yaml.org,2002:omap",{kind:"sequence",resolve:d,construct:e})},{"../type":13}],25:[function(a,b,c){function d(a){if(null===a)return!0;var b,c,d,e,f,h=a;for(f=new Array(h.length),b=0,c=h.length;b<c;b+=1){if(d=h[b],"[object Object]"!==g.call(d))return!1;if(e=Object.keys(d),1!==e.length)return!1;f[b]=[e[0],d[e[0]]]}return!0}function e(a){if(null===a)return[];var b,c,d,e,f,g=a;for(f=new Array(g.length),b=0,c=g.length;b<c;b+=1)d=g[b],e=Object.keys(d),f[b]=[e[0],d[e[0]]];return f}var f=a("../type"),g=Object.prototype.toString;b.exports=new f("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:d,construct:e})},{"../type":13}],26:[function(a,b,c){var d=a("../type");b.exports=new d("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(a){return null!==a?a:[]}})},{"../type":13}],27:[function(a,b,c){function d(a){if(null===a)return!0;var b,c=a;for(b in c)if(g.call(c,b)&&null!==c[b])return!1;return!0}function e(a){return null!==a?a:{}}var f=a("../type"),g=Object.prototype.hasOwnProperty;b.exports=new f("tag:yaml.org,2002:set",{kind:"mapping",resolve:d,construct:e})},{"../type":13}],28:[function(a,b,c){var d=a("../type");b.exports=new d("tag:yaml.org,2002:str",{kind:"scalar",construct:function(a){return null!==a?a:""}})},{"../type":13}],29:[function(a,b,c){function d(a){return null!==a&&(null!==h.exec(a)||null!==i.exec(a))}function e(a){var b,c,d,e,f,g,j,k,l,m,n=0,o=null;if(b=h.exec(a),null===b&&(b=i.exec(a)),null===b)throw new Error("Date resolve error");if(c=+b[1],d=+b[2]-1,e=+b[3],!b[4])return new Date(Date.UTC(c,d,e));if(f=+b[4],g=+b[5],j=+b[6],b[7]){for(n=b[7].slice(0,3);n.length<3;)n+="0";n=+n}return b[9]&&(k=+b[10],l=+(b[11]||0),o=6e4*(60*k+l),"-"===b[9]&&(o=-o)),m=new Date(Date.UTC(c,d,e,f,g,j,n)),o&&m.setTime(m.getTime()-o),m}function f(a){return a.toISOString()}var g=a("../type"),h=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),i=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");b.exports=new g("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:d,construct:e,instanceOf:Date,represent:f})},{"../type":13}],"/":[function(a,b,c){var d=a("./lib/js-yaml.js");b.exports=d},{"./lib/js-yaml.js":1}]},{},[])("/")}),function(a,b,c){function d(a){var c=[];return i(c,b.noop).chars(a),c.join("")}function e(a,c){var d,e={},f=a.split(",");for(d=0;d<f.length;d++)e[c?b.lowercase(f[d]):f[d]]=!0;return e}function f(a,c){function d(a,d,f,h){if(d=b.lowercase(d),w[d])for(;s.last()&&x[s.last()];)e("",s.last());v[d]&&s.last()==d&&e("",d),(h=u[d]||!!h)||s.push(d);var i={};f.replace(m,function(a,b,c,d,e){i[b]=g(c||d||e||"")}),c.start&&c.start(d,i,h)}function e(a,d){var e,f=0;if(d=b.lowercase(d))for(f=s.length-1;0<=f&&s[f]!=d;f--);if(0<=f){for(e=s.length-1;e>=f;e--)c.end&&c.end(s[e]);s.length=f}}"string"!=typeof a&&(a=null===a||"undefined"==typeof a?"":""+a);var f,h,i,s=[],t=a;for(s.last=function(){return s[s.length-1]};a;){if(i="",h=!0,s.last()&&y[s.last()]?(a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+s.last()+"[^>]*>","i"),function(a,b){return b=b.replace(p,"$1").replace(r,"$1"),c.chars&&c.chars(g(b)),""}),e("",s.last())):(0===a.indexOf("<!--")?(f=a.indexOf("--",4),0<=f&&a.lastIndexOf("-->",f)===f&&(c.comment&&c.comment(a.substring(4,f)),a=a.substring(f+3),h=!1)):q.test(a)?(f=a.match(q))&&(a=a.replace(f[0],""),h=!1):o.test(a)?(f=a.match(l))&&(a=a.substring(f[0].length),f[0].replace(l,e),h=!1):n.test(a)&&((f=a.match(k))?(f[4]&&(a=a.substring(f[0].length),f[0].replace(k,d)),h=!1):(i+="<",a=a.substring(1))),h&&(f=a.indexOf("<"),i+=0>f?a:a.substring(0,f),a=0>f?"":a.substring(f),c.chars&&c.chars(g(i)))),a==t)throw j("badparse",a);t=a}e()}function g(a){return a?(C.innerHTML=a.replace(/</g,"<"),C.textContent):""}function h(a){return a.replace(/&/g,"&").replace(s,function(a){var b=a.charCodeAt(0);return a=a.charCodeAt(1),"&#"+(1024*(b-55296)+(a-56320)+65536)+";"}).replace(t,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"<").replace(/>/g,">")}function i(a,c){var d=!1,e=b.bind(a,a.push);return{start:function(a,f,g){a=b.lowercase(a),!d&&y[a]&&(d=a),d||!0!==z[a]||(e("<"),e(a),b.forEach(f,function(d,f){var g=b.lowercase(f),i="img"===a&&"src"===g||"background"===g;!0!==B[g]||!0===A[g]&&!c(d,i)||(e(" "),e(f),e('="'),e(h(d)),e('"'))}),e(g?"/>":">"))},end:function(a){a=b.lowercase(a),d||!0!==z[a]||(e("</"),e(a),e(">")),a==d&&(d=!1)},chars:function(a){d||e(h(a))}}}var j=b.$$minErr("$sanitize"),k=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,l=/^<\/\s*([\w:-]+)[^>]*>/,m=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,n=/^</,o=/^<\//,p=/\x3c!--(.*?)--\x3e/g,q=/<!DOCTYPE([^>]*?)>/i,r=/<!\[CDATA\[(.*?)]]\x3e/g,s=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,t=/([^\#-~| |!])/g,u=e("area,br,col,hr,img,wbr");a=e("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),c=e("rp,rt");var v=b.extend({},c,a),w=b.extend({},a,e("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),x=b.extend({},c,e("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var"));a=e("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,stop,svg,switch,text,title,tspan,use");var y=e("script,style"),z=b.extend({},u,w,x,v,a),A=e("background,cite,href,longdesc,src,usemap,xlink:href");a=e("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,valign,value,vspace,width"),c=e("accent-height,accumulate,additive,alphabetic,arabic-form,ascent,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan",!0);var B=b.extend({},A,c,a),C=document.createElement("pre");b.module("ngSanitize",[]).provider("$sanitize",function(){this.$get=["$$sanitizeUri",function(a){return function(b){var c=[];return f(b,i(c,function(b,c){return!/^unsafe/.test(a(b,c))})),c.join("")}}]}),b.module("ngSanitize").filter("linky",["$sanitize",function(a){var c=/((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,e=/^mailto:/i;return function(f,g){function h(a){a&&n.push(d(a))}function i(a,c){n.push("<a "),b.isDefined(g)&&n.push('target="',g,'" '),n.push('href="',a.replace(/"/g,"""),'">'),h(c),n.push("</a>")}if(!f)return f;for(var j,k,l,m=f,n=[];j=m.match(c);)k=j[0],j[2]||j[4]||(k=(j[3]?"http://":"mailto:")+k),l=j.index,h(m.substr(0,l)),i(k,j[0].replace(e,"")),m=m.substring(l+j[0].length);return h(m),a(n.join(""))}}])}(window,window.angular); \ No newline at end of file +}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html",'<div ng-class="{\n \'active\': active\n }" class="item text-center" ng-transclude></div>\n')}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'<div ng-switch="datepickerMode" role="application" ng-keydown="keydown($event)">\n <uib-daypicker ng-switch-when="day" tabindex="0"></uib-daypicker>\n <uib-monthpicker ng-switch-when="month" tabindex="0"></uib-monthpicker>\n <uib-yearpicker ng-switch-when="year" tabindex="0"></uib-yearpicker>\n</div>')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th colspan="{{::5 + showWeeks}}"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n <tr>\n <th ng-if="showWeeks" class="text-center"></th>\n <th ng-repeat="label in ::labels track by $index" class="text-center"><small aria-label="{{::label.full}}">{{::label.abbr}}</small></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="row in rows track by $index">\n <td ng-if="showWeeks" class="text-center h6"><em>{{ weekNumbers[$index] }}</em></td>\n <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{::dt.uid}}" ng-class="::dt.customClass">\n <button type="button" style="min-width:100%;" class="btn btn-default btn-sm" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="::{\'text-muted\': dt.secondary, \'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="row in rows track by $index">\n <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{::dt.uid}}" ng-class="::dt.customClass">\n <button type="button" style="min-width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'<ul class="dropdown-menu" dropdown-nested ng-if="isOpen" style="display: block" ng-style="{top: position.top+\'px\', left: position.left+\'px\'}" ng-keydown="keydown($event)" ng-click="$event.stopPropagation()">\n\t<li ng-transclude></li>\n\t<li ng-if="showButtonBar" style="padding:10px 9px 2px">\n\t\t<span class="btn-group pull-left">\n\t\t\t<button type="button" class="btn btn-sm btn-info" ng-click="select(\'today\')" ng-disabled="isDisabled(\'today\')">{{ getText(\'current\') }}</button>\n\t\t\t<button type="button" class="btn btn-sm btn-danger" ng-click="select(null)">{{ getText(\'clear\') }}</button>\n\t\t</span>\n\t\t<button type="button" class="btn btn-sm btn-success pull-right" ng-click="close()">{{ getText(\'close\') }}</button>\n\t</li>\n</ul>\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th colspan="3"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="row in rows track by $index">\n <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{::dt.uid}}" ng-class="::dt.customClass">\n <button type="button" style="min-width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'<div uib-modal-animation-class="fade"\n modal-in-class="in"\n ng-style="{\'z-index\': 1040 + (index && 1 || 0) + index*10}"\n></div>\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'<div modal-render="{{$isRendered}}" tabindex="-1" role="dialog" class="modal"\n uib-modal-animation-class="fade"\n modal-in-class="in"\n ng-style="{\'z-index\': 1050 + index*10, display: \'block\'}">\n <div class="modal-dialog" ng-class="size ? \'modal-\' + size : \'\'"><div class="modal-content" uib-modal-transclude></div></div>\n</div>\n')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'<ul class="pager">\n <li ng-class="{disabled: noPrevious()||ngDisabled, previous: align}"><a href ng-click="selectPage(page - 1, $event)">{{::getText(\'previous\')}}</a></li>\n <li ng-class="{disabled: noNext()||ngDisabled, next: align}"><a href ng-click="selectPage(page + 1, $event)">{{::getText(\'next\')}}</a></li>\n</ul>\n')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'<ul class="pagination">\n <li ng-if="::boundaryLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-first"><a href ng-click="selectPage(1, $event)">{{::getText(\'first\')}}</a></li>\n <li ng-if="::directionLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-prev"><a href ng-click="selectPage(page - 1, $event)">{{::getText(\'previous\')}}</a></li>\n <li ng-repeat="page in pages track by $index" ng-class="{active: page.active,disabled: ngDisabled&&!page.active}" class="pagination-page"><a href ng-click="selectPage(page.number, $event)">{{page.text}}</a></li>\n <li ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next"><a href ng-click="selectPage(page + 1, $event)">{{::getText(\'next\')}}</a></li>\n <li ng-if="::boundaryLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-last"><a href ng-click="selectPage(totalPages, $event)">{{::getText(\'last\')}}</a></li>\n</ul>\n')}]),angular.module("template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-popup.html",'<div\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner" ng-bind-html="contentExp()"></div>\n</div>\n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'<div\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner" ng-bind="content"></div>\n</div>\n')}]),angular.module("template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-template-popup.html",'<div\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner"\n uib-tooltip-template-transclude="contentExp()"\n tooltip-template-transclude-scope="originScope()"></div>\n</div>\n')}]),angular.module("template/popover/popover-html.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-html.html",'<div tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n <div class="popover-content" ng-bind-html="contentExp()"></div>\n </div>\n</div>\n')}]),angular.module("template/popover/popover-template.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-template.html",'<div tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n <div class="popover-content"\n uib-tooltip-template-transclude="contentExp()"\n tooltip-template-transclude-scope="originScope()"></div>\n </div>\n</div>\n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'<div tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n <div class="popover-content" ng-bind="content"></div>\n </div>\n</div>\n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'<div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" aria-labelledby="{{::title}}" style="min-width: 0;" ng-transclude></div>\n')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'<div class="progress" ng-transclude aria-labelledby="{{::title}}"></div>')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'<div class="progress">\n <div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" aria-labelledby="{{::title}}" style="min-width: 0;" ng-transclude></div>\n</div>\n')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'<span ng-mouseleave="reset()" ng-keydown="onKeydown($event)" tabindex="0" role="slider" aria-valuemin="0" aria-valuemax="{{range.length}}" aria-valuenow="{{value}}">\n <span ng-repeat-start="r in range track by $index" class="sr-only">({{ $index < value ? \'*\' : \' \' }})</span>\n <i ng-repeat-end ng-mouseenter="enter($index + 1)" ng-click="rate($index + 1)" class="glyphicon" ng-class="$index < value && (r.stateOn || \'glyphicon-star\') || (r.stateOff || \'glyphicon-star-empty\')" ng-attr-title="{{r.title}}" aria-valuetext="{{r.title}}"></i>\n</span>\n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'<li ng-class="{active: active, disabled: disabled}">\n <a href ng-click="select()" uib-tab-heading-transclude>{{heading}}</a>\n</li>\n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'<div>\n <ul class="nav nav-{{type || \'tabs\'}}" ng-class="{\'nav-stacked\': vertical, \'nav-justified\': justified}" ng-transclude></ul>\n <div class="tab-content">\n <div class="tab-pane" \n ng-repeat="tab in tabs" \n ng-class="{active: tab.active}"\n uib-tab-content-transclude="tab">\n </div>\n </div>\n</div>\n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'<table>\n <tbody>\n <tr class="text-center" ng-show="::showSpinners">\n <td><a ng-click="incrementHours()" ng-class="{disabled: noIncrementHours()}" class="btn btn-link" ng-disabled="noIncrementHours()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n <td> </td>\n <td><a ng-click="incrementMinutes()" ng-class="{disabled: noIncrementMinutes()}" class="btn btn-link" ng-disabled="noIncrementMinutes()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n <td ng-show="showMeridian"></td>\n </tr>\n <tr>\n <td class="form-group" ng-class="{\'has-error\': invalidHours}">\n <input style="width:50px;" type="text" ng-model="hours" ng-change="updateHours()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}">\n </td>\n <td>:</td>\n <td class="form-group" ng-class="{\'has-error\': invalidMinutes}">\n <input style="width:50px;" type="text" ng-model="minutes" ng-change="updateMinutes()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}">\n </td>\n <td ng-show="showMeridian"><button type="button" ng-class="{disabled: noToggleMeridian()}" class="btn btn-default text-center" ng-click="toggleMeridian()" ng-disabled="noToggleMeridian()" tabindex="{{::tabindex}}">{{meridian}}</button></td>\n </tr>\n <tr class="text-center" ng-show="::showSpinners">\n <td><a ng-click="decrementHours()" ng-class="{disabled: noDecrementHours()}" class="btn btn-link" ng-disabled="noDecrementHours()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n <td> </td>\n <td><a ng-click="decrementMinutes()" ng-class="{disabled: noDecrementMinutes()}" class="btn btn-link" ng-disabled="noDecrementMinutes()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n <td ng-show="showMeridian"></td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'<a href tabindex="-1" ng-bind-html="match.label | uibTypeaheadHighlight:query"></a>\n')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'<ul class="dropdown-menu" ng-show="isOpen() && !moveInProgress" ng-style="{top: position().top+\'px\', left: position().left+\'px\'}" style="display: block;" role="listbox" aria-hidden="{{!isOpen()}}">\n <li ng-repeat="match in matches track by $index" ng-class="{active: isActive($index) }" ng-mouseenter="selectActive($index)" ng-click="selectMatch($index)" role="option" id="{{::match.id}}">\n <div uib-typeahead-match index="$index" match="match" query="query" template-url="templateUrl"></div>\n </li>\n</ul>\n')}]),!angular.$$csp()&&angular.element(document).find("head").prepend('<style type="text/css">.ng-animate.item:not(.left):not(.right){-webkit-transition:0s ease-in-out left;transition:0s ease-in-out left}</style>'),!function(a,b){"function"==typeof define&&define.amd?define([],function(){return b()}):"object"==typeof exports?module.exports=b():b()}(this,function(){function a(a){var b=a.storageKey(),c=a.storage(),d=function(){var d=a.preferredLanguage();angular.isString(d)?a.use(d):c.put(b,a.use())};d.displayName="fallbackFromIncorrectStorageValue",c?c.get(b)?a.use(c.get(b))["catch"](d):d():angular.isString(a.preferredLanguage())&&a.use(a.preferredLanguage())}function b(){var a,b,c=null,d=!1,e=!1;b={sanitize:function(a,b){return"text"===b&&(a=g(a)),a},escape:function(a,b){return"text"===b&&(a=f(a)),a},sanitizeParameters:function(a,b){return"params"===b&&(a=h(a,g)),a},escapeParameters:function(a,b){return"params"===b&&(a=h(a,f)),a}},b.escaped=b.escapeParameters,this.addStrategy=function(a,c){return b[a]=c,this},this.removeStrategy=function(a){return delete b[a],this},this.useStrategy=function(a){return d=!0,c=a,this},this.$get=["$injector","$log",function(f,g){var h={},i=function(a,c,d){return angular.forEach(d,function(d){if(angular.isFunction(d))a=d(a,c);else if(angular.isFunction(b[d]))a=b[d](a,c);else{if(!angular.isString(b[d]))throw new Error("pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: '"+d+"'");if(!h[b[d]])try{h[b[d]]=f.get(b[d])}catch(e){throw h[b[d]]=function(){},new Error("pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: '"+d+"'")}a=h[b[d]](a,c)}}),a},j=function(){d||e||(g.warn("pascalprecht.translate.$translateSanitization: No sanitization strategy has been configured. This can have serious security implications. See http://angular-translate.github.io/docs/#/guide/19_security for details."),e=!0)};return f.has("$sanitize")&&(a=f.get("$sanitize")),{useStrategy:function(a){return function(b){a.useStrategy(b)}}(this),sanitize:function(a,b,d){if(c||j(),arguments.length<3&&(d=c),!d)return a;var e=angular.isArray(d)?d:[d];return i(a,b,e)}}}];var f=function(a){var b=angular.element("<div></div>");return b.text(a),b.html()},g=function(b){if(!a)throw new Error("pascalprecht.translate.$translateSanitization: Error cannot find $sanitize service. Either include the ngSanitize module (https://docs.angularjs.org/api/ngSanitize) or use a sanitization strategy which does not depend on $sanitize, such as 'escape'.");return a(b)},h=function(a,b,c){if(angular.isObject(a)){var d=angular.isArray(a)?[]:{};if(c){if(c.indexOf(a)>-1)throw new Error("pascalprecht.translate.$translateSanitization: Error cannot interpolate parameter due recursive object")}else c=[];return c.push(a),angular.forEach(a,function(a,e){d[e]=h(a,b,c)}),c.splice(-1,1),d}return angular.isNumber(a)?a:b(a)}}function c(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u={},v=[],w=a,x=[],y="translate-cloak",z=!1,A=!1,B=".",C=!1,D=0,E=!0,F="default",G={"default":function(a){return(a||"").split("-").join("_")},java:function(a){var b=(a||"").split("-").join("_"),c=b.split("_");return c.length>1?c[0].toLowerCase()+"_"+c[1].toUpperCase():b},bcp47:function(a){var b=(a||"").split("_").join("-"),c=b.split("-");return c.length>1?c[0].toLowerCase()+"-"+c[1].toUpperCase():b},"iso639-1":function(a){var b=(a||"").split("_").join("-"),c=b.split("-");return c[0].toLowerCase()}},H="2.11.0",I=function(){if(angular.isFunction(d.getLocale))return d.getLocale();var a,c,e=b.$get().navigator,f=["language","browserLanguage","systemLanguage","userLanguage"];if(angular.isArray(e.languages))for(a=0;a<e.languages.length;a++)if(c=e.languages[a],c&&c.length)return c;for(a=0;a<f.length;a++)if(c=e[f[a]],c&&c.length)return c;return null};I.displayName="angular-translate/service: getFirstBrowserLanguage";var J=function(){var a=I()||"";return G[F]&&(a=G[F](a)),a};J.displayName="angular-translate/service: getLocale";var K=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},L=function(){return this.toString().replace(/^\s+|\s+$/g,"")},M=function(a){if(a){for(var b=[],c=angular.lowercase(a),d=0,e=v.length;e>d;d++)b.push(angular.lowercase(v[d]));if(K(b,c)>-1)return a;if(f){var g;for(var h in f)if(f.hasOwnProperty(h)){var i=!1,j=Object.prototype.hasOwnProperty.call(f,h)&&angular.lowercase(h)===angular.lowercase(a);if("*"===h.slice(-1)&&(i=h.slice(0,-1)===a.slice(0,h.length-1)),(j||i)&&(g=f[h],K(b,angular.lowercase(g))>-1))return g}}var k=a.split("_");return k.length>1&&K(b,angular.lowercase(k[0]))>-1?k[0]:void 0}},N=function(a,b){if(!a&&!b)return u;if(a&&!b){if(angular.isString(a))return u[a]}else angular.isObject(u[a])||(u[a]={}),angular.extend(u[a],O(b));return this};this.translations=N,this.cloakClassName=function(a){return a?(y=a,this):y},this.nestedObjectDelimeter=function(a){return a?(B=a,this):B};var O=function(a,b,c,d){var e,f,g,h;b||(b=[]),c||(c={});for(e in a)Object.prototype.hasOwnProperty.call(a,e)&&(h=a[e],angular.isObject(h)?O(h,b.concat(e),c,e):(f=b.length?""+b.join(B)+B+e:e,b.length&&e===d&&(g=""+b.join(B),c[g]="@:"+f),c[f]=h));return c};O.displayName="flatObject",this.addInterpolation=function(a){return x.push(a),this},this.useMessageFormatInterpolation=function(){return this.useInterpolation("$translateMessageFormatInterpolation")},this.useInterpolation=function(a){return n=a,this},this.useSanitizeValueStrategy=function(a){return c.useStrategy(a),this},this.preferredLanguage=function(a){return a?(P(a),this):e};var P=function(a){return a&&(e=a),e};this.translationNotFoundIndicator=function(a){return this.translationNotFoundIndicatorLeft(a),this.translationNotFoundIndicatorRight(a),this},this.translationNotFoundIndicatorLeft=function(a){return a?(q=a,this):q},this.translationNotFoundIndicatorRight=function(a){return a?(r=a,this):r},this.fallbackLanguage=function(a){return Q(a),this};var Q=function(a){return a?(angular.isString(a)?(h=!0,g=[a]):angular.isArray(a)&&(h=!1,g=a),angular.isString(e)&&K(g,e)<0&&g.push(e),this):h?g[0]:g};this.use=function(a){if(a){if(!u[a]&&!o)throw new Error("$translateProvider couldn't find translationTable for langKey: '"+a+"'");return i=a,this}return i},this.resolveClientLocale=function(){return J()};var R=function(a){return a?(w=a,this):l?l+w:w};this.storageKey=R,this.useUrlLoader=function(a,b){return this.useLoader("$translateUrlLoader",angular.extend({url:a},b))},this.useStaticFilesLoader=function(a){return this.useLoader("$translateStaticFilesLoader",a)},this.useLoader=function(a,b){return o=a,p=b||{},this},this.useLocalStorage=function(){return this.useStorage("$translateLocalStorage")},this.useCookieStorage=function(){return this.useStorage("$translateCookieStorage")},this.useStorage=function(a){return k=a,this},this.storagePrefix=function(a){return a?(l=a,this):a},this.useMissingTranslationHandlerLog=function(){return this.useMissingTranslationHandler("$translateMissingTranslationHandlerLog")},this.useMissingTranslationHandler=function(a){return m=a,this},this.usePostCompiling=function(a){return z=!!a,this},this.forceAsyncReload=function(a){return A=!!a,this},this.uniformLanguageTag=function(a){return a?angular.isString(a)&&(a={standard:a}):a={},F=a.standard,this},this.determinePreferredLanguage=function(a){var b=a&&angular.isFunction(a)?a():J();return e=v.length?M(b)||b:b,this},this.registerAvailableLanguageKeys=function(a,b){return a?(v=a,b&&(f=b),this):v},this.useLoaderCache=function(a){return a===!1?s=void 0:a===!0?s=!0:"undefined"==typeof a?s="$translationCache":a&&(s=a),this},this.directivePriority=function(a){return void 0===a?D:(D=a,this)},this.statefulFilter=function(a){return void 0===a?E:(E=a,this)},this.postProcess=function(a){return t=a?a:void 0,this},this.$get=["$log","$injector","$rootScope","$q",function(a,b,c,d){var f,l,F,G=b.get(n||"$translateDefaultInterpolation"),I=!1,S={},T={},U=function(a,b,c,h,j){!i&&e&&(i=e);var m=j&&j!==i?M(j)||j:i;if(j&&ja(j),angular.isArray(a)){var n=function(a){for(var e={},f=[],g=function(a){var f=d.defer(),g=function(b){e[a]=b,f.resolve([a,b])};return U(a,b,c,h,j).then(g,g),f.promise},i=0,k=a.length;k>i;i++)f.push(g(a[i]));return d.all(f).then(function(){return e})};return n(a)}var o=d.defer();a&&(a=L.apply(a));var p=function(){var a=e?T[e]:T[m];if(l=0,k&&!a){var b=f.get(w);if(a=T[b],g&&g.length){var c=K(g,b);l=0===c?1:0,K(g,e)<0&&g.push(e)}}return a}();if(p){var q=function(){j||(m=i),fa(a,b,c,h,m).then(o.resolve,o.reject)};q.displayName="promiseResolved",p["finally"](q)}else fa(a,b,c,h,m).then(o.resolve,o.reject);return o.promise},V=function(a){return q&&(a=[q,a].join(" ")),r&&(a=[a,r].join(" ")),a},W=function(a){i=a,k&&f.put(U.storageKey(),i),c.$emit("$translateChangeSuccess",{language:a}),G.setLocale(i);var b=function(a,b){S[b].setLocale(i)};b.displayName="eachInterpolatorLocaleSetter",angular.forEach(S,b),c.$emit("$translateChangeEnd",{language:a})},X=function(a){if(!a)throw"No language key specified for loading.";var e=d.defer();c.$emit("$translateLoadingStart",{language:a}),I=!0;var f=s;"string"==typeof f&&(f=b.get(f));var g=angular.extend({},p,{key:a,$http:angular.extend({},{cache:f},p.$http)}),h=function(b){var d={};c.$emit("$translateLoadingSuccess",{language:a}),angular.isArray(b)?angular.forEach(b,function(a){angular.extend(d,O(a))}):angular.extend(d,O(b)),I=!1,e.resolve({key:a,table:d}),c.$emit("$translateLoadingEnd",{language:a})};h.displayName="onLoaderSuccess";var i=function(a){c.$emit("$translateLoadingError",{language:a}),e.reject(a),c.$emit("$translateLoadingEnd",{language:a})};return i.displayName="onLoaderError",b.get(o)(g).then(h,i),e.promise};if(k&&(f=b.get(k),!f.get||!f.put))throw new Error("Couldn't use storage '"+k+"', missing get() or put() method!");if(x.length){var Y=function(a){var c=b.get(a);c.setLocale(e||i),S[c.getInterpolationIdentifier()]=c};Y.displayName="interpolationFactoryAdder",angular.forEach(x,Y)}var Z=function(a){var b=d.defer();if(Object.prototype.hasOwnProperty.call(u,a))b.resolve(u[a]);else if(T[a]){var c=function(a){N(a.key,a.table),b.resolve(a.table)};c.displayName="translationTableResolver",T[a].then(c,b.reject)}else b.reject();return b.promise},$=function(a,b,c,e){var f=d.defer(),g=function(d){if(Object.prototype.hasOwnProperty.call(d,b)){e.setLocale(a);var g=d[b];if("@:"===g.substr(0,2))$(a,g.substr(2),c,e).then(f.resolve,f.reject);else{var h=e.interpolate(d[b],c);h=ia(b,d[b],h,c,a),f.resolve(h)}e.setLocale(i)}else f.reject()};return g.displayName="fallbackTranslationResolver",Z(a).then(g,f.reject),f.promise},_=function(a,b,c,d){var e,f=u[a];if(f&&Object.prototype.hasOwnProperty.call(f,b)){if(d.setLocale(a),e=d.interpolate(f[b],c),"@:"===e.substr(0,2))return _(a,e.substr(2),c,d);d.setLocale(i)}return e},aa=function(a,c,d){if(m){var e=b.get(m)(a,i,c,d);return void 0!==e?e:a}return a},ba=function(a,b,c,e,f){var h=d.defer();if(a<g.length){var i=g[a];$(i,b,c,e).then(function(a){h.resolve(a)},function(){return ba(a+1,b,c,e,f).then(h.resolve,h.reject)})}else f?h.resolve(f):m?h.resolve(aa(b,c)):h.reject(aa(b,c));return h.promise},ca=function(a,b,c,d){var e;if(a<g.length){var f=g[a];e=_(f,b,c,d),e||(e=ca(a+1,b,c,d))}return e},da=function(a,b,c,d){return ba(F>0?F:l,a,b,c,d)},ea=function(a,b,c){return ca(F>0?F:l,a,b,c)},fa=function(a,b,c,e,f){var h=d.defer(),i=f?u[f]:u,j=c?S[c]:G;if(i&&Object.prototype.hasOwnProperty.call(i,a)){var k=i[a];if("@:"===k.substr(0,2))U(k.substr(2),b,c,e,f).then(h.resolve,h.reject);else{var l=j.interpolate(k,b);l=ia(a,k,l,b,f),h.resolve(l)}}else{var n;m&&!I&&(n=aa(a,b,e)),f&&g&&g.length?da(a,b,j,e).then(function(a){h.resolve(a)},function(a){h.reject(V(a))}):m&&!I&&n?e?h.resolve(e):h.resolve(n):e?h.resolve(e):h.reject(V(a))}return h.promise},ga=function(a,b,c,d){var e,f=d?u[d]:u,h=G;if(S&&Object.prototype.hasOwnProperty.call(S,c)&&(h=S[c]),f&&Object.prototype.hasOwnProperty.call(f,a)){var i=f[a];e="@:"===i.substr(0,2)?ga(i.substr(2),b,c,d):h.interpolate(i,b)}else{var j;m&&!I&&(j=aa(a,b)),d&&g&&g.length?(l=0,e=ea(a,b,h)):e=m&&!I&&j?j:V(a)}return e},ha=function(a){j===a&&(j=void 0),T[a]=void 0},ia=function(a,c,d,e,f){var g=t;return g&&("string"==typeof g&&(g=b.get(g)),g)?g(a,c,d,e,f):d},ja=function(a){u[a]||!o||T[a]||(T[a]=X(a).then(function(a){N(a.key,a.table)}))};U.preferredLanguage=function(a){return a&&P(a),e},U.cloakClassName=function(){return y},U.nestedObjectDelimeter=function(){return B},U.fallbackLanguage=function(a){if(void 0!==a&&null!==a){if(Q(a),o&&g&&g.length)for(var b=0,c=g.length;c>b;b++)T[g[b]]||(T[g[b]]=X(g[b]));U.use(U.use())}return h?g[0]:g},U.useFallbackLanguage=function(a){if(void 0!==a&&null!==a)if(a){var b=K(g,a);b>-1&&(F=b)}else F=0},U.proposedLanguage=function(){return j},U.storage=function(){return f},U.negotiateLocale=M,U.use=function(a){if(!a)return i;var b=d.defer();c.$emit("$translateChangeStart",{language:a});var e=M(a);return v.length>0&&!e?d.reject(a):(e&&(a=e),j=a,!A&&u[a]||!o||T[a]?T[a]?T[a].then(function(a){return j===a.key&&W(a.key),b.resolve(a.key),a},function(a){return!i&&g&&g.length>0?U.use(g[0]).then(b.resolve,b.reject):b.reject(a)}):(b.resolve(a),W(a)):(T[a]=X(a).then(function(c){return N(c.key,c.table),b.resolve(c.key),j===a&&W(c.key),c},function(a){return c.$emit("$translateChangeError",{language:a}),b.reject(a),c.$emit("$translateChangeEnd",{language:a}),d.reject(a)}),T[a]["finally"](function(){ha(a)})),b.promise)},U.resolveClientLocale=function(){return J()},U.storageKey=function(){return R()},U.isPostCompilingEnabled=function(){return z},U.isForceAsyncReloadEnabled=function(){return A},U.refresh=function(a){function b(){f.resolve(),c.$emit("$translateRefreshEnd",{language:a})}function e(){f.reject(),c.$emit("$translateRefreshEnd",{language:a})}if(!o)throw new Error("Couldn't refresh translation table, no loader registered!");var f=d.defer();if(c.$emit("$translateRefreshStart",{language:a}),a)if(u[a]){var h=function(c){N(c.key,c.table),a===i&&W(i),b()};h.displayName="refreshPostProcessor",X(a).then(h,e)}else e();else{var j=[],k={};if(g&&g.length)for(var l=0,m=g.length;m>l;l++)j.push(X(g[l])),k[g[l]]=!0;i&&!k[i]&&j.push(X(i));var n=function(a){u={},angular.forEach(a,function(a){N(a.key,a.table)}),i&&W(i),b()};n.displayName="refreshPostProcessor",d.all(j).then(n,e)}return f.promise},U.instant=function(a,b,c,d){var f=d&&d!==i?M(d)||d:i;if(null===a||angular.isUndefined(a))return a;if(d&&ja(d),angular.isArray(a)){for(var h={},j=0,k=a.length;k>j;j++)h[a[j]]=U.instant(a[j],b,c,d);return h}if(angular.isString(a)&&a.length<1)return a;a&&(a=L.apply(a));var l,n=[];e&&n.push(e),f&&n.push(f),g&&g.length&&(n=n.concat(g));for(var o=0,p=n.length;p>o;o++){var s=n[o];if(u[s]&&"undefined"!=typeof u[s][a]&&(l=ga(a,b,c,f)),"undefined"!=typeof l)break}return l||""===l||(q||r?l=V(a):(l=G.interpolate(a,b),m&&!I&&(l=aa(a,b)))),l},U.versionInfo=function(){return H},U.loaderCache=function(){return s},U.directivePriority=function(){return D},U.statefulFilter=function(){return E},U.isReady=function(){return C};var ka=d.defer();ka.promise.then(function(){C=!0}),U.onReady=function(a){var b=d.defer();return angular.isFunction(a)&&b.promise.then(a),C?b.resolve():ka.promise.then(b.resolve), +b.promise},U.getAvailableLanguageKeys=function(){return v.length>0?v:null};var la=c.$on("$translateReady",function(){ka.resolve(),la(),la=null}),ma=c.$on("$translateChangeEnd",function(){ka.resolve(),ma(),ma=null});if(o){if(angular.equals(u,{})&&U.use()&&U.use(U.use()),g&&g.length)for(var na=function(a){return N(a.key,a.table),c.$emit("$translateChangeEnd",{language:a.key}),a},oa=0,pa=g.length;pa>oa;oa++){var qa=g[oa];!A&&u[qa]||(T[qa]=X(qa).then(na))}}else c.$emit("$translateReady",{language:U.use()});return U}]}function d(a,b){var c,d={},e="default";return d.setLocale=function(a){c=a},d.getInterpolationIdentifier=function(){return e},d.useSanitizeValueStrategy=function(a){return b.useStrategy(a),this},d.interpolate=function(c,d){d=d||{},d=b.sanitize(d,"params");var e=a(c)(d);return e=b.sanitize(e,"text")},d}function e(a,b,c,d,e,g){var h=function(){return this.toString().replace(/^\s+|\s+$/g,"")};return{restrict:"AE",scope:!0,priority:a.directivePriority(),compile:function(b,i){var j=i.translateValues?i.translateValues:void 0,k=i.translateInterpolation?i.translateInterpolation:void 0,l=b[0].outerHTML.match(/translate-value-+/i),m="^(.*)("+c.startSymbol()+".*"+c.endSymbol()+")(.*)",n="^(.*)"+c.startSymbol()+"(.*)"+c.endSymbol()+"(.*)";return function(b,o,p){b.interpolateParams={},b.preText="",b.postText="",b.translateNamespace=f(b);var q={},r=function(a,c,d){if(c.translateValues&&angular.extend(a,e(c.translateValues)(b.$parent)),l)for(var f in d)if(Object.prototype.hasOwnProperty.call(c,f)&&"translateValue"===f.substr(0,14)&&"translateValues"!==f){var g=angular.lowercase(f.substr(14,1))+f.substr(15);a[g]=d[f]}},s=function(a){if(angular.isFunction(s._unwatchOld)&&(s._unwatchOld(),s._unwatchOld=void 0),angular.equals(a,"")||!angular.isDefined(a)){var d=h.apply(o.text()),e=d.match(m);if(angular.isArray(e)){b.preText=e[1],b.postText=e[3],q.translate=c(e[2])(b.$parent);var f=d.match(n);angular.isArray(f)&&f[2]&&f[2].length&&(s._unwatchOld=b.$watch(f[2],function(a){q.translate=a,y()}))}else q.translate=d?d:void 0}else q.translate=a;y()},t=function(a){p.$observe(a,function(b){q[a]=b,y()})};r(b.interpolateParams,p,i);var u=!0;p.$observe("translate",function(a){"undefined"==typeof a?s(""):""===a&&u||(q.translate=a,y()),u=!1});for(var v in p)p.hasOwnProperty(v)&&"translateAttr"===v.substr(0,13)&&t(v);if(p.$observe("translateDefault",function(a){b.defaultText=a,y()}),j&&p.$observe("translateValues",function(a){a&&b.$parent.$watch(function(){angular.extend(b.interpolateParams,e(a)(b.$parent))})}),l){var w=function(a){p.$observe(a,function(c){var d=angular.lowercase(a.substr(14,1))+a.substr(15);b.interpolateParams[d]=c})};for(var x in p)Object.prototype.hasOwnProperty.call(p,x)&&"translateValue"===x.substr(0,14)&&"translateValues"!==x&&w(x)}var y=function(){for(var a in q)q.hasOwnProperty(a)&&void 0!==q[a]&&z(a,q[a],b,b.interpolateParams,b.defaultText,b.translateNamespace)},z=function(b,c,d,e,f,g){c?(g&&"."===c.charAt(0)&&(c=g+c),a(c,e,k,f,d.translateLanguage).then(function(a){A(a,d,!0,b)},function(a){A(a,d,!1,b)})):A(c,d,!1,b)},A=function(b,c,e,f){if(e||"undefined"!=typeof c.defaultText&&(b=c.defaultText),"translate"===f){(e||!e&&"undefined"==typeof p.translateKeepContent)&&o.empty().append(c.preText+b+c.postText);var g=a.isPostCompilingEnabled(),h="undefined"!=typeof i.translateCompile,j=h&&"false"!==i.translateCompile;(g&&!h||j)&&d(o.contents())(c)}else{var k=p.$attr[f];"data-"===k.substr(0,5)&&(k=k.substr(5)),k=k.substr(15),o.attr(k,b)}};(j||l||p.translateDefault)&&b.$watch("interpolateParams",y,!0);var B=b.$on("translateLanguageChanged",y),C=g.$on("$translateChangeSuccess",y);o.text().length?s(p.translate?p.translate:""):p.translate&&s(p.translate),y(),b.$on("$destroy",function(){B(),C()})}}}}function f(a){return a.translateNamespace?a.translateNamespace:a.$parent?f(a.$parent):void 0}function g(a,b){return{compile:function(c){var d=function(){c.addClass(a.cloakClassName())},e=function(){c.removeClass(a.cloakClassName())};return a.onReady(function(){e()}),d(),function(c,f,g){g.translateCloak&&g.translateCloak.length&&(g.$observe("translateCloak",function(b){a(b).then(e,d)}),b.$on("$translateChangeSuccess",function(){a(g.translateCloak).then(e,d)}))}}}}function h(){return{restrict:"A",scope:!0,compile:function(){return{pre:function(a,b,c){a.translateNamespace=f(a),a.translateNamespace&&"."===c.translateNamespace.charAt(0)?a.translateNamespace+=c.translateNamespace:a.translateNamespace=c.translateNamespace}}}}}function f(a){return a.translateNamespace?a.translateNamespace:a.$parent?f(a.$parent):void 0}function i(){return{restrict:"A",scope:!0,compile:function(){return function(a,b,c){c.$observe("translateLanguage",function(b){a.translateLanguage=b}),a.$watch("translateLanguage",function(){a.$broadcast("translateLanguageChanged")})}}}}function j(a,b){var c=function(c,d,e,f){return angular.isObject(d)||(d=a(d)(this)),b.instant(c,d,e,f)};return b.statefulFilter()&&(c.$stateful=!0),c}function k(a){return a("translations")}return a.$inject=["$translate"],c.$inject=["$STORAGE_KEY","$windowProvider","$translateSanitizationProvider","pascalprechtTranslateOverrider"],d.$inject=["$interpolate","$translateSanitization"],e.$inject=["$translate","$q","$interpolate","$compile","$parse","$rootScope"],g.$inject=["$translate","$rootScope"],j.$inject=["$parse","$translate"],k.$inject=["$cacheFactory"],angular.module("pascalprecht.translate",["ng"]).run(a),a.displayName="runTranslate",angular.module("pascalprecht.translate").provider("$translateSanitization",b),angular.module("pascalprecht.translate").constant("pascalprechtTranslateOverrider",{}).provider("$translate",c),c.displayName="displayName",angular.module("pascalprecht.translate").factory("$translateDefaultInterpolation",d),d.displayName="$translateDefaultInterpolation",angular.module("pascalprecht.translate").constant("$STORAGE_KEY","NG_TRANSLATE_LANG_KEY"),angular.module("pascalprecht.translate").directive("translate",e),e.displayName="translateDirective",angular.module("pascalprecht.translate").directive("translateCloak",g),g.displayName="translateCloakDirective",angular.module("pascalprecht.translate").directive("translateNamespace",h),h.displayName="translateNamespaceDirective",angular.module("pascalprecht.translate").directive("translateLanguage",i),i.displayName="translateLanguageDirective",angular.module("pascalprecht.translate").filter("translate",j),j.displayName="translateFilterFactory",angular.module("pascalprecht.translate").factory("$translationCache",k),k.displayName="$translationCache","pascalprecht.translate"}),!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}if(window.FileAPI||(window.FileAPI={}),!window.XMLHttpRequest)throw"AJAX is not supported. XMLHttpRequest is not defined.";if(FileAPI.shouldLoad=!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){a&&angular.isString(a)&&-1!==a.indexOf("#2174")&&(a=null),c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}}}}(),function(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!==navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.hasFlash=b(),FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i)}FileAPI.ngfFixIE=function(d,e,f){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var g=function(){var b=e.parent();d.attr("disabled")?b&&b.removeClass("js-fileapi-wrapper"):(e.attr("__ngf_flash_")||(e.unbind("change"),e.unbind("click"),e.bind("change",function(a){h.apply(this,[a]),f.apply(this,[a])}),e.attr("__ngf_flash_","true")),b.addClass("js-fileapi-wrapper"),a(d)||(b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible"),e.css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("position","absolute").css("top","0px").css("left","0px")))};d.bind("mouseenter",g);var h=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}}(),window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(e=c("error",d),a.onerror&&a.onerror(e),a.dispatchEvent(e))};this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="12.0.4",ngFileUpload.service("UploadBase",["$http","$q","$timeout",function(a,b,c){function d(d){function e(a){j.notify&&j.notify(a),k.progressFunc&&c(function(){k.progressFunc(a)})}function h(a){return null!=d._start&&g?{loaded:a.loaded+d._start,total:d._file&&d._file.size||a.total,type:a.type,config:d,lengthComputable:!0,target:a.target}:a}function i(){a(d).then(function(a){g&&d._chunkSize&&!d._finished&&d._file?(e({loaded:d._end,total:d._file&&d._file.size,config:d,type:"progress"}),f.upload(d,!0)):(d._finished&&delete d._finished,j.resolve(a))},function(a){j.reject(a)},function(a){j.notify(a)})}d.method=d.method||"POST",d.headers=d.headers||{};var j=d._deferred=d._deferred||b.defer(),k=j.promise;return d.disableProgress||(d.headers.__setXHR_=function(){return function(a){a&&a.upload&&a.upload.addEventListener&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e(h(a))},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e(h(a)))},!1))}}),g?d._chunkSize&&d._end&&!d._finished?(d._start=d._end,d._end+=d._chunkSize,i()):d.resumeSizeUrl?a.get(d.resumeSizeUrl).then(function(a){d._start=d.resumeSizeResponseReader?d.resumeSizeResponseReader(a.data):parseInt((null==a.data.size?a.data:a.data.size).toString()),d._chunkSize&&(d._end=d._start+d._chunkSize),i()},function(a){throw a}):d.resumeSize?d.resumeSize().then(function(a){d._start=a,i()},function(a){throw a}):(d._chunkSize&&(d._start=0,d._end=d._start+d._chunkSize),i()):i(),k.success=function(a){return k.then(function(b){a(b.data,b.status,b.headers,d)}),k},k.error=function(a){return k.then(null,function(b){a(b.data,b.status,b.headers,d)}),k},k.progress=function(a){return k.progressFunc=a,k.then(null,null,function(b){a(b)}),k},k.abort=k.pause=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),k},k.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(k,arguments),a.apply(k,arguments)}}(d.xhrFn),k},f.promisesCount++,k["finally"](function(){f.promisesCount--}),k}function e(a){var b={};for(var c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return b}var f=this;f.promisesCount=0,this.isResumeSupported=function(){return window.Blob&&window.Blob.prototype.slice};var g=this.isResumeSupported();this.isUploadInProgress=function(){return f.promisesCount>0},this.rename=function(a,b){return a.ngfName=b,a},this.jsonBlob=function(a){null==a||angular.isString(a)||(a=JSON.stringify(a));var b=new window.Blob([a],{type:"application/json"});return b._ngfBlob=!0,b},this.json=function(a){return angular.toJson(a)},this.isFile=function(a){return null!=a&&(a instanceof window.Blob||a.flashId&&a.name&&a.size)},this.upload=function(a,b){function c(b,c){if(b._ngfBlob)return b;if(a._file=a._file||b,null!=a._start&&g){a._end&&a._end>=b.size&&(a._finished=!0,a._end=b.size);var d=b.slice(a._start,a._end||b.size);return d.name=b.name,d.ngfName=b.ngfName,a._chunkSize&&(c.append("_chunkSize",a._chunkSize),c.append("_currentChunkSize",a._end-a._start),c.append("_chunkNumber",Math.floor(a._start/a._chunkSize)),c.append("_totalSize",a._file.size)),d}return b}function h(b,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))b.append(e,d);else if(f.isFile(d)){var g=c(d,b),i=e.split(",");i[1]&&(g.ngfName=i[1].replace(/^\s+|\s+$/g,""),e=i[0]),a._fileKey=a._fileKey||e,b.append(e,g,g.ngfName||g.name)}else if(angular.isObject(d)){if(d.$$ngfCircularDetection)throw"ngFileUpload: Circular reference in config.data. Make sure specified data for Upload.upload() has no circular reference: "+e;d.$$ngfCircularDetection=!0;try{for(var j in d)if(d.hasOwnProperty(j)&&"$$ngfCircularDetection"!==j){var k=null==a.objectKey?"[i]":a.objectKey;d.length&&parseInt(j)>-1&&(k=null==a.arrayKey?k:a.arrayKey),h(b,d[j],e+k.replace(/[ik]/g,j))}}finally{delete d.$$ngfCircularDetection}}else b.append(e,d)}function i(){a._chunkSize=f.translateScalars(a.resumeChunkSize),a._chunkSize=a._chunkSize?parseInt(a._chunkSize.toString()):null,a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(b){var c,d=new window.FormData;b=b||a.fields||{},a.file&&(b.file=a.file);for(c in b)if(b.hasOwnProperty(c)){var e=b[c];a.formDataAppender?a.formDataAppender(d,c,e):h(d,e,c)}return d})}return b||(a=e(a)),a._isDigested||(a._isDigested=!0,i()),d(a)},this.http=function(b){return b=e(b),b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof window.Blob?b:a.defaults.transformRequest[0].apply(this,arguments)},b._chunkSize=f.translateScalars(b.resumeChunkSize),b._chunkSize=b._chunkSize?parseInt(b._chunkSize.toString()):null,d(b)},this.translateScalars=function(a){if(angular.isString(a)){if(a.search(/kb/i)===a.length-2)return parseFloat(1024*a.substring(0,a.length-2));if(a.search(/mb/i)===a.length-2)return parseFloat(1048576*a.substring(0,a.length-2));if(a.search(/gb/i)===a.length-2)return parseFloat(1073741824*a.substring(0,a.length-2));if(a.search(/b/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/s/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/m/i)===a.length-1)return parseFloat(60*a.substring(0,a.length-1));if(a.search(/h/i)===a.length-1)return parseFloat(3600*a.substring(0,a.length-1))}return a},this.urlToBlob=function(c){var d=b.defer();return a({url:c,method:"get",responseType:"arraybuffer"}).then(function(a){var b=new Uint8Array(a.data),c=a.headers("content-type")||"image/WebP",e=new window.Blob([b],{type:c});d.resolve(e)},function(a){d.reject(a)}),d.promise},this.setDefaults=function(a){this.defaults=a||{}},this.defaults={},this.version=ngFileUpload.version}]),ngFileUpload.service("Upload",["$parse","$timeout","$compile","$q","UploadExif",function(a,b,c,d,e){function f(a,b,c){var e=[i.emptyPromise()];return angular.forEach(a,function(d,f){0===d.type.indexOf("image/jpeg")&&i.attrGetter("ngfFixOrientation",b,c,{$file:d})&&e.push(i.happyPromise(i.applyExifRotation(d),d).then(function(b){a.splice(f,1,b)}))}),d.all(e)}function g(a,b,c){var e=i.attrGetter("ngfResize",b,c);if(!e||!i.isResizeSupported()||!a.length)return i.emptyPromise();if(!(e instanceof Function))return h(e,a,b,c);var f=d.defer();e(a).then(function(d){h(d,a,b,c).then(function(a){f.resolve(a)},function(a){f.reject(a)})},function(a){f.reject(a)})}function h(a,b,c,e){function f(d,f){if(0===d.type.indexOf("image")){if(a.pattern&&!i.validatePattern(d,a.pattern))return;var h=i.resize(d,a.width,a.height,a.quality,a.type,a.ratio,a.centerCrop,function(a,b){return i.attrGetter("ngfResizeIf",c,e,{$width:a,$height:b,$file:d})},a.restoreExif!==!1);g.push(h),h.then(function(a){b.splice(f,1,a)},function(a){d.$error="resize",d.$errorParam=(a?(a.message?a.message:a)+": ":"")+(d&&d.name)})}}for(var g=[i.emptyPromise()],h=0;h<b.length;h++)f(b[h],h);return d.all(g)}var i=e;return i.getAttrWithDefaults=function(a,b){if(null!=a[b])return a[b];var c=i.defaults[b];return null==c?c:angular.isString(c)?c:JSON.stringify(c)},i.attrGetter=function(b,c,d,e){var f=this.getAttrWithDefaults(c,b);if(!d)return f;try{return e?a(f)(d,e):a(f)(d)}catch(g){if(b.search(/min|max|pattern/i))return f;throw g}},i.shouldUpdateOn=function(a,b,c){var d=i.attrGetter("ngModelOptions",b,c);return!d||!d.updateOn||d.updateOn.split(" ").indexOf(a)>-1},i.emptyPromise=function(){var a=d.defer(),c=arguments;return b(function(){a.resolve.apply(a,c)}),a.promise},i.rejectPromise=function(){var a=d.defer(),c=arguments;return b(function(){a.reject.apply(a,c)}),a.promise},i.happyPromise=function(a,c){var e=d.defer();return a.then(function(a){e.resolve(a)},function(a){b(function(){throw a}),e.resolve(c)}),e.promise},i.updateModel=function(c,d,e,h,j,k,l){function m(f,g,j,l,m){d.$$ngfPrevValidFiles=f,d.$$ngfPrevInvalidFiles=g;var n=f&&f.length?f[0]:null,o=g&&g.length?g[0]:null;c&&(i.applyModelValidation(c,f),c.$setViewValue(m?n:f)),h&&a(h)(e,{$files:f,$file:n,$newFiles:j,$duplicateFiles:l,$invalidFiles:g,$invalidFile:o,$event:k});var p=i.attrGetter("ngfModelInvalid",d);p&&b(function(){a(p).assign(e,m?o:g)}),b(function(){})}function n(){function a(a,b){return a.name===b.name&&(a.$ngfOrigSize||a.size)===(b.$ngfOrigSize||b.size)&&a.type===b.type}function b(b){var c;for(c=0;c<s.length;c++)if(a(b,s[c]))return!0;for(c=0;c<t.length;c++)if(a(b,t[c]))return!0;return!1}if(j){r=[],u=[];for(var c=0;c<j.length;c++)b(j[c])?u.push(j[c]):r.push(j[c])}}function o(a){return angular.isArray(a)?a:[a]}function p(){w=[],v=[],angular.forEach(r,function(a){a.$error?v.push(a):w.push(a)})}function q(){function a(){b(function(){m(x?s.concat(w):w,x?t.concat(v):v,j,u,y)},A&&A.debounce?A.debounce.change||A.debounce:0)}g(z?r:w,d,e).then(function(){z?i.validate(r,s.length,c,d,e).then(function(){p(),a()}):a()},function(a){throw"Could not resize files "+a})}var r,s,t,u=[],v=[],w=[];s=d.$$ngfPrevValidFiles||[],t=d.$$ngfPrevInvalidFiles||[],c&&c.$modelValue&&(s=o(c.$modelValue));var x=i.attrGetter("ngfKeep",d,e);r=(j||[]).slice(0),("distinct"===x||i.attrGetter("ngfKeepDistinct",d,e)===!0)&&n(d,e);var y=!x&&!i.attrGetter("ngfMultiple",d,e)&&!i.attrGetter("multiple",d);if(!x||r.length){i.attrGetter("ngfBeforeModelChange",d,e,{$files:j,$file:j&&j.length?j[0]:null,$newFiles:r,$duplicateFiles:u,$event:k});var z=i.attrGetter("ngfValidateAfterResize",d,e),A=i.attrGetter("ngModelOptions",d,e);i.validate(r,s.length,c,d,e).then(function(){l?m(r,[],j,u,y):(A&&A.allowInvalid||z?w=r:p(),i.attrGetter("ngfFixOrientation",d,e)&&i.isExifSupported()?f(w,d,e).then(function(){q()}):q())})}},i}]),ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile","Upload",function(a,b,c,d){function e(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=d.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}function f(a,b,c,d,f,h,i,j){function k(){return"input"===b[0].tagName.toLowerCase()&&c.type&&"file"===c.type.toLowerCase()}function l(){return t("ngfChange")||t("ngfSelect")}function m(b){if(j.shouldUpdateOn("change",c,a)){for(var e=b.__files_||b.target&&b.target.files,f=[],g=0;g<e.length;g++)f.push(e[g]);j.updateModel(d,c,a,l(),f.length?f:null,b)}}function n(a){if(b!==a)for(var c=0;c<b[0].attributes.length;c++){var d=b[0].attributes[c];"type"!==d.name&&"class"!==d.name&&"style"!==d.name&&((null==d.value||""===d.value)&&("required"===d.name&&(d.value="required"),"multiple"===d.name&&(d.value="multiple")),a.attr(d.name,"id"===d.name?"ngf-"+d.value:d.value))}}function o(){if(k())return b;var a=angular.element('<input type="file">');n(a);var c=angular.element("<label>upload</label>");return c.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),g.push({el:b,ref:c}),document.body.appendChild(c.append(a)[0]),a}function p(c){if(b.attr("disabled"))return!1;if(!t("ngfSelectDisabled",a)){var d=q(c);if(null!=d)return d;r(c);try{k()||document.body.contains(w[0])||(g.push({el:b,ref:w.parent()}),document.body.appendChild(w.parent()[0]),w.bind("change",m))}catch(f){}return e(navigator.userAgent)?setTimeout(function(){w[0].click()},0):w[0].click(),!1}}function q(a){var b=a.changedTouches||a.originalEvent&&a.originalEvent.changedTouches;if("touchstart"===a.type)return v=b?b[0].clientY:0,!0;if(a.stopPropagation(),a.preventDefault(),"touchend"===a.type){var c=b?b[0].clientY:0;if(Math.abs(c-v)>20)return!1}}function r(b){j.shouldUpdateOn("click",c,a)&&w.val()&&(w.val(null),j.updateModel(d,c,a,l(),null,b,!0))}function s(a){if(w&&!w.attr("__ngf_ie10_Fix_")){if(!w[0].parentNode)return void(w=null);a.preventDefault(),a.stopPropagation(),w.unbind("click");var b=w.clone();return w.replaceWith(b),w=b,w.attr("__ngf_ie10_Fix_","true"),w.bind("change",m),w.bind("click",s),w[0].click(),!1}w.removeAttr("__ngf_ie10_Fix_")}var t=function(a,b){return j.attrGetter(a,c,b)};j.registerModelChangeValidator(d,c,a);var u=[];u.push(a.$watch(t("ngfMultiple"),function(){w.attr("multiple",t("ngfMultiple",a))})),u.push(a.$watch(t("ngfCapture"),function(){w.attr("capture",t("ngfCapture",a))})),u.push(a.$watch(t("ngfAccept"),function(){w.attr("accept",t("ngfAccept",a))})),c.$observe("accept",function(){w.attr("accept",t("accept"))}),u.push(function(){c.$$observers&&delete c.$$observers.accept});var v=0,w=b;k()||(w=o()),w.bind("change",m),k()?b.bind("click",r):b.bind("click touchstart touchend",p),-1!==navigator.appVersion.indexOf("MSIE 10")&&w.bind("click",s),d&&d.$formatters.push(function(a){return(null==a||0===a.length)&&w.val()&&w.val(null),a}),a.$on("$destroy",function(){k()||w.parent().remove(),angular.forEach(u,function(a){a()})}),h(function(){for(var a=0;a<g.length;a++){var b=g[a];document.body.contains(b.el[0])||(g.splice(a,1),b.ref.remove())}}),window.FileAPI&&window.FileAPI.ngfFixIE&&window.FileAPI.ngfFixIE(b,w,m)}var g=[];return{restrict:"AEC",require:"?ngModel",link:function(e,g,h,i){f(e,g,h,i,a,b,c,d)}}}]),function(){function a(a){return"img"===a.tagName.toLowerCase()?"image":"audio"===a.tagName.toLowerCase()?"audio":"video"===a.tagName.toLowerCase()?"video":/./}function b(b,c,d,e,f,g,h,i){function j(a){var g=b.attrGetter("ngfNoObjectUrl",f,d);b.dataUrl(a,g)["finally"](function(){c(function(){var b=(g?a.$ngfDataUrl:a.$ngfBlobUrl)||a.$ngfDataUrl;i?e.css("background-image","url('"+(b||"")+"')"):e.attr("src",b),b?e.removeClass("ng-hide"):e.addClass("ng-hide")})})}c(function(){var c=d.$watch(f[g],function(c){var d=h;if("ngfThumbnail"===g&&(d||(d={width:e[0].clientWidth,height:e[0].clientHeight}),0===d.width&&window.getComputedStyle)){var f=getComputedStyle(e[0]);d={width:parseInt(f.width.slice(0,-2)),height:parseInt(f.height.slice(0,-2))}}return angular.isString(c)?(e.removeClass("ng-hide"),i?e.css("background-image","url('"+c+"')"):e.attr("src",c)):void(!c||!c.type||0!==c.type.search(a(e[0]))||i&&0!==c.type.indexOf("image")?e.addClass("ng-hide"):d&&b.isResizeSupported()?b.resize(c,d.width,d.height,d.quality).then(function(a){j(a)},function(a){throw a}):j(c))});d.$on("$destroy",function(){c()})})}ngFileUpload.service("UploadDataUrl",["UploadBase","$timeout","$q",function(a,b,c){var d=a;return d.base64DataUrl=function(a){if(angular.isArray(a)){var b=c.defer(),e=0;return angular.forEach(a,function(c){d.dataUrl(c,!0)["finally"](function(){if(e++,e===a.length){var c=[];angular.forEach(a,function(a){c.push(a.$ngfDataUrl)}),b.resolve(c,a)}})}),b.promise}return d.dataUrl(a,!0)},d.dataUrl=function(a,e){if(!a)return d.emptyPromise(a,a);if(e&&null!=a.$ngfDataUrl||!e&&null!=a.$ngfBlobUrl)return d.emptyPromise(e?a.$ngfDataUrl:a.$ngfBlobUrl,a);var f=e?a.$$ngfDataUrlPromise:a.$$ngfBlobUrlPromise;if(f)return f;var g=c.defer();return b(function(){if(window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)){var c=window.URL||window.webkitURL;if(c&&c.createObjectURL&&!e){var f;try{f=c.createObjectURL(a)}catch(h){return void b(function(){a.$ngfBlobUrl="",g.reject()})}b(function(){if(a.$ngfBlobUrl=f,f){g.resolve(f,a),d.blobUrls=d.blobUrls||[],d.blobUrlsTotalSize=d.blobUrlsTotalSize||0,d.blobUrls.push({url:f,size:a.size}),d.blobUrlsTotalSize+=a.size||0;for(var b=d.defaults.blobUrlsMaxMemory||268435456,e=d.defaults.blobUrlsMaxQueueSize||200;(d.blobUrlsTotalSize>b||d.blobUrls.length>e)&&d.blobUrls.length>1;){var h=d.blobUrls.splice(0,1)[0];c.revokeObjectURL(h.url),d.blobUrlsTotalSize-=h.size}}})}else{var i=new FileReader;i.onload=function(c){b(function(){a.$ngfDataUrl=c.target.result,g.resolve(c.target.result,a),b(function(){delete a.$ngfDataUrl},1e3)})},i.onerror=function(){b(function(){a.$ngfDataUrl="",g.reject()})},i.readAsDataURL(a)}}else b(function(){a[e?"$ngfDataUrl":"$ngfBlobUrl"]="",g.reject()})}),f=e?a.$$ngfDataUrlPromise=g.promise:a.$$ngfBlobUrlPromise=g.promise,f["finally"](function(){delete a[e?"$$ngfDataUrlPromise":"$$ngfBlobUrlPromise"]}),f},d}]),ngFileUpload.directive("ngfSrc",["Upload","$timeout",function(a,c){return{restrict:"AE",link:function(d,e,f){b(a,c,d,e,f,"ngfSrc",a.attrGetter("ngfResize",f,d),!1)}}}]),ngFileUpload.directive("ngfBackground",["Upload","$timeout",function(a,c){return{restrict:"AE",link:function(d,e,f){b(a,c,d,e,f,"ngfBackground",a.attrGetter("ngfResize",f,d),!0)}}}]),ngFileUpload.directive("ngfThumbnail",["Upload","$timeout",function(a,c){return{restrict:"AE",link:function(d,e,f){var g=a.attrGetter("ngfSize",f,d);b(a,c,d,e,f,"ngfThumbnail",g,a.attrGetter("ngfAsBackground",f,d))}}}]),ngFileUpload.config(["$compileProvider",function(a){a.imgSrcSanitizationWhitelist&&a.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|local|file|data|blob):/),a.aHrefSanitizationWhitelist&&a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|local|file|data|blob):/)}]),ngFileUpload.filter("ngfDataUrl",["UploadDataUrl","$sce",function(a,b){return function(c,d,e){if(angular.isString(c))return b.trustAsResourceUrl(c);var f=c&&((d?c.$ngfDataUrl:c.$ngfBlobUrl)||c.$ngfDataUrl);return c&&!f?(!c.$ngfDataUrlFilterInProgress&&angular.isObject(c)&&(c.$ngfDataUrlFilterInProgress=!0,a.dataUrl(c,d)),""):(c&&delete c.$ngfDataUrlFilterInProgress,(c&&f?e?b.trustAsResourceUrl(f):f:c)||"")}}])}(),ngFileUpload.service("UploadValidate",["UploadDataUrl","$q","$timeout",function(a,b,c){function d(a){var b="",c=[];if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])b=a.substring(1,a.length-1);else{var e=a.split(",");if(e.length>1)for(var f=0;f<e.length;f++){var g=d(e[f]);g.regexp?(b+="("+g.regexp+")",f<e.length-1&&(b+="|")):c=c.concat(g.excludes)}else 0===a.indexOf("!")?c.push("^((?!"+d(a.substring(1)).regexp+").)*$"):(0===a.indexOf(".")&&(a="*"+a), +b="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",b=b.replace(/\\\*/g,".*").replace(/\\\?/g,"."))}return{regexp:b,excludes:c}}function e(a,b){null==b||a.$dirty||(a.$setDirty?a.$setDirty():a.$dirty=!0)}var f=a;return f.validatePattern=function(a,b){if(!b)return!0;var c=d(b),e=!0;if(c.regexp&&c.regexp.length){var f=new RegExp(c.regexp,"i");e=null!=a.type&&f.test(a.type)||null!=a.name&&f.test(a.name)}for(var g=c.excludes.length;g--;){var h=new RegExp(c.excludes[g],"i");e=e&&(null==a.type||h.test(a.type))&&(null==a.name||h.test(a.name))}return e},f.ratioToFloat=function(a){var b=a.toString(),c=b.search(/[x:]/i);return b=c>-1?parseFloat(b.substring(0,c))/parseFloat(b.substring(c+1)):parseFloat(b)},f.registerModelChangeValidator=function(a,b,c){a&&a.$formatters.push(function(d){a.$dirty&&(d&&!angular.isArray(d)&&(d=[d]),f.validate(d,0,a,b,c).then(function(){f.applyModelValidation(a,d)}))})},f.applyModelValidation=function(a,b){e(a,b),angular.forEach(a.$ngfValidations,function(b){a.$setValidity(b.name,b.valid)})},f.getValidationAttr=function(a,b,c,d,e){var g="ngf"+c[0].toUpperCase()+c.substr(1),h=f.attrGetter(g,a,b,{$file:e});if(null==h&&(h=f.attrGetter("ngfValidate",a,b,{$file:e}))){var i=(d||c).split(".");h=h[i[0]],i.length>1&&(h=h&&h[i[1]])}return h},f.validate=function(a,c,d,e,g){function h(b,c,h){if(a){for(var i=a.length,j=null;i--;){var k=a[i];if(k){var l=f.getValidationAttr(e,g,b,c,k);null!=l&&(h(k,l,i)||(k.$error=b,(k.$errorMessages=k.$errorMessages||{})[b]=!0,k.$errorParam=l,a.splice(i,1),j=!1))}}null!==j&&d.$ngfValidations.push({name:b,valid:j})}}function i(c,h,i,k,l){function m(a,b,d){null!=d?k(b,d).then(function(e){l(e,d)?a.resolve():(b.$error=c,(b.$errorMessages=b.$errorMessages||{})[c]=!0,b.$errorParam=d,a.reject())},function(){j("ngfValidateForce",{$file:b})?(b.$error=c,(b.$errorMessages=b.$errorMessages||{})[c]=!0,b.$errorParam=d,a.reject()):a.resolve()}):a.resolve()}var n=[f.emptyPromise()];return a?(a=void 0===a.length?[a]:a,angular.forEach(a,function(a){var d=b.defer();return n.push(d.promise),!i||null!=a.type&&0===a.type.search(i)?void("dimensions"===c&&null!=f.attrGetter("ngfDimensions",e)?f.imageDimensions(a).then(function(b){m(d,a,j("ngfDimensions",{$file:a,$width:b.width,$height:b.height}))},function(){d.reject()}):"duration"===c&&null!=f.attrGetter("ngfDuration",e)?f.mediaDuration(a).then(function(b){m(d,a,j("ngfDuration",{$file:a,$duration:b}))},function(){d.reject()}):m(d,a,f.getValidationAttr(e,g,c,h,a))):void d.resolve()}),b.all(n).then(function(){d.$ngfValidations.push({name:c,valid:!0})},function(){d.$ngfValidations.push({name:c,valid:!1})})):void 0}d=d||{},d.$ngfValidations=d.$ngfValidations||[],angular.forEach(d.$ngfValidations,function(a){a.valid=!0});var j=function(a,b){return f.attrGetter(a,e,g,b)};if(null==a||0===a.length)return f.emptyPromise(d);a=void 0===a.length?[a]:a.slice(0),h("maxFiles",null,function(a,b,d){return b>c+d}),h("pattern",null,f.validatePattern),h("minSize","size.min",function(a,b){return a.size+.1>=f.translateScalars(b)}),h("maxSize","size.max",function(a,b){return a.size-.1<=f.translateScalars(b)});var k=0;if(h("maxTotalSize",null,function(b,c){return k+=b.size,!(k>f.translateScalars(c))||(a.splice(0,a.length),!1)}),h("validateFn",null,function(a,b){return b===!0||null===b||""===b}),!a.length)return f.emptyPromise(d,d.$ngfValidations);var l=b.defer(),m=[];return m.push(f.happyPromise(i("maxHeight","height.max",/image/,this.imageDimensions,function(a,b){return a.height<=b}))),m.push(f.happyPromise(i("minHeight","height.min",/image/,this.imageDimensions,function(a,b){return a.height>=b}))),m.push(f.happyPromise(i("maxWidth","width.max",/image/,this.imageDimensions,function(a,b){return a.width<=b}))),m.push(f.happyPromise(i("minWidth","width.min",/image/,this.imageDimensions,function(a,b){return a.width>=b}))),m.push(f.happyPromise(i("dimensions",null,/image/,function(a,b){return f.emptyPromise(b)},function(a){return a}))),m.push(f.happyPromise(i("ratio",null,/image/,this.imageDimensions,function(a,b){for(var c=b.toString().split(","),d=!1,e=0;e<c.length;e++)Math.abs(a.width/a.height-f.ratioToFloat(c[e]))<1e-4&&(d=!0);return d}))),m.push(f.happyPromise(i("maxRatio","ratio.max",/image/,this.imageDimensions,function(a,b){return a.width/a.height-f.ratioToFloat(b)<1e-4}))),m.push(f.happyPromise(i("minRatio","ratio.min",/image/,this.imageDimensions,function(a,b){return a.width/a.height-f.ratioToFloat(b)>-1e-4}))),m.push(f.happyPromise(i("maxDuration","duration.max",/audio|video/,this.mediaDuration,function(a,b){return a<=f.translateScalars(b)}))),m.push(f.happyPromise(i("minDuration","duration.min",/audio|video/,this.mediaDuration,function(a,b){return a>=f.translateScalars(b)}))),m.push(f.happyPromise(i("duration",null,/audio|video/,function(a,b){return f.emptyPromise(b)},function(a){return a}))),m.push(f.happyPromise(i("validateAsyncFn",null,null,function(a,b){return b},function(a){return a===!0||null===a||""===a}))),b.all(m).then(function(){l.resolve(d,d.$ngfValidations)})},f.imageDimensions=function(a){if(a.$ngfWidth&&a.$ngfHeight){var d=b.defer();return c(function(){d.resolve({width:a.$ngfWidth,height:a.$ngfHeight})}),d.promise}if(a.$ngfDimensionPromise)return a.$ngfDimensionPromise;var e=b.defer();return c(function(){return 0!==a.type.indexOf("image")?void e.reject("not image"):void f.dataUrl(a).then(function(b){function d(){var b=h[0].clientWidth,c=h[0].clientHeight;h.remove(),a.$ngfWidth=b,a.$ngfHeight=c,e.resolve({width:b,height:c})}function f(){h.remove(),e.reject("load error")}function g(){c(function(){h[0].parentNode&&(h[0].clientWidth?d():i>10?f():g())},1e3)}var h=angular.element("<img>").attr("src",b).css("visibility","hidden").css("position","fixed").css("max-width","none !important").css("max-height","none !important");h.on("load",d),h.on("error",f);var i=0;g(),angular.element(document.getElementsByTagName("body")[0]).append(h)},function(){e.reject("load error")})}),a.$ngfDimensionPromise=e.promise,a.$ngfDimensionPromise["finally"](function(){delete a.$ngfDimensionPromise}),a.$ngfDimensionPromise},f.mediaDuration=function(a){if(a.$ngfDuration){var d=b.defer();return c(function(){d.resolve(a.$ngfDuration)}),d.promise}if(a.$ngfDurationPromise)return a.$ngfDurationPromise;var e=b.defer();return c(function(){return 0!==a.type.indexOf("audio")&&0!==a.type.indexOf("video")?void e.reject("not media"):void f.dataUrl(a).then(function(b){function d(){var b=h[0].duration;a.$ngfDuration=b,h.remove(),e.resolve(b)}function f(){h.remove(),e.reject("load error")}function g(){c(function(){h[0].parentNode&&(h[0].duration?d():i>10?f():g())},1e3)}var h=angular.element(0===a.type.indexOf("audio")?"<audio>":"<video>").attr("src",b).css("visibility","none").css("position","fixed");h.on("loadedmetadata",d),h.on("error",f);var i=0;g(),angular.element(document.body).append(h)},function(){e.reject("load error")})}),a.$ngfDurationPromise=e.promise,a.$ngfDurationPromise["finally"](function(){delete a.$ngfDurationPromise}),a.$ngfDurationPromise},f}]),ngFileUpload.service("UploadResize",["UploadValidate","$q",function(a,b){var c=a,d=function(a,b,c,d,e){var f=e?Math.max(c/a,d/b):Math.min(c/a,d/b);return{width:a*f,height:b*f,marginX:a*f-c,marginY:b*f-d}},e=function(a,e,f,g,h,i,j,k){var l=b.defer(),m=document.createElement("canvas"),n=document.createElement("img");return n.onload=function(){if(null!=k&&k(n.width,n.height)===!1)return void l.reject("resizeIf");try{if(i){var a=c.ratioToFloat(i),b=n.width/n.height;a>b?(e=n.width,f=e/a):(f=n.height,e=f*a)}e||(e=n.width),f||(f=n.height);var o=d(n.width,n.height,e,f,j);m.width=Math.min(o.width,e),m.height=Math.min(o.height,f);var p=m.getContext("2d");p.drawImage(n,Math.min(0,-o.marginX/2),Math.min(0,-o.marginY/2),o.width,o.height),l.resolve(m.toDataURL(h||"image/WebP",g||.934))}catch(q){l.reject(q)}},n.onerror=function(){l.reject()},n.src=a,l.promise};return c.dataUrltoBlob=function(a,b,c){for(var d=a.split(","),e=d[0].match(/:(.*?);/)[1],f=atob(d[1]),g=f.length,h=new Uint8Array(g);g--;)h[g]=f.charCodeAt(g);var i=new window.Blob([h],{type:e});return i.name=b,i.$ngfOrigSize=c,i},c.isResizeSupported=function(){var a=document.createElement("canvas");return window.atob&&a.getContext&&a.getContext("2d")&&window.Blob},c.isResizeSupported()&&Object.defineProperty(window.Blob.prototype,"name",{get:function(){return this.$ngfName},set:function(a){this.$ngfName=a},configurable:!0}),c.resize=function(a,d,f,g,h,i,j,k,l){if(0!==a.type.indexOf("image"))return c.emptyPromise(a);var m=b.defer();return c.dataUrl(a,!0).then(function(b){e(b,d,f,g,h||a.type,i,j,k).then(function(d){if("image/jpeg"===a.type&&l)try{d=c.restoreExif(b,d)}catch(e){setTimeout(function(){throw e},1)}try{var f=c.dataUrltoBlob(d,a.name,a.size);m.resolve(f)}catch(e){m.reject(e)}},function(b){"resizeIf"===b&&m.resolve(a),m.reject(b)})},function(a){m.reject(a)}),m.promise},c}]),function(){function a(a,c,d,e,f,g,h,i,j,k){function l(){return c.attr("disabled")||r("ngfDropDisabled",a)}function m(b,c){i.updateModel(e,d,a,r("ngfChange")||r("ngfDrop"),b,c)}function n(b,c){if(!i.shouldUpdateOn(b,d,a)||!c)return i.rejectPromise([]);var e=[];c.replace(/<(img src|img [^>]* src) *=\"([^\"]*)\"/gi,function(a,b,c){e.push(c)});var f=[],g=[];if(e.length){angular.forEach(e,function(a){f.push(i.urlToBlob(a).then(function(a){g.push(a)}))});var h=k.defer();return k.all(f).then(function(){h.resolve(g)},function(a){h.reject(a)}),h.promise}return i.emptyPromise()}function o(a,b,c,d){var e=r("ngfDragOverClass",a,{$event:c}),f="dragover";if(angular.isString(e))f=e;else if(e&&(e.delay&&(v=e.delay),e.accept||e.reject)){var g=c.dataTransfer.items;if(null!=g&&g.length)for(var h=e.pattern||r("ngfPattern",a,{$event:c}),j=g.length;j--;){if(!i.validatePattern(g[j],h)){f=e.reject;break}f=e.accept}else f=e.accept}d(f)}function p(b,c,e,f){function g(a,b){var c=k.defer();if(null!=a)if(a.isDirectory){var d=[i.emptyPromise()];if(m){var e={type:"directory"};e.name=e.path=(b||"")+a.name+a.name,n.push(e)}var f=a.createReader(),h=[],p=function(){f.readEntries(function(e){try{e.length?(h=h.concat(Array.prototype.slice.call(e||[],0)),p()):(angular.forEach(h.slice(0),function(c){n.length<=j&&l>=o&&d.push(g(c,(b?b:"")+a.name+"/"))}),k.all(d).then(function(){c.resolve()},function(a){c.reject(a)}))}catch(f){c.reject(f)}},function(a){c.reject(a)})};p()}else a.file(function(a){try{a.path=(b?b:"")+a.name,m&&(a=i.rename(a,a.path)),n.push(a),o+=a.size,c.resolve()}catch(d){c.reject(d)}},function(a){c.reject(a)});return c.promise}var j=i.getValidationAttr(d,a,"maxFiles")||Number.MAX_VALUE,l=i.getValidationAttr(d,a,"maxTotalSize")||Number.MAX_VALUE,m=r("ngfIncludeDir",a),n=[],o=0,p=[i.emptyPromise()];if(b&&b.length>0&&"file"!==h.protocol())for(var q=0;q<b.length;q++){if(b[q].webkitGetAsEntry&&b[q].webkitGetAsEntry()&&b[q].webkitGetAsEntry().isDirectory){var s=b[q].webkitGetAsEntry();if(s.isDirectory&&!e)continue;null!=s&&p.push(g(s))}else{var t=b[q].getAsFile();null!=t&&(n.push(t),o+=t.size)}if(n.length>j||o>l||!f&&n.length>0)break}else if(null!=c)for(var u=0;u<c.length;u++){var v=c.item(u);if((v.type||v.size>0)&&(n.push(v),o+=v.size),n.length>j||o>l||!f&&n.length>0)break}var w=k.defer();return k.all(p).then(function(){if(f||m||!n.length)w.resolve(n);else{for(var a=0;n[a]&&"directory"===n[a].type;)a++;w.resolve([n[a]])}},function(a){w.reject(a)}),w.promise}var q=b(),r=function(a,b,c){return i.attrGetter(a,d,b,c)};if(r("dropAvailable")&&g(function(){a[r("dropAvailable")]?a[r("dropAvailable")].value=q:a[r("dropAvailable")]=q}),!q)return void(r("ngfHideOnDropNotAvailable",a)===!0&&c.css("display","none"));null==r("ngfSelect")&&i.registerModelChangeValidator(e,d,a);var s,t=null,u=f(r("ngfStopPropagation")),v=1;c[0].addEventListener("dragover",function(b){if(!l()&&i.shouldUpdateOn("drop",d,a)){if(b.preventDefault(),u(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var e=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===e||"linkMove"===e?"move":"copy"}g.cancel(t),s||(s="C",o(a,d,b,function(d){s=d,c.addClass(s),r("ngfDrag",a,{$isDragging:!0,$class:s,$event:b})}))}},!1),c[0].addEventListener("dragenter",function(b){!l()&&i.shouldUpdateOn("drop",d,a)&&(b.preventDefault(),u(a)&&b.stopPropagation())},!1),c[0].addEventListener("dragleave",function(b){!l()&&i.shouldUpdateOn("drop",d,a)&&(b.preventDefault(),u(a)&&b.stopPropagation(),t=g(function(){s&&c.removeClass(s),s=null,r("ngfDrag",a,{$isDragging:!1,$event:b})},v||100))},!1),c[0].addEventListener("drop",function(b){if(!l()&&i.shouldUpdateOn("drop",d,a)){b.preventDefault(),u(a)&&b.stopPropagation(),s&&c.removeClass(s),s=null;var e,f=b.dataTransfer.items;try{e=b.dataTransfer&&b.dataTransfer.getData&&b.dataTransfer.getData("text/html")}catch(g){}p(f,b.dataTransfer.files,r("ngfAllowDir",a)!==!1,r("multiple")||r("ngfMultiple",a)).then(function(a){a.length?m(a,b):n("dropUrl",e).then(function(a){m(a,b)})})}},!1),c[0].addEventListener("paste",function(b){if(navigator.userAgent.toLowerCase().indexOf("firefox")>-1&&r("ngfEnableFirefoxPaste",a)&&b.preventDefault(),!l()&&i.shouldUpdateOn("paste",d,a)){var c=[],e=b.clipboardData||b.originalEvent.clipboardData;if(e&&e.items)for(var f=0;f<e.items.length;f++)-1!==e.items[f].type.indexOf("image")&&c.push(e.items[f].getAsFile());c.length?m(c,b):n("pasteUrl",e).then(function(a){m(a,b)})}},!1),navigator.userAgent.toLowerCase().indexOf("firefox")>-1&&r("ngfEnableFirefoxPaste",a)&&(c.attr("contenteditable",!0),c.on("keypress",function(a){a.metaKey||a.ctrlKey||a.preventDefault()}))}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a&&!/Edge\/12./i.test(navigator.userAgent)}ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location","Upload","$http","$q",function(b,c,d,e,f,g){return{restrict:"AEC",require:"?ngModel",link:function(h,i,j,k){a(h,i,j,k,b,c,d,e,f,g)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout","Upload",function(a,c,d){return function(e,f,g){if(b()){var h=a(d.attrGetter("ngfDropAvailable",g));c(function(){h(e),h.assign&&h.assign(e,!0)})}}}])}(),ngFileUpload.service("UploadExif",["UploadResize","$q",function(a,b){function c(a,b,c,d){switch(b){case 2:return a.transform(-1,0,0,1,c,0);case 3:return a.transform(-1,0,0,-1,c,d);case 4:return a.transform(1,0,0,-1,0,d);case 5:return a.transform(0,1,1,0,0,0);case 6:return a.transform(0,1,-1,0,d,0);case 7:return a.transform(0,-1,-1,0,d,c);case 8:return a.transform(0,-1,1,0,0,c)}}function d(a){for(var b="",c=new Uint8Array(a),d=c.byteLength,e=0;d>e;e++)b+=String.fromCharCode(c[e]);return window.btoa(b)}var e=a;return e.isExifSupported=function(){return window.FileReader&&(new FileReader).readAsArrayBuffer&&e.isResizeSupported()},e.readOrientation=function(a){var c=b.defer(),d=new FileReader,e=a.slice?a.slice(0,65536):a;return d.readAsArrayBuffer(e),d.onerror=function(a){return c.reject(a)},d.onload=function(a){var b={orientation:1},d=new DataView(this.result);if(65496!==d.getUint16(0,!1))return c.resolve(b);for(var e=d.byteLength,f=2;e>f;){var g=d.getUint16(f,!1);if(f+=2,65505===g){if(1165519206!==d.getUint32(f+=2,!1))return c.resolve(b);var h=18761===d.getUint16(f+=6,!1);f+=d.getUint32(f+4,h);var i=d.getUint16(f,h);f+=2;for(var j=0;i>j;j++)if(274===d.getUint16(f+12*j,h)){var k=d.getUint16(f+12*j+8,h);return k>=2&&8>=k&&(d.setUint16(f+12*j+8,1,h),b.fixedArrayBuffer=a.target.result),b.orientation=k,c.resolve(b)}}else{if(65280!==(65280&g))break;f+=d.getUint16(f,!1)}}return c.resolve(b)},c.promise},e.applyExifRotation=function(a){if(0!==a.type.indexOf("image/jpeg"))return e.emptyPromise(a);var f=b.defer();return e.readOrientation(a).then(function(b){return b.orientation<2||b.orientation>8?f.resolve(a):void e.dataUrl(a,!0).then(function(g){var h=document.createElement("canvas"),i=document.createElement("img");i.onload=function(){try{h.width=b.orientation>4?i.height:i.width,h.height=b.orientation>4?i.width:i.height;var g=h.getContext("2d");c(g,b.orientation,i.width,i.height),g.drawImage(i,0,0);var j=h.toDataURL(a.type||"image/WebP",.934);j=e.restoreExif(d(b.fixedArrayBuffer),j);var k=e.dataUrltoBlob(j,a.name);f.resolve(k)}catch(l){return f.reject(l)}},i.onerror=function(){f.reject()},i.src=g},function(a){f.reject(a)})},function(a){f.reject(a)}),f.promise},e.restoreExif=function(a,b){var c={};return c.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c.encode64=function(a){var b,c,d,e,f,g="",h="",i="",j=0;do b=a[j++],c=a[j++],h=a[j++],d=b>>2,e=(3&b)<<4|c>>4,f=(15&c)<<2|h>>6,i=63&h,isNaN(c)?f=i=64:isNaN(h)&&(i=64),g=g+this.KEY_STR.charAt(d)+this.KEY_STR.charAt(e)+this.KEY_STR.charAt(f)+this.KEY_STR.charAt(i),b=c=h="",d=e=f=i="";while(j<a.length);return g},c.restore=function(a,b){a.match("data:image/jpeg;base64,")&&(a=a.replace("data:image/jpeg;base64,",""));var c=this.decode64(a),d=this.slice2Segments(c),e=this.exifManipulation(b,d);return"data:image/jpeg;base64,"+this.encode64(e)},c.exifManipulation=function(a,b){var c=this.getExifArray(b),d=this.insertExif(a,c);return new Uint8Array(d)},c.getExifArray=function(a){for(var b,c=0;c<a.length;c++)if(b=a[c],255===b[0]&225===b[1])return b;return[]},c.insertExif=function(a,b){var c=a.replace("data:image/jpeg;base64,",""),d=this.decode64(c),e=d.indexOf(255,3),f=d.slice(0,e),g=d.slice(e),h=f;return h=h.concat(b),h=h.concat(g)},c.slice2Segments=function(a){for(var b=0,c=[];!(255===a[b]&218===a[b+1]);){if(255===a[b]&216===a[b+1])b+=2;else{var d=256*a[b+2]+a[b+3],e=b+d+2,f=a.slice(b,e);c.push(f),b=e}if(b>a.length)break}return c},c.decode64=function(a){var b,c,d,e,f,g="",h="",i=0,j=[],k=/[^A-Za-z0-9\+\/\=]/g;k.exec(a)&&console.log("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, NaNExpect errors in decoding."),a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");do d=this.KEY_STR.indexOf(a.charAt(i++)),e=this.KEY_STR.indexOf(a.charAt(i++)),f=this.KEY_STR.indexOf(a.charAt(i++)),h=this.KEY_STR.indexOf(a.charAt(i++)),b=d<<2|e>>4,c=(15&e)<<4|f>>2,g=(3&f)<<6|h,j.push(b),64!==f&&j.push(c),64!==h&&j.push(g),b=c=g="",d=e=f=h="";while(i<a.length);return j},c.restore(a,b)},e}]),"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.date"),function(a){a.module("ui.date",[]).constant("uiDateConfig",{}).constant("uiDateFormatConfig","").factory("uiDateConverter",["uiDateFormatConfig",function(b){function c(a,c){if(a=a||b,c){if(a)try{return jQuery.datepicker.formatDate(a,c)}catch(d){return}if(c.toISOString)return c.toISOString()}return null}function d(c,d){if(c=c||b,a.isDate(d)&&!isNaN(d))return d;if(a.isString(d)){if(c)return jQuery.datepicker.parseDate(c,d);var e=new Date(d);return isNaN(e.getTime())?null:e}return a.isNumber(d)?new Date(d):null}return{stringToDate:d,dateToString:c}}]).directive("uiDate",["uiDateConfig","uiDateConverter",function(b,c){return{require:"?ngModel",link:function(d,e,f,g){var h=function(){return a.extend({},b,d.$eval(f.uiDate))},i=function(){function b(){var b=["Hours","Minutes","Seconds","Milliseconds"],c=a.isDate(g.$modelValue),d={};c&&g.$modelValue.toDateString()===e.datepicker("getDate").toDateString()||(c&&a.forEach(b,function(a){d[a]=g.$modelValue["get"+a]()}),g.$setViewValue(e.datepicker("getDate")),c&&a.forEach(b,function(a){g.$viewValue["set"+a](d[a])}))}var i=!1,j=h();if(g){var k=j.onSelect||a.noop;j.onSelect=function(a,c){d.$apply(function(){i=!0,b(),k(a,c),e.blur()})};var l=j.beforeShow||a.noop;j.beforeShow=function(a,b){i=!0,l(a,b)};var m=j.onClose||a.noop;j.onClose=function(a,b){i=!1,m(a,b)},e.off("blur.datepicker").on("blur.datepicker",function(){i||d.$apply(function(){e.datepicker("setDate",e.datepicker("getDate")),b()})}),g.$validators.uiDateValidator=function(b,d){return a.isDate(c.stringToDate(f.uiDateFormat,d))},g.$parsers.push(function(a){return c.stringToDate(f.uiDateFormat,a)}),g.$render=function(){e.datepicker("setDate",g.$modelValue)}}e.data("datepicker")?(e.datepicker("option",j),e.datepicker("refresh")):(e.datepicker(j),e.on("$destroy",function(){e.datepicker("hide"),e.datepicker("destroy")})),g&&g.$render()};d.$watch(h,i,!0)}}}]).directive("uiDateFormat",["uiDateConverter",function(a){return{require:"ngModel",link:function(b,c,d,e){var f=d.uiDateFormat;e.$formatters.unshift(function(b){return a.stringToDate(f,b)}),e.$parsers.push(function(b){return a.dateToString(f,b)})}}}])}(angular),angular.module("angular-input-stars",[]).service("FontAwesomeIcons",["$http","$q",function(a,b){this.get=function(){var c=b.defer();return a.get("https://raw.githubusercontent.com/FortAwesome/Font-Awesome/gh-pages/icons.yml").then(function(a){for(var b=jsyaml.load(a.data),d={iconMap:{},iconList:[],iconCategoryList:[]},e=b.icons,f=0;f<e.length;f++){d.iconMap[e[f].name]=e[f].id,d.iconList.push(e[f].name);for(var g=0;g<e[f].categories.length;g++)d.iconCategoryList[e[f].categories[g]]||(d.iconCategoryList[e[f].categories[g]]=[]),d.iconCategoryList[e[f].categories[g]].push(e[f].name)}c.resolve(d)},function(a){var b="Could not fetch FontAwesome Github Repo";a||(b=a.data||a),c.reject(b)}),c.promise}}]).filter("toFaIcon",["FontAwesomeIcons","$timeout",function(a,b){var c=function(a,b){var c={full:"",empty:""};return __indexOf.call(b.iconList,a)>=0?(c.full="fa-"+b.iconMap[a],c.empty="fa-"+b.iconMap[a]+"-o","thumbs-up"==a||"thumbs-down"==a?c.empty="fa-"+b.iconMap[a].split("-")[0]+"-o-"+b.iconMap[a].split("-")[1]:"Smile Outlined"==a&&(c.empty="fa-frown-o"),c):(console.error("Error no shape of type: "+a+" for rating input"),c)};return function(a,b,d){var e=c(a,d);return b?e.empty:e.full}}]).directive("inputStars",["$rootScope","$filter","FontAwesomeIcons","$q",function(a,b,c,d){function e(a,e,f,g){var h={};(function(){var a=d.defer();return c.get().then(function(b){a.resolve(b)},function(b){a.reject(new Error("toShapeIcon Error: "+b))}),a.promise})().then(function(c){!function(){a.items=new Array((+f.max)),h.emptyIcon=b("toFaIcon")(f.iconEmpty,!0,c)||f.iconEmpty||"fa-stars-o",h.iconHover=f.iconHover||"angular-input-stars-hover",h.fullIcon=b("toFaIcon")(f.iconFull,!1,c)||f.iconEmpty||"fa-stars",h.iconBase=f.iconBase||"fa fa-fw",a.listClass=f.listClass||"angular-input-stars",a.readonly=!(void 0===f.readonly)}(),f.$observe("max",function(b){a.items=new Array((+b))}),f.$observe("iconEmpty",function(a){h.emptyIcon=b("toFaIcon")(a,!0,c)||a||"fa-stars-o"}),f.$observe("iconFull",function(a){h.fullIcon=b("toFaIcon")(a,!1,c)||a||"fa-stars"}),g.$render=function(){a.last_value=g.$viewValue||0},a.getClass=function(b){return b>=a.last_value?h.iconBase+" "+h.emptyIcon:h.iconBase+" "+h.fullIcon+" active "},a.unpaintStars=function(b,c){a.paintStars(a.last_value-1,c)},a.paintStars=function(b,c){if(!a.readonly){for(var d=e.find("li").find("i"),f=0;f<d.length;f++){var g=angular.element(d[f]);b>=f?(g.removeClass(h.emptyIcon),g.addClass(h.fullIcon),g.addClass("active"),g.addClass(h.iconHover)):(g.removeClass(h.fullIcon),g.removeClass("active"),g.removeClass(h.iconHover),g.addClass(h.emptyIcon))}!c&&d.removeClass(h.iconHover)}},a.setValue=function(b,c){if(!a.readonly){var d=c.target;c.pageX<d.getBoundingClientRect().left+d.offsetWidth/2?a.last_value=b+1:a.last_value=b+1,g.$setViewValue(a.last_value),f.onShapeClick&&a.$eval(f.onStarClick)}}},function(a){console.error("angular-input-stars.js | "+a.message||a)})}var f={restrict:"EA",replace:!0,template:'<ul ng-class="listClass"><li ng-touch="paintStars($index)" ng-mouseenter="paintStars($index, true)" ng-mouseleave="unpaintStars($index, false)" ng-repeat="item in items track by $index"><i ng-class="getClass($index)" ng-click="setValue($index, $event)"></i></li></ul>',require:"ngModel",scope:!0,link:e};return f}]),!function(a){var b="Compound",c="Identifier",d="MemberExpression",e="Literal",f="ThisExpression",g="CallExpression",h="UnaryExpression",i="BinaryExpression",j="LogicalExpression",k="ConditionalExpression",l="ArrayExpression",m=46,n=44,o=39,p=34,q=40,r=41,s=91,t=93,u=63,v=59,w=58,x=function(a,b){var c=new Error(a+" at character "+b);throw c.index=b,c.description=a,c},y=!0,z={"-":y,"!":y,"~":y,"+":y},A={"||":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10},B=function(a){var b,c=0;for(var d in a)(b=d.length)>c&&a.hasOwnProperty(d)&&(c=b);return c},C=B(z),D=B(A),E={"true":!0,"false":!1,"null":null},F="this",G=function(a){return A[a]||0},H=function(a,b,c){var d="||"===a||"&&"===a?j:i;return{type:d,operator:a,left:b,right:c}},I=function(a){return a>=48&&a<=57},J=function(a){return 36===a||95===a||a>=65&&a<=90||a>=97&&a<=122||a>=128&&!A[String.fromCharCode(a)]},K=function(a){return 36===a||95===a||a>=65&&a<=90||a>=97&&a<=122||a>=48&&a<=57||a>=128&&!A[String.fromCharCode(a)]},L=function(a){for(var i,j,y=0,B=a.charAt,L=a.charCodeAt,M=function(b){return B.call(a,b)},N=function(b){return L.call(a,b)},O=a.length,P=function(){for(var a=N(y);32===a||9===a;)a=N(++y)},Q=function(){var a,b,c=S();return P(),N(y)!==u?c:(y++,a=Q(),a||x("Expected expression",y),P(),N(y)===w?(y++,b=Q(),b||x("Expected expression",y),{type:k,test:c,consequent:a,alternate:b}):void x("Expected :",y))},R=function(){P();for(var b=a.substr(y,D),c=b.length;c>0;){if(A.hasOwnProperty(b))return y+=c,b;b=b.substr(0,--c)}return!1},S=function(){var a,b,c,d,e,f,g,h;if(f=T(),b=R(),!b)return f;for(e={value:b,prec:G(b)},g=T(),g||x("Expected expression after "+b,y),d=[f,e,g];(b=R())&&(c=G(b),0!==c);){for(e={value:b,prec:c};d.length>2&&c<=d[d.length-2].prec;)g=d.pop(),b=d.pop().value,f=d.pop(),a=H(b,f,g),d.push(a);a=T(),a||x("Expected expression after "+b,y),d.push(e,a)}for(h=d.length-1,a=d[h];h>1;)a=H(d[h-1].value,d[h-2],a),h-=2;return a},T=function(){var b,c,d;if(P(),b=N(y),I(b)||b===m)return U();if(b===o||b===p)return V();if(J(b)||b===q)return Y();if(b===s)return $();for(c=a.substr(y,C),d=c.length;d>0;){if(z.hasOwnProperty(c))return y+=d,{type:h,operator:c,argument:T(),prefix:!0};c=c.substr(0,--d)}return!1},U=function(){for(var a,b,c="";I(N(y));)c+=M(y++);if(N(y)===m)for(c+=M(y++);I(N(y));)c+=M(y++);if(a=M(y),"e"===a||"E"===a){for(c+=M(y++),a=M(y),"+"!==a&&"-"!==a||(c+=M(y++));I(N(y));)c+=M(y++);I(N(y-1))||x("Expected exponent ("+c+M(y)+")",y)}return b=N(y),J(b)?x("Variable names cannot start with a number ("+c+M(y)+")",y):b===m&&x("Unexpected period",y),{type:e,value:parseFloat(c),raw:c}},V=function(){for(var a,b="",c=M(y++),d=!1;y<O;){if(a=M(y++),a===c){d=!0;break}if("\\"===a)switch(a=M(y++)){case"n":b+="\n";break;case"r":b+="\r";break;case"t":b+="\t";break;case"b":b+="\b";break;case"f":b+="\f";break;case"v":b+="\x0B";break;default:b+="\\"+a}else b+=a}return d||x('Unclosed quote after "'+b+'"',y),{type:e,value:b,raw:c+b+c}},W=function(){var b,d=N(y),g=y;for(J(d)?y++:x("Unexpected "+M(y),y);y<O&&(d=N(y),K(d));)y++;return b=a.slice(g,y),E.hasOwnProperty(b)?{type:e,value:E[b],raw:b}:b===F?{type:f}:{type:c,name:b}},X=function(a){for(var c,d,e=[],f=!1;y<O;){if(P(),c=N(y),c===a){f=!0,y++;break}c===n?y++:(d=Q(),d&&d.type!==b||x("Expected comma",y),e.push(d))}return f||x("Expected "+String.fromCharCode(a),y),e},Y=function(){var a,b;for(a=N(y),b=a===q?Z():W(),P(),a=N(y);a===m||a===s||a===q;)y++,a===m?(P(),b={type:d,computed:!1,object:b,property:W()}):a===s?(b={type:d,computed:!0,object:b,property:Q()},P(),a=N(y),a!==t&&x("Unclosed [",y),y++):a===q&&(b={type:g,arguments:X(r),callee:b}),P(),a=N(y);return b},Z=function(){y++;var a=Q();return P(),N(y)===r?(y++,a):void x("Unclosed (",y)},$=function(){return y++,{type:l,elements:X(t)}},_=[];y<O;)i=N(y),i===v||i===n?y++:(j=Q())?_.push(j):y<O&&x('Unexpected "'+M(y)+'"',y);return 1===_.length?_[0]:{type:b,body:_}};if(L.version="0.3.1",L.toString=function(){return"JavaScript Expression Parser (JSEP) v"+L.version},L.addUnaryOp=function(a){return C=Math.max(a.length,C),z[a]=y,this},L.addBinaryOp=function(a,b){return D=Math.max(a.length,D),A[a]=b,this},L.addLiteral=function(a,b){return E[a]=b,this},L.removeUnaryOp=function(a){return delete z[a],a.length===C&&(C=B(z)),this},L.removeBinaryOp=function(a){return delete A[a],a.length===D&&(D=B(A)),this},L.removeLiteral=function(a){return delete E[a],this},"undefined"==typeof exports){var M=a.jsep;a.jsep=L,L.noConflict=function(){return a.jsep===L&&(a.jsep=M),L}}else"undefined"!=typeof module&&module.exports?exports=module.exports=L:exports.parse=L}(this),!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.Raven=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;d.length>g;g++)e(d[g]);return e}({1:[function(a,b,c){function d(a){this.name="RavenConfigError",this.message=a}d.prototype=new Error,d.prototype.constructor=d,b.exports=d},{}],2:[function(a,b,c){function d(){return+new Date}function e(){this.a=!("object"!=typeof JSON||!JSON.stringify),this.b="undefined"!=typeof document,this.c=null,this.d=null,this.e=null,this.f=null,this.g=null,this.h={},this.i={logger:"javascript",ignoreErrors:[],ignoreUrls:[],whitelistUrls:[],includePaths:[],crossOrigin:"anonymous",collectWindowErrors:!0,maxMessageLength:0,stackTraceLimit:50},this.j=0,this.k=!1,this.l=Error.stackTraceLimit,this.m=window.console||{},this.n={},this.o=[],this.p=d(),this.q=[];for(var a in this.m)this.n[a]=this.m[a]}var f=a(5),g=a(1),h=a(4),i=h.isFunction,j=h.isUndefined,k=h.isError,l=h.isEmptyObject,m=h.hasKey,n=h.joinRegExp,o=h.each,p=h.objectMerge,q=h.truncate,r=h.urlencode,s=h.uuid4,t="source protocol user pass host port path".split(" "),u=/^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;e.prototype={VERSION:"2.3.0",debug:!1,TraceKit:f,config:function(a,b){var c=this;if(this.e)return this.r("error","Error: Raven has already been configured"),this;if(!a)return this;b&&o(b,function(a,b){"tags"===a||"extra"===a?c.h[a]=b:c.i[a]=b});var d=this.s(a),e=d.path.lastIndexOf("/"),g=d.path.substr(1,e);return this.t=a,this.i.ignoreErrors.push(/^Script error\.?$/),this.i.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/),this.i.ignoreErrors=n(this.i.ignoreErrors),this.i.ignoreUrls=!!this.i.ignoreUrls.length&&n(this.i.ignoreUrls),this.i.whitelistUrls=!!this.i.whitelistUrls.length&&n(this.i.whitelistUrls),this.i.includePaths=n(this.i.includePaths),this.f=d.user,this.u=d.pass&&d.pass.substr(1),this.g=d.path.substr(e+1),this.e=this.v(d),this.w=this.e+"/"+g+"api/"+this.g+"/store/",this.i.fetchContext&&(f.remoteFetching=!0),this.i.linesOfContext&&(f.linesOfContext=this.i.linesOfContext),f.collectWindowErrors=!!this.i.collectWindowErrors,this},install:function(){var a=this;return this.isSetup()&&!this.k&&(f.report.subscribe(function(){a.x.apply(a,arguments)}),this.y(),this.z(),this.k=!0),Error.stackTraceLimit=this.i.stackTraceLimit,this},context:function(a,b,c){return i(a)&&(c=b||[],b=a,a=void 0),this.wrap(a,b).apply(this,c)},wrap:function(a,b){function c(){for(var c=[],e=arguments.length,f=!a||a&&a.deep!==!1;e--;)c[e]=f?d.wrap(a,arguments[e]):arguments[e];try{return b.apply(this,c)}catch(g){throw d.A(),d.captureException(g,a),g}}var d=this;if(j(b)&&!i(a))return a;if(i(a)&&(b=a,a=void 0),!i(b))return b;try{if(b.B)return b}catch(e){return b}if(b.C)return b.C;for(var f in b)m(b,f)&&(c[f]=b[f]);return b.C=c,c.prototype=b.prototype,c.B=!0,c.D=b,c},uninstall:function(){return f.report.uninstall(),this.E(),Error.stackTraceLimit=this.l,this.k=!1,this},captureException:function(a,b){if(!k(a))return this.captureMessage(a,b);this.c=a;try{var c=f.computeStackTrace(a); +this.F(c,b)}catch(d){if(a!==d)throw d}return this},captureMessage:function(a,b){return this.i.ignoreErrors.test&&this.i.ignoreErrors.test(a)?void 0:(this.G(p({message:a+""},b)),this)},addPlugin:function(a){var b=Array.prototype.slice.call(arguments,1);return this.o.push([a,b]),this.k&&this.z(),this},setUserContext:function(a){return this.h.user=a,this},setExtraContext:function(a){return this.H("extra",a),this},setTagsContext:function(a){return this.H("tags",a),this},clearContext:function(){return this.h={},this},getContext:function(){return JSON.parse(JSON.stringify(this.h))},setRelease:function(a){return this.i.release=a,this},setDataCallback:function(a){return this.i.dataCallback=a,this},setShouldSendCallback:function(a){return this.i.shouldSendCallback=a,this},setTransport:function(a){return this.i.transport=a,this},lastException:function(){return this.c},lastEventId:function(){return this.d},isSetup:function(){return!!this.a&&(!!this.e||(this.ravenNotConfiguredError||(this.ravenNotConfiguredError=!0,this.r("error","Error: Raven has not been configured.")),!1))},afterLoad:function(){var a=window.RavenConfig;a&&this.config(a.dsn,a.config).install()},showReportDialog:function(a){if(window.document){a=a||{};var b=a.eventId||this.lastEventId();if(!b)throw new g("Missing eventId");var c=a.dsn||this.t;if(!c)throw new g("Missing DSN");var d=encodeURIComponent,e="";e+="?eventId="+d(b),e+="&dsn="+d(c);var f=a.user||this.h.user;f&&(f.name&&(e+="&name="+d(f.name)),f.email&&(e+="&email="+d(f.email)));var h=this.v(this.s(c)),i=document.createElement("script");i.async=!0,i.src=h+"/api/embed/error-page/"+e,(document.head||document.body).appendChild(i)}},A:function(){var a=this;this.j+=1,setTimeout(function(){a.j-=1})},I:function(a,b){var c,d;if(this.b){b=b||{},a="raven"+a.substr(0,1).toUpperCase()+a.substr(1),document.createEvent?(c=document.createEvent("HTMLEvents"),c.initEvent(a,!0,!0)):(c=document.createEventObject(),c.eventType=a);for(d in b)m(b,d)&&(c[d]=b[d]);if(document.createEvent)document.dispatchEvent(c);else try{document.fireEvent("on"+c.eventType.toLowerCase(),c)}catch(e){}}},y:function(){function a(a,b,d,e){var f=a[b];a[b]=d(f),e||c.q.push([a,b,f])}function b(a){return function(b,d){var e=[].slice.call(arguments),f=e[0];return i(f)&&(e[0]=c.wrap(f)),a.apply?a.apply(this,e):a(e[0],e[1])}}var c=this;a(window,"setTimeout",b),a(window,"setInterval",b),window.requestAnimationFrame&&a(window,"requestAnimationFrame",function(a){return function(b){return a(c.wrap(b))}}),"EventTarget Window Node ApplicationCache AudioTrackList ChannelMergerNode CryptoOperation EventSource FileReader HTMLUnknownElement IDBDatabase IDBRequest IDBTransaction KeyOperation MediaController MessagePort ModalWindow Notification SVGElementInstance Screen TextTrack TextTrackCue TextTrackList WebSocket WebSocketWorker Worker XMLHttpRequest XMLHttpRequestEventTarget XMLHttpRequestUpload".replace(/\w+/g,function(b){var d=window[b]&&window[b].prototype;d&&d.hasOwnProperty&&d.hasOwnProperty("addEventListener")&&(a(d,"addEventListener",function(a){return function(b,d,e,f){try{d&&d.handleEvent&&(d.handleEvent=c.wrap(d.handleEvent))}catch(g){}return a.call(this,b,c.wrap(d),e,f)}}),a(d,"removeEventListener",function(a){return function(b,c,d,e){return c=c&&(c.C?c.C:c),a.call(this,b,c,d,e)}}))}),"XMLHttpRequest"in window&&a(XMLHttpRequest.prototype,"send",function(b){return function(d){var e=this;return"onreadystatechange onload onerror onprogress".replace(/\w+/g,function(b){b in e&&"[object Function]"===Object.prototype.toString.call(e[b])&&a(e,b,function(a){return c.wrap(a)},!0)}),b.apply(this,arguments)}});var d=window.jQuery||window.$;d&&d.fn&&d.fn.ready&&a(d.fn,"ready",function(a){return function(b){return a.call(this,c.wrap(b))}})},E:function(){for(var a;this.q.length;){a=this.q.shift();var b=a[0],c=a[1],d=a[2];b[c]=d}},z:function(){var a=this;o(this.o,function(b,c){var d=c[0],e=c[1];d.apply(a,[a].concat(e))})},s:function(a){var b=u.exec(a),c={},d=7;try{for(;d--;)c[t[d]]=b[d]||""}catch(e){throw new g("Invalid DSN: "+a)}if(c.pass&&!this.i.allowSecretKey)throw new g("Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key");return c},v:function(a){var b="//"+a.host+(a.port?":"+a.port:"");return a.protocol&&(b=a.protocol+":"+b),b},x:function(){this.j||this.F.apply(this,arguments)},F:function(a,b){var c=this,d=[];a.stack&&a.stack.length&&o(a.stack,function(a,b){var e=c.J(b);e&&d.push(e)}),this.I("handle",{stackInfo:a,options:b}),this.K(a.name,a.message,a.url,a.lineno,d.slice(0,this.i.stackTraceLimit),b)},J:function(a){if(a.url){var b,c={filename:a.url,lineno:a.line,colno:a.column,"function":a.func||"?"},d=this.L(a);if(d){var e=["pre_context","context_line","post_context"];for(b=3;b--;)c[e[b]]=d[b]}return c.in_app=!(this.i.includePaths.test&&!this.i.includePaths.test(c.filename)||/(Raven|TraceKit)\./.test(c["function"])||/raven\.(min\.)?js$/.test(c.filename)),c}},L:function(a){if(a.context&&this.i.fetchContext){for(var b=a.context,c=~~(b.length/2),d=b.length,e=!1;d--;)if(b[d].length>300){e=!0;break}if(e){if(j(a.column))return;return[[],b[c].substr(a.column,50),[]]}return[b.slice(0,c),b[c],b.slice(c+1)]}},K:function(a,b,c,d,e,f){var g,h;if((!this.i.ignoreErrors.test||!this.i.ignoreErrors.test(b))&&(b+="",b=q(b,this.i.maxMessageLength),h=(a?a+": ":"")+b,h=q(h,this.i.maxMessageLength),e&&e.length?(c=e[0].filename||c,e.reverse(),g={frames:e}):c&&(g={frames:[{filename:c,lineno:d,in_app:!0}]}),(!this.i.ignoreUrls.test||!this.i.ignoreUrls.test(c))&&(!this.i.whitelistUrls.test||this.i.whitelistUrls.test(c)))){var i=p({exception:{values:[{type:a,value:b,stacktrace:g}]},culprit:c,message:h},f);this.G(i)}},M:function(a){var b=this.i.maxMessageLength;if(a.message=q(a.message,b),a.exception){var c=a.exception.values[0];c.value=q(c.value,b)}return a},N:function(){if(this.b&&document.location&&document.location.href){var a={headers:{"User-Agent":navigator.userAgent}};return a.url=document.location.href,document.referrer&&(a.headers.Referer=document.referrer),a}},G:function(a){var b=this,c=this.i,e={project:this.g,logger:c.logger,platform:"javascript"},f=this.N();if(f&&(e.request=f),a=p(e,a),a.tags=p(p({},this.h.tags),a.tags),a.extra=p(p({},this.h.extra),a.extra),a.extra["session:duration"]=d()-this.p,l(a.tags)&&delete a.tags,this.h.user&&(a.user=this.h.user),c.release&&(a.release=c.release),c.serverName&&(a.server_name=c.serverName),i(c.dataCallback)&&(a=c.dataCallback(a)||a),a&&!l(a)&&(!i(c.shouldSendCallback)||c.shouldSendCallback(a))&&(this.d=a.event_id||(a.event_id=s()),a=this.M(a),this.r("debug","Raven about to send:",a),this.isSetup())){var g={sentry_version:"7",sentry_client:"raven-js/"+this.VERSION,sentry_key:this.f};this.u&&(g.sentry_secret=this.u);var h=this.w;(c.transport||this.O).call(this,{url:h,auth:g,data:a,options:c,onSuccess:function(){b.I("success",{data:a,src:h})},onError:function(){b.I("failure",{data:a,src:h})}})}},P:function(a){a.auth.sentry_data=JSON.stringify(a.data);var b=this.Q(),c=a.url+"?"+r(a.auth),d=a.options.crossOrigin;(d||""===d)&&(b.crossOrigin=d),b.onload=a.onSuccess,b.onerror=b.onabort=a.onError,b.src=c},R:function(a){function b(){200===c.status?a.onSuccess&&a.onSuccess():a.onError&&a.onError()}var c,d=a.url;c=new XMLHttpRequest,"withCredentials"in c?c.onreadystatechange=function(){4===c.readyState&&b()}:(c=new XDomainRequest,d=d.replace(/^https?:/,""),c.onload=b),c.open("POST",d+"?"+r(a.auth)),c.send(JSON.stringify(a.data))},O:function(a){var b="withCredentials"in new XMLHttpRequest||"undefined"!=typeof XDomainRequest;return(b?this.R:this.P)(a)},Q:function(){return document.createElement("img")},r:function(a){this.n[a]&&this.debug&&Function.prototype.apply.call(this.n[a],this.m,[].slice.call(arguments,1))},H:function(a,b){j(b)?delete this.h[a]:this.h[a]=p(this.h[a]||{},b)}},e.prototype.setUser=e.prototype.setUserContext,e.prototype.setReleaseContext=e.prototype.setRelease,b.exports=e},{1:1,4:4,5:5}],3:[function(a,b,c){var d=a(2),e=window.Raven,f=new d;f.noConflict=function(){return window.Raven=e,f},f.afterLoad(),b.exports=f},{2:2}],4:[function(a,b,c){function d(a){return void 0===a}function e(a){return"function"==typeof a}function f(a){return"[object String]"===q.toString.call(a)}function g(a){return"object"==typeof a&&null!==a}function h(a){for(var b in a)return!1;return!0}function i(a){var b=q.toString.call(a);return g(a)&&"[object Error]"===b||"[object Exception]"===b||a instanceof Error}function j(a,b){var c,e;if(d(a.length))for(c in a)m(a,c)&&b.call(null,c,a[c]);else if(e=a.length)for(c=0;e>c;c++)b.call(null,c,a[c])}function k(a,b){return b?(j(b,function(b,c){a[b]=c}),a):a}function l(a,b){return!b||b>=a.length?a:a.substr(0,b)+"…"}function m(a,b){return q.hasOwnProperty.call(a,b)}function n(a){for(var b,c=[],d=0,e=a.length;e>d;d++)b=a[d],f(b)?c.push(b.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")):b&&b.source&&c.push(b.source);return new RegExp(c.join("|"),"i")}function o(a){var b=[];return j(a,function(a,c){b.push(encodeURIComponent(a)+"="+encodeURIComponent(c))}),b.join("&")}function p(){var a=window.crypto||window.msCrypto;if(!d(a)&&a.getRandomValues){var b=new Uint16Array(8);a.getRandomValues(b),b[3]=4095&b[3]|16384,b[4]=16383&b[4]|32768;var c=function(a){for(var b=a.toString(16);4>b.length;)b="0"+b;return b};return c(b[0])+c(b[1])+c(b[2])+c(b[3])+c(b[4])+c(b[5])+c(b[6])+c(b[7])}return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0,c="x"===a?b:3&b|8;return c.toString(16)})}var q=Object.prototype;b.exports={isUndefined:d,isFunction:e,isString:f,isObject:g,isEmptyObject:h,isError:i,each:j,objectMerge:k,truncate:l,hasKey:m,joinRegExp:n,urlencode:o,uuid4:p}},{}],5:[function(a,b,c){function d(){return"undefined"==typeof document?"":document.location.href}var e=a(4),f=e.hasKey,g=e.isString,h=e.isUndefined,i={remoteFetching:!1,collectWindowErrors:!0,linesOfContext:7,debug:!1},j=[].slice,k="?",l=/^(?:Uncaught )?((?:Eval|Internal|Range|Reference|Syntax|Type|URI)Error)\: ?(.*)$/;i.report=function(){function a(a){k(),r.push(a)}function b(a){for(var b=r.length-1;b>=0;--b)r[b]===a&&r.splice(b,1)}function c(){m(),r=[]}function e(a,b){var c=null;if(!b||i.collectWindowErrors){for(var d in r)if(f(r,d))try{r[d].apply(null,[a].concat(j.call(arguments,2)))}catch(e){c=e}if(c)throw c}}function h(a,b,c,f,h){var j=null;if(u)i.computeStackTrace.augmentStackTraceWithInitialElement(u,b,c,a),n();else if(h)j=i.computeStackTrace(h),e(j,!0);else{var k={url:b,line:c,column:f};k.func=i.computeStackTrace.guessFunctionName(k.url,k.line),k.context=i.computeStackTrace.gatherContext(k.url,k.line);var m,o=void 0,q=a;if(g(a)){var m=a.match(l);m&&(o=m[1],q=m[2])}j={name:o,message:q,url:d(),stack:[k]},e(j,!0)}return!!p&&p.apply(this,arguments)}function k(){q||(p=window.onerror,window.onerror=h,q=!0)}function m(){q&&(window.onerror=p,q=!1,p=void 0)}function n(){var a=u,b=s;s=null,u=null,t=null,e.apply(null,[a,!1].concat(b))}function o(a,b){var c=j.call(arguments,1);if(u){if(t===a)return;n()}var d=i.computeStackTrace(a);if(u=d,t=a,s=c,window.setTimeout(function(){t===a&&n()},d.incomplete?2e3:0),b!==!1)throw a}var p,q,r=[],s=null,t=null,u=null;return o.subscribe=a,o.unsubscribe=b,o.uninstall=c,o}(),i.computeStackTrace=function(){function a(a){if(!i.remoteFetching)return"";try{var b=function(){try{return new window.XMLHttpRequest}catch(a){return new window.ActiveXObject("Microsoft.XMLHTTP")}},c=b();return c.open("GET",a,!1),c.send(""),c.responseText}catch(d){return""}}function b(b){if(!g(b))return[];if(!f(v,b)){var c="",d="";try{d=document.domain}catch(e){}-1!==b.indexOf(d)&&(c=a(b)),v[b]=c?c.split("\n"):[]}return v[b]}function c(a,c){var d,e=/function ([^(]*)\(([^)]*)\)/,f=/['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/,g="",i=10,j=b(a);if(!j.length)return k;for(var l=0;i>l;++l)if(g=j[c-l]+g,!h(g)){if(d=f.exec(g))return d[1];if(d=e.exec(g))return d[1]}return k}function e(a,c){var d=b(a);if(!d.length)return null;var e=[],f=Math.floor(i.linesOfContext/2),g=f+i.linesOfContext%2,j=Math.max(0,c-f-1),k=Math.min(d.length,c+g-1);c-=1;for(var l=j;k>l;++l)h(d[l])||e.push(d[l]);return e.length>0?e:null}function j(a){return a.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g,"\\$&")}function l(a){return j(a).replace("<","(?:<|<)").replace(">","(?:>|>)").replace("&","(?:&|&)").replace('"','(?:"|")').replace(/\s+/g,"\\s+")}function m(a,c){for(var d,e,f=0,g=c.length;g>f;++f)if((d=b(c[f])).length&&(d=d.join("\n"),e=a.exec(d)))return{url:c[f],line:d.substring(0,e.index).split("\n").length,column:e.index-d.lastIndexOf("\n",e.index)-1};return null}function n(a,c,d){var e,f=b(c),g=new RegExp("\\b"+j(a)+"\\b");return d-=1,f&&f.length>d&&(e=g.exec(f[d]))?e.index:null}function o(a){if("undefined"!=typeof document){for(var b,c,d,e,f=[window.location.href],g=document.getElementsByTagName("script"),h=""+a,i=/^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,k=/^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,n=0;g.length>n;++n){var o=g[n];o.src&&f.push(o.src)}if(d=i.exec(h)){var p=d[1]?"\\s+"+d[1]:"",q=d[2].split(",").join("\\s*,\\s*");b=j(d[3]).replace(/;$/,";?"),c=new RegExp("function"+p+"\\s*\\(\\s*"+q+"\\s*\\)\\s*{\\s*"+b+"\\s*}")}else c=new RegExp(j(h).replace(/\s+/g,"\\s+"));if(e=m(c,f))return e;if(d=k.exec(h)){var r=d[1];if(b=l(d[2]),c=new RegExp("on"+r+"=[\\'\"]\\s*"+b+"\\s*[\\'\"]","i"),e=m(c,f[0]))return e;if(c=new RegExp(b),e=m(c,f))return e}return null}}function p(a){if(!h(a.stack)&&a.stack){for(var b,f,g=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|<anonymous>).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,i=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|\[native).*?)(?::(\d+))?(?::(\d+))?\s*$/i,j=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:ms-appx|https?|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,l=a.stack.split("\n"),m=[],o=/^(.*) is undefined$/.exec(a.message),p=0,q=l.length;q>p;++p){if(b=g.exec(l[p])){var r=b[2]&&-1!==b[2].indexOf("native");f={url:r?null:b[2],func:b[1]||k,args:r?[b[2]]:[],line:b[3]?+b[3]:null,column:b[4]?+b[4]:null}}else if(b=j.exec(l[p]))f={url:b[2],func:b[1]||k,args:[],line:+b[3],column:b[4]?+b[4]:null};else{if(!(b=i.exec(l[p])))continue;f={url:b[3],func:b[1]||k,args:b[2]?b[2].split(","):[],line:b[4]?+b[4]:null,column:b[5]?+b[5]:null}}!f.func&&f.line&&(f.func=c(f.url,f.line)),f.line&&(f.context=e(f.url,f.line)),m.push(f)}return m.length?(m[0].line&&!m[0].column&&o?m[0].column=n(o[1],m[0].url,m[0].line):m[0].column||h(a.columnNumber)||(m[0].column=a.columnNumber+1),{name:a.name,message:a.message,url:d(),stack:m}):null}}function q(a){var b=a.stacktrace;if(!h(a.stacktrace)&&a.stacktrace){for(var f,g=/ line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i,i=/ line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i,j=b.split("\n"),k=[],l=0;j.length>l;l+=2){var m=null;if((f=g.exec(j[l]))?m={url:f[2],line:+f[1],column:null,func:f[3],args:[]}:(f=i.exec(j[l]))&&(m={url:f[6],line:+f[1],column:+f[2],func:f[3]||f[4],args:f[5]?f[5].split(","):[]}),m){if(!m.func&&m.line&&(m.func=c(m.url,m.line)),m.line)try{m.context=e(m.url,m.line)}catch(n){}m.context||(m.context=[j[l+1]]),k.push(m)}}return k.length?{name:a.name,message:a.message,url:d(),stack:k}:null}}function r(a){var g=a.message.split("\n");if(4>g.length)return null;var h,i=/^\s*Line (\d+) of linked script ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i,j=/^\s*Line (\d+) of inline#(\d+) script in ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i,k=/^\s*Line (\d+) of function script\s*$/i,n=[],o=document.getElementsByTagName("script"),p=[];for(var q in o)f(o,q)&&!o[q].src&&p.push(o[q]);for(var r=2;g.length>r;r+=2){var s=null;if(h=i.exec(g[r]))s={url:h[2],func:h[3],args:[],line:+h[1],column:null};else if(h=j.exec(g[r])){s={url:h[3],func:h[4],args:[],line:+h[1],column:null};var t=+h[1],u=p[h[2]-1];if(u){var v=b(s.url);if(v){v=v.join("\n");var w=v.indexOf(u.innerText);w>=0&&(s.line=t+v.substring(0,w).split("\n").length)}}}else if(h=k.exec(g[r])){var x=window.location.href.replace(/#.*$/,""),y=new RegExp(l(g[r+1])),z=m(y,[x]);s={url:x,func:"",args:[],line:z?z.line:h[1],column:null}}if(s){s.func||(s.func=c(s.url,s.line));var A=e(s.url,s.line),B=A?A[Math.floor(A.length/2)]:null;s.context=A&&B.replace(/^\s*/,"")===g[r+1].replace(/^\s*/,"")?A:[g[r+1]],n.push(s)}}return n.length?{name:a.name,message:g[0],url:d(),stack:n}:null}function s(a,b,d,f){var g={url:b,line:d};if(g.url&&g.line){a.incomplete=!1,g.func||(g.func=c(g.url,g.line)),g.context||(g.context=e(g.url,g.line));var h=/ '([^']+)' /.exec(f);if(h&&(g.column=n(h[1],g.url,g.line)),a.stack.length>0&&a.stack[0].url===g.url){if(a.stack[0].line===g.line)return!1;if(!a.stack[0].line&&a.stack[0].func===g.func)return a.stack[0].line=g.line,a.stack[0].context=g.context,!1}return a.stack.unshift(g),a.partial=!0,!0}return a.incomplete=!0,!1}function t(a,b){for(var e,f,g,h=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,j=[],l={},m=!1,p=t.caller;p&&!m;p=p.caller)if(p!==u&&p!==i.report){if(f={url:null,func:k,line:null,column:null},p.name?f.func=p.name:(e=h.exec(p.toString()))&&(f.func=e[1]),"undefined"==typeof f.func)try{f.func=e.input.substring(0,e.input.indexOf("{"))}catch(q){}if(g=o(p)){f.url=g.url,f.line=g.line,f.func===k&&(f.func=c(f.url,f.line));var r=/ '([^']+)' /.exec(a.message||a.description);r&&(f.column=n(r[1],g.url,g.line))}l[""+p]?m=!0:l[""+p]=!0,j.push(f)}b&&j.splice(0,b);var v={name:a.name,message:a.message,url:d(),stack:j};return s(v,a.sourceURL||a.fileName,a.line||a.lineNumber,a.message||a.description),v}function u(a,b){var c=null;b=null==b?0:+b;try{if(c=q(a))return c}catch(e){if(i.debug)throw e}try{if(c=p(a))return c}catch(e){if(i.debug)throw e}try{if(c=r(a))return c}catch(e){if(i.debug)throw e}try{if(c=t(a,b+1))return c}catch(e){if(i.debug)throw e}return{name:a.name,message:a.message,url:d()}}var v={};return u.augmentStackTraceWithInitialElement=s,u.computeStackTraceFromStackProp=p,u.guessFunctionName=c,u.gatherContext=e,u}(),b.exports=i},{4:4}]},{},[3])(3)}),function(){function a(a,b){if(a!==b){var c=null===a,d=a===u,e=a===a,f=null===b,g=b===u,h=b===b;if(a>b&&!f||!e||c&&!g&&h||d&&h)return 1;if(a<b&&!c||!h||f&&!d&&e||g&&e)return-1}return 0}function b(a,b,c){for(var d=a.length,e=c?d:-1;c?e--:++e<d;)if(b(a[e],e,a))return e;return-1}function c(a,b,c){if(b!==b)return m(a,c);c-=1;for(var d=a.length;++c<d;)if(a[c]===b)return c;return-1}function d(a){return"function"==typeof a||!1}function e(a){return null==a?"":a+""}function f(a,b){for(var c=-1,d=a.length;++c<d&&-1<b.indexOf(a.charAt(c)););return c}function g(a,b){for(var c=a.length;c--&&-1<b.indexOf(a.charAt(c)););return c}function h(b,c){return a(b.a,c.a)||b.b-c.b}function i(a){return Ja[a]}function j(a){return Ka[a]}function k(a,b,c){return b?a=Na[a]:c&&(a=Oa[a]),"\\"+a}function l(a){return"\\"+Oa[a]}function m(a,b,c){var d=a.length;for(b+=c?0:-1;c?b--:++b<d;){var e=a[b];if(e!==e)return b}return-1}function n(a){return!!a&&"object"==typeof a}function o(a){return 160>=a&&9<=a&&13>=a||32==a||160==a||5760==a||6158==a||8192<=a&&(8202>=a||8232==a||8233==a||8239==a||8287==a||12288==a||65279==a)}function p(a,b){for(var c=-1,d=a.length,e=-1,f=[];++c<d;)a[c]===b&&(a[c]=N,f[++e]=c);return f}function q(a){for(var b=-1,c=a.length;++b<c&&o(a.charCodeAt(b)););return b}function r(a){for(var b=a.length;b--&&o(a.charCodeAt(b)););return b}function s(a){return La[a]}function t(o){function Ja(a){if(n(a)&&!(Bf(a)||a instanceof Ma)){if(a instanceof La)return a;if(_d.call(a,"__chain__")&&_d.call(a,"__wrapped__"))return Pc(a)}return new La(a)}function Ka(){}function La(a,b,c){this.__wrapped__=a,this.__actions__=c||[],this.__chain__=!!b}function Ma(a){this.__wrapped__=a,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Ae,this.__views__=[]}function Na(){this.__data__={}}function Oa(a){var b=a?a.length:0;for(this.data={hash:pe(null),set:new je};b--;)this.push(a[b])}function Pa(a,b){var c=a.data;return("string"==typeof b||pd(b)?c.set.has(b):c.hash[b])?0:-1}function Qa(a,b){var c=-1,d=a.length;for(b||(b=Nd(d));++c<d;)b[c]=a[c];return b}function Ra(a,b){for(var c=-1,d=a.length;++c<d&&!1!==b(a[c],c,a););return a}function Sa(a,b){for(var c=-1,d=a.length;++c<d;)if(!b(a[c],c,a))return!1;return!0}function Ta(a,b){for(var c=-1,d=a.length,e=-1,f=[];++c<d;){var g=a[c];b(g,c,a)&&(f[++e]=g)}return f}function Wa(a,b){for(var c=-1,d=a.length,e=Nd(d);++c<d;)e[c]=b(a[c],c,a);return e}function Xa(a,b){for(var c=-1,d=b.length,e=a.length;++c<d;)a[e+c]=b[c];return a}function Ya(a,b,c,d){var e=-1,f=a.length;for(d&&f&&(c=a[++e]);++e<f;)c=b(c,a[e],e,a);return c}function Za(a,b){for(var c=-1,d=a.length;++c<d;)if(b(a[c],c,a))return!0;return!1}function $a(a,b,c,d){return a!==u&&_d.call(d,c)?a:b}function _a(a,b,c){for(var d=-1,e=Mf(b),f=e.length;++d<f;){var g=e[d],h=a[g],i=c(h,b[g],g,a,b);(i===i?i===h:h!==h)&&(h!==u||g in a)||(a[g]=i)}return a}function ab(a,b){return null==b?a:cb(b,Mf(b),a)}function bb(a,b){for(var c=-1,d=null==a,e=!d&&Cc(a),f=e?a.length:0,g=b.length,h=Nd(g);++c<g;){var i=b[c];h[c]=e?Dc(i,f)?a[i]:u:d?u:a[i]}return h}function cb(a,b,c){c||(c={});for(var d=-1,e=b.length;++d<e;){var f=b[d];c[f]=a[f]}return c}function db(a,b,c){var d=typeof a;return"function"==d?b===u?a:Nb(a,b,c):null==a?Id:"object"==d?ub(a):b===u?Md(a):vb(a,b)}function eb(a,b,c,d,e,f,g){var h;if(c&&(h=e?c(a,d,e):c(a)),h!==u)return h;if(!pd(a))return a;if(d=Bf(a)){if(h=yc(a),!b)return Qa(a,h)}else{var i=be.call(a),j=i==T;if(i!=V&&i!=O&&(!j||e))return Ia[i]?Ac(a,i,b):e?a:{};if(h=zc(j?{}:a),!b)return ab(h,a)}for(f||(f=[]),g||(g=[]),e=f.length;e--;)if(f[e]==a)return g[e];return f.push(a),g.push(h),(d?Ra:nb)(a,function(d,e){h[e]=eb(d,b,c,e,a,f,g)}),h}function fb(a,b,c){if("function"!=typeof a)throw new Wd(M);return ke(function(){a.apply(u,c)},b)}function gb(a,b){var d=a?a.length:0,e=[];if(!d)return e;var f=-1,g=vc(),h=g===c,i=h&&b.length>=J&&pe&&je?new Oa(b):null,j=b.length;i&&(g=Pa,h=!1,b=i);a:for(;++f<d;)if(i=a[f],h&&i===i){for(var k=j;k--;)if(b[k]===i)continue a;e.push(i)}else 0>g(b,i,0)&&e.push(i);return e}function hb(a,b){var c=!0;return He(a,function(a,d,e){return c=!!b(a,d,e)}),c}function ib(a,b,c,d){var e=d,f=e;return He(a,function(a,g,h){g=+b(a,g,h),(c(g,e)||g===d&&g===f)&&(e=g,f=a)}),f}function jb(a,b){var c=[];return He(a,function(a,d,e){b(a,d,e)&&c.push(a)}),c}function kb(a,b,c,d){var e;return c(a,function(a,c,f){return b(a,c,f)?(e=d?c:a,!1):void 0}),e}function lb(a,b,c,d){d||(d=[]);for(var e=-1,f=a.length;++e<f;){var g=a[e];n(g)&&Cc(g)&&(c||Bf(g)||ld(g))?b?lb(g,b,c,d):Xa(d,g):c||(d[d.length]=g)}return d}function mb(a,b){Je(a,b,Ad)}function nb(a,b){return Je(a,b,Mf)}function ob(a,b){return Ke(a,b,Mf)}function pb(a,b){for(var c=-1,d=b.length,e=-1,f=[];++c<d;){var g=b[c];od(a[g])&&(f[++e]=g)}return f}function qb(a,b,c){if(null!=a){c!==u&&c in Nc(a)&&(b=[c]),c=0;for(var d=b.length;null!=a&&c<d;)a=a[b[c++]];return c&&c==d?a:u}}function rb(a,b,c,d,e,f){if(a===b)a=!0;else if(null==a||null==b||!pd(a)&&!n(b))a=a!==a&&b!==b;else a:{var g=rb,h=Bf(a),i=Bf(b),j=P,k=P;h||(j=be.call(a),j==O?j=V:j!=V&&(h=vd(a))),i||(k=be.call(b),k==O?k=V:k!=V&&vd(b));var l=j==V,i=k==V,k=j==k;if(!k||h||l){if(!d&&(j=l&&_d.call(a,"__wrapped__"),i=i&&_d.call(b,"__wrapped__"),j||i)){a=g(j?a.value():a,i?b.value():b,c,d,e,f);break a}if(k){for(e||(e=[]),f||(f=[]),j=e.length;j--;)if(e[j]==a){a=f[j]==b;break a}e.push(a),f.push(b),a=(h?qc:sc)(a,b,g,c,d,e,f),e.pop(),f.pop()}else a=!1}else a=rc(a,b,j)}return a}function sb(a,b,c){var d=b.length,e=d,f=!c;if(null==a)return!e;for(a=Nc(a);d--;){var g=b[d];if(f&&g[2]?g[1]!==a[g[0]]:!(g[0]in a))return!1}for(;++d<e;){var g=b[d],h=g[0],i=a[h],j=g[1];if(f&&g[2]){if(i===u&&!(h in a))return!1}else if(g=c?c(i,j,h):u,g===u?!rb(j,i,c,!0):!g)return!1}return!0}function tb(a,b){var c=-1,d=Cc(a)?Nd(a.length):[];return He(a,function(a,e,f){d[++c]=b(a,e,f)}),d}function ub(a){var b=wc(a);if(1==b.length&&b[0][2]){var c=b[0][0],d=b[0][1];return function(a){return null!=a&&(a[c]===d&&(d!==u||c in Nc(a)))}}return function(a){return sb(a,b)}}function vb(a,b){var c=Bf(a),d=Fc(a)&&b===b&&!pd(b),e=a+"";return a=Oc(a),function(f){if(null==f)return!1;var g=e;if(f=Nc(f),!(!c&&d||g in f)){if(f=1==a.length?f:qb(f,Cb(a,0,-1)),null==f)return!1;g=Uc(a),f=Nc(f)}return f[g]===b?b!==u||g in f:rb(b,f[g],u,!0)}}function wb(a,b,c,d,e){if(!pd(a))return a;var f=Cc(b)&&(Bf(b)||vd(b)),g=f?u:Mf(b);return Ra(g||b,function(h,i){if(g&&(i=h,h=b[i]),n(h)){d||(d=[]),e||(e=[]);a:{for(var j=i,k=d,l=e,m=k.length,o=b[j];m--;)if(k[m]==o){a[j]=l[m];break a}var m=a[j],p=c?c(m,o,j,a,b):u,q=p===u;q&&(p=o,Cc(o)&&(Bf(o)||vd(o))?p=Bf(m)?m:Cc(m)?Qa(m):[]:sd(o)||ld(o)?p=ld(m)?yd(m):sd(m)?m:{}:q=!1),k.push(o),l.push(p),q?a[j]=wb(p,o,c,k,l):(p===p?p!==m:m===m)&&(a[j]=p)}}else j=a[i],k=c?c(j,h,i,a,b):u,(l=k===u)&&(k=h),k===u&&(!f||i in a)||!l&&(k===k?k===j:j!==j)||(a[i]=k)}),a}function xb(a){return function(b){return null==b?u:b[a]}}function yb(a){var b=a+"";return a=Oc(a),function(c){return qb(c,a,b)}}function zb(a,b){for(var c=a?b.length:0;c--;){var d=b[c];if(d!=e&&Dc(d)){var e=d;le.call(a,d,1)}}}function Ab(a,b){return a+qe(ye()*(b-a+1))}function Bb(a,b,c,d,e){return e(a,function(a,e,f){c=d?(d=!1,a):b(c,a,e,f)}),c}function Cb(a,b,c){var d=-1,e=a.length;for(b=null==b?0:+b||0,0>b&&(b=-b>e?0:e+b),c=c===u||c>e?e:+c||0,0>c&&(c+=e),e=b>c?0:c-b>>>0,b>>>=0,c=Nd(e);++d<e;)c[d]=a[d+b];return c}function Db(a,b){var c;return He(a,function(a,d,e){return c=b(a,d,e),!c}),!!c}function Eb(a,b){var c=a.length;for(a.sort(b);c--;)a[c]=a[c].c;return a}function Fb(b,c,d){var e=tc(),f=-1;return c=Wa(c,function(a){return e(a)}),b=tb(b,function(a){return{a:Wa(c,function(b){return b(a)}),b:++f,c:a}}),Eb(b,function(b,c){var e;a:{for(var f=-1,g=b.a,h=c.a,i=g.length,j=d.length;++f<i;)if(e=a(g[f],h[f])){if(f>=j)break a;f=d[f],e*="asc"===f||!0===f?1:-1;break a}e=b.b-c.b}return e})}function Gb(a,b){var c=0;return He(a,function(a,d,e){c+=+b(a,d,e)||0}),c}function Hb(a,b){var d=-1,e=vc(),f=a.length,g=e===c,h=g&&f>=J,i=h&&pe&&je?new Oa((void 0)):null,j=[];i?(e=Pa,g=!1):(h=!1,i=b?[]:j);a:for(;++d<f;){var k=a[d],l=b?b(k,d,a):k;if(g&&k===k){for(var m=i.length;m--;)if(i[m]===l)continue a;b&&i.push(l),j.push(k)}else 0>e(i,l,0)&&((b||h)&&i.push(l),j.push(k))}return j}function Ib(a,b){for(var c=-1,d=b.length,e=Nd(d);++c<d;)e[c]=a[b[c]];return e}function Jb(a,b,c,d){for(var e=a.length,f=d?e:-1;(d?f--:++f<e)&&b(a[f],f,a););return c?Cb(a,d?0:f,d?f+1:e):Cb(a,d?f+1:0,d?e:f)}function Kb(a,b){var c=a;c instanceof Ma&&(c=c.value());for(var d=-1,e=b.length;++d<e;)var f=b[d],c=f.func.apply(f.thisArg,Xa([c],f.args));return c}function Lb(a,b,c){var d=0,e=a?a.length:d;if("number"==typeof b&&b===b&&e<=Ce){for(;d<e;){var f=d+e>>>1,g=a[f];(c?g<=b:g<b)&&null!==g?d=f+1:e=f}return e}return Mb(a,b,Id,c)}function Mb(a,b,c,d){b=c(b);for(var e=0,f=a?a.length:0,g=b!==b,h=null===b,i=b===u;e<f;){var j=qe((e+f)/2),k=c(a[j]),l=k!==u,m=k===k;(g?m||d:h?m&&l&&(d||null!=k):i?m&&(d||l):null==k?0:d?k<=b:k<b)?e=j+1:f=j}return ve(f,Be)}function Nb(a,b,c){if("function"!=typeof a)return Id;if(b===u)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 3:return function(c,d,e){return a.call(b,c,d,e)};case 4:return function(c,d,e,f){return a.call(b,c,d,e,f)};case 5:return function(c,d,e,f,g){return a.call(b,c,d,e,f,g)}}return function(){return a.apply(b,arguments)}}function Ob(a){var b=new ee(a.byteLength);return new me(b).set(new me(a)),b}function Pb(a,b,c){for(var d=c.length,e=-1,f=ue(a.length-d,0),g=-1,h=b.length,i=Nd(h+f);++g<h;)i[g]=b[g];for(;++e<d;)i[c[e]]=a[e];for(;f--;)i[g++]=a[e++];return i}function Qb(a,b,c){for(var d=-1,e=c.length,f=-1,g=ue(a.length-e,0),h=-1,i=b.length,j=Nd(g+i);++f<g;)j[f]=a[f];for(g=f;++h<i;)j[g+h]=b[h];for(;++d<e;)j[g+c[d]]=a[f++];return j}function Rb(a,b){return function(c,d,e){var f=b?b():{};if(d=tc(d,e,3),Bf(c)){e=-1;for(var g=c.length;++e<g;){var h=c[e];a(f,h,d(h,e,c),c)}}else He(c,function(b,c,e){a(f,b,d(b,c,e),e)});return f}}function Sb(a){return jd(function(b,c){var d=-1,e=null==b?0:c.length,f=2<e?c[e-2]:u,g=2<e?c[2]:u,h=1<e?c[e-1]:u;for("function"==typeof f?(f=Nb(f,h,5),e-=2):(f="function"==typeof h?h:u,e-=f?1:0),g&&Ec(c[0],c[1],g)&&(f=3>e?u:f,e=1);++d<e;)(g=c[d])&&a(b,g,f);return b})}function Tb(a,b){return function(c,d){var e=c?Ne(c):0;if(!Hc(e))return a(c,d);for(var f=b?e:-1,g=Nc(c);(b?f--:++f<e)&&!1!==d(g[f],f,g););return c}}function Ub(a){return function(b,c,d){var e=Nc(b);d=d(b);for(var f=d.length,g=a?f:-1;a?g--:++g<f;){var h=d[g];if(!1===c(e[h],h,e))break}return b}}function Vb(a,b){function c(){return(this&&this!==Ua&&this instanceof c?d:a).apply(b,arguments)}var d=Xb(a);return c}function Wb(a){return function(b){var c=-1;b=Gd(Dd(b));for(var d=b.length,e="";++c<d;)e=a(e,b[c],c);return e}}function Xb(a){return function(){var b=arguments;switch(b.length){case 0:return new a;case 1:return new a(b[0]);case 2:return new a(b[0],b[1]);case 3:return new a(b[0],b[1],b[2]);case 4:return new a(b[0],b[1],b[2],b[3]);case 5:return new a(b[0],b[1],b[2],b[3],b[4]);case 6:return new a(b[0],b[1],b[2],b[3],b[4],b[5]);case 7:return new a(b[0],b[1],b[2],b[3],b[4],b[5],b[6])}var c=Ge(a.prototype),b=a.apply(c,b);return pd(b)?b:c}}function Yb(a){function b(c,d,e){return e&&Ec(c,d,e)&&(d=u),c=pc(c,a,u,u,u,u,u,d),c.placeholder=b.placeholder,c}return b}function Zb(a,b){return jd(function(c){var d=c[0];return null==d?d:(c.push(b),a.apply(u,c))})}function $b(a,b){return function(c,d,e){if(e&&Ec(c,d,e)&&(d=u),d=tc(d,e,3),1==d.length){e=c=Bf(c)?c:Mc(c);for(var f=d,g=-1,h=e.length,i=b,j=i;++g<h;){var k=e[g],l=+f(k);a(l,i)&&(i=l,j=k)}if(e=j,!c.length||e!==b)return e}return ib(c,d,a,b)}}function _b(a,c){return function(d,e,f){return e=tc(e,f,3),Bf(d)?(e=b(d,e,c),-1<e?d[e]:u):kb(d,e,a)}}function ac(a){return function(c,d,e){return c&&c.length?(d=tc(d,e,3),b(c,d,a)):-1}}function bc(a){return function(b,c,d){return c=tc(c,d,3),kb(b,c,a,!0)}}function cc(a){return function(){for(var b,c=arguments.length,d=a?c:-1,e=0,f=Nd(c);a?d--:++d<c;){var g=f[e++]=arguments[d];if("function"!=typeof g)throw new Wd(M);!b&&La.prototype.thru&&"wrapper"==uc(g)&&(b=new La([],(!0)))}for(d=b?-1:c;++d<c;){var g=f[d],e=uc(g),h="wrapper"==e?Me(g):u;b=h&&Gc(h[0])&&h[1]==(D|z|B|E)&&!h[4].length&&1==h[9]?b[uc(h[0])].apply(b,h[3]):1==g.length&&Gc(g)?b[e]():b.thru(g)}return function(){var a=arguments,d=a[0];if(b&&1==a.length&&Bf(d)&&d.length>=J)return b.plant(d).value();for(var e=0,a=c?f[e].apply(this,a):d;++e<c;)a=f[e].call(this,a);return a}}}function dc(a,b){return function(c,d,e){return"function"==typeof d&&e===u&&Bf(c)?a(c,d):b(c,Nb(d,e,3))}}function ec(a){return function(b,c,d){return("function"!=typeof c||d!==u)&&(c=Nb(c,d,3)),a(b,c,Ad)}}function fc(a){return function(b,c,d){return("function"!=typeof c||d!==u)&&(c=Nb(c,d,3)),a(b,c)}}function gc(a){return function(b,c,d){var e={};return c=tc(c,d,3),nb(b,function(b,d,f){f=c(b,d,f),d=a?f:d,b=a?b:f,e[d]=b}),e}}function hc(a){return function(b,c,d){return b=e(b),(a?b:"")+lc(b,c,d)+(a?"":b)}}function ic(a){var b=jd(function(c,d){var e=p(d,b.placeholder);return pc(c,a,u,d,e)});return b}function jc(a,b){return function(c,d,e,f){var g=3>arguments.length;return"function"==typeof d&&f===u&&Bf(c)?a(c,d,e,g):Bb(c,tc(d,f,4),e,g,b)}}function kc(a,b,c,d,e,f,g,h,i,j){function k(){for(var t=arguments.length,v=t,y=Nd(t);v--;)y[v]=arguments[v];if(d&&(y=Pb(y,d,e)),f&&(y=Qb(y,f,g)),o||r){var v=k.placeholder,z=p(y,v),t=t-z.length;if(t<j){var A=h?Qa(h):u,t=ue(j-t,0),D=o?z:u,z=o?u:z,E=o?y:u,y=o?u:y;return b|=o?B:C,b&=~(o?C:B),q||(b&=~(w|x)),y=[a,b,c,E,D,y,z,A,i,t],A=kc.apply(u,y),Gc(a)&&Oe(A,y),A.placeholder=v,A}}if(v=m?c:this,A=n?v[a]:a,h)for(t=y.length,D=ve(h.length,t),z=Qa(y);D--;)E=h[D],y[D]=Dc(E,t)?z[E]:u;return l&&i<y.length&&(y.length=i),this&&this!==Ua&&this instanceof k&&(A=s||Xb(a)),A.apply(v,y)}var l=b&D,m=b&w,n=b&x,o=b&z,q=b&y,r=b&A,s=n?u:Xb(a);return k}function lc(a,b,c){return a=a.length,b=+b,a<b&&se(b)?(b-=a,c=null==c?" ":c+"",Ed(c,oe(b/c.length)).slice(0,b)):""}function mc(a,b,c,d){function e(){ +for(var b=-1,h=arguments.length,i=-1,j=d.length,k=Nd(j+h);++i<j;)k[i]=d[i];for(;h--;)k[i++]=arguments[++b];return(this&&this!==Ua&&this instanceof e?g:a).apply(f?c:this,k)}var f=b&w,g=Xb(a);return e}function nc(a){var b=Rd[a];return function(a,c){return(c=c===u?0:+c||0)?(c=he(10,c),b(a*c)/c):b(a)}}function oc(a){return function(b,c,d,e){var f=tc(d);return null==d&&f===db?Lb(b,c,a):Mb(b,c,f(d,e,1),a)}}function pc(a,b,c,d,e,f,g,h){var i=b&x;if(!i&&"function"!=typeof a)throw new Wd(M);var j=d?d.length:0;if(j||(b&=~(B|C),d=e=u),j-=e?e.length:0,b&C){var k=d,l=e;d=e=u}var m=i?u:Me(a);return c=[a,b,c,d,e,k,l,f,g,h],m&&(d=c[1],b=m[1],h=d|b,e=b==D&&d==z||b==D&&d==E&&c[7].length<=m[8]||b==(D|E)&&d==z,(h<D||e)&&(b&w&&(c[2]=m[2],h|=d&w?0:y),(d=m[3])&&(e=c[3],c[3]=e?Pb(e,d,m[4]):Qa(d),c[4]=e?p(c[3],N):Qa(m[4])),(d=m[5])&&(e=c[5],c[5]=e?Qb(e,d,m[6]):Qa(d),c[6]=e?p(c[5],N):Qa(m[6])),(d=m[7])&&(c[7]=Qa(d)),b&D&&(c[8]=null==c[8]?m[8]:ve(c[8],m[8])),null==c[9]&&(c[9]=m[9]),c[0]=m[0],c[1]=h),b=c[1],h=c[9]),c[9]=null==h?i?0:a.length:ue(h-j,0)||0,(m?Le:Oe)(b==w?Vb(c[0],c[2]):b!=B&&b!=(w|B)||c[4].length?kc.apply(u,c):mc.apply(u,c),c)}function qc(a,b,c,d,e,f,g){var h=-1,i=a.length,j=b.length;if(i!=j&&(!e||j<=i))return!1;for(;++h<i;){var k=a[h],j=b[h],l=d?d(e?j:k,e?k:j,h):u;if(l!==u){if(l)continue;return!1}if(e){if(!Za(b,function(a){return k===a||c(k,a,d,e,f,g)}))return!1}else if(k!==j&&!c(k,j,d,e,f,g))return!1}return!0}function rc(a,b,c){switch(c){case Q:case R:return+a==+b;case S:return a.name==b.name&&a.message==b.message;case U:return a!=+a?b!=+b:a==+b;case W:case X:return a==b+""}return!1}function sc(a,b,c,d,e,f,g){var h=Mf(a),i=h.length,j=Mf(b).length;if(i!=j&&!e)return!1;for(j=i;j--;){var k=h[j];if(!(e?k in b:_d.call(b,k)))return!1}for(var l=e;++j<i;){var k=h[j],m=a[k],n=b[k],o=d?d(e?n:m,e?m:n,k):u;if(o===u?!c(m,n,d,e,f,g):!o)return!1;l||(l="constructor"==k)}return!(!l&&(c=a.constructor,d=b.constructor,c!=d&&"constructor"in a&&"constructor"in b&&!("function"==typeof c&&c instanceof c&&"function"==typeof d&&d instanceof d)))}function tc(a,b,c){var d=Ja.callback||Hd,d=d===Hd?db:d;return c?d(a,b,c):d}function uc(a){for(var b=a.name+"",c=Fe[b],d=c?c.length:0;d--;){var e=c[d],f=e.func;if(null==f||f==a)return e.name}return b}function vc(a,b,d){var e=Ja.indexOf||Tc,e=e===Tc?c:e;return a?e(a,b,d):e}function wc(a){a=Bd(a);for(var b=a.length;b--;){var c=a[b][1];a[b][2]=c===c&&!pd(c)}return a}function xc(a,b){var c=null==a?u:a[b];return qd(c)?c:u}function yc(a){var b=a.length,c=new a.constructor(b);return b&&"string"==typeof a[0]&&_d.call(a,"index")&&(c.index=a.index,c.input=a.input),c}function zc(a){return a=a.constructor,"function"==typeof a&&a instanceof a||(a=Td),new a}function Ac(a,b,c){var d=a.constructor;switch(b){case Y:return Ob(a);case Q:case R:return new d((+a));case Z:case $:case _:case aa:case ba:case ca:case da:case ea:case fa:return b=a.buffer,new d(c?Ob(b):b,a.byteOffset,a.length);case U:case X:return new d(a);case W:var e=new d(a.source,ya.exec(a));e.lastIndex=a.lastIndex}return e}function Bc(a,b,c){return null==a||Fc(b,a)||(b=Oc(b),a=1==b.length?a:qb(a,Cb(b,0,-1)),b=Uc(b)),b=null==a?a:a[b],null==b?u:b.apply(a,c)}function Cc(a){return null!=a&&Hc(Ne(a))}function Dc(a,b){return a="number"==typeof a||Ba.test(a)?+a:-1,b=null==b?De:b,-1<a&&0==a%1&&a<b}function Ec(a,b,c){if(!pd(c))return!1;var d=typeof b;return!!("number"==d?Cc(c)&&Dc(b,c.length):"string"==d&&b in c)&&(b=c[b],a===a?a===b:b!==b)}function Fc(a,b){var c=typeof a;return!!("string"==c&&ra.test(a)||"number"==c)||!Bf(a)&&(!qa.test(a)||null!=b&&a in Nc(b))}function Gc(a){var b=uc(a),c=Ja[b];return"function"==typeof c&&b in Ma.prototype&&(a===c||(b=Me(c),!!b&&a===b[0]))}function Hc(a){return"number"==typeof a&&-1<a&&0==a%1&&a<=De}function Ic(a,b){return a===u?b:Cf(a,b,Ic)}function Jc(a,b){a=Nc(a);for(var c=-1,d=b.length,e={};++c<d;){var f=b[c];f in a&&(e[f]=a[f])}return e}function Kc(a,b){var c={};return mb(a,function(a,d,e){b(a,d,e)&&(c[d]=a)}),c}function Lc(a){for(var b=Ad(a),c=b.length,d=c&&a.length,e=!!d&&Hc(d)&&(Bf(a)||ld(a)),f=-1,g=[];++f<c;){var h=b[f];(e&&Dc(h,d)||_d.call(a,h))&&g.push(h)}return g}function Mc(a){return null==a?[]:Cc(a)?pd(a)?a:Td(a):Cd(a)}function Nc(a){return pd(a)?a:Td(a)}function Oc(a){if(Bf(a))return a;var b=[];return e(a).replace(sa,function(a,c,d,e){b.push(d?e.replace(wa,"$1"):c||a)}),b}function Pc(a){return a instanceof Ma?a.clone():new La(a.__wrapped__,a.__chain__,Qa(a.__actions__))}function Qc(a,b,c){return a&&a.length?((c?Ec(a,b,c):null==b)&&(b=1),Cb(a,0>b?0:b)):[]}function Rc(a,b,c){var d=a?a.length:0;return d?((c?Ec(a,b,c):null==b)&&(b=1),b=d-(+b||0),Cb(a,0,0>b?0:b)):[]}function Sc(a){return a?a[0]:u}function Tc(a,b,d){var e=a?a.length:0;if(!e)return-1;if("number"==typeof d)d=0>d?ue(e+d,0):d;else if(d)return d=Lb(a,b),d<e&&(b===b?b===a[d]:a[d]!==a[d])?d:-1;return c(a,b,d||0)}function Uc(a){var b=a?a.length:0;return b?a[b-1]:u}function Vc(a){return Qc(a,1)}function Wc(a,b,d,e){if(!a||!a.length)return[];null!=b&&"boolean"!=typeof b&&(e=d,d=Ec(a,b,e)?u:b,b=!1);var f=tc();if((null!=d||f!==db)&&(d=f(d,e,3)),b&&vc()===c){b=d;var g;d=-1,e=a.length;for(var f=-1,h=[];++d<e;){var i=a[d],j=b?b(i,d,a):i;d&&g===j||(g=j,h[++f]=i)}a=h}else a=Hb(a,d);return a}function Xc(a){if(!a||!a.length)return[];var b=-1,c=0;a=Ta(a,function(a){return Cc(a)?(c=ue(a.length,c),!0):void 0});for(var d=Nd(c);++b<c;)d[b]=Wa(a,xb(b));return d}function Yc(a,b,c){return a&&a.length?(a=Xc(a),null==b?a:(b=Nb(b,c,4),Wa(a,function(a){return Ya(a,b,u,!0)}))):[]}function Zc(a,b){var c=-1,d=a?a.length:0,e={};for(!d||b||Bf(a[0])||(b=[]);++c<d;){var f=a[c];b?e[f]=b[c]:f&&(e[f[0]]=f[1])}return e}function $c(a){return a=Ja(a),a.__chain__=!0,a}function _c(a,b,c){return b.call(c,a)}function ad(a,b,c){var d=Bf(a)?Sa:hb;return c&&Ec(a,b,c)&&(b=u),("function"!=typeof b||c!==u)&&(b=tc(b,c,3)),d(a,b)}function bd(a,b,c){var d=Bf(a)?Ta:jb;return b=tc(b,c,3),d(a,b)}function cd(a,b,c,d){var e=a?Ne(a):0;return Hc(e)||(a=Cd(a),e=a.length),c="number"!=typeof c||d&&Ec(b,c,d)?0:0>c?ue(e+c,0):c||0,"string"==typeof a||!Bf(a)&&ud(a)?c<=e&&-1<a.indexOf(b,c):!!e&&-1<vc(a,b,c)}function dd(a,b,c){var d=Bf(a)?Wa:tb;return b=tc(b,c,3),d(a,b)}function ed(a,b,c){if(c?Ec(a,b,c):null==b){a=Mc(a);var d=a.length;return 0<d?a[Ab(0,d-1)]:u}c=-1,a=xd(a);var d=a.length,e=d-1;for(b=ve(0>b?0:+b||0,d);++c<b;){var d=Ab(c,e),f=a[d];a[d]=a[c],a[c]=f}return a.length=b,a}function fd(a,b,c){var d=Bf(a)?Za:Db;return c&&Ec(a,b,c)&&(b=u),("function"!=typeof b||c!==u)&&(b=tc(b,c,3)),d(a,b)}function gd(a,b){var c;if("function"!=typeof b){if("function"!=typeof a)throw new Wd(M);var d=a;a=b,b=d}return function(){return 0<--a&&(c=b.apply(this,arguments)),1>=a&&(b=u),c}}function hd(a,b,c){function d(b,c){c&&fe(c),i=m=n=u,b&&(o=nf(),j=a.apply(l,h),m||i||(h=l=u))}function e(){var a=b-(nf()-k);0>=a||a>b?d(n,i):m=ke(e,a)}function f(){d(q,m)}function g(){if(h=arguments,k=nf(),l=this,n=q&&(m||!r),!1===p)var c=r&&!m;else{i||r||(o=k);var d=p-(k-o),g=0>=d||d>p;g?(i&&(i=fe(i)),o=k,j=a.apply(l,h)):i||(i=ke(f,d))}return g&&m?m=fe(m):m||b===p||(m=ke(e,b)),c&&(g=!0,j=a.apply(l,h)),!g||m||i||(h=l=u),j}var h,i,j,k,l,m,n,o=0,p=!1,q=!0;if("function"!=typeof a)throw new Wd(M);if(b=0>b?0:+b||0,!0===c)var r=!0,q=!1;else pd(c)&&(r=!!c.leading,p="maxWait"in c&&ue(+c.maxWait||0,b),q="trailing"in c?!!c.trailing:q);return g.cancel=function(){m&&fe(m),i&&fe(i),o=0,i=m=n=u},g}function id(a,b){function c(){var d=arguments,e=b?b.apply(this,d):d[0],f=c.cache;return f.has(e)?f.get(e):(d=a.apply(this,d),c.cache=f.set(e,d),d)}if("function"!=typeof a||b&&"function"!=typeof b)throw new Wd(M);return c.cache=new id.Cache,c}function jd(a,b){if("function"!=typeof a)throw new Wd(M);return b=ue(b===u?a.length-1:+b||0,0),function(){for(var c=arguments,d=-1,e=ue(c.length-b,0),f=Nd(e);++d<e;)f[d]=c[b+d];switch(b){case 0:return a.call(this,f);case 1:return a.call(this,c[0],f);case 2:return a.call(this,c[0],c[1],f)}for(e=Nd(b+1),d=-1;++d<b;)e[d]=c[d];return e[b]=f,a.apply(this,e)}}function kd(a,b){return a>b}function ld(a){return n(a)&&Cc(a)&&_d.call(a,"callee")&&!ie.call(a,"callee")}function md(a,b,c,d){return d=(c="function"==typeof c?Nb(c,d,3):u)?c(a,b):u,d===u?rb(a,b,c):!!d}function nd(a){return n(a)&&"string"==typeof a.message&&be.call(a)==S}function od(a){return pd(a)&&be.call(a)==T}function pd(a){var b=typeof a;return!!a&&("object"==b||"function"==b)}function qd(a){return null!=a&&(od(a)?de.test($d.call(a)):n(a)&&Aa.test(a))}function rd(a){return"number"==typeof a||n(a)&&be.call(a)==U}function sd(a){var b;if(!n(a)||be.call(a)!=V||ld(a)||!(_d.call(a,"constructor")||(b=a.constructor,"function"!=typeof b||b instanceof b)))return!1;var c;return mb(a,function(a,b){c=b}),c===u||_d.call(a,c)}function td(a){return pd(a)&&be.call(a)==W}function ud(a){return"string"==typeof a||n(a)&&be.call(a)==X}function vd(a){return n(a)&&Hc(a.length)&&!!Ha[be.call(a)]}function wd(a,b){return a<b}function xd(a){var b=a?Ne(a):0;return Hc(b)?b?Qa(a):[]:Cd(a)}function yd(a){return cb(a,Ad(a))}function zd(a){return pb(a,Ad(a))}function Ad(a){if(null==a)return[];pd(a)||(a=Td(a));for(var b=a.length,b=b&&Hc(b)&&(Bf(a)||ld(a))&&b||0,c=a.constructor,d=-1,c="function"==typeof c&&c.prototype===a,e=Nd(b),f=0<b;++d<b;)e[d]=d+"";for(var g in a)f&&Dc(g,b)||"constructor"==g&&(c||!_d.call(a,g))||e.push(g);return e}function Bd(a){a=Nc(a);for(var b=-1,c=Mf(a),d=c.length,e=Nd(d);++b<d;){var f=c[b];e[b]=[f,a[f]]}return e}function Cd(a){return Ib(a,Mf(a))}function Dd(a){return(a=e(a))&&a.replace(Ca,i).replace(va,"")}function Ed(a,b){var c="";if(a=e(a),b=+b,1>b||!a||!se(b))return c;do b%2&&(c+=a),b=qe(b/2),a+=a;while(b);return c}function Fd(a,b,c){var d=a;return(a=e(a))?(c?Ec(d,b,c):null==b)?a.slice(q(a),r(a)+1):(b+="",a.slice(f(a,b),g(a,b)+1)):a}function Gd(a,b,c){return c&&Ec(a,b,c)&&(b=u),a=e(a),a.match(b||Fa)||[]}function Hd(a,b,c){return c&&Ec(a,b,c)&&(b=u),n(a)?Jd(a):db(a,b)}function Id(a){return a}function Jd(a){return ub(eb(a,!0))}function Kd(a,b,c){if(null==c){var d=pd(b),e=d?Mf(b):u;((e=e&&e.length?pb(b,e):u)?e.length:d)||(e=!1,c=b,b=a,a=this)}e||(e=pb(b,Mf(b)));var f=!0,d=-1,g=od(a),h=e.length;!1===c?f=!1:pd(c)&&"chain"in c&&(f=c.chain);for(;++d<h;){c=e[d];var i=b[c];a[c]=i,g&&(a.prototype[c]=function(b){return function(){var c=this.__chain__;if(f||c){var d=a(this.__wrapped__);return(d.__actions__=Qa(this.__actions__)).push({func:b,args:arguments,thisArg:a}),d.__chain__=c,d}return b.apply(a,Xa([this.value()],arguments))}}(i))}return a}function Ld(){}function Md(a){return Fc(a)?xb(a):yb(a)}o=o?Va.defaults(Ua.Object(),o,Va.pick(Ua,Ga)):Ua;var Nd=o.Array,Od=o.Date,Pd=o.Error,Qd=o.Function,Rd=o.Math,Sd=o.Number,Td=o.Object,Ud=o.RegExp,Vd=o.String,Wd=o.TypeError,Xd=Nd.prototype,Yd=Td.prototype,Zd=Vd.prototype,$d=Qd.prototype.toString,_d=Yd.hasOwnProperty,ae=0,be=Yd.toString,ce=Ua._,de=Ud("^"+$d.call(_d).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),ee=o.ArrayBuffer,fe=o.clearTimeout,ge=o.parseFloat,he=Rd.pow,ie=Yd.propertyIsEnumerable,je=xc(o,"Set"),ke=o.setTimeout,le=Xd.splice,me=o.Uint8Array,ne=xc(o,"WeakMap"),oe=Rd.ceil,pe=xc(Td,"create"),qe=Rd.floor,re=xc(Nd,"isArray"),se=o.isFinite,te=xc(Td,"keys"),ue=Rd.max,ve=Rd.min,we=xc(Od,"now"),xe=o.parseInt,ye=Rd.random,ze=Sd.NEGATIVE_INFINITY,Ae=Sd.POSITIVE_INFINITY,Be=4294967294,Ce=2147483647,De=9007199254740991,Ee=ne&&new ne,Fe={};Ja.support={},Ja.templateSettings={escape:na,evaluate:oa,interpolate:pa,variable:"",imports:{_:Ja}};var Ge=function(){function a(){}return function(b){if(pd(b)){a.prototype=b;var c=new a;a.prototype=u}return c||{}}}(),He=Tb(nb),Ie=Tb(ob,!0),Je=Ub(),Ke=Ub(!0),Le=Ee?function(a,b){return Ee.set(a,b),a}:Id,Me=Ee?function(a){return Ee.get(a)}:Ld,Ne=xb("length"),Oe=function(){var a=0,b=0;return function(c,d){var e=nf(),f=I-(e-b);if(b=e,0<f){if(++a>=H)return c}else a=0;return Le(c,d)}}(),Pe=jd(function(a,b){return n(a)&&Cc(a)?gb(a,lb(b,!1,!0)):[]}),Qe=ac(),Re=ac(!0),Se=jd(function(a){for(var b=a.length,d=b,e=Nd(k),f=vc(),g=f===c,h=[];d--;){var i=a[d]=Cc(i=a[d])?i:[];e[d]=g&&120<=i.length&&pe&&je?new Oa(d&&i):null}var g=a[0],j=-1,k=g?g.length:0,l=e[0];a:for(;++j<k;)if(i=g[j],0>(l?Pa(l,i):f(h,i,0))){for(d=b;--d;){var m=e[d];if(0>(m?Pa(m,i):f(a[d],i,0)))continue a}l&&l.push(i),h.push(i)}return h}),Te=jd(function(b,c){c=lb(c);var d=bb(b,c);return zb(b,c.sort(a)),d}),Ue=oc(),Ve=oc(!0),We=jd(function(a){return Hb(lb(a,!1,!0))}),Xe=jd(function(a,b){return Cc(a)?gb(a,b):[]}),Ye=jd(Xc),Ze=jd(function(a){var b=a.length,c=2<b?a[b-2]:u,d=1<b?a[b-1]:u;return 2<b&&"function"==typeof c?b-=2:(c=1<b&&"function"==typeof d?(--b,d):u,d=u),a.length=b,Yc(a,c,d)}),$e=jd(function(a){return a=lb(a),this.thru(function(b){b=Bf(b)?b:[Nc(b)];for(var c=a,d=-1,e=b.length,f=-1,g=c.length,h=Nd(e+g);++d<e;)h[d]=b[d];for(;++f<g;)h[d++]=c[f];return h})}),_e=jd(function(a,b){return bb(a,lb(b))}),af=Rb(function(a,b,c){_d.call(a,c)?++a[c]:a[c]=1}),bf=_b(He),cf=_b(Ie,!0),df=dc(Ra,He),ef=dc(function(a,b){for(var c=a.length;c--&&!1!==b(a[c],c,a););return a},Ie),ff=Rb(function(a,b,c){_d.call(a,c)?a[c].push(b):a[c]=[b]}),gf=Rb(function(a,b,c){a[c]=b}),hf=jd(function(a,b,c){var d=-1,e="function"==typeof b,f=Fc(b),g=Cc(a)?Nd(a.length):[];return He(a,function(a){var h=e?b:f&&null!=a?a[b]:u;g[++d]=h?h.apply(a,c):Bc(a,b,c)}),g}),jf=Rb(function(a,b,c){a[c?0:1].push(b)},function(){return[[],[]]}),kf=jc(Ya,He),lf=jc(function(a,b,c,d){var e=a.length;for(d&&e&&(c=a[--e]);e--;)c=b(c,a[e],e,a);return c},Ie),mf=jd(function(a,b){if(null==a)return[];var c=b[2];return c&&Ec(b[0],b[1],c)&&(b.length=1),Fb(a,lb(b),[])}),nf=we||function(){return(new Od).getTime()},of=jd(function(a,b,c){var d=w;if(c.length)var e=p(c,of.placeholder),d=d|B;return pc(a,d,b,c,e)}),pf=jd(function(a,b){b=b.length?lb(b):zd(a);for(var c=-1,d=b.length;++c<d;){var e=b[c];a[e]=pc(a[e],w,a)}return a}),qf=jd(function(a,b,c){var d=w|x;if(c.length)var e=p(c,qf.placeholder),d=d|B;return pc(b,d,a,c,e)}),rf=Yb(z),sf=Yb(A),tf=jd(function(a,b){return fb(a,1,b)}),uf=jd(function(a,b,c){return fb(a,b,c)}),vf=cc(),wf=cc(!0),xf=jd(function(a,b){if(b=lb(b),"function"!=typeof a||!Sa(b,d))throw new Wd(M);var c=b.length;return jd(function(d){for(var e=ve(d.length,c);e--;)d[e]=b[e](d[e]);return a.apply(this,d)})}),yf=ic(B),zf=ic(C),Af=jd(function(a,b){return pc(a,E,u,u,u,lb(b))}),Bf=re||function(a){return n(a)&&Hc(a.length)&&be.call(a)==P},Cf=Sb(wb),Df=Sb(function(a,b,c){return c?_a(a,b,c):ab(a,b)}),Ef=Zb(Df,function(a,b){return a===u?b:a}),Ff=Zb(Cf,Ic),Gf=bc(nb),Hf=bc(ob),If=ec(Je),Jf=ec(Ke),Kf=fc(nb),Lf=fc(ob),Mf=te?function(a){var b=null==a?u:a.constructor;return"function"==typeof b&&b.prototype===a||"function"!=typeof a&&Cc(a)?Lc(a):pd(a)?te(a):[]}:Lc,Nf=gc(!0),Of=gc(),Pf=jd(function(a,b){if(null==a)return{};if("function"!=typeof b[0])return b=Wa(lb(b),Vd),Jc(a,gb(Ad(a),b));var c=Nb(b[0],b[1],3);return Kc(a,function(a,b,d){return!c(a,b,d)})}),Qf=jd(function(a,b){return null==a?{}:"function"==typeof b[0]?Kc(a,Nb(b[0],b[1],3)):Jc(a,lb(b))}),Rf=Wb(function(a,b,c){return b=b.toLowerCase(),a+(c?b.charAt(0).toUpperCase()+b.slice(1):b)}),Sf=Wb(function(a,b,c){return a+(c?"-":"")+b.toLowerCase()}),Tf=hc(),Uf=hc(!0),Vf=Wb(function(a,b,c){return a+(c?"_":"")+b.toLowerCase()}),Wf=Wb(function(a,b,c){return a+(c?" ":"")+(b.charAt(0).toUpperCase()+b.slice(1))}),Xf=jd(function(a,b){try{return a.apply(u,b)}catch(c){return nd(c)?c:new Pd(c)}}),Yf=jd(function(a,b){return function(c){return Bc(c,a,b)}}),Zf=jd(function(a,b){return function(c){return Bc(a,c,b)}}),$f=nc("ceil"),_f=nc("floor"),ag=$b(kd,ze),bg=$b(wd,Ae),cg=nc("round");return Ja.prototype=Ka.prototype,La.prototype=Ge(Ka.prototype),La.prototype.constructor=La,Ma.prototype=Ge(Ka.prototype),Ma.prototype.constructor=Ma,Na.prototype["delete"]=function(a){return this.has(a)&&delete this.__data__[a]},Na.prototype.get=function(a){return"__proto__"==a?u:this.__data__[a]},Na.prototype.has=function(a){return"__proto__"!=a&&_d.call(this.__data__,a)},Na.prototype.set=function(a,b){return"__proto__"!=a&&(this.__data__[a]=b),this},Oa.prototype.push=function(a){var b=this.data;"string"==typeof a||pd(a)?b.set.add(a):b.hash[a]=!0},id.Cache=Na,Ja.after=function(a,b){if("function"!=typeof b){if("function"!=typeof a)throw new Wd(M);var c=a;a=b,b=c}return a=se(a=+a)?a:0,function(){return 1>--a?b.apply(this,arguments):void 0}},Ja.ary=function(a,b,c){return c&&Ec(a,b,c)&&(b=u),b=a&&null==b?a.length:ue(+b||0,0),pc(a,D,u,u,u,u,b)},Ja.assign=Df,Ja.at=_e,Ja.before=gd,Ja.bind=of,Ja.bindAll=pf,Ja.bindKey=qf,Ja.callback=Hd,Ja.chain=$c,Ja.chunk=function(a,b,c){b=(c?Ec(a,b,c):null==b)?1:ue(qe(b)||1,1),c=0;for(var d=a?a.length:0,e=-1,f=Nd(oe(d/b));c<d;)f[++e]=Cb(a,c,c+=b);return f},Ja.compact=function(a){for(var b=-1,c=a?a.length:0,d=-1,e=[];++b<c;){var f=a[b];f&&(e[++d]=f)}return e},Ja.constant=function(a){return function(){return a}},Ja.countBy=af,Ja.create=function(a,b,c){var d=Ge(a);return c&&Ec(a,b,c)&&(b=u),b?ab(d,b):d},Ja.curry=rf,Ja.curryRight=sf,Ja.debounce=hd,Ja.defaults=Ef,Ja.defaultsDeep=Ff,Ja.defer=tf,Ja.delay=uf,Ja.difference=Pe,Ja.drop=Qc,Ja.dropRight=Rc,Ja.dropRightWhile=function(a,b,c){return a&&a.length?Jb(a,tc(b,c,3),!0,!0):[]},Ja.dropWhile=function(a,b,c){return a&&a.length?Jb(a,tc(b,c,3),!0):[]},Ja.fill=function(a,b,c,d){var e=a?a.length:0;if(!e)return[];for(c&&"number"!=typeof c&&Ec(a,b,c)&&(c=0,d=e),e=a.length,c=null==c?0:+c||0,0>c&&(c=-c>e?0:e+c),d=d===u||d>e?e:+d||0,0>d&&(d+=e),e=c>d?0:d>>>0,c>>>=0;c<e;)a[c++]=b;return a},Ja.filter=bd,Ja.flatten=function(a,b,c){var d=a?a.length:0;return c&&Ec(a,b,c)&&(b=!1),d?lb(a,b):[]},Ja.flattenDeep=function(a){return a&&a.length?lb(a,!0):[]},Ja.flow=vf,Ja.flowRight=wf,Ja.forEach=df,Ja.forEachRight=ef,Ja.forIn=If,Ja.forInRight=Jf,Ja.forOwn=Kf,Ja.forOwnRight=Lf,Ja.functions=zd,Ja.groupBy=ff,Ja.indexBy=gf,Ja.initial=function(a){return Rc(a,1)},Ja.intersection=Se,Ja.invert=function(a,b,c){c&&Ec(a,b,c)&&(b=u),c=-1;for(var d=Mf(a),e=d.length,f={};++c<e;){var g=d[c],h=a[g];b?_d.call(f,h)?f[h].push(g):f[h]=[g]:f[h]=g}return f},Ja.invoke=hf,Ja.keys=Mf,Ja.keysIn=Ad,Ja.map=dd,Ja.mapKeys=Nf,Ja.mapValues=Of,Ja.matches=Jd,Ja.matchesProperty=function(a,b){return vb(a,eb(b,!0))},Ja.memoize=id,Ja.merge=Cf,Ja.method=Yf,Ja.methodOf=Zf,Ja.mixin=Kd,Ja.modArgs=xf,Ja.negate=function(a){if("function"!=typeof a)throw new Wd(M);return function(){return!a.apply(this,arguments)}},Ja.omit=Pf,Ja.once=function(a){return gd(2,a)},Ja.pairs=Bd,Ja.partial=yf,Ja.partialRight=zf,Ja.partition=jf,Ja.pick=Qf,Ja.pluck=function(a,b){return dd(a,Md(b))},Ja.property=Md,Ja.propertyOf=function(a){return function(b){return qb(a,Oc(b),b+"")}},Ja.pull=function(){var a=arguments,b=a[0];if(!b||!b.length)return b;for(var c=0,d=vc(),e=a.length;++c<e;)for(var f=0,g=a[c];-1<(f=d(b,g,f));)le.call(b,f,1);return b},Ja.pullAt=Te,Ja.range=function(a,b,c){c&&Ec(a,b,c)&&(b=c=u),a=+a||0,c=null==c?1:+c||0,null==b?(b=a,a=0):b=+b||0;var d=-1;b=ue(oe((b-a)/(c||1)),0);for(var e=Nd(b);++d<b;)e[d]=a,a+=c;return e},Ja.rearg=Af,Ja.reject=function(a,b,c){var d=Bf(a)?Ta:jb;return b=tc(b,c,3),d(a,function(a,c,d){return!b(a,c,d)})},Ja.remove=function(a,b,c){var d=[];if(!a||!a.length)return d;var e=-1,f=[],g=a.length;for(b=tc(b,c,3);++e<g;)c=a[e],b(c,e,a)&&(d.push(c),f.push(e));return zb(a,f),d},Ja.rest=Vc,Ja.restParam=jd,Ja.set=function(a,b,c){if(null==a)return a;var d=b+"";b=null!=a[d]||Fc(b,a)?[d]:Oc(b);for(var d=-1,e=b.length,f=e-1,g=a;null!=g&&++d<e;){var h=b[d];pd(g)&&(d==f?g[h]=c:null==g[h]&&(g[h]=Dc(b[d+1])?[]:{})),g=g[h]}return a},Ja.shuffle=function(a){return ed(a,Ae)},Ja.slice=function(a,b,c){var d=a?a.length:0;return d?(c&&"number"!=typeof c&&Ec(a,b,c)&&(b=0,c=d),Cb(a,b,c)):[]},Ja.sortBy=function(a,b,c){if(null==a)return[];c&&Ec(a,b,c)&&(b=u);var d=-1;return b=tc(b,c,3),a=tb(a,function(a,c,e){return{a:b(a,c,e),b:++d,c:a}}),Eb(a,h)},Ja.sortByAll=mf,Ja.sortByOrder=function(a,b,c,d){return null==a?[]:(d&&Ec(b,c,d)&&(c=u),Bf(b)||(b=null==b?[]:[b]),Bf(c)||(c=null==c?[]:[c]),Fb(a,b,c))},Ja.spread=function(a){if("function"!=typeof a)throw new Wd(M);return function(b){return a.apply(this,b)}},Ja.take=function(a,b,c){return a&&a.length?((c?Ec(a,b,c):null==b)&&(b=1),Cb(a,0,0>b?0:b)):[]},Ja.takeRight=function(a,b,c){var d=a?a.length:0;return d?((c?Ec(a,b,c):null==b)&&(b=1),b=d-(+b||0),Cb(a,0>b?0:b)):[]},Ja.takeRightWhile=function(a,b,c){return a&&a.length?Jb(a,tc(b,c,3),!1,!0):[]},Ja.takeWhile=function(a,b,c){return a&&a.length?Jb(a,tc(b,c,3)):[]},Ja.tap=function(a,b,c){return b.call(c,a),a},Ja.throttle=function(a,b,c){var d=!0,e=!0;if("function"!=typeof a)throw new Wd(M);return!1===c?d=!1:pd(c)&&(d="leading"in c?!!c.leading:d,e="trailing"in c?!!c.trailing:e),hd(a,b,{leading:d,maxWait:+b,trailing:e})},Ja.thru=_c,Ja.times=function(a,b,c){if(a=qe(a),1>a||!se(a))return[];var d=-1,e=Nd(ve(a,4294967295));for(b=Nb(b,c,1);++d<a;)4294967295>d?e[d]=b(d):b(d);return e},Ja.toArray=xd,Ja.toPlainObject=yd,Ja.transform=function(a,b,c,d){var e=Bf(a)||vd(a);return b=tc(b,d,4),null==c&&(e||pd(a)?(d=a.constructor,c=e?Bf(a)?new d:[]:Ge(od(d)?d.prototype:u)):c={}),(e?Ra:nb)(a,function(a,d,e){return b(c,a,d,e)}),c},Ja.union=We,Ja.uniq=Wc,Ja.unzip=Xc,Ja.unzipWith=Yc,Ja.values=Cd,Ja.valuesIn=function(a){return Ib(a,Ad(a))},Ja.where=function(a,b){return bd(a,ub(b))},Ja.without=Xe,Ja.wrap=function(a,b){return b=null==b?Id:b,pc(b,B,u,[a],[])},Ja.xor=function(){for(var a=-1,b=arguments.length;++a<b;){var c=arguments[a];if(Cc(c))var d=d?Xa(gb(d,c),gb(c,d)):c}return d?Hb(d):[]},Ja.zip=Ye,Ja.zipObject=Zc,Ja.zipWith=Ze,Ja.backflow=wf,Ja.collect=dd,Ja.compose=wf,Ja.each=df,Ja.eachRight=ef,Ja.extend=Df,Ja.iteratee=Hd,Ja.methods=zd,Ja.object=Zc,Ja.select=bd,Ja.tail=Vc,Ja.unique=Wc,Kd(Ja,Ja),Ja.add=function(a,b){return(+a||0)+(+b||0)},Ja.attempt=Xf,Ja.camelCase=Rf,Ja.capitalize=function(a){return(a=e(a))&&a.charAt(0).toUpperCase()+a.slice(1)},Ja.ceil=$f,Ja.clone=function(a,b,c,d){return b&&"boolean"!=typeof b&&Ec(a,b,c)?b=!1:"function"==typeof b&&(d=c,c=b,b=!1),"function"==typeof c?eb(a,b,Nb(c,d,3)):eb(a,b)},Ja.cloneDeep=function(a,b,c){return"function"==typeof b?eb(a,!0,Nb(b,c,3)):eb(a,!0)},Ja.deburr=Dd,Ja.endsWith=function(a,b,c){a=e(a),b+="";var d=a.length;return c=c===u?d:ve(0>c?0:+c||0,d),c-=b.length,0<=c&&a.indexOf(b,c)==c},Ja.escape=function(a){return(a=e(a))&&ma.test(a)?a.replace(ka,j):a},Ja.escapeRegExp=function(a){return(a=e(a))&&ua.test(a)?a.replace(ta,k):a||"(?:)"},Ja.every=ad,Ja.find=bf,Ja.findIndex=Qe,Ja.findKey=Gf,Ja.findLast=cf,Ja.findLastIndex=Re,Ja.findLastKey=Hf,Ja.findWhere=function(a,b){return bf(a,ub(b))},Ja.first=Sc,Ja.floor=_f,Ja.get=function(a,b,c){return a=null==a?u:qb(a,Oc(b),b+""),a===u?c:a},Ja.gt=kd,Ja.gte=function(a,b){return a>=b},Ja.has=function(a,b){if(null==a)return!1;var c=_d.call(a,b);if(!c&&!Fc(b)){if(b=Oc(b),a=1==b.length?a:qb(a,Cb(b,0,-1)),null==a)return!1;b=Uc(b),c=_d.call(a,b)}return c||Hc(a.length)&&Dc(b,a.length)&&(Bf(a)||ld(a))},Ja.identity=Id,Ja.includes=cd,Ja.indexOf=Tc,Ja.inRange=function(a,b,c){return b=+b||0,c===u?(c=b,b=0):c=+c||0,a>=ve(b,c)&&a<ue(b,c)},Ja.isArguments=ld,Ja.isArray=Bf,Ja.isBoolean=function(a){return!0===a||!1===a||n(a)&&be.call(a)==Q},Ja.isDate=function(a){return n(a)&&be.call(a)==R},Ja.isElement=function(a){return!!a&&1===a.nodeType&&n(a)&&!sd(a)},Ja.isEmpty=function(a){return null==a||(Cc(a)&&(Bf(a)||ud(a)||ld(a)||n(a)&&od(a.splice))?!a.length:!Mf(a).length)},Ja.isEqual=md,Ja.isError=nd,Ja.isFinite=function(a){return"number"==typeof a&&se(a)},Ja.isFunction=od,Ja.isMatch=function(a,b,c,d){return c="function"==typeof c?Nb(c,d,3):u,sb(a,wc(b),c)},Ja.isNaN=function(a){return rd(a)&&a!=+a},Ja.isNative=qd,Ja.isNull=function(a){return null===a},Ja.isNumber=rd,Ja.isObject=pd,Ja.isPlainObject=sd,Ja.isRegExp=td,Ja.isString=ud,Ja.isTypedArray=vd,Ja.isUndefined=function(a){return a===u},Ja.kebabCase=Sf,Ja.last=Uc,Ja.lastIndexOf=function(a,b,c){var d=a?a.length:0;if(!d)return-1;var e=d;if("number"==typeof c)e=(0>c?ue(d+c,0):ve(c||0,d-1))+1;else if(c)return e=Lb(a,b,!0)-1,a=a[e],(b===b?b===a:a!==a)?e:-1;if(b!==b)return m(a,e,!0);for(;e--;)if(a[e]===b)return e;return-1},Ja.lt=wd,Ja.lte=function(a,b){return a<=b},Ja.max=ag,Ja.min=bg,Ja.noConflict=function(){return Ua._=ce,this},Ja.noop=Ld,Ja.now=nf,Ja.pad=function(a,b,c){a=e(a),b=+b;var d=a.length;return d<b&&se(b)?(d=(b-d)/2,b=qe(d),d=oe(d),c=lc("",d,c),c.slice(0,b)+a+c):a},Ja.padLeft=Tf,Ja.padRight=Uf,Ja.parseInt=function(a,b,c){return(c?Ec(a,b,c):null==b)?b=0:b&&(b=+b),a=Fd(a),xe(a,b||(za.test(a)?16:10))},Ja.random=function(a,b,c){c&&Ec(a,b,c)&&(b=c=u);var d=null==a,e=null==b;return null==c&&(e&&"boolean"==typeof a?(c=a,a=1):"boolean"==typeof b&&(c=b,e=!0)),d&&e&&(b=1,e=!1),a=+a||0,e?(b=a,a=0):b=+b||0,c||a%1||b%1?(c=ye(),ve(a+c*(b-a+ge("1e-"+((c+"").length-1))),b)):Ab(a,b)},Ja.reduce=kf,Ja.reduceRight=lf,Ja.repeat=Ed,Ja.result=function(a,b,c){var d=null==a?u:a[b];return d===u&&(null==a||Fc(b,a)||(b=Oc(b),a=1==b.length?a:qb(a,Cb(b,0,-1)),d=null==a?u:a[Uc(b)]),d=d===u?c:d),od(d)?d.call(a):d},Ja.round=cg,Ja.runInContext=t,Ja.size=function(a){var b=a?Ne(a):0;return Hc(b)?b:Mf(a).length},Ja.snakeCase=Vf,Ja.some=fd,Ja.sortedIndex=Ue,Ja.sortedLastIndex=Ve,Ja.startCase=Wf,Ja.startsWith=function(a,b,c){return a=e(a),c=null==c?0:ve(0>c?0:+c||0,a.length),a.lastIndexOf(b,c)==c},Ja.sum=function(a,b,c){if(c&&Ec(a,b,c)&&(b=u),b=tc(b,c,3),1==b.length){a=Bf(a)?a:Mc(a),c=a.length;for(var d=0;c--;)d+=+b(a[c])||0;a=d}else a=Gb(a,b);return a},Ja.template=function(a,b,c){var d=Ja.templateSettings;c&&Ec(a,b,c)&&(b=c=u),a=e(a),b=_a(ab({},c||b),d,$a),c=_a(ab({},b.imports),d.imports,$a);var f,g,h=Mf(c),i=Ib(c,h),j=0;c=b.interpolate||Da;var k="__p+='";c=Ud((b.escape||Da).source+"|"+c.source+"|"+(c===pa?xa:Da).source+"|"+(b.evaluate||Da).source+"|$","g");var m="sourceURL"in b?"//# sourceURL="+b.sourceURL+"\n":"";if(a.replace(c,function(b,c,d,e,h,i){return d||(d=e),k+=a.slice(j,i).replace(Ea,l),c&&(f=!0,k+="'+__e("+c+")+'"),h&&(g=!0,k+="';"+h+";\n__p+='"),d&&(k+="'+((__t=("+d+"))==null?'':__t)+'"),j=i+b.length,b}),k+="';",(b=b.variable)||(k="with(obj){"+k+"}"),k=(g?k.replace(ga,""):k).replace(ha,"$1").replace(ia,"$1;"),k="function("+(b||"obj")+"){"+(b?"":"obj||(obj={});")+"var __t,__p=''"+(f?",__e=_.escape":"")+(g?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+k+"return __p}",b=Xf(function(){return Qd(h,m+"return "+k).apply(u,i)}),b.source=k,nd(b))throw b;return b},Ja.trim=Fd,Ja.trimLeft=function(a,b,c){var d=a;return(a=e(a))?a.slice((c?Ec(d,b,c):null==b)?q(a):f(a,b+"")):a},Ja.trimRight=function(a,b,c){var d=a;return(a=e(a))?(c?Ec(d,b,c):null==b)?a.slice(0,r(a)+1):a.slice(0,g(a,b+"")+1):a},Ja.trunc=function(a,b,c){c&&Ec(a,b,c)&&(b=u);var d=F;if(c=G,null!=b)if(pd(b)){var f="separator"in b?b.separator:f,d="length"in b?+b.length||0:d;c="omission"in b?e(b.omission):c}else d=+b||0;if(a=e(a),d>=a.length)return a;if(d-=c.length,1>d)return c;if(b=a.slice(0,d),null==f)return b+c;if(td(f)){if(a.slice(d).search(f)){var g,h=a.slice(0,d);for(f.global||(f=Ud(f.source,(ya.exec(f)||"")+"g")),f.lastIndex=0;a=f.exec(h);)g=a.index;b=b.slice(0,null==g?d:g)}}else a.indexOf(f,d)!=d&&(f=b.lastIndexOf(f),-1<f&&(b=b.slice(0,f)));return b+c},Ja.unescape=function(a){return(a=e(a))&&la.test(a)?a.replace(ja,s):a},Ja.uniqueId=function(a){var b=++ae;return e(a)+b},Ja.words=Gd,Ja.all=ad,Ja.any=fd,Ja.contains=cd,Ja.eq=md,Ja.detect=bf,Ja.foldl=kf,Ja.foldr=lf,Ja.head=Sc,Ja.include=cd,Ja.inject=kf,Kd(Ja,function(){var a={};return nb(Ja,function(b,c){Ja.prototype[c]||(a[c]=b)}),a}(),!1),Ja.sample=ed,Ja.prototype.sample=function(a){return this.__chain__||null!=a?this.thru(function(b){return ed(b,a)}):ed(this.value())},Ja.VERSION=v,Ra("bind bindKey curry curryRight partial partialRight".split(" "),function(a){Ja[a].placeholder=Ja}),Ra(["drop","take"],function(a,b){Ma.prototype[a]=function(c){var d=this.__filtered__;if(d&&!b)return new Ma(this);c=null==c?1:ue(qe(c)||0,0);var e=this.clone();return d?e.__takeCount__=ve(e.__takeCount__,c):e.__views__.push({size:c,type:a+(0>e.__dir__?"Right":"")}),e},Ma.prototype[a+"Right"]=function(b){return this.reverse()[a](b).reverse()}}),Ra(["filter","map","takeWhile"],function(a,b){var c=b+1,d=c!=L;Ma.prototype[a]=function(a,b){var e=this.clone();return e.__iteratees__.push({iteratee:tc(a,b,1),type:c}),e.__filtered__=e.__filtered__||d,e}}),Ra(["first","last"],function(a,b){var c="take"+(b?"Right":"");Ma.prototype[a]=function(){return this[c](1).value()[0]}}),Ra(["initial","rest"],function(a,b){var c="drop"+(b?"":"Right");Ma.prototype[a]=function(){return this.__filtered__?new Ma(this):this[c](1)}}),Ra(["pluck","where"],function(a,b){var c=b?"filter":"map",d=b?ub:Md;Ma.prototype[a]=function(a){return this[c](d(a))}}),Ma.prototype.compact=function(){return this.filter(Id)},Ma.prototype.reject=function(a,b){return a=tc(a,b,1),this.filter(function(b){return!a(b)})},Ma.prototype.slice=function(a,b){a=null==a?0:+a||0;var c=this;return c.__filtered__&&(0<a||0>b)?new Ma(c):(0>a?c=c.takeRight(-a):a&&(c=c.drop(a)),b!==u&&(b=+b||0,c=0>b?c.dropRight(-b):c.take(b-a)),c)},Ma.prototype.takeRightWhile=function(a,b){return this.reverse().takeWhile(a,b).reverse()},Ma.prototype.toArray=function(){return this.take(Ae)},nb(Ma.prototype,function(a,b){var c=/^(?:filter|map|reject)|While$/.test(b),d=/^(?:first|last)$/.test(b),e=Ja[d?"take"+("last"==b?"Right":""):b];e&&(Ja.prototype[b]=function(){function b(a){return d&&g?e(a,1)[0]:e.apply(u,Xa([a],f))}var f=d?[1]:arguments,g=this.__chain__,h=this.__wrapped__,i=!!this.__actions__.length,j=h instanceof Ma,k=f[0],l=j||Bf(h);return l&&c&&"function"==typeof k&&1!=k.length&&(j=l=!1),k={func:_c,args:[b],thisArg:u},i=j&&!i,d&&!g?i?(h=h.clone(),h.__actions__.push(k),a.call(h)):e.call(u,this.value())[0]:!d&&l?(h=i?h:new Ma(this),h=a.apply(h,f),h.__actions__.push(k),new La(h,g)):this.thru(b)})}),Ra("join pop push replace shift sort splice split unshift".split(" "),function(a){var b=(/^(?:replace|split)$/.test(a)?Zd:Xd)[a],c=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",d=/^(?:join|pop|replace|shift)$/.test(a);Ja.prototype[a]=function(){var a=arguments;return d&&!this.__chain__?b.apply(this.value(),a):this[c](function(c){return b.apply(c,a)})}}),nb(Ma.prototype,function(a,b){var c=Ja[b];if(c){var d=c.name+"";(Fe[d]||(Fe[d]=[])).push({name:b,func:c})}}),Fe[kc(u,x).name]=[{name:"wrapper",func:u}],Ma.prototype.clone=function(){var a=new Ma(this.__wrapped__);return a.__actions__=Qa(this.__actions__),a.__dir__=this.__dir__,a.__filtered__=this.__filtered__,a.__iteratees__=Qa(this.__iteratees__),a.__takeCount__=this.__takeCount__,a.__views__=Qa(this.__views__),a},Ma.prototype.reverse=function(){if(this.__filtered__){var a=new Ma(this);a.__dir__=-1,a.__filtered__=!0}else a=this.clone(),a.__dir__*=-1;return a},Ma.prototype.value=function(){var a,b=this.__wrapped__.value(),c=this.__dir__,d=Bf(b),e=0>c,f=d?b.length:0;a=f;for(var g=this.__views__,h=0,i=-1,j=g.length;++i<j;){var k=g[i],l=k.size;switch(k.type){case"drop":h+=l;break;case"dropRight":a-=l;break;case"take":a=ve(a,h+l);break;case"takeRight":h=ue(h,a-l)}}if(a={start:h,end:a},g=a.start,h=a.end,a=h-g,e=e?h:g-1,g=this.__iteratees__,h=g.length,i=0,j=ve(a,this.__takeCount__),!d||f<J||f==a&&j==a)return Kb(b,this.__actions__);d=[];a:for(;a--&&i<j;){for(e+=c,f=-1,k=b[e];++f<h;){var m=g[f],l=m.type,m=m.iteratee(k);if(l==L)k=m;else if(!m){if(l==K)continue a;break a}}d[i++]=k}return d},Ja.prototype.chain=function(){return $c(this)},Ja.prototype.commit=function(){return new La(this.value(),this.__chain__)},Ja.prototype.concat=$e,Ja.prototype.plant=function(a){for(var b,c=this;c instanceof Ka;){var d=Pc(c);b?e.__wrapped__=d:b=d;var e=d,c=c.__wrapped__}return e.__wrapped__=a,b},Ja.prototype.reverse=function(){function a(a){return a.reverse()}var b=this.__wrapped__;return b instanceof Ma?(this.__actions__.length&&(b=new Ma(this)),b=b.reverse(),b.__actions__.push({func:_c,args:[a],thisArg:u}),new La(b,this.__chain__)):this.thru(a)},Ja.prototype.toString=function(){return this.value()+""},Ja.prototype.run=Ja.prototype.toJSON=Ja.prototype.valueOf=Ja.prototype.value=function(){return Kb(this.__wrapped__,this.__actions__)},Ja.prototype.collect=Ja.prototype.map, +Ja.prototype.head=Ja.prototype.first,Ja.prototype.select=Ja.prototype.filter,Ja.prototype.tail=Ja.prototype.rest,Ja}var u,v="3.10.1",w=1,x=2,y=4,z=8,A=16,B=32,C=64,D=128,E=256,F=30,G="...",H=150,I=16,J=200,K=1,L=2,M="Expected a function",N="__lodash_placeholder__",O="[object Arguments]",P="[object Array]",Q="[object Boolean]",R="[object Date]",S="[object Error]",T="[object Function]",U="[object Number]",V="[object Object]",W="[object RegExp]",X="[object String]",Y="[object ArrayBuffer]",Z="[object Float32Array]",$="[object Float64Array]",_="[object Int8Array]",aa="[object Int16Array]",ba="[object Int32Array]",ca="[object Uint8Array]",da="[object Uint8ClampedArray]",ea="[object Uint16Array]",fa="[object Uint32Array]",ga=/\b__p\+='';/g,ha=/\b(__p\+=)''\+/g,ia=/(__e\(.*?\)|\b__t\))\+'';/g,ja=/&(?:amp|lt|gt|quot|#39|#96);/g,ka=/[&<>"'`]/g,la=RegExp(ja.source),ma=RegExp(ka.source),na=/<%-([\s\S]+?)%>/g,oa=/<%([\s\S]+?)%>/g,pa=/<%=([\s\S]+?)%>/g,qa=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,ra=/^\w*$/,sa=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g,ta=/^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g,ua=RegExp(ta.source),va=/[\u0300-\u036f\ufe20-\ufe23]/g,wa=/\\(\\)?/g,xa=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ya=/\w*$/,za=/^0[xX]/,Aa=/^\[object .+?Constructor\]$/,Ba=/^\d+$/,Ca=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,Da=/($^)/,Ea=/['\n\r\u2028\u2029\\]/g,Fa=RegExp("[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?=[A-Z\\xc0-\\xd6\\xd8-\\xde][a-z\\xdf-\\xf6\\xf8-\\xff]+)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|[0-9]+","g"),Ga="Array ArrayBuffer Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Math Number Object RegExp Set String _ clearTimeout isFinite parseFloat parseInt setTimeout TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap".split(" "),Ha={};Ha[Z]=Ha[$]=Ha[_]=Ha[aa]=Ha[ba]=Ha[ca]=Ha[da]=Ha[ea]=Ha[fa]=!0,Ha[O]=Ha[P]=Ha[Y]=Ha[Q]=Ha[R]=Ha[S]=Ha[T]=Ha["[object Map]"]=Ha[U]=Ha[V]=Ha[W]=Ha["[object Set]"]=Ha[X]=Ha["[object WeakMap]"]=!1;var Ia={};Ia[O]=Ia[P]=Ia[Y]=Ia[Q]=Ia[R]=Ia[Z]=Ia[$]=Ia[_]=Ia[aa]=Ia[ba]=Ia[U]=Ia[V]=Ia[W]=Ia[X]=Ia[ca]=Ia[da]=Ia[ea]=Ia[fa]=!0,Ia[S]=Ia[T]=Ia["[object Map]"]=Ia["[object Set]"]=Ia["[object WeakMap]"]=!1;var Ja={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"},Ka={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},La={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},Ma={"function":!0,object:!0},Na={0:"x30",1:"x31",2:"x32",3:"x33",4:"x34",5:"x35",6:"x36",7:"x37",8:"x38",9:"x39",A:"x41",B:"x42",C:"x43",D:"x44",E:"x45",F:"x46",a:"x61",b:"x62",c:"x63",d:"x64",e:"x65",f:"x66",n:"x6e",r:"x72",t:"x74",u:"x75",v:"x76",x:"x78"},Oa={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Pa=Ma[typeof exports]&&exports&&!exports.nodeType&&exports,Qa=Ma[typeof module]&&module&&!module.nodeType&&module,Ra=Ma[typeof self]&&self&&self.Object&&self,Sa=Ma[typeof window]&&window&&window.Object&&window,Ta=Qa&&Qa.exports===Pa&&Pa,Ua=Pa&&Qa&&"object"==typeof global&&global&&global.Object&&global||Sa!==(this&&this.window)&&Sa||Ra||this,Va=t();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(Ua._=Va,define(function(){return Va})):Pa&&Qa?Ta?(Qa.exports=Va)._=Va:Pa._=Va:Ua._=Va}.call(this),function(a,b){a(function(){function a(a,b){return null!=a&&null!=b&&a.toLowerCase()===b.toLowerCase()}function c(a,b){var c,d,e=a.length;if(!e||!b)return!1;for(c=b.toLowerCase(),d=0;d<e;++d)if(c===a[d].toLowerCase())return!0;return!1}function d(a){for(var b in a)h.call(a,b)&&(a[b]=new RegExp(a[b],"i"))}function e(a,b){this.ua=a||"",this._cache={},this.maxPhoneWidth=b||600}var f={};f.mobileDetectRules={phones:{iPhone:"\\biPhone\\b|\\biPod\\b",BlackBerry:"BlackBerry|\\bBB10\\b|rim[0-9]+",HTC:"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m",Nexus:"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6",Dell:"Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b",Motorola:"Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\bMoto E\\b",Samsung:"Samsung|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F",LG:"\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)",Sony:"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533",Asus:"Asus.*Galaxy|PadFone.*Mobile",NokiaLumia:"Lumia [0-9]{3,4}",Micromax:"Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b",Palm:"PalmSource|Palm",Vertu:"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature",Pantech:"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790",Fly:"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250",Wiko:"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM",iMobile:"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)",SimValley:"\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b",Wolfgang:"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q",Alcatel:"Alcatel",Nintendo:"Nintendo 3DS",Amoi:"Amoi",INQ:"INQ",GenericPhone:"Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser"},tablets:{iPad:"iPad|iPad.*Mobile",NexusTablet:"Android.*Nexus[\\s]+(7|9|10)",SamsungTablet:"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561",Kindle:"Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI)\\b",SurfaceTablet:"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)",HPTablet:"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10",AsusTablet:"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K017 |ME572C|ME103K|ME170C|ME171C|\\bME70C\\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA",BlackBerryTablet:"PlayBook|RIM Tablet",HTCtablet:"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410",MotorolaTablet:"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617",NookTablet:"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2",AcerTablet:"Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b|\\bA3-A20",ToshibaTablet:"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO",LGTablet:"\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b",FujitsuTablet:"Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b",PrestigioTablet:"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002",LenovoTablet:"Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)",DellTablet:"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7",YarvikTablet:"Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b",MedionTablet:"Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB",ArnovaTablet:"AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2",IntensoTablet:"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004",IRUTablet:"M702pro",MegafonTablet:"MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b",EbodaTablet:"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)",AllViewTablet:"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)",ArchosTablet:"\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b",AinolTablet:"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark",NokiaLumiaTablet:"Lumia 2520",SonyTablet:"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31",PhilipsTablet:"\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b",CubeTablet:"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT",CobyTablet:"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010",MIDTablet:"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10",MSITablet:"MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b",SMiTTablet:"Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)",RockChipTablet:"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A",FlyTablet:"IQ310|Fly Vision",bqTablet:"Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus",HuaweiTablet:"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim",NecTablet:"\\bN-06D|\\bN-08D",PantechTablet:"Pantech.*P4100",BronchoTablet:"Broncho.*(N701|N708|N802|a710)",VersusTablet:"TOUCHPAD.*[78910]|\\bTOUCHTAB\\b",ZyncTablet:"z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900",PositivoTablet:"TB07STA|TB10STA|TB07FTA|TB10FTA",NabiTablet:"Android.*\\bNabi",KoboTablet:"Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build",DanewTablet:"DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b",TexetTablet:"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE",PlaystationTablet:"Playstation.*(Portable|Vita)",TrekstorTablet:"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab",PyleAudioTablet:"\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b",AdvanTablet:"Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ",DanyTechTablet:"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1",GalapadTablet:"Android.*\\bG1\\b",MicromaxTablet:"Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b",KarbonnTablet:"Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b",AllFineTablet:"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide",PROSCANTablet:"\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b",YONESTablet:"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026",ChangJiaTablet:"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503",GUTablet:"TX-A1301|TX-M9002|Q702|kf026",PointOfViewTablet:"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10",OvermaxTablet:"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)",HCLTablet:"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync",DPSTablet:"DPS Dream 9|DPS Dual 7",VistureTablet:"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10",CrestaTablet:"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989",MediatekTablet:"\\bMT8125|MT8389|MT8135|MT8377\\b",ConcordeTablet:"Concorde([ ]+)?Tab|ConCorde ReadMan",GoCleverTablet:"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042",ModecomTablet:"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003",VoninoTablet:"\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b",ECSTablet:"V07OT2|TM105A|S10OT1|TR10CS1",StorexTablet:"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab",VodafoneTablet:"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497",EssentielBTablet:"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2",RossMoorTablet:"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711",iMobileTablet:"i-mobile i-note",TolinoTablet:"tolino tab [0-9.]+|tolino shine",AudioSonicTablet:"\\bC-22Q|T7-QC|T-17B|T-17P\\b",AMPETablet:"Android.* A78 ",SkkTablet:"Android.* (SKYPAD|PHOENIX|CYCLOPS)",TecnoTablet:"TECNO P9",JXDTablet:"Android.* \\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b",iJoyTablet:"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)",FX2Tablet:"FX2 PAD7|FX2 PAD10",XoroTablet:"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151",ViewsonicTablet:"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a",OdysTablet:"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10",CaptivaTablet:"CAPTIVA PAD",IconbitTablet:"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S",TeclastTablet:"T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air|\\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b|\\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b|\\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b|\\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b|\\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b|\\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b|\\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b|\\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi",OndaTablet:"\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\b[\\s]+",JaytechTablet:"TPC-PA762",BlaupunktTablet:"Endeavour 800NG|Endeavour 1010",DigmaTablet:"\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b",EvolioTablet:"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b",LavaTablet:"QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b",AocTablet:"MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712",MpmanTablet:"MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\\bMPG7\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010",CelkonTablet:"CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b",WolderTablet:"miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b",MiTablet:"\\bMI PAD\\b|\\bHM NOTE 1W\\b",NibiruTablet:"Nibiru M1|Nibiru Jupiter One",NexoTablet:"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI",LeaderTablet:"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100",UbislateTablet:"UbiSlate[\\s]?7C",PocketBookTablet:"Pocketbook",KocasoTablet:"\\b(TB-1207)\\b",Hudl:"Hudl HT7S3|Hudl 2",TelstraTablet:"T-Hub2",GenericTablet:"Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bJolla\\b|\\bTP750\\b"},oss:{AndroidOS:"Android",BlackBerryOS:"blackberry|\\bBB10\\b|rim tablet os",PalmOS:"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino",SymbianOS:"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b",WindowsMobileOS:"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;",WindowsPhoneOS:"Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;",iOS:"\\biPhone.*Mobile|\\biPod|\\biPad",MeeGoOS:"MeeGo",MaemoOS:"Maemo",JavaOS:"J2ME/|\\bMIDP\\b|\\bCLDC\\b",webOS:"webOS|hpwOS",badaOS:"\\bBada\\b",BREWOS:"BREW"},uas:{Vivaldi:"Vivaldi",Chrome:"\\bCrMo\\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?",Dolfin:"\\bDolfin\\b",Opera:"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+",Skyfire:"Skyfire",Edge:"Mobile Safari/[.0-9]* Edge",IE:"IEMobile|MSIEMobile",Firefox:"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile",Bolt:"bolt",TeaShark:"teashark",Blazer:"Blazer",Safari:"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari",Tizen:"Tizen",UCBrowser:"UC.*Browser|UCWEB",baiduboxapp:"baiduboxapp",baidubrowser:"baidubrowser",DiigoBrowser:"DiigoBrowser",Puffin:"Puffin",Mercury:"\\bMercury\\b",ObigoBrowser:"Obigo",NetFront:"NF-Browser",GenericBrowser:"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger",PaleMoon:"Android.*PaleMoon|Mobile.*PaleMoon"},props:{Mobile:"Mobile/[VER]",Build:"Build/[VER]",Version:"Version/[VER]",VendorID:"VendorID/[VER]",iPad:"iPad.*CPU[a-z ]+[VER]",iPhone:"iPhone.*CPU[a-z ]+[VER]",iPod:"iPod.*CPU[a-z ]+[VER]",Kindle:"Kindle/[VER]",Chrome:["Chrome/[VER]","CriOS/[VER]","CrMo/[VER]"],Coast:["Coast/[VER]"],Dolfin:"Dolfin/[VER]",Firefox:"Firefox/[VER]",Fennec:"Fennec/[VER]",Edge:"Edge/[VER]",IE:["IEMobile/[VER];","IEMobile [VER]","MSIE [VER];","Trident/[0-9.]+;.*rv:[VER]"],NetFront:"NetFront/[VER]", +NokiaBrowser:"NokiaBrowser/[VER]",Opera:[" OPR/[VER]","Opera Mini/[VER]","Version/[VER]"],"Opera Mini":"Opera Mini/[VER]","Opera Mobi":"Version/[VER]","UC Browser":"UC Browser[VER]",MQQBrowser:"MQQBrowser/[VER]",MicroMessenger:"MicroMessenger/[VER]",baiduboxapp:"baiduboxapp/[VER]",baidubrowser:"baidubrowser/[VER]",Iron:"Iron/[VER]",Safari:["Version/[VER]","Safari/[VER]"],Skyfire:"Skyfire/[VER]",Tizen:"Tizen/[VER]",Webkit:"webkit[ /][VER]",PaleMoon:"PaleMoon/[VER]",Gecko:"Gecko/[VER]",Trident:"Trident/[VER]",Presto:"Presto/[VER]",Goanna:"Goanna/[VER]",iOS:" \\bi?OS\\b [VER][ ;]{1}",Android:"Android [VER]",BlackBerry:["BlackBerry[\\w]+/[VER]","BlackBerry.*Version/[VER]","Version/[VER]"],BREW:"BREW [VER]",Java:"Java/[VER]","Windows Phone OS":["Windows Phone OS [VER]","Windows Phone [VER]"],"Windows Phone":"Windows Phone [VER]","Windows CE":"Windows CE/[VER]","Windows NT":"Windows NT [VER]",Symbian:["SymbianOS/[VER]","Symbian/[VER]"],webOS:["webOS/[VER]","hpwOS/[VER];"]},utils:{Bot:"Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom",MobileBot:"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2",DesktopMode:"WPDesktop",TV:"SonyDTV|HbbTV",WebKit:"(webkit)[ /]([\\w.]+)",Console:"\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b",Watch:"SM-V700"}},f.detectMobileBrowsers={fullPattern:/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,shortPattern:/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,tabletPattern:/android|ipad|playbook|silk/i};var g,h=Object.prototype.hasOwnProperty;return f.FALLBACK_PHONE="UnknownPhone",f.FALLBACK_TABLET="UnknownTablet",f.FALLBACK_MOBILE="UnknownMobile",g="isArray"in Array?Array.isArray:function(a){return"[object Array]"===Object.prototype.toString.call(a)},function(){var a,b,c,e,i,j,k=f.mobileDetectRules;for(a in k.props)if(h.call(k.props,a)){for(b=k.props[a],g(b)||(b=[b]),i=b.length,e=0;e<i;++e)c=b[e],j=c.indexOf("[VER]"),j>=0&&(c=c.substring(0,j)+"([\\w._\\+]+)"+c.substring(j+5)),b[e]=new RegExp(c,"i");k.props[a]=b}d(k.oss),d(k.phones),d(k.tablets),d(k.uas),d(k.utils),k.oss0={WindowsPhoneOS:k.oss.WindowsPhoneOS,WindowsMobileOS:k.oss.WindowsMobileOS}}(),f.findMatch=function(a,b){for(var c in a)if(h.call(a,c)&&a[c].test(b))return c;return null},f.findMatches=function(a,b){var c=[];for(var d in a)h.call(a,d)&&a[d].test(b)&&c.push(d);return c},f.getVersionStr=function(a,b){var c,d,e,g,i=f.mobileDetectRules.props;if(h.call(i,a))for(c=i[a],e=c.length,d=0;d<e;++d)if(g=c[d].exec(b),null!==g)return g[1];return null},f.getVersion=function(a,b){var c=f.getVersionStr(a,b);return c?f.prepareVersionNo(c):NaN},f.prepareVersionNo=function(a){var b;return b=a.split(/[a-z._ \/\-]/i),1===b.length&&(a=b[0]),b.length>1&&(a=b[0]+".",b.shift(),a+=b.join("")),Number(a)},f.isMobileFallback=function(a){return f.detectMobileBrowsers.fullPattern.test(a)||f.detectMobileBrowsers.shortPattern.test(a.substr(0,4))},f.isTabletFallback=function(a){return f.detectMobileBrowsers.tabletPattern.test(a)},f.prepareDetectionCache=function(a,c,d){if(a.mobile===b){var g,h,i;return(h=f.findMatch(f.mobileDetectRules.tablets,c))?(a.mobile=a.tablet=h,void(a.phone=null)):(g=f.findMatch(f.mobileDetectRules.phones,c))?(a.mobile=a.phone=g,void(a.tablet=null)):void(f.isMobileFallback(c)?(i=e.isPhoneSized(d),i===b?(a.mobile=f.FALLBACK_MOBILE,a.tablet=a.phone=null):i?(a.mobile=a.phone=f.FALLBACK_PHONE,a.tablet=null):(a.mobile=a.tablet=f.FALLBACK_TABLET,a.phone=null)):f.isTabletFallback(c)?(a.mobile=a.tablet=f.FALLBACK_TABLET,a.phone=null):a.mobile=a.tablet=a.phone=null)}},f.mobileGrade=function(a){var b=null!==a.mobile();return a.os("iOS")&&a.version("iPad")>=4.3||a.os("iOS")&&a.version("iPhone")>=3.1||a.os("iOS")&&a.version("iPod")>=3.1||a.version("Android")>2.1&&a.is("Webkit")||a.version("Windows Phone OS")>=7||a.is("BlackBerry")&&a.version("BlackBerry")>=6||a.match("Playbook.*Tablet")||a.version("webOS")>=1.4&&a.match("Palm|Pre|Pixi")||a.match("hp.*TouchPad")||a.is("Firefox")&&a.version("Firefox")>=12||a.is("Chrome")&&a.is("AndroidOS")&&a.version("Android")>=4||a.is("Skyfire")&&a.version("Skyfire")>=4.1&&a.is("AndroidOS")&&a.version("Android")>=2.3||a.is("Opera")&&a.version("Opera Mobi")>11&&a.is("AndroidOS")||a.is("MeeGoOS")||a.is("Tizen")||a.is("Dolfin")&&a.version("Bada")>=2||(a.is("UC Browser")||a.is("Dolfin"))&&a.version("Android")>=2.3||a.match("Kindle Fire")||a.is("Kindle")&&a.version("Kindle")>=3||a.is("AndroidOS")&&a.is("NookTablet")||a.version("Chrome")>=11&&!b||a.version("Safari")>=5&&!b||a.version("Firefox")>=4&&!b||a.version("MSIE")>=7&&!b||a.version("Opera")>=10&&!b?"A":a.os("iOS")&&a.version("iPad")<4.3||a.os("iOS")&&a.version("iPhone")<3.1||a.os("iOS")&&a.version("iPod")<3.1||a.is("Blackberry")&&a.version("BlackBerry")>=5&&a.version("BlackBerry")<6||a.version("Opera Mini")>=5&&a.version("Opera Mini")<=6.5&&(a.version("Android")>=2.3||a.is("iOS"))||a.match("NokiaN8|NokiaC7|N97.*Series60|Symbian/3")||a.version("Opera Mobi")>=11&&a.is("SymbianOS")?"B":(a.version("BlackBerry")<5||a.match("MSIEMobile|Windows CE.*Mobile")||a.version("Windows Mobile")<=5.2,"C")},f.detectOS=function(a){return f.findMatch(f.mobileDetectRules.oss0,a)||f.findMatch(f.mobileDetectRules.oss,a)},f.getDeviceSmallerSide=function(){return window.screen.width<window.screen.height?window.screen.width:window.screen.height},e.prototype={constructor:e,mobile:function(){return f.prepareDetectionCache(this._cache,this.ua,this.maxPhoneWidth),this._cache.mobile},phone:function(){return f.prepareDetectionCache(this._cache,this.ua,this.maxPhoneWidth),this._cache.phone},tablet:function(){return f.prepareDetectionCache(this._cache,this.ua,this.maxPhoneWidth),this._cache.tablet},userAgent:function(){return this._cache.userAgent===b&&(this._cache.userAgent=f.findMatch(f.mobileDetectRules.uas,this.ua)),this._cache.userAgent},userAgents:function(){return this._cache.userAgents===b&&(this._cache.userAgents=f.findMatches(f.mobileDetectRules.uas,this.ua)),this._cache.userAgents},os:function(){return this._cache.os===b&&(this._cache.os=f.detectOS(this.ua)),this._cache.os},version:function(a){return f.getVersion(a,this.ua)},versionStr:function(a){return f.getVersionStr(a,this.ua)},is:function(b){return c(this.userAgents(),b)||a(b,this.os())||a(b,this.phone())||a(b,this.tablet())||c(f.findMatches(f.mobileDetectRules.utils,this.ua),b)},match:function(a){return a instanceof RegExp||(a=new RegExp(a,"i")),a.test(this.ua)},isPhoneSized:function(a){return e.isPhoneSized(a||this.maxPhoneWidth)},mobileGrade:function(){return this._cache.grade===b&&(this._cache.grade=f.mobileGrade(this)),this._cache.grade}},"undefined"!=typeof window&&window.screen?e.isPhoneSized=function(a){return a<0?b:f.getDeviceSmallerSide()<=a}:e.isPhoneSized=function(){},e._impl=f,e.version="1.3.3 2016-07-31",e})}(function(a){if("undefined"!=typeof module&&module.exports)return function(a){module.exports=a()};if("function"==typeof define&&define.amd)return define;if("undefined"!=typeof window)return function(a){window.MobileDetect=a()};throw new Error("unknown environment")}()),function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.jsyaml=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){function d(a){return function(){throw new Error("Function "+a+" is deprecated and cannot be used.")}}var e=a("./js-yaml/loader"),f=a("./js-yaml/dumper");b.exports.Type=a("./js-yaml/type"),b.exports.Schema=a("./js-yaml/schema"),b.exports.FAILSAFE_SCHEMA=a("./js-yaml/schema/failsafe"),b.exports.JSON_SCHEMA=a("./js-yaml/schema/json"),b.exports.CORE_SCHEMA=a("./js-yaml/schema/core"),b.exports.DEFAULT_SAFE_SCHEMA=a("./js-yaml/schema/default_safe"),b.exports.DEFAULT_FULL_SCHEMA=a("./js-yaml/schema/default_full"),b.exports.load=e.load,b.exports.loadAll=e.loadAll,b.exports.safeLoad=e.safeLoad,b.exports.safeLoadAll=e.safeLoadAll,b.exports.dump=f.dump,b.exports.safeDump=f.safeDump,b.exports.YAMLException=a("./js-yaml/exception"),b.exports.MINIMAL_SCHEMA=a("./js-yaml/schema/failsafe"),b.exports.SAFE_SCHEMA=a("./js-yaml/schema/default_safe"),b.exports.DEFAULT_SCHEMA=a("./js-yaml/schema/default_full"),b.exports.scan=d("scan"),b.exports.parse=d("parse"),b.exports.compose=d("compose"),b.exports.addConstructor=d("addConstructor")},{"./js-yaml/dumper":3,"./js-yaml/exception":4,"./js-yaml/loader":5,"./js-yaml/schema":7,"./js-yaml/schema/core":8,"./js-yaml/schema/default_full":9,"./js-yaml/schema/default_safe":10,"./js-yaml/schema/failsafe":11,"./js-yaml/schema/json":12,"./js-yaml/type":13}],2:[function(a,b,c){function d(a){return"undefined"==typeof a||null===a}function e(a){return"object"==typeof a&&null!==a}function f(a){return Array.isArray(a)?a:d(a)?[]:[a]}function g(a,b){var c,d,e,f;if(b)for(f=Object.keys(b),c=0,d=f.length;c<d;c+=1)e=f[c],a[e]=b[e];return a}function h(a,b){var c,d="";for(c=0;c<b;c+=1)d+=a;return d}function i(a){return 0===a&&Number.NEGATIVE_INFINITY===1/a}b.exports.isNothing=d,b.exports.isObject=e,b.exports.toArray=f,b.exports.repeat=h,b.exports.isNegativeZero=i,b.exports.extend=g},{}],3:[function(a,b,c){function d(a,b){var c,d,e,f,g,h,i;if(null===b)return{};for(c={},d=Object.keys(b),e=0,f=d.length;e<f;e+=1)g=d[e],h=String(b[g]),"!!"===g.slice(0,2)&&(g="tag:yaml.org,2002:"+g.slice(2)),i=a.compiledTypeMap[g],i&&J.call(i.styleAliases,h)&&(h=i.styleAliases[h]),c[g]=h;return c}function e(a){var b,c,d;if(b=a.toString(16).toUpperCase(),a<=255)c="x",d=2;else if(a<=65535)c="u",d=4;else{if(!(a<=4294967295))throw new F("code point within a string may not be greater than 0xFFFFFFFF");c="U",d=8}return"\\"+c+E.repeat("0",d-b.length)+b}function f(a){this.schema=a.schema||G,this.indent=Math.max(1,a.indent||2),this.skipInvalid=a.skipInvalid||!1,this.flowLevel=E.isNothing(a.flowLevel)?-1:a.flowLevel,this.styleMap=d(this.schema,a.styles||null),this.sortKeys=a.sortKeys||!1,this.lineWidth=a.lineWidth||80,this.noRefs=a.noRefs||!1,this.noCompatMode=a.noCompatMode||!1,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function g(a,b){for(var c,d=E.repeat(" ",b),e=0,f=-1,g="",h=a.length;e<h;)f=a.indexOf("\n",e),f===-1?(c=a.slice(e),e=h):(c=a.slice(e,f+1),e=f+1),c.length&&"\n"!==c&&(g+=d),g+=c;return g}function h(a,b){return"\n"+E.repeat(" ",a.indent*b)}function i(a,b){var c,d,e;for(c=0,d=a.implicitTypes.length;c<d;c+=1)if(e=a.implicitTypes[c],e.resolve(b))return!0;return!1}function j(a){return a===M||a===K}function k(a){return 32<=a&&a<=126||161<=a&&a<=55295&&8232!==a&&8233!==a||57344<=a&&a<=65533&&65279!==a||65536<=a&&a<=1114111}function l(a){return k(a)&&65279!==a&&a!==U&&a!==$&&a!==_&&a!==ba&&a!==da&&a!==W&&a!==P}function m(a){return k(a)&&65279!==a&&!j(a)&&a!==V&&a!==Y&&a!==W&&a!==U&&a!==$&&a!==_&&a!==ba&&a!==da&&a!==P&&a!==R&&a!==T&&a!==N&&a!==ca&&a!==X&&a!==S&&a!==O&&a!==Q&&a!==Z&&a!==aa}function n(a,b,c,d,e){var f,g,h=!1,i=!1,n=d!==-1,o=-1,p=m(a.charCodeAt(0))&&!j(a.charCodeAt(a.length-1));if(b)for(f=0;f<a.length;f++){if(g=a.charCodeAt(f),!k(g))return ka;p=p&&l(g)}else{for(f=0;f<a.length;f++){if(g=a.charCodeAt(f),g===L)h=!0,n&&(i=i||f-o-1>d&&" "!==a[o+1],o=f);else if(!k(g))return ka;p=p&&l(g)}i=i||n&&f-o-1>d&&" "!==a[o+1]}return h||i?" "===a[0]&&c>9?ka:i?ja:ia:p&&!e(a)?ga:ha}function o(a,b,c,d){a.dump=function(){function e(b){return i(a,b)}if(0===b.length)return"''";if(!a.noCompatMode&&fa.indexOf(b)!==-1)return"'"+b+"'";var f=a.indent*Math.max(1,c),h=a.lineWidth===-1?-1:Math.max(Math.min(a.lineWidth,40),a.lineWidth-f),j=d||a.flowLevel>-1&&c>=a.flowLevel;switch(n(b,j,a.indent,h,e)){case ga:return b;case ha:return"'"+b.replace(/'/g,"''")+"'";case ia:return"|"+p(b,a.indent)+q(g(b,f));case ja:return">"+p(b,a.indent)+q(g(r(b,h),f));case ka:return'"'+t(b,h)+'"';default:throw new F("impossible error: invalid scalar style")}}()}function p(a,b){var c=" "===a[0]?String(b):"",d="\n"===a[a.length-1],e=d&&("\n"===a[a.length-2]||"\n"===a),f=e?"+":d?"":"-";return c+f+"\n"}function q(a){return"\n"===a[a.length-1]?a.slice(0,-1):a}function r(a,b){for(var c,d,e=/(\n+)([^\n]*)/g,f=function(){var c=a.indexOf("\n");return c=c!==-1?c:a.length,e.lastIndex=c,s(a.slice(0,c),b)}(),g="\n"===a[0]||" "===a[0];d=e.exec(a);){var h=d[1],i=d[2];c=" "===i[0],f+=h+(g||c||""===i?"":"\n")+s(i,b),g=c}return f}function s(a,b){if(""===a||" "===a[0])return a;for(var c,d,e=/ [^ ]/g,f=0,g=0,h=0,i="";c=e.exec(a);)h=c.index,h-f>b&&(d=g>f?g:h,i+="\n"+a.slice(f,d),f=d+1),g=h;return i+="\n",i+=a.length-f>b&&g>f?a.slice(f,g)+"\n"+a.slice(g+1):a.slice(f),i.slice(1)}function t(a){for(var b,c,d="",f=0;f<a.length;f++)b=a.charCodeAt(f),c=ea[b],d+=!c&&k(b)?a[f]:c||e(b);return d}function u(a,b,c){var d,e,f="",g=a.tag;for(d=0,e=c.length;d<e;d+=1)z(a,b,c[d],!1,!1)&&(0!==d&&(f+=", "),f+=a.dump);a.tag=g,a.dump="["+f+"]"}function v(a,b,c,d){var e,f,g="",i=a.tag;for(e=0,f=c.length;e<f;e+=1)z(a,b+1,c[e],!0,!0)&&(d&&0===e||(g+=h(a,b)),g+="- "+a.dump);a.tag=i,a.dump=g||"[]"}function w(a,b,c){var d,e,f,g,h,i="",j=a.tag,k=Object.keys(c);for(d=0,e=k.length;d<e;d+=1)h="",0!==d&&(h+=", "),f=k[d],g=c[f],z(a,b,f,!1,!1)&&(a.dump.length>1024&&(h+="? "),h+=a.dump+": ",z(a,b,g,!1,!1)&&(h+=a.dump,i+=h));a.tag=j,a.dump="{"+i+"}"}function x(a,b,c,d){var e,f,g,i,j,k,l="",m=a.tag,n=Object.keys(c);if(a.sortKeys===!0)n.sort();else if("function"==typeof a.sortKeys)n.sort(a.sortKeys);else if(a.sortKeys)throw new F("sortKeys must be a boolean or a function");for(e=0,f=n.length;e<f;e+=1)k="",d&&0===e||(k+=h(a,b)),g=n[e],i=c[g],z(a,b+1,g,!0,!0,!0)&&(j=null!==a.tag&&"?"!==a.tag||a.dump&&a.dump.length>1024,j&&(k+=a.dump&&L===a.dump.charCodeAt(0)?"?":"? "),k+=a.dump,j&&(k+=h(a,b)),z(a,b+1,i,!0,j)&&(k+=a.dump&&L===a.dump.charCodeAt(0)?":":": ",k+=a.dump,l+=k));a.tag=m,a.dump=l||"{}"}function y(a,b,c){var d,e,f,g,h,i;for(e=c?a.explicitTypes:a.implicitTypes,f=0,g=e.length;f<g;f+=1)if(h=e[f],(h.instanceOf||h.predicate)&&(!h.instanceOf||"object"==typeof b&&b instanceof h.instanceOf)&&(!h.predicate||h.predicate(b))){if(a.tag=c?h.tag:"?",h.represent){if(i=a.styleMap[h.tag]||h.defaultStyle,"[object Function]"===I.call(h.represent))d=h.represent(b,i);else{if(!J.call(h.represent,i))throw new F("!<"+h.tag+'> tag resolver accepts not "'+i+'" style');d=h.represent[i](b,i)}a.dump=d}return!0}return!1}function z(a,b,c,d,e,f){a.tag=null,a.dump=c,y(a,c,!1)||y(a,c,!0);var g=I.call(a.dump);d&&(d=a.flowLevel<0||a.flowLevel>b);var h,i,j="[object Object]"===g||"[object Array]"===g;if(j&&(h=a.duplicates.indexOf(c),i=h!==-1),(null!==a.tag&&"?"!==a.tag||i||2!==a.indent&&b>0)&&(e=!1),i&&a.usedDuplicates[h])a.dump="*ref_"+h;else{if(j&&i&&!a.usedDuplicates[h]&&(a.usedDuplicates[h]=!0),"[object Object]"===g)d&&0!==Object.keys(a.dump).length?(x(a,b,a.dump,e),i&&(a.dump="&ref_"+h+a.dump)):(w(a,b,a.dump),i&&(a.dump="&ref_"+h+" "+a.dump));else if("[object Array]"===g)d&&0!==a.dump.length?(v(a,b,a.dump,e),i&&(a.dump="&ref_"+h+a.dump)):(u(a,b,a.dump),i&&(a.dump="&ref_"+h+" "+a.dump));else{if("[object String]"!==g){if(a.skipInvalid)return!1;throw new F("unacceptable kind of an object to dump "+g)}"?"!==a.tag&&o(a,a.dump,b,f)}null!==a.tag&&"?"!==a.tag&&(a.dump="!<"+a.tag+"> "+a.dump)}return!0}function A(a,b){var c,d,e=[],f=[];for(B(a,e,f),c=0,d=f.length;c<d;c+=1)b.duplicates.push(e[f[c]]);b.usedDuplicates=new Array(d)}function B(a,b,c){var d,e,f;if(null!==a&&"object"==typeof a)if(e=b.indexOf(a),e!==-1)c.indexOf(e)===-1&&c.push(e);else if(b.push(a),Array.isArray(a))for(e=0,f=a.length;e<f;e+=1)B(a[e],b,c);else for(d=Object.keys(a),e=0,f=d.length;e<f;e+=1)B(a[d[e]],b,c)}function C(a,b){b=b||{};var c=new f(b);return c.noRefs||A(a,c),z(c,0,a,!0,!0)?c.dump+"\n":""}function D(a,b){return C(a,E.extend({schema:H},b))}var E=a("./common"),F=a("./exception"),G=a("./schema/default_full"),H=a("./schema/default_safe"),I=Object.prototype.toString,J=Object.prototype.hasOwnProperty,K=9,L=10,M=32,N=33,O=34,P=35,Q=37,R=38,S=39,T=42,U=44,V=45,W=58,X=62,Y=63,Z=64,$=91,_=93,aa=96,ba=123,ca=124,da=125,ea={};ea[0]="\\0",ea[7]="\\a",ea[8]="\\b",ea[9]="\\t",ea[10]="\\n",ea[11]="\\v",ea[12]="\\f",ea[13]="\\r",ea[27]="\\e",ea[34]='\\"',ea[92]="\\\\",ea[133]="\\N",ea[160]="\\_",ea[8232]="\\L",ea[8233]="\\P";var fa=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],ga=1,ha=2,ia=3,ja=4,ka=5;b.exports.dump=C,b.exports.safeDump=D},{"./common":2,"./exception":4,"./schema/default_full":9,"./schema/default_safe":10}],4:[function(a,b,c){function d(a,b){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||"",this.name="YAMLException",this.reason=a,this.mark=b,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():"")}d.prototype=Object.create(Error.prototype),d.prototype.constructor=d,d.prototype.toString=function(a){var b=this.name+": ";return b+=this.reason||"(unknown reason)",!a&&this.mark&&(b+=" "+this.mark.toString()),b},b.exports=d},{}],5:[function(a,b,c){function d(a){return 10===a||13===a}function e(a){return 9===a||32===a}function f(a){return 9===a||32===a||10===a||13===a}function g(a){return 44===a||91===a||93===a||123===a||125===a}function h(a){var b;return 48<=a&&a<=57?a-48:(b=32|a,97<=b&&b<=102?b-97+10:-1)}function i(a){return 120===a?2:117===a?4:85===a?8:0}function j(a){return 48<=a&&a<=57?a-48:-1}function k(a){return 48===a?"\0":97===a?"":98===a?"\b":116===a?"\t":9===a?"\t":110===a?"\n":118===a?"\x0B":102===a?"\f":114===a?"\r":101===a?"":32===a?" ":34===a?'"':47===a?"/":92===a?"\\":78===a?"…":95===a?" ":76===a?"\u2028":80===a?"\u2029":""}function l(a){return a<=65535?String.fromCharCode(a):String.fromCharCode((a-65536>>10)+55296,(a-65536&1023)+56320)}function m(a,b){this.input=a,this.filename=b.filename||null,this.schema=b.schema||S,this.onWarning=b.onWarning||null,this.legacy=b.legacy||!1,this.json=b.json||!1,this.listener=b.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=a.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function n(a,b){return new P(b,new Q(a.filename,a.input,a.position,a.line,a.position-a.lineStart))}function o(a,b){throw n(a,b)}function p(a,b){a.onWarning&&a.onWarning.call(null,n(a,b))}function q(a,b,c,d){var e,f,g,h;if(b<c){if(h=a.input.slice(b,c),d)for(e=0,f=h.length;e<f;e+=1)g=h.charCodeAt(e),9===g||32<=g&&g<=1114111||o(a,"expected valid JSON character");else _.test(h)&&o(a,"the stream contains non-printable characters");a.result+=h}}function r(a,b,c,d){var e,f,g,h;for(O.isObject(c)||o(a,"cannot merge mappings; the provided source object is unacceptable"),e=Object.keys(c),g=0,h=e.length;g<h;g+=1)f=e[g],T.call(b,f)||(b[f]=c[f],d[f]=!0)}function s(a,b,c,d,e,f){var g,h;if(e=String(e),null===b&&(b={}),"tag:yaml.org,2002:merge"===d)if(Array.isArray(f))for(g=0,h=f.length;g<h;g+=1)r(a,b,f[g],c);else r(a,b,f,c);else a.json||T.call(c,e)||!T.call(b,e)||o(a,"duplicated mapping key"),b[e]=f,delete c[e];return b}function t(a){var b;b=a.input.charCodeAt(a.position),10===b?a.position++:13===b?(a.position++,10===a.input.charCodeAt(a.position)&&a.position++):o(a,"a line break is expected"),a.line+=1,a.lineStart=a.position}function u(a,b,c){for(var f=0,g=a.input.charCodeAt(a.position);0!==g;){for(;e(g);)g=a.input.charCodeAt(++a.position);if(b&&35===g)do g=a.input.charCodeAt(++a.position);while(10!==g&&13!==g&&0!==g);if(!d(g))break;for(t(a),g=a.input.charCodeAt(a.position),f++,a.lineIndent=0;32===g;)a.lineIndent++,g=a.input.charCodeAt(++a.position)}return c!==-1&&0!==f&&a.lineIndent<c&&p(a,"deficient indentation"),f}function v(a){var b,c=a.position;return b=a.input.charCodeAt(c),!(45!==b&&46!==b||b!==a.input.charCodeAt(c+1)||b!==a.input.charCodeAt(c+2)||(c+=3,b=a.input.charCodeAt(c),0!==b&&!f(b)))}function w(a,b){1===b?a.result+=" ":b>1&&(a.result+=O.repeat("\n",b-1))}function x(a,b,c){var h,i,j,k,l,m,n,o,p,r=a.kind,s=a.result;if(p=a.input.charCodeAt(a.position),f(p)||g(p)||35===p||38===p||42===p||33===p||124===p||62===p||39===p||34===p||37===p||64===p||96===p)return!1;if((63===p||45===p)&&(i=a.input.charCodeAt(a.position+1),f(i)||c&&g(i)))return!1;for(a.kind="scalar",a.result="",j=k=a.position,l=!1;0!==p;){if(58===p){if(i=a.input.charCodeAt(a.position+1),f(i)||c&&g(i))break}else if(35===p){if(h=a.input.charCodeAt(a.position-1),f(h))break}else{if(a.position===a.lineStart&&v(a)||c&&g(p))break;if(d(p)){if(m=a.line,n=a.lineStart,o=a.lineIndent,u(a,!1,-1),a.lineIndent>=b){l=!0,p=a.input.charCodeAt(a.position);continue}a.position=k,a.line=m,a.lineStart=n,a.lineIndent=o;break}}l&&(q(a,j,k,!1),w(a,a.line-m),j=k=a.position,l=!1),e(p)||(k=a.position+1),p=a.input.charCodeAt(++a.position)}return q(a,j,k,!1),!!a.result||(a.kind=r,a.result=s,!1)}function y(a,b){var c,e,f;if(c=a.input.charCodeAt(a.position),39!==c)return!1;for(a.kind="scalar",a.result="",a.position++,e=f=a.position;0!==(c=a.input.charCodeAt(a.position));)if(39===c){if(q(a,e,a.position,!0),c=a.input.charCodeAt(++a.position),39!==c)return!0;e=f=a.position,a.position++}else d(c)?(q(a,e,f,!0),w(a,u(a,!1,b)),e=f=a.position):a.position===a.lineStart&&v(a)?o(a,"unexpected end of the document within a single quoted scalar"):(a.position++,f=a.position);o(a,"unexpected end of the stream within a single quoted scalar")}function z(a,b){var c,e,f,g,j,k;if(k=a.input.charCodeAt(a.position),34!==k)return!1;for(a.kind="scalar",a.result="",a.position++,c=e=a.position;0!==(k=a.input.charCodeAt(a.position));){if(34===k)return q(a,c,a.position,!0),a.position++,!0;if(92===k){if(q(a,c,a.position,!0),k=a.input.charCodeAt(++a.position),d(k))u(a,!1,b);else if(k<256&&ea[k])a.result+=fa[k],a.position++;else if((j=i(k))>0){for(f=j,g=0;f>0;f--)k=a.input.charCodeAt(++a.position),(j=h(k))>=0?g=(g<<4)+j:o(a,"expected hexadecimal character");a.result+=l(g),a.position++}else o(a,"unknown escape sequence");c=e=a.position}else d(k)?(q(a,c,e,!0),w(a,u(a,!1,b)),c=e=a.position):a.position===a.lineStart&&v(a)?o(a,"unexpected end of the document within a double quoted scalar"):(a.position++,e=a.position)}o(a,"unexpected end of the stream within a double quoted scalar")}function A(a,b){var c,d,e,g,h,i,j,k,l,m,n,p=!0,q=a.tag,r=a.anchor,t={};if(n=a.input.charCodeAt(a.position),91===n)g=93,j=!1,d=[];else{if(123!==n)return!1;g=125,j=!0,d={}}for(null!==a.anchor&&(a.anchorMap[a.anchor]=d),n=a.input.charCodeAt(++a.position);0!==n;){if(u(a,!0,b),n=a.input.charCodeAt(a.position),n===g)return a.position++,a.tag=q,a.anchor=r,a.kind=j?"mapping":"sequence",a.result=d,!0;p||o(a,"missed comma between flow collection entries"),l=k=m=null,h=i=!1,63===n&&(e=a.input.charCodeAt(a.position+1),f(e)&&(h=i=!0,a.position++,u(a,!0,b))),c=a.line,H(a,b,U,!1,!0),l=a.tag,k=a.result,u(a,!0,b),n=a.input.charCodeAt(a.position),!i&&a.line!==c||58!==n||(h=!0,n=a.input.charCodeAt(++a.position),u(a,!0,b),H(a,b,U,!1,!0),m=a.result),j?s(a,d,t,l,k,m):h?d.push(s(a,null,t,l,k,m)):d.push(k),u(a,!0,b),n=a.input.charCodeAt(a.position),44===n?(p=!0,n=a.input.charCodeAt(++a.position)):p=!1}o(a,"unexpected end of the stream within a flow collection")}function B(a,b){var c,f,g,h,i=Y,k=!1,l=!1,m=b,n=0,p=!1;if(h=a.input.charCodeAt(a.position),124===h)f=!1;else{if(62!==h)return!1;f=!0}for(a.kind="scalar",a.result="";0!==h;)if(h=a.input.charCodeAt(++a.position),43===h||45===h)Y===i?i=43===h?$:Z:o(a,"repeat of a chomping mode identifier");else{if(!((g=j(h))>=0))break;0===g?o(a,"bad explicit indentation width of a block scalar; it cannot be less than one"):l?o(a,"repeat of an indentation width identifier"):(m=b+g-1,l=!0)}if(e(h)){do h=a.input.charCodeAt(++a.position);while(e(h));if(35===h)do h=a.input.charCodeAt(++a.position);while(!d(h)&&0!==h)}for(;0!==h;){for(t(a),a.lineIndent=0,h=a.input.charCodeAt(a.position);(!l||a.lineIndent<m)&&32===h;)a.lineIndent++,h=a.input.charCodeAt(++a.position);if(!l&&a.lineIndent>m&&(m=a.lineIndent),d(h))n++;else{if(a.lineIndent<m){i===$?a.result+=O.repeat("\n",k?1+n:n):i===Y&&k&&(a.result+="\n");break}for(f?e(h)?(p=!0,a.result+=O.repeat("\n",k?1+n:n)):p?(p=!1,a.result+=O.repeat("\n",n+1)):0===n?k&&(a.result+=" "):a.result+=O.repeat("\n",n):a.result+=O.repeat("\n",k?1+n:n),k=!0,l=!0,n=0,c=a.position;!d(h)&&0!==h;)h=a.input.charCodeAt(++a.position);q(a,c,a.position,!1)}}return!0}function C(a,b){var c,d,e,g=a.tag,h=a.anchor,i=[],j=!1;for(null!==a.anchor&&(a.anchorMap[a.anchor]=i),e=a.input.charCodeAt(a.position);0!==e&&45===e&&(d=a.input.charCodeAt(a.position+1),f(d));)if(j=!0,a.position++,u(a,!0,-1)&&a.lineIndent<=b)i.push(null),e=a.input.charCodeAt(a.position);else if(c=a.line,H(a,b,W,!1,!0),i.push(a.result),u(a,!0,-1),e=a.input.charCodeAt(a.position),(a.line===c||a.lineIndent>b)&&0!==e)o(a,"bad indentation of a sequence entry");else if(a.lineIndent<b)break;return!!j&&(a.tag=g,a.anchor=h,a.kind="sequence",a.result=i,!0)}function D(a,b,c){var d,g,h,i,j=a.tag,k=a.anchor,l={},m={},n=null,p=null,q=null,r=!1,t=!1;for(null!==a.anchor&&(a.anchorMap[a.anchor]=l),i=a.input.charCodeAt(a.position);0!==i;){if(d=a.input.charCodeAt(a.position+1),h=a.line,63!==i&&58!==i||!f(d)){if(!H(a,c,V,!1,!0))break;if(a.line===h){for(i=a.input.charCodeAt(a.position);e(i);)i=a.input.charCodeAt(++a.position);if(58===i)i=a.input.charCodeAt(++a.position),f(i)||o(a,"a whitespace character is expected after the key-value separator within a block mapping"),r&&(s(a,l,m,n,p,null),n=p=q=null),t=!0,r=!1,g=!1,n=a.tag,p=a.result;else{if(!t)return a.tag=j,a.anchor=k,!0;o(a,"can not read an implicit mapping pair; a colon is missed")}}else{if(!t)return a.tag=j,a.anchor=k,!0;o(a,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===i?(r&&(s(a,l,m,n,p,null),n=p=q=null),t=!0,r=!0,g=!0):r?(r=!1,g=!0):o(a,"incomplete explicit mapping pair; a key node is missed"),a.position+=1,i=d;if((a.line===h||a.lineIndent>b)&&(H(a,b,X,!0,g)&&(r?p=a.result:q=a.result),r||(s(a,l,m,n,p,q),n=p=q=null),u(a,!0,-1),i=a.input.charCodeAt(a.position)),a.lineIndent>b&&0!==i)o(a,"bad indentation of a mapping entry");else if(a.lineIndent<b)break}return r&&s(a,l,m,n,p,null),t&&(a.tag=j,a.anchor=k,a.kind="mapping",a.result=l),t}function E(a){var b,c,d,e,g=!1,h=!1;if(e=a.input.charCodeAt(a.position),33!==e)return!1;if(null!==a.tag&&o(a,"duplication of a tag property"),e=a.input.charCodeAt(++a.position),60===e?(g=!0,e=a.input.charCodeAt(++a.position)):33===e?(h=!0,c="!!",e=a.input.charCodeAt(++a.position)):c="!",b=a.position,g){do e=a.input.charCodeAt(++a.position);while(0!==e&&62!==e);a.position<a.length?(d=a.input.slice(b,a.position),e=a.input.charCodeAt(++a.position)):o(a,"unexpected end of the stream within a verbatim tag")}else{for(;0!==e&&!f(e);)33===e&&(h?o(a,"tag suffix cannot contain exclamation marks"):(c=a.input.slice(b-1,a.position+1),ca.test(c)||o(a,"named tag handle cannot contain such characters"),h=!0,b=a.position+1)),e=a.input.charCodeAt(++a.position);d=a.input.slice(b,a.position),ba.test(d)&&o(a,"tag suffix cannot contain flow indicator characters")}return d&&!da.test(d)&&o(a,"tag name cannot contain such characters: "+d),g?a.tag=d:T.call(a.tagMap,c)?a.tag=a.tagMap[c]+d:"!"===c?a.tag="!"+d:"!!"===c?a.tag="tag:yaml.org,2002:"+d:o(a,'undeclared tag handle "'+c+'"'),!0}function F(a){var b,c;if(c=a.input.charCodeAt(a.position),38!==c)return!1;for(null!==a.anchor&&o(a,"duplication of an anchor property"),c=a.input.charCodeAt(++a.position),b=a.position;0!==c&&!f(c)&&!g(c);)c=a.input.charCodeAt(++a.position);return a.position===b&&o(a,"name of an anchor node must contain at least one character"),a.anchor=a.input.slice(b,a.position),!0}function G(a){var b,c,d;if(d=a.input.charCodeAt(a.position),42!==d)return!1;for(d=a.input.charCodeAt(++a.position),b=a.position;0!==d&&!f(d)&&!g(d);)d=a.input.charCodeAt(++a.position);return a.position===b&&o(a,"name of an alias node must contain at least one character"),c=a.input.slice(b,a.position),a.anchorMap.hasOwnProperty(c)||o(a,'unidentified alias "'+c+'"'),a.result=a.anchorMap[c],u(a,!0,-1),!0}function H(a,b,c,d,e){var f,g,h,i,j,k,l,m,n=1,p=!1,q=!1;if(null!==a.listener&&a.listener("open",a),a.tag=null,a.anchor=null,a.kind=null,a.result=null,f=g=h=X===c||W===c,d&&u(a,!0,-1)&&(p=!0,a.lineIndent>b?n=1:a.lineIndent===b?n=0:a.lineIndent<b&&(n=-1)),1===n)for(;E(a)||F(a);)u(a,!0,-1)?(p=!0,h=f,a.lineIndent>b?n=1:a.lineIndent===b?n=0:a.lineIndent<b&&(n=-1)):h=!1;if(h&&(h=p||e),1!==n&&X!==c||(l=U===c||V===c?b:b+1,m=a.position-a.lineStart,1===n?h&&(C(a,m)||D(a,m,l))||A(a,l)?q=!0:(g&&B(a,l)||y(a,l)||z(a,l)?q=!0:G(a)?(q=!0,null===a.tag&&null===a.anchor||o(a,"alias node should not have any properties")):x(a,l,U===c)&&(q=!0,null===a.tag&&(a.tag="?")),null!==a.anchor&&(a.anchorMap[a.anchor]=a.result)):0===n&&(q=h&&C(a,m))),null!==a.tag&&"!"!==a.tag)if("?"===a.tag){for(i=0,j=a.implicitTypes.length;i<j;i+=1)if(k=a.implicitTypes[i],k.resolve(a.result)){a.result=k.construct(a.result),a.tag=k.tag,null!==a.anchor&&(a.anchorMap[a.anchor]=a.result);break}}else T.call(a.typeMap,a.tag)?(k=a.typeMap[a.tag],null!==a.result&&k.kind!==a.kind&&o(a,"unacceptable node kind for !<"+a.tag+'> tag; it should be "'+k.kind+'", not "'+a.kind+'"'),k.resolve(a.result)?(a.result=k.construct(a.result),null!==a.anchor&&(a.anchorMap[a.anchor]=a.result)):o(a,"cannot resolve a node with !<"+a.tag+"> explicit tag")):o(a,"unknown tag !<"+a.tag+">");return null!==a.listener&&a.listener("close",a),null!==a.tag||null!==a.anchor||q}function I(a){var b,c,g,h,i=a.position,j=!1;for(a.version=null,a.checkLineBreaks=a.legacy,a.tagMap={}, +a.anchorMap={};0!==(h=a.input.charCodeAt(a.position))&&(u(a,!0,-1),h=a.input.charCodeAt(a.position),!(a.lineIndent>0||37!==h));){for(j=!0,h=a.input.charCodeAt(++a.position),b=a.position;0!==h&&!f(h);)h=a.input.charCodeAt(++a.position);for(c=a.input.slice(b,a.position),g=[],c.length<1&&o(a,"directive name must not be less than one character in length");0!==h;){for(;e(h);)h=a.input.charCodeAt(++a.position);if(35===h){do h=a.input.charCodeAt(++a.position);while(0!==h&&!d(h));break}if(d(h))break;for(b=a.position;0!==h&&!f(h);)h=a.input.charCodeAt(++a.position);g.push(a.input.slice(b,a.position))}0!==h&&t(a),T.call(ha,c)?ha[c](a,c,g):p(a,'unknown document directive "'+c+'"')}return u(a,!0,-1),0===a.lineIndent&&45===a.input.charCodeAt(a.position)&&45===a.input.charCodeAt(a.position+1)&&45===a.input.charCodeAt(a.position+2)?(a.position+=3,u(a,!0,-1)):j&&o(a,"directives end mark is expected"),H(a,a.lineIndent-1,X,!1,!0),u(a,!0,-1),a.checkLineBreaks&&aa.test(a.input.slice(i,a.position))&&p(a,"non-ASCII line breaks are interpreted as content"),a.documents.push(a.result),a.position===a.lineStart&&v(a)?void(46===a.input.charCodeAt(a.position)&&(a.position+=3,u(a,!0,-1))):void(a.position<a.length-1&&o(a,"end of the stream or a document separator is expected"))}function J(a,b){a=String(a),b=b||{},0!==a.length&&(10!==a.charCodeAt(a.length-1)&&13!==a.charCodeAt(a.length-1)&&(a+="\n"),65279===a.charCodeAt(0)&&(a=a.slice(1)));var c=new m(a,b);for(c.input+="\0";32===c.input.charCodeAt(c.position);)c.lineIndent+=1,c.position+=1;for(;c.position<c.length-1;)I(c);return c.documents}function K(a,b,c){var d,e,f=J(a,c);for(d=0,e=f.length;d<e;d+=1)b(f[d])}function L(a,b){var c=J(a,b);if(0!==c.length){if(1===c.length)return c[0];throw new P("expected a single document in the stream, but found more")}}function M(a,b,c){K(a,b,O.extend({schema:R},c))}function N(a,b){return L(a,O.extend({schema:R},b))}for(var O=a("./common"),P=a("./exception"),Q=a("./mark"),R=a("./schema/default_safe"),S=a("./schema/default_full"),T=Object.prototype.hasOwnProperty,U=1,V=2,W=3,X=4,Y=1,Z=2,$=3,_=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,aa=/[\x85\u2028\u2029]/,ba=/[,\[\]\{\}]/,ca=/^(?:!|!!|![a-z\-]+!)$/i,da=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i,ea=new Array(256),fa=new Array(256),ga=0;ga<256;ga++)ea[ga]=k(ga)?1:0,fa[ga]=k(ga);var ha={YAML:function(a,b,c){var d,e,f;null!==a.version&&o(a,"duplication of %YAML directive"),1!==c.length&&o(a,"YAML directive accepts exactly one argument"),d=/^([0-9]+)\.([0-9]+)$/.exec(c[0]),null===d&&o(a,"ill-formed argument of the YAML directive"),e=parseInt(d[1],10),f=parseInt(d[2],10),1!==e&&o(a,"unacceptable YAML version of the document"),a.version=c[0],a.checkLineBreaks=f<2,1!==f&&2!==f&&p(a,"unsupported YAML version of the document")},TAG:function(a,b,c){var d,e;2!==c.length&&o(a,"TAG directive accepts exactly two arguments"),d=c[0],e=c[1],ca.test(d)||o(a,"ill-formed tag handle (first argument) of the TAG directive"),T.call(a.tagMap,d)&&o(a,'there is a previously declared suffix for "'+d+'" tag handle'),da.test(e)||o(a,"ill-formed tag prefix (second argument) of the TAG directive"),a.tagMap[d]=e}};b.exports.loadAll=K,b.exports.load=L,b.exports.safeLoadAll=M,b.exports.safeLoad=N},{"./common":2,"./exception":4,"./mark":6,"./schema/default_full":9,"./schema/default_safe":10}],6:[function(a,b,c){function d(a,b,c,d,e){this.name=a,this.buffer=b,this.position=c,this.line=d,this.column=e}var e=a("./common");d.prototype.getSnippet=function(a,b){var c,d,f,g,h;if(!this.buffer)return null;for(a=a||4,b=b||75,c="",d=this.position;d>0&&"\0\r\n…\u2028\u2029".indexOf(this.buffer.charAt(d-1))===-1;)if(d-=1,this.position-d>b/2-1){c=" ... ",d+=5;break}for(f="",g=this.position;g<this.buffer.length&&"\0\r\n…\u2028\u2029".indexOf(this.buffer.charAt(g))===-1;)if(g+=1,g-this.position>b/2-1){f=" ... ",g-=5;break}return h=this.buffer.slice(d,g),e.repeat(" ",a)+c+h+f+"\n"+e.repeat(" ",a+this.position-d+c.length)+"^"},d.prototype.toString=function(a){var b,c="";return this.name&&(c+='in "'+this.name+'" '),c+="at line "+(this.line+1)+", column "+(this.column+1),a||(b=this.getSnippet(),b&&(c+=":\n"+b)),c},b.exports=d},{"./common":2}],7:[function(a,b,c){function d(a,b,c){var e=[];return a.include.forEach(function(a){c=d(a,b,c)}),a[b].forEach(function(a){c.forEach(function(b,c){b.tag===a.tag&&e.push(c)}),c.push(a)}),c.filter(function(a,b){return e.indexOf(b)===-1})}function e(){function a(a){d[a.tag]=a}var b,c,d={};for(b=0,c=arguments.length;b<c;b+=1)arguments[b].forEach(a);return d}function f(a){this.include=a.include||[],this.implicit=a.implicit||[],this.explicit=a.explicit||[],this.implicit.forEach(function(a){if(a.loadKind&&"scalar"!==a.loadKind)throw new h("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")}),this.compiledImplicit=d(this,"implicit",[]),this.compiledExplicit=d(this,"explicit",[]),this.compiledTypeMap=e(this.compiledImplicit,this.compiledExplicit)}var g=a("./common"),h=a("./exception"),i=a("./type");f.DEFAULT=null,f.create=function(){var a,b;switch(arguments.length){case 1:a=f.DEFAULT,b=arguments[0];break;case 2:a=arguments[0],b=arguments[1];break;default:throw new h("Wrong number of arguments for Schema.create function")}if(a=g.toArray(a),b=g.toArray(b),!a.every(function(a){return a instanceof f}))throw new h("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");if(!b.every(function(a){return a instanceof i}))throw new h("Specified list of YAML types (or a single Type object) contains a non-Type object.");return new f({include:a,explicit:b})},b.exports=f},{"./common":2,"./exception":4,"./type":13}],8:[function(a,b,c){var d=a("../schema");b.exports=new d({include:[a("./json")]})},{"../schema":7,"./json":12}],9:[function(a,b,c){var d=a("../schema");b.exports=d.DEFAULT=new d({include:[a("./default_safe")],explicit:[a("../type/js/undefined"),a("../type/js/regexp"),a("../type/js/function")]})},{"../schema":7,"../type/js/function":18,"../type/js/regexp":19,"../type/js/undefined":20,"./default_safe":10}],10:[function(a,b,c){var d=a("../schema");b.exports=new d({include:[a("./core")],implicit:[a("../type/timestamp"),a("../type/merge")],explicit:[a("../type/binary"),a("../type/omap"),a("../type/pairs"),a("../type/set")]})},{"../schema":7,"../type/binary":14,"../type/merge":22,"../type/omap":24,"../type/pairs":25,"../type/set":27,"../type/timestamp":29,"./core":8}],11:[function(a,b,c){var d=a("../schema");b.exports=new d({explicit:[a("../type/str"),a("../type/seq"),a("../type/map")]})},{"../schema":7,"../type/map":21,"../type/seq":26,"../type/str":28}],12:[function(a,b,c){var d=a("../schema");b.exports=new d({include:[a("./failsafe")],implicit:[a("../type/null"),a("../type/bool"),a("../type/int"),a("../type/float")]})},{"../schema":7,"../type/bool":15,"../type/float":16,"../type/int":17,"../type/null":23,"./failsafe":11}],13:[function(a,b,c){function d(a){var b={};return null!==a&&Object.keys(a).forEach(function(c){a[c].forEach(function(a){b[String(a)]=c})}),b}function e(a,b){if(b=b||{},Object.keys(b).forEach(function(b){if(g.indexOf(b)===-1)throw new f('Unknown option "'+b+'" is met in definition of "'+a+'" YAML type.')}),this.tag=a,this.kind=b.kind||null,this.resolve=b.resolve||function(){return!0},this.construct=b.construct||function(a){return a},this.instanceOf=b.instanceOf||null,this.predicate=b.predicate||null,this.represent=b.represent||null,this.defaultStyle=b.defaultStyle||null,this.styleAliases=d(b.styleAliases||null),h.indexOf(this.kind)===-1)throw new f('Unknown kind "'+this.kind+'" is specified for "'+a+'" YAML type.')}var f=a("./exception"),g=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],h=["scalar","sequence","mapping"];b.exports=e},{"./exception":4}],14:[function(a,b,c){function d(a){if(null===a)return!1;var b,c,d=0,e=a.length,f=l;for(c=0;c<e;c++)if(b=f.indexOf(a.charAt(c)),!(b>64)){if(b<0)return!1;d+=6}return d%8===0}function e(a){var b,c,d=a.replace(/[\r\n=]/g,""),e=d.length,f=l,g=0,i=[];for(b=0;b<e;b++)b%4===0&&b&&(i.push(g>>16&255),i.push(g>>8&255),i.push(255&g)),g=g<<6|f.indexOf(d.charAt(b));return c=e%4*6,0===c?(i.push(g>>16&255),i.push(g>>8&255),i.push(255&g)):18===c?(i.push(g>>10&255),i.push(g>>2&255)):12===c&&i.push(g>>4&255),h?new h(i):i}function f(a){var b,c,d="",e=0,f=a.length,g=l;for(b=0;b<f;b++)b%3===0&&b&&(d+=g[e>>18&63],d+=g[e>>12&63],d+=g[e>>6&63],d+=g[63&e]),e=(e<<8)+a[b];return c=f%3,0===c?(d+=g[e>>18&63],d+=g[e>>12&63],d+=g[e>>6&63],d+=g[63&e]):2===c?(d+=g[e>>10&63],d+=g[e>>4&63],d+=g[e<<2&63],d+=g[64]):1===c&&(d+=g[e>>2&63],d+=g[e<<4&63],d+=g[64],d+=g[64]),d}function g(a){return h&&h.isBuffer(a)}var h;try{var i=a;h=i("buffer").Buffer}catch(j){}var k=a("../type"),l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";b.exports=new k("tag:yaml.org,2002:binary",{kind:"scalar",resolve:d,construct:e,predicate:g,represent:f})},{"../type":13}],15:[function(a,b,c){function d(a){if(null===a)return!1;var b=a.length;return 4===b&&("true"===a||"True"===a||"TRUE"===a)||5===b&&("false"===a||"False"===a||"FALSE"===a)}function e(a){return"true"===a||"True"===a||"TRUE"===a}function f(a){return"[object Boolean]"===Object.prototype.toString.call(a)}var g=a("../type");b.exports=new g("tag:yaml.org,2002:bool",{kind:"scalar",resolve:d,construct:e,predicate:f,represent:{lowercase:function(a){return a?"true":"false"},uppercase:function(a){return a?"TRUE":"FALSE"},camelcase:function(a){return a?"True":"False"}},defaultStyle:"lowercase"})},{"../type":13}],16:[function(a,b,c){function d(a){return null!==a&&!!j.test(a)}function e(a){var b,c,d,e;return b=a.replace(/_/g,"").toLowerCase(),c="-"===b[0]?-1:1,e=[],"+-".indexOf(b[0])>=0&&(b=b.slice(1)),".inf"===b?1===c?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===b?NaN:b.indexOf(":")>=0?(b.split(":").forEach(function(a){e.unshift(parseFloat(a,10))}),b=0,d=1,e.forEach(function(a){b+=a*d,d*=60}),c*b):c*parseFloat(b,10)}function f(a,b){var c;if(isNaN(a))switch(b){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===a)switch(b){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===a)switch(b){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(h.isNegativeZero(a))return"-0.0";return c=a.toString(10),k.test(c)?c.replace("e",".e"):c}function g(a){return"[object Number]"===Object.prototype.toString.call(a)&&(a%1!==0||h.isNegativeZero(a))}var h=a("../common"),i=a("../type"),j=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?|\\.[0-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),k=/^[-+]?[0-9]+e/;b.exports=new i("tag:yaml.org,2002:float",{kind:"scalar",resolve:d,construct:e,predicate:g,represent:f,defaultStyle:"lowercase"})},{"../common":2,"../type":13}],17:[function(a,b,c){function d(a){return 48<=a&&a<=57||65<=a&&a<=70||97<=a&&a<=102}function e(a){return 48<=a&&a<=55}function f(a){return 48<=a&&a<=57}function g(a){if(null===a)return!1;var b,c=a.length,g=0,h=!1;if(!c)return!1;if(b=a[g],"-"!==b&&"+"!==b||(b=a[++g]),"0"===b){if(g+1===c)return!0;if(b=a[++g],"b"===b){for(g++;g<c;g++)if(b=a[g],"_"!==b){if("0"!==b&&"1"!==b)return!1;h=!0}return h}if("x"===b){for(g++;g<c;g++)if(b=a[g],"_"!==b){if(!d(a.charCodeAt(g)))return!1;h=!0}return h}for(;g<c;g++)if(b=a[g],"_"!==b){if(!e(a.charCodeAt(g)))return!1;h=!0}return h}for(;g<c;g++)if(b=a[g],"_"!==b){if(":"===b)break;if(!f(a.charCodeAt(g)))return!1;h=!0}return!!h&&(":"!==b||/^(:[0-5]?[0-9])+$/.test(a.slice(g)))}function h(a){var b,c,d=a,e=1,f=[];return d.indexOf("_")!==-1&&(d=d.replace(/_/g,"")),b=d[0],"-"!==b&&"+"!==b||("-"===b&&(e=-1),d=d.slice(1),b=d[0]),"0"===d?0:"0"===b?"b"===d[1]?e*parseInt(d.slice(2),2):"x"===d[1]?e*parseInt(d,16):e*parseInt(d,8):d.indexOf(":")!==-1?(d.split(":").forEach(function(a){f.unshift(parseInt(a,10))}),d=0,c=1,f.forEach(function(a){d+=a*c,c*=60}),e*d):e*parseInt(d,10)}function i(a){return"[object Number]"===Object.prototype.toString.call(a)&&a%1===0&&!j.isNegativeZero(a)}var j=a("../common"),k=a("../type");b.exports=new k("tag:yaml.org,2002:int",{kind:"scalar",resolve:g,construct:h,predicate:i,represent:{binary:function(a){return"0b"+a.toString(2)},octal:function(a){return"0"+a.toString(8)},decimal:function(a){return a.toString(10)},hexadecimal:function(a){return"0x"+a.toString(16).toUpperCase()}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},{"../common":2,"../type":13}],18:[function(a,b,c){function d(a){if(null===a)return!1;try{var b="("+a+")",c=h.parse(b,{range:!0});return"Program"===c.type&&1===c.body.length&&"ExpressionStatement"===c.body[0].type&&"FunctionExpression"===c.body[0].expression.type}catch(d){return!1}}function e(a){var b,c="("+a+")",d=h.parse(c,{range:!0}),e=[];if("Program"!==d.type||1!==d.body.length||"ExpressionStatement"!==d.body[0].type||"FunctionExpression"!==d.body[0].expression.type)throw new Error("Failed to resolve function");return d.body[0].expression.params.forEach(function(a){e.push(a.name)}),b=d.body[0].expression.body.range,new Function(e,c.slice(b[0]+1,b[1]-1))}function f(a){return a.toString()}function g(a){return"[object Function]"===Object.prototype.toString.call(a)}var h;try{var i=a;h=i("esprima")}catch(j){"undefined"!=typeof window&&(h=window.esprima)}var k=a("../../type");b.exports=new k("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:d,construct:e,predicate:g,represent:f})},{"../../type":13}],19:[function(a,b,c){function d(a){if(null===a)return!1;if(0===a.length)return!1;var b=a,c=/\/([gim]*)$/.exec(a),d="";if("/"===b[0]){if(c&&(d=c[1]),d.length>3)return!1;if("/"!==b[b.length-d.length-1])return!1}return!0}function e(a){var b=a,c=/\/([gim]*)$/.exec(a),d="";return"/"===b[0]&&(c&&(d=c[1]),b=b.slice(1,b.length-d.length-1)),new RegExp(b,d)}function f(a){var b="/"+a.source+"/";return a.global&&(b+="g"),a.multiline&&(b+="m"),a.ignoreCase&&(b+="i"),b}function g(a){return"[object RegExp]"===Object.prototype.toString.call(a)}var h=a("../../type");b.exports=new h("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:d,construct:e,predicate:g,represent:f})},{"../../type":13}],20:[function(a,b,c){function d(){return!0}function e(){}function f(){return""}function g(a){return"undefined"==typeof a}var h=a("../../type");b.exports=new h("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:d,construct:e,predicate:g,represent:f})},{"../../type":13}],21:[function(a,b,c){var d=a("../type");b.exports=new d("tag:yaml.org,2002:map",{kind:"mapping",construct:function(a){return null!==a?a:{}}})},{"../type":13}],22:[function(a,b,c){function d(a){return"<<"===a||null===a}var e=a("../type");b.exports=new e("tag:yaml.org,2002:merge",{kind:"scalar",resolve:d})},{"../type":13}],23:[function(a,b,c){function d(a){if(null===a)return!0;var b=a.length;return 1===b&&"~"===a||4===b&&("null"===a||"Null"===a||"NULL"===a)}function e(){return null}function f(a){return null===a}var g=a("../type");b.exports=new g("tag:yaml.org,2002:null",{kind:"scalar",resolve:d,construct:e,predicate:f,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})},{"../type":13}],24:[function(a,b,c){function d(a){if(null===a)return!0;var b,c,d,e,f,i=[],j=a;for(b=0,c=j.length;b<c;b+=1){if(d=j[b],f=!1,"[object Object]"!==h.call(d))return!1;for(e in d)if(g.call(d,e)){if(f)return!1;f=!0}if(!f)return!1;if(i.indexOf(e)!==-1)return!1;i.push(e)}return!0}function e(a){return null!==a?a:[]}var f=a("../type"),g=Object.prototype.hasOwnProperty,h=Object.prototype.toString;b.exports=new f("tag:yaml.org,2002:omap",{kind:"sequence",resolve:d,construct:e})},{"../type":13}],25:[function(a,b,c){function d(a){if(null===a)return!0;var b,c,d,e,f,h=a;for(f=new Array(h.length),b=0,c=h.length;b<c;b+=1){if(d=h[b],"[object Object]"!==g.call(d))return!1;if(e=Object.keys(d),1!==e.length)return!1;f[b]=[e[0],d[e[0]]]}return!0}function e(a){if(null===a)return[];var b,c,d,e,f,g=a;for(f=new Array(g.length),b=0,c=g.length;b<c;b+=1)d=g[b],e=Object.keys(d),f[b]=[e[0],d[e[0]]];return f}var f=a("../type"),g=Object.prototype.toString;b.exports=new f("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:d,construct:e})},{"../type":13}],26:[function(a,b,c){var d=a("../type");b.exports=new d("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(a){return null!==a?a:[]}})},{"../type":13}],27:[function(a,b,c){function d(a){if(null===a)return!0;var b,c=a;for(b in c)if(g.call(c,b)&&null!==c[b])return!1;return!0}function e(a){return null!==a?a:{}}var f=a("../type"),g=Object.prototype.hasOwnProperty;b.exports=new f("tag:yaml.org,2002:set",{kind:"mapping",resolve:d,construct:e})},{"../type":13}],28:[function(a,b,c){var d=a("../type");b.exports=new d("tag:yaml.org,2002:str",{kind:"scalar",construct:function(a){return null!==a?a:""}})},{"../type":13}],29:[function(a,b,c){function d(a){return null!==a&&(null!==h.exec(a)||null!==i.exec(a))}function e(a){var b,c,d,e,f,g,j,k,l,m,n=0,o=null;if(b=h.exec(a),null===b&&(b=i.exec(a)),null===b)throw new Error("Date resolve error");if(c=+b[1],d=+b[2]-1,e=+b[3],!b[4])return new Date(Date.UTC(c,d,e));if(f=+b[4],g=+b[5],j=+b[6],b[7]){for(n=b[7].slice(0,3);n.length<3;)n+="0";n=+n}return b[9]&&(k=+b[10],l=+(b[11]||0),o=6e4*(60*k+l),"-"===b[9]&&(o=-o)),m=new Date(Date.UTC(c,d,e,f,g,j,n)),o&&m.setTime(m.getTime()-o),m}function f(a){return a.toISOString()}var g=a("../type"),h=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),i=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");b.exports=new g("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:d,construct:e,instanceOf:Date,represent:f})},{"../type":13}],"/":[function(a,b,c){var d=a("./lib/js-yaml.js");b.exports=d},{"./lib/js-yaml.js":1}]},{},[])("/")}),function(a,b,c){function d(a){var c=[];return i(c,b.noop).chars(a),c.join("")}function e(a,c){var d,e={},f=a.split(",");for(d=0;d<f.length;d++)e[c?b.lowercase(f[d]):f[d]]=!0;return e}function f(a,c){function d(a,d,f,h){if(d=b.lowercase(d),w[d])for(;s.last()&&x[s.last()];)e("",s.last());v[d]&&s.last()==d&&e("",d),(h=u[d]||!!h)||s.push(d);var i={};f.replace(m,function(a,b,c,d,e){i[b]=g(c||d||e||"")}),c.start&&c.start(d,i,h)}function e(a,d){var e,f=0;if(d=b.lowercase(d))for(f=s.length-1;0<=f&&s[f]!=d;f--);if(0<=f){for(e=s.length-1;e>=f;e--)c.end&&c.end(s[e]);s.length=f}}"string"!=typeof a&&(a=null===a||"undefined"==typeof a?"":""+a);var f,h,i,s=[],t=a;for(s.last=function(){return s[s.length-1]};a;){if(i="",h=!0,s.last()&&y[s.last()]?(a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+s.last()+"[^>]*>","i"),function(a,b){return b=b.replace(p,"$1").replace(r,"$1"),c.chars&&c.chars(g(b)),""}),e("",s.last())):(0===a.indexOf("<!--")?(f=a.indexOf("--",4),0<=f&&a.lastIndexOf("-->",f)===f&&(c.comment&&c.comment(a.substring(4,f)),a=a.substring(f+3),h=!1)):q.test(a)?(f=a.match(q))&&(a=a.replace(f[0],""),h=!1):o.test(a)?(f=a.match(l))&&(a=a.substring(f[0].length),f[0].replace(l,e),h=!1):n.test(a)&&((f=a.match(k))?(f[4]&&(a=a.substring(f[0].length),f[0].replace(k,d)),h=!1):(i+="<",a=a.substring(1))),h&&(f=a.indexOf("<"),i+=0>f?a:a.substring(0,f),a=0>f?"":a.substring(f),c.chars&&c.chars(g(i)))),a==t)throw j("badparse",a);t=a}e()}function g(a){return a?(C.innerHTML=a.replace(/</g,"<"),C.textContent):""}function h(a){return a.replace(/&/g,"&").replace(s,function(a){var b=a.charCodeAt(0);return a=a.charCodeAt(1),"&#"+(1024*(b-55296)+(a-56320)+65536)+";"}).replace(t,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"<").replace(/>/g,">")}function i(a,c){var d=!1,e=b.bind(a,a.push);return{start:function(a,f,g){a=b.lowercase(a),!d&&y[a]&&(d=a),d||!0!==z[a]||(e("<"),e(a),b.forEach(f,function(d,f){var g=b.lowercase(f),i="img"===a&&"src"===g||"background"===g;!0!==B[g]||!0===A[g]&&!c(d,i)||(e(" "),e(f),e('="'),e(h(d)),e('"'))}),e(g?"/>":">"))},end:function(a){a=b.lowercase(a),d||!0!==z[a]||(e("</"),e(a),e(">")),a==d&&(d=!1)},chars:function(a){d||e(h(a))}}}var j=b.$$minErr("$sanitize"),k=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,l=/^<\/\s*([\w:-]+)[^>]*>/,m=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,n=/^</,o=/^<\//,p=/\x3c!--(.*?)--\x3e/g,q=/<!DOCTYPE([^>]*?)>/i,r=/<!\[CDATA\[(.*?)]]\x3e/g,s=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,t=/([^\#-~| |!])/g,u=e("area,br,col,hr,img,wbr");a=e("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),c=e("rp,rt");var v=b.extend({},c,a),w=b.extend({},a,e("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),x=b.extend({},c,e("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var"));a=e("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,stop,svg,switch,text,title,tspan,use");var y=e("script,style"),z=b.extend({},u,w,x,v,a),A=e("background,cite,href,longdesc,src,usemap,xlink:href");a=e("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,valign,value,vspace,width"),c=e("accent-height,accumulate,additive,alphabetic,arabic-form,ascent,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan",!0);var B=b.extend({},A,c,a),C=document.createElement("pre");b.module("ngSanitize",[]).provider("$sanitize",function(){this.$get=["$$sanitizeUri",function(a){return function(b){var c=[];return f(b,i(c,function(b,c){return!/^unsafe/.test(a(b,c))})),c.join("")}}]}),b.module("ngSanitize").filter("linky",["$sanitize",function(a){var c=/((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,e=/^mailto:/i;return function(f,g){function h(a){a&&n.push(d(a))}function i(a,c){n.push("<a "),b.isDefined(g)&&n.push('target="',g,'" '),n.push('href="',a.replace(/"/g,"""),'">'),h(c),n.push("</a>")}if(!f)return f;for(var j,k,l,m=f,n=[];j=m.match(c);)k=j[0],j[2]||j[4]||(k=(j[3]?"http://":"mailto:")+k),l=j.index,h(m.substr(0,l)),i(k,j[0].replace(e,"")),m=m.substring(l+j[0].length);return h(m),a(n.join(""))}}])}(window,window.angular); \ No newline at end of file diff --git a/public/form_modules/forms/base/controllers/submit-form.client.controller.js b/public/form_modules/forms/base/controllers/submit-form.client.controller.js index c3824171..bca7f3f0 100644 --- a/public/form_modules/forms/base/controllers/submit-form.client.controller.js +++ b/public/form_modules/forms/base/controllers/submit-form.client.controller.js @@ -5,6 +5,9 @@ angular.module('view-form').controller('SubmitFormController', [ '$scope', '$rootScope', '$state', '$translate', 'myForm', function($scope, $rootScope, $state, $translate, myForm) { $scope.myform = myForm; + + $(".loader").fadeOut("slow"); + document.body.style.background = myForm.design.colors.backgroundColor; $translate.use(myForm.language); } ]); diff --git a/public/form_modules/forms/base/directives/on-enter-key.client.directive.js b/public/form_modules/forms/base/directives/on-enter-key.client.directive.js index afb9e135..eb4e5cfd 100644 --- a/public/form_modules/forms/base/directives/on-enter-key.client.directive.js +++ b/public/form_modules/forms/base/directives/on-enter-key.client.directive.js @@ -25,7 +25,7 @@ angular.module('view-form').directive('onEnterKey', ['$rootScope', function($roo return { restrict: 'A', link: function($scope, $element, $attrs) { - $element.bind('keydown keypress', function(event) { + $element.bind('keyup keypress', function(event) { var keyCode = event.which || event.keyCode; @@ -65,6 +65,8 @@ angular.module('view-form').directive('onEnterKey', ['$rootScope', function($roo var keyCode = event.which || event.keyCode; if(keyCode === 9 && event.shiftKey) { + + console.log('onTabAndShiftKey'); event.preventDefault(); $rootScope.$apply(function() { $rootScope.$eval($attrs.onTabAndShiftKey); diff --git a/public/form_modules/forms/base/directives/submit-form.client.directive.js b/public/form_modules/forms/base/directives/submit-form.client.directive.js index b1be6d38..3798eb40 100644 --- a/public/form_modules/forms/base/directives/submit-form.client.directive.js +++ b/public/form_modules/forms/base/directives/submit-form.client.directive.js @@ -9,8 +9,8 @@ jsep.addBinaryOp('!begins', 10); jsep.addBinaryOp('ends', 10); jsep.addBinaryOp('!ends', 10); -angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCounter', '$filter', '$rootScope', 'SendVisitorData', '$translate', - function ($http, TimeCounter, $filter, $rootScope, SendVisitorData, $translate) { +angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCounter', '$filter', '$rootScope', 'SendVisitorData', '$translate', '$timeout', + function ($http, TimeCounter, $filter, $rootScope, SendVisitorData, $translate, $timeout) { return { templateUrl: 'form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html', restrict: 'E', @@ -19,7 +19,8 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun ispreview: '=' }, controller: function($document, $window, $scope){ - $scope.noscroll = false; + var NOSCROLL = false; + var FORM_ACTION_ID = 'submit_field'; $scope.forms = {}; //Don't start timer if we are looking at a design preview @@ -59,99 +60,64 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun TimeCounter.restartClock(); }; - //Fire event when window is scrolled - $window.onscroll = function(){ - $scope.scrollPos = document.body.scrollTop || document.documentElement.scrollTop || 0; - var elemBox = document.getElementsByClassName('activeField')[0].getBoundingClientRect(); - $scope.fieldTop = elemBox.top; - $scope.fieldBottom = elemBox.bottom; - - var field_id; - var field_index; - - if(!$scope.noscroll){ - //Focus on submit button - if( $scope.selected.index === $scope.myform.visible_form_fields.length-1 && $scope.fieldBottom < 200){ - field_index = $scope.selected.index+1; - field_id = 'submit_field'; - $scope.setActiveField(field_id, field_index, false); - } - //Focus on field above submit button - else if($scope.selected.index === $scope.myform.visible_form_fields.length){ - if($scope.fieldTop > 200){ - field_index = $scope.selected.index-1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); - } - } else if( $scope.fieldBottom < 0){ - field_index = $scope.selected.index+1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); - } else if ( $scope.selected.index !== 0 && $scope.fieldTop > 0) { - field_index = $scope.selected.index-1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); - } - $scope.$apply(); - } - }; - /* ** Field Controls */ var evaluateLogicJump = function(field){ var logicJump = field.logicJump; - if (logicJump.expressionString && logicJump.valueB && field.fieldValue) { - var parse_tree = jsep(logicJump.expressionString); - var left, right; + if(logicJump.enabled){ + if (logicJump.expressionString && logicJump.valueB && field.fieldValue) { + var parse_tree = jsep(logicJump.expressionString); + var left, right; - if(parse_tree.left.name === 'field'){ - left = field.fieldValue; - right = logicJump.valueB; - } else { - left = logicJump.valueB; - right = field.fieldValue; - } - - if(field.fieldType === 'number' || field.fieldType === 'scale' || field.fieldType === 'rating'){ - switch(parse_tree.operator) { - case '==': - return (parseInt(left) === parseInt(right)); - case '!==': - return (parseInt(left) !== parseInt(right)); - case '>': - return (parseInt(left) > parseInt(right)); - case '>=': - return (parseInt(left) > parseInt(right)); - case '<': - return (parseInt(left) < parseInt(right)); - case '<=': - return (parseInt(left) <= parseInt(right)); - default: - return false; + if(parse_tree.left.name === 'field'){ + left = field.fieldValue; + right = logicJump.valueB; + } else { + left = logicJump.valueB; + right = field.fieldValue; } - } else { - switch(parse_tree.operator) { - case '==': - return (left === right); - case '!==': - return (left !== right); - case 'contains': - return (left.indexOf(right) > -1); - case '!contains': - /* jshint -W018 */ - return !(left.indexOf(right) > -1); - case 'begins': - return left.startsWith(right); - case '!begins': - return !left.startsWith(right); - case 'ends': - return left.endsWith(right); - case '!ends': - return left.endsWith(right); - default: - return false; + + if(field.fieldType === 'number' || field.fieldType === 'scale' || field.fieldType === 'rating'){ + switch(parse_tree.operator) { + case '==': + return (parseInt(left) === parseInt(right)); + case '!==': + return (parseInt(left) !== parseInt(right)); + case '>': + return (parseInt(left) > parseInt(right)); + case '>=': + return (parseInt(left) > parseInt(right)); + case '<': + return (parseInt(left) < parseInt(right)); + case '<=': + return (parseInt(left) <= parseInt(right)); + default: + return false; + } + } else { + switch(parse_tree.operator) { + case '==': + return (left === right); + case '!==': + return (left !== right); + case 'contains': + return (left.indexOf(right) > -1); + case '!contains': + /* jshint -W018 */ + return !(left.indexOf(right) > -1); + case 'begins': + return left.startsWith(right); + case '!begins': + return !left.startsWith(right); + case 'ends': + return left.endsWith(right); + case '!ends': + return left.endsWith(right); + default: + return false; + } } } } @@ -163,35 +129,46 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun throw new Error('current active field is null'); } - if($scope.selected._id === 'submit_field') { + if($scope.selected._id === FORM_ACTION_ID) { return $scope.myform.form_fields.length - 1; } return $scope.selected.index; + }; + $scope.isActiveField = function(field){ + if($scope.selected._id === field._id) { + return true + } + return false; }; $scope.setActiveField = $rootScope.setActiveField = function(field_id, field_index, animateScroll) { - if($scope.selected === null || $scope.selected._id === field_id){ - //console.log('not scrolling'); - //console.log($scope.selected); - return; - } - //console.log('field_id: '+field_id); - //console.log('field_index: '+field_index); - //console.log($scope.selected); + if($scope.selected === null || (!field_id && field_index === null) ) { + return; + } + + if(!field_id){ + field_id = $scope.myform.visible_form_fields[field_index]._id; + } else if(field_index === null){ + field_index = $scope.myform.visible_form_fields.length - $scope.selected._id = field_id; - $scope.selected.index = field_index; - if(!field_index){ - for(var i=0; i<$scope.myform.visible_form_fields.length; i++){ + for(var i=0; i < $scope.myform.visible_form_fields.length; i++){ var currField = $scope.myform.visible_form_fields[i]; - if(field_id === currField._id){ - $scope.selected.index = i; + if(currField['_id'] == field_id){ + field_index = i; break; } } } + if($scope.selected._id === field_id){ + return; + } + + $scope.selected._id = field_id; + $scope.selected.index = field_index; + + var nb_valid = $filter('formValidity')($scope.myform); $scope.translateAdvancementData = { done: nb_valid, @@ -200,10 +177,10 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun }; if(animateScroll){ - $scope.noscroll=true; + NOSCROLL=true; setTimeout(function() { $document.scrollToElement(angular.element('.activeField'), -10, 200).then(function() { - $scope.noscroll = false; + NOSCROLL = false; setTimeout(function() { if (document.querySelectorAll('.activeField .focusOn').length) { //Handle default case @@ -218,54 +195,109 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun }); }); }); - } else { - setTimeout(function() { - if (document.querySelectorAll('.activeField .focusOn')[0]) { - //FIXME: DAVID: Figure out how to set focus without scroll movement in HTML Dom - document.querySelectorAll('.activeField .focusOn')[0].focus(); - } else if (document.querySelectorAll('.activeField input')[0]){ - document.querySelectorAll('.activeField input')[0].focus(); - } - }); - } - - //Only send analytics data if form has not been submitted - if(!$scope.myform.submitted){ - SendVisitorData.send($scope.myform, getActiveField(), TimeCounter.getTimeElapsed()); - } + } }; - $rootScope.nextField = $scope.nextField = function(){ - var currField = $scope.myform.visible_form_fields[$scope.selected.index]; - - if($scope.selected && $scope.selected.index > -1){ - //Jump to logicJump's destination if it is true - if(currField.logicJump && evaluateLogicJump(currField)){ - $rootScope.setActiveField(currField.logicJump.jumpTo, null, true); - } else { - var selected_index, selected_id; - if($scope.selected.index < $scope.myform.visible_form_fields.length-1){ - selected_index = $scope.selected.index+1; - selected_id = $scope.myform.visible_form_fields[selected_index]._id; - $rootScope.setActiveField(selected_id, selected_index, true); - } else if($scope.selected.index === $scope.myform.visible_form_fields.length-1) { - selected_index = $scope.selected.index+1; - selected_id = 'submit_field'; - $rootScope.setActiveField(selected_id, selected_index, true); - } + $scope.$watch('selected.index', function(oldValue, newValue){ + if(oldValue !== newValue && newValue < $scope.myform.form_fields.length){ + //Only send analytics data if form has not been submitted + if(!$scope.myform.submitted){ + console.log('SendVisitorData.send()'); + SendVisitorData.send($scope.myform, newValue, TimeCounter.getTimeElapsed()); } - } + } + }); + //Fire event when window is scrolled + $window.onscroll = function(){ + if(!NOSCROLL){ + + var scrollTop = $(window).scrollTop(); + var elemBox = document.getElementsByClassName('activeField')[0].getBoundingClientRect(); + var fieldTop = elemBox.top; + var fieldBottom = elemBox.bottom; + + var field_id, field_index; + var elemHeight = $('.activeField').height(); + + var submitSectionHeight = $('.form-actions').height(); + var maxScrollTop = $(document).height() - $(window).height(); + var fieldWrapperHeight = $('form_fields').height(); + + var selector = 'form > .field-directive:nth-of-type(' + String($scope.myform.visible_form_fields.length - 1)+ ')' + var fieldDirectiveHeight = $(selector).height() + var scrollPosition = maxScrollTop - submitSectionHeight - fieldDirectiveHeight*1.2; + + var fractionToJump = 0.9; + + //Focus on field above submit form button + if($scope.selected.index === $scope.myform.visible_form_fields.length){ + if(scrollTop < scrollPosition){ + field_index = $scope.selected.index-1; + $scope.setActiveField(null, field_index, false); + } + } + + //Focus on submit form button + else if($scope.selected.index === $scope.myform.visible_form_fields.length-1 && scrollTop > scrollPosition){ + field_index = $scope.selected.index+1; + $scope.setActiveField(FORM_ACTION_ID, field_index, false); + } + + //If we scrolled bellow the current field, move to next field + else if(fieldBottom < elemHeight * fractionToJump && $scope.selected.index < $scope.myform.visible_form_fields.length-1 ){ + field_index = $scope.selected.index+1; + $scope.setActiveField(null, field_index, false); + } + //If we scrolled above the current field, move to prev field + else if ( $scope.selected.index !== 0 && fieldTop > elemHeight * fractionToJump) { + field_index = $scope.selected.index-1; + $scope.setActiveField(null, field_index, false); + } + } + + $scope.$apply(); + }; + + $rootScope.nextField = $scope.nextField = function(){ + if($scope.selected && $scope.selected.index > -1){ + + if($scope.selected._id !== FORM_ACTION_ID){ + var currField = $scope.myform.visible_form_fields[$scope.selected.index]; + + //Jump to logicJump's destination if it is true + if(currField.logicJump && currField.logicJump.jumpTo && evaluateLogicJump(currField)){ + $scope.setActiveField(currField.logicJump.jumpTo, null, true); + } else if($scope.selected.index < $scope.myform.visible_form_fields.length-1){ + $scope.setActiveField(null, $scope.selected.index+1, true); + } else { + $scope.setActiveField(FORM_ACTION_ID, null, true); + } + } else { + //If we are at the submit actions page, go to the first field + $rootScope.setActiveField(null, 0, true); + } + } else { + //If selected is not defined go to the first field + $rootScope.setActiveField(null, 0, true); + } + }; $rootScope.prevField = $scope.prevField = function(){ + console.log('prevField'); + console.log($scope.selected); + var selected_index = $scope.selected.index - 1; if($scope.selected.index > 0){ - var selected_index = $scope.selected.index - 1; - var selected_id = $scope.myform.visible_form_fields[selected_index]._id; - $scope.setActiveField(selected_id, selected_index, true); + $scope.setActiveField(null, selected_index, true); } }; + $rootScope.goToInvalid = $scope.goToInvalid = function() { + var field_id = $('.row.field-directive .ng-invalid.focusOn, .row.field-directive .ng-untouched.focusOn:not(.ng-valid)').first().parents('.row.field-directive').first().attr('data-id'); + $scope.setActiveField(field_id, null, true); + }; + /* ** Form Display Functions */ @@ -276,10 +308,6 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun } }; - $rootScope.goToInvalid = $scope.goToInvalid = function() { - document.querySelectorAll('.ng-invalid.focusOn')[0].focus(); - }; - var getDeviceData = function(){ var md = new MobileDetect(window.navigator.userAgent); var deviceType = 'other'; @@ -320,6 +348,10 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun }; $rootScope.submitForm = $scope.submitForm = function() { + if($scope.forms.myForm.$invalid){ + $scope.goToInvalid(); + return; + } var _timeElapsed = TimeCounter.stopClock(); $scope.loading = true; diff --git a/public/form_modules/forms/base/views/directiveViews/field/date.html b/public/form_modules/forms/base/views/directiveViews/field/date.html index c2d74a20..bb8a9df6 100755 --- a/public/form_modules/forms/base/views/directiveViews/field/date.html +++ b/public/form_modules/forms/base/views/directiveViews/field/date.html @@ -16,6 +16,7 @@ <div class="col-xs-12 field-input"> <div class="control-group input-append"> <input class="focusOn" + ng-focus="setActiveField(field._id, null, false)" ng-style="{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}" ng-class="{ 'no-border': !!field.fieldValue }" ui-date="dateOptions" diff --git a/public/form_modules/forms/base/views/directiveViews/field/dropdown.html b/public/form_modules/forms/base/views/directiveViews/field/dropdown.html index 4b8866e3..913fc5cc 100755 --- a/public/form_modules/forms/base/views/directiveViews/field/dropdown.html +++ b/public/form_modules/forms/base/views/directiveViews/field/dropdown.html @@ -15,6 +15,7 @@ </div> <div class="col-xs-12 field-input"> <ui-select ng-model="field.fieldValue" + ng-focus="setActiveField(field._id, null, false)" theme="selectize" search-enabled="true" search-by="option_value" diff --git a/public/form_modules/forms/base/views/directiveViews/field/radio.html b/public/form_modules/forms/base/views/directiveViews/field/radio.html index 2de24531..faace86f 100755 --- a/public/form_modules/forms/base/views/directiveViews/field/radio.html +++ b/public/form_modules/forms/base/views/directiveViews/field/radio.html @@ -26,6 +26,7 @@ {{$index+1}} </div> <input ng-style="{'color': design.colors.answerColor, 'border-color': design.colors.answerColor}" + ng-focus="setActiveField(field._id, null, false)" type="radio" class="focusOn" value="{{option.option_value}}" ng-model="field.fieldValue" diff --git a/public/form_modules/forms/base/views/directiveViews/field/statement.html b/public/form_modules/forms/base/views/directiveViews/field/statement.html index 84fbe0b6..5a471590 100644 --- a/public/form_modules/forms/base/views/directiveViews/field/statement.html +++ b/public/form_modules/forms/base/views/directiveViews/field/statement.html @@ -12,7 +12,7 @@ <p class="col-xs-12" ng-if="field.description.length">{{field.description}} </p> <br> <div class="col-xs-offset-1 col-xs-11"> - <button class="btn focusOn"> + <button class="btn focusOn" ng-style="{'font-size': '1.3em', 'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}" ng-click="nextField()"> {{ 'CONTINUE' | translate }} diff --git a/public/form_modules/forms/base/views/directiveViews/field/textarea.html b/public/form_modules/forms/base/views/directiveViews/field/textarea.html index c31dbba9..feaec4c4 100755 --- a/public/form_modules/forms/base/views/directiveViews/field/textarea.html +++ b/public/form_modules/forms/base/views/directiveViews/field/textarea.html @@ -16,6 +16,7 @@ <div class="col-xs-12 field-input"> <small style="font-size:0.6em;">Press SHIFT+ENTER to add a newline</small> <textarea class="textarea focusOn" type="text" + ng-focus="setActiveField(field._id, null, false)" ng-model="field.fieldValue" ng-model-options="{ debounce: 250 }" ng-class="{ 'no-border': !!field.fieldValue }" diff --git a/public/form_modules/forms/base/views/directiveViews/field/textfield.html b/public/form_modules/forms/base/views/directiveViews/field/textfield.html index 72811c0f..c4a6e7e2 100755 --- a/public/form_modules/forms/base/views/directiveViews/field/textfield.html +++ b/public/form_modules/forms/base/views/directiveViews/field/textfield.html @@ -26,6 +26,7 @@ placeholder="{{placeholder}}" ng-class="{ 'no-border': !!field.fieldValue }" class="focusOn text-field-input" + ng-focus="setActiveField(field._id, null, false)" ng-model="field.fieldValue" ng-model-options="{ debounce: 250 }" value="field.fieldValue" @@ -45,7 +46,7 @@ </div> </div> <div> - <div class="btn btn-lg btn-default" + <div class="btn btn-lg btn-default" ng-disabled="!field.fieldValue || field.$invalid" style="padding: 4px; margin-top:8px; background: rgba(255,255,255,0.5)"> <button ng-disabled="!field.fieldValue || field.$invalid" ng-style="{'background-color':design.colors.buttonColor, 'color':design.colors.buttonTextColor}" diff --git a/public/form_modules/forms/base/views/directiveViews/field/yes_no.html b/public/form_modules/forms/base/views/directiveViews/field/yes_no.html index f16800d0..9187a5d5 100644 --- a/public/form_modules/forms/base/views/directiveViews/field/yes_no.html +++ b/public/form_modules/forms/base/views/directiveViews/field/yes_no.html @@ -28,6 +28,7 @@ <input type="radio" value="true" class="focusOn" style="opacity: 0; margin-left: 0px;" + ng-focus="setActiveField(field._id, null, false)" ng-model="field.fieldValue" ng-model-options="{ debounce: 250 }" ng-required="field.required" @@ -46,6 +47,7 @@ <input type="radio" value="false" style="opacity:0; margin-left:0px;" + ng-focus="setActiveField(field._id, null, false)" ng-model="field.fieldValue" ng-model-options="{ debounce: 250 }" ng-required="field.required" diff --git a/public/form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html b/public/form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html index f29619d1..efa57efe 100755 --- a/public/form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html +++ b/public/form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html @@ -1,16 +1,13 @@ -<section class="overlay submitform" ng-if="!ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))"></section> -<section class="overlay previewform submitform" ng-if="ispreview && (loading || (!myform.submitted && !myform.startPage.showStart))"></section> - <!-- Start Page View --> <div ng-show="!myform.submitted && myform.startPage.showStart" class="form-submitted" style="padding-top: 35vh;"> <div class="row"> <div class="col-xs-12 text-center" style="overflow-wrap: break-word;"> - <h1 style="font-weight: 400; nont-size: 25px;" ng-style="{'color': form.design.colors.questionColor}"> + <h1 style="font-weight: 400; nont-size: 25px;" ng-style="{'color': myform.design.colors.questionColor}"> {{myform.startPage.introTitle}} </h1> </div> <div class="col-xs-10 col-xs-offset-1 text-center" style="overflow-wrap: break-word;"> - <p style="font-weight: 100; font-size: 16px;" ng-style="{'color': form.design.colors.questionColor}"> + <p style="font-weight: 100; font-size: 16px;" ng-style="{'color': myform.design.colors.questionColor}"> {{myform.startPage.introParagraph}} </p> </div> @@ -37,42 +34,46 @@ </div> <!-- Form Fields View --> -<div class="form-fields" ng-show="!myform.submitted && !myform.startPage.showStart" ng-style="{ 'border-color': myform.design.colors.buttonTextColor }"> +<div class="form-fields" + ng-show="!myform.submitted && !myform.startPage.showStart" + ng-style="{ 'border-color': myform.design.colors.buttonTextColor }"> - <div class="row"> - <form name="forms.myForm" novalidate class="submission-form col-sm-12 col-md-offset-1 col-md-10"> + <div class="row form-field-wrapper"> + <form name="forms.myForm" novalidate class="submission-form"> <div ng-repeat="field in myform.form_fields" ng-if="!field.deletePreserved" data-index="{{$index}}" data-id="{{field._id}}" ng-class="{activeField: selected._id == field._id }" class="row field-directive"> <field-directive field="field" design="myform.design" index="$index" forms="forms"> </field-directive> </div> + <div class="row form-actions" id="submit_field" ng-class="{activeField: selected._id == 'submit_field' }" + ng-style="{ 'background-color':myform.design.colors.buttonColor}" style="border-top: 1px solid #ddd; margin-top: 30vh; height: 100vh; margin-left: 1%; margin-right: 1%;" + on-tab-and-shift-key="prevField()" + on-tab-key="nextField()" + on-enter-key="submitForm()"> + <div class="col-xs-12 text-left" style="background-color:#990000; color:white;" ng-if="forms.myForm.$invalid"> + {{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }} + </div> + + <button ng-if="!forms.myForm.$invalid" class="Button btn col-sm-2 col-xs-8 focusOn" v-busy="loading" v-busy-label="Please wait" v-pressable ng-disabled="loading || forms.myForm.$invalid" ng-click="submitForm()" on-enter-key-disabled="loading || forms.myForm.$invalid" ng-style="{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}" style="font-size: 1.6em; margin-left: 1em; margin-top: 1em;"> + + {{ 'SUBMIT' | translate }} + </button> + + <button ng-if="forms.myForm.$invalid" class="Button btn col-sm-2 col-xs-8 focusOn" ng-click="goToInvalid()" on-enter-key="goToInvalid()" on-enter-key-disabled="!forms.myForm.$invalid" style="font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white"> + {{ 'REVIEW' | translate }} + </button> + + <div class="col-sm-2 hidden-xs" style="font-size: 75%; margin-top:3.25em"> + <small> + {{ 'ENTER' | translate }} + </small> + </div> + </div> </form> </div> - <div class="row form-actions" id="submit_field" ng-class="{activeField: selected._id == 'submit_field' }" ng-style="{ 'background-color':myform.design.colors.buttonColor}" style="border-top: 1px solid #ddd; margin-right: -13%; margin-left: -13%; margin-top: 30vh; height: 100vh"> - - <div class="col-xs-12 text-left" style="background-color:#990000; color:white;" ng-if="forms.myForm.$invalid"> - {{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }} - </div> - - <button ng-if="!forms.myForm.$invalid" class="Button btn col-sm-2 col-xs-8 focusOn" v-busy="loading" v-busy-label="Please wait" v-pressable ng-disabled="loading || forms.myForm.$invalid" ng-click="submitForm()" on-enter-key="submitForm()" on-enter-key-disabled="loading || forms.myForm.$invalid" ng-style="{'background-color':myform.design.colors.buttonColor, 'color':myform.design.colors.buttonTextColor}" style="font-size: 1.6em; margin-left: 1em; margin-top: 1em;"> - - {{ 'SUBMIT' | translate }} - </button> - - <button ng-if="forms.myForm.$invalid" class="Button btn col-sm-2 col-xs-8 focusOn" ng-click="goToInvalid()" on-enter-key="goToInvalid()" on-enter-key-disabled="!forms.myForm.$invalid" style="font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white"> - {{ 'REVIEW' | translate }} - </button> - - <div class="col-sm-2 hidden-xs" style="font-size: 75%; margin-top:3.25em"> - <small> - {{ 'ENTER' | translate }} - </small> - </div> - </div> - <section ng-if="!myform.hideFooter" class="navbar navbar-fixed-bottom" ng-style="{ 'background-color':myform.design.colors.buttonColor, 'padding-top': '15px', 'border-top': '2px '+ myform.design.colors.buttonTextColor +' solid', 'color':myform.design.colors.buttonTextColor}"> <div class="container-fluid"> <div class="row"> diff --git a/public/form_modules/forms/base/views/form-not-found.client.view.html b/public/form_modules/forms/base/views/form-not-found.client.view.html new file mode 100644 index 00000000..84f77fe9 --- /dev/null +++ b/public/form_modules/forms/base/views/form-not-found.client.view.html @@ -0,0 +1,12 @@ +<script> +$(".loader").fadeOut("slow"); +</script> +<section class="public-form auth sigin-view valign-wrapper"> + <div class="row valign"> + <h3 class="col-md-12 text-center">404 - Form Does not Exist </h3> + <div class="col-md-4 col-md-offset-4"> + <div class="col-md-12 text-center" style="padding-bottom: 50px;"> + The form you are trying to access does not exist. Sorry about that! + </div> + </div> +</section> diff --git a/public/form_modules/forms/base/views/form-unauthorized.client.view.html b/public/form_modules/forms/base/views/form-unauthorized.client.view.html index 1fd0bebd..2d36dbab 100644 --- a/public/form_modules/forms/base/views/form-unauthorized.client.view.html +++ b/public/form_modules/forms/base/views/form-unauthorized.client.view.html @@ -1,4 +1,7 @@ -<section class="auth sigin-view valign-wrapper"> +<script> +$(".loader").fadeOut("slow"); +</script> +<section class="public-form auth sigin-view valign-wrapper"> <div class="row valign"> <h3 class="col-md-12 text-center">Not Authorized to Access Form</h3> <div class="col-md-4 col-md-offset-4"> diff --git a/public/form_modules/forms/base/views/submit-form.client.view.html b/public/form_modules/forms/base/views/submit-form.client.view.html index 232cb82a..8305c031 100644 --- a/public/form_modules/forms/base/views/submit-form.client.view.html +++ b/public/form_modules/forms/base/views/submit-form.client.view.html @@ -1,4 +1,4 @@ -<section class="public-form" ng-style="{ 'background-color': myform.design.colors.backgroundColor }"> +<section class="public-form"> <submit-form-directive myform="myform"></submit-form-directive> </section> diff --git a/public/form_modules/forms/config/forms.client.routes.js b/public/form_modules/forms/config/forms.client.routes.js index 8c0c67a2..6a7ed097 100644 --- a/public/form_modules/forms/config/forms.client.routes.js +++ b/public/form_modules/forms/config/forms.client.routes.js @@ -27,7 +27,11 @@ angular.module('view-form').config(['$stateProvider', }). state('unauthorizedFormAccess', { url: '/forms/unauthorized', - templateUrl: '/static/form_modules/forms/base/views/form-unauthorized.client.view.html', + templateUrl: '/static/form_modules/forms/base/views/form-unauthorized.client.view.html' + }) + .state('formNotFound', { + url: '*path', + templateUrl: '/static/form_modules/forms/base/views/form-not-found.client.view.html' }); } ]); diff --git a/public/form_modules/forms/directives/analytics-service.client.directive.js b/public/form_modules/forms/directives/analytics-service.client.directive.js index ed233746..c40aad44 100644 --- a/public/form_modules/forms/directives/analytics-service.client.directive.js +++ b/public/form_modules/forms/directives/analytics-service.client.directive.js @@ -28,18 +28,6 @@ deviceType = 'desktop'; } - $.ajaxSetup( { 'async': false } ); - var geoData = $.getJSON('https://freegeoip.net/json/').responseJSON; - $.ajaxSetup( { 'async': true } ); - - if(!geoData){ - geoData = { - ip: '', - city: '', - country_name: '' - }; - } - // Create a new message object var visitorData = { referrer: document.referrer, @@ -49,11 +37,8 @@ timeElapsed: timeElapsed, language: lang, deviceType: deviceType, - ipAddr: geoData.ip, - geoLocation: { - city: geoData.city, - country: geoData.country_name - } + ipAddr: null, + geoLocation: null }; Socket.emit('form-visitor-data', visitorData); diff --git a/public/modules/core/css/core.css b/public/modules/core/css/core.css index 5410f01e..ca6b9c2a 100755 --- a/public/modules/core/css/core.css +++ b/public/modules/core/css/core.css @@ -1,3 +1,18 @@ +/*Modal overlay (for lightbox effect)*/ +.overlay { + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; + background-color: rgb(0,0,0); + background-color: rgba(0,0,0,0.5); + z-index: 10; +} +.overlay.submitform { + background-color: rgb(256,256,256); + background-color: rgba(256,256,256,0.8); +} .form-item .title-row > .list-group-item-heading { color: #34628a; diff --git a/public/modules/forms/admin/controllers/admin-form.client.controller.js b/public/modules/forms/admin/controllers/admin-form.client.controller.js index be9ba4b7..7dac194d 100644 --- a/public/modules/forms/admin/controllers/admin-form.client.controller.js +++ b/public/modules/forms/admin/controllers/admin-form.client.controller.js @@ -16,6 +16,7 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo $scope.animationsEnabled = true; $scope.myform = myForm; $rootScope.saveInProgress = false; + $scope.oldForm = _.cloneDeep($scope.myform); CurrentForm.setForm($scope.myform); @@ -42,13 +43,23 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo } }; - $scope.tabData = [ + $scope.tabData = [ { heading: $filter('translate')('CONFIGURE_TAB'), templateName: 'configure' } ]; + $scope.designTabActive = false + + $scope.deactivateDesignTab = function(){ + $scope.designTabActive = false + } + + $scope.activateDesignTab = function(){ + $scope.designTabActive = true + } + $scope.setForm = function(form){ $scope.myform = form; }; @@ -102,16 +113,20 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo } }; - // Update existing Form - $scope.update = $rootScope.update = function(updateImmediately, data, isDiffed, refreshAfterUpdate, cb){ - refreshFrame(); + $scope.updateDesign = function(updateImmediately, data, shouldDiff, refreshAfterUpdate){ + $scope.update(updateImmediately, data, shouldDiff, refreshAfterUpdate, function(){ + refreshFrame(); + }); + } + // Update existing Form + $scope.update = $rootScope.update = function(updateImmediately, data, shouldDiff, refreshAfterUpdate, cb){ var continueUpdate = true; if(!updateImmediately){ continueUpdate = !$rootScope.saveInProgress; } - //Update form **if we are not currently updating** or if **shouldUpdateNow flag is set** + //Update form **if we are not in the middle of an update** or if **shouldUpdateNow flag is set** if(continueUpdate) { var err = null; @@ -119,11 +134,24 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo $rootScope.saveInProgress = true; } - if (isDiffed) { + if (shouldDiff) { + //Do this so we can create duplicate fields + var checkForValidId = new RegExp('^[0-9a-fA-F]{24}$'); + for(var i=0; i < $scope.myform.form_fields.length; i++){ + var field = $scope.myform.form_fields[i]; + if(!checkForValidId.exec(field._id+'')){ + delete $scope.myform.form_fields[i]._id; + delete $scope.myform.form_fields[i].id; + } + } + + var data = DeepDiff.diff($scope.oldForm, $scope.myform); + $scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {changes: data}) .then(function (response) { if (refreshAfterUpdate) { $rootScope.myform = $scope.myform = response.data; + $scope.oldForm = _.cloneDeep($scope.myform); } }).catch(function (response) { err = response.data; @@ -146,6 +174,22 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo delete dataToSend.submissions; } + if(dataToSend.visible_form_fields){ + delete dataToSend.visible_form_fields; + } + + if(dataToSend.analytics){ + delete dataToSend.analytics.visitors; + delete dataToSend.analytics.fields; + delete dataToSend.analytics.submissions; + delete dataToSend.analytics.views; + delete dataToSend.analytics.conversionRate; + } + + delete dataToSend.created; + delete dataToSend.lastModified; + delete dataToSend.__v; + $scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {form: dataToSend}) .then(function (response) { if (refreshAfterUpdate) { diff --git a/public/modules/forms/admin/controllers/list-forms.client.controller.js b/public/modules/forms/admin/controllers/list-forms.client.controller.js index b3c7d78f..476a9a2a 100644 --- a/public/modules/forms/admin/controllers/list-forms.client.controller.js +++ b/public/modules/forms/admin/controllers/list-forms.client.controller.js @@ -1,12 +1,13 @@ 'use strict'; // Forms controller -angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope', '$stateParams', '$state', 'GetForms', 'CurrentForm', '$http', '$uibModal', - function($rootScope, $scope, $stateParams, $state, GetForms, CurrentForm, $http, $uibModal) { +angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope', '$stateParams', '$state', 'GetForms', 'CurrentForm', '$http', '$uibModal', 'myForms', + function($rootScope, $scope, $stateParams, $state, GetForms, CurrentForm, $http, $uibModal, myForms) { $scope = $rootScope; $scope.forms = {}; $scope.showCreateModal = false; + $scope.myforms = myForms $rootScope.languageRegExp = { regExp: /[@!#$%^&*()\-+={}\[\]|\\/'";:`.,~№?<>]+/i, @@ -49,13 +50,6 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope } }; - // Return all user's Forms - $scope.findAll = function() { - GetForms.query(function(_forms){ - $scope.myforms = _forms; - }); - }; - //Modal functions $scope.openCreateModal = function(){ if(!$scope.showCreateModal){ diff --git a/public/modules/forms/admin/directives/edit-form.client.directive.js b/public/modules/forms/admin/directives/edit-form.client.directive.js index bc75eeec..28cd0d6b 100644 --- a/public/modules/forms/admin/directives/edit-form.client.directive.js +++ b/public/modules/forms/admin/directives/edit-form.client.directive.js @@ -1,3 +1,4 @@ + 'use strict'; angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormFields', '$uibModal', @@ -23,7 +24,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField forceHelperSize: true, forcePlaceholderSize: true, update: function(e, ui) { - $scope.update(false, $scope.myform, false, false, function(err){ + $scope.update(false, $scope.myform, true, false, function(err){ }); }, }; @@ -31,7 +32,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField /* ** EditModal Functions */ - $scope.openEditModal = function(curr_field){ + $scope.openEditModal = function(curr_field, isEdit, field_index){ $scope.editFieldModal = $uibModal.open({ animation: true, templateUrl: 'editFieldModal.html', @@ -40,9 +41,11 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField $scope.field = curr_field; $scope.showLogicJump = false; + $scope.isEdit = isEdit; + // decides whether field options block will be shown (true for dropdown and radio fields) $scope.showAddOptions = function (field){ - if(field.fieldType === 'dropdown' || field.fieldType === 'checkbox' || field.fieldType === 'radio'){ + if($scope.field.fieldType === 'dropdown' || $scope.field.fieldType === 'checkbox' || $scope.field.fieldType === 'radio'){ return true; } else { return false; @@ -66,13 +69,13 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField ]; // add new option to the field - $scope.addOption = function(currField){ - if(currField.fieldType === 'checkbox' || currField.fieldType === 'dropdown' || currField.fieldType === 'radio'){ - if(!currField.fieldOptions){ - currField.fieldOptions = []; + $scope.addOption = function(){ + if($scope.field.fieldType === 'checkbox' || $scope.field.fieldType === 'dropdown' || $scope.field.fieldType === 'radio'){ + if(!$scope.field.fieldOptions){ + $scope.field.fieldOptions = []; } - var lastOptionID = currField.fieldOptions.length+1; + var lastOptionID = $scope.field.fieldOptions.length+1; // new option's id @@ -83,17 +86,17 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; // put new option into fieldOptions array - currField.fieldOptions.push(newOption); + $scope.field.fieldOptions.push(newOption); } }; // delete particular option - $scope.deleteOption = function (currField, option){ - if(currField.fieldType === 'checkbox' || currField.fieldType === 'dropdown' || currField.fieldType === 'radio'){ - for(var i = 0; i < currField.fieldOptions.length; i++){ - if(currField.fieldOptions[i].option_id === option.option_id){ + $scope.deleteOption = function (option){ + if($scope.field.fieldType === 'checkbox' || $scope.field.fieldType === 'dropdown' || $scope.field.fieldType === 'radio'){ + for(var i = 0; i < $scope.field.fieldOptions.length; i++){ + if($scope.field.fieldOptions[i].option_id === option.option_id){ - currField.fieldOptions.splice(i, 1); + $scope.field.fieldOptions.splice(i, 1); break; } } @@ -118,8 +121,8 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; // decides whether field options block will be shown (true for dropdown and radio fields) - $scope.showRatingOptions = function (field){ - if(field.fieldType === 'rating'){ + $scope.showRatingOptions = function (){ + if($scope.field.fieldType === 'rating'){ return true; } else { return false; @@ -127,11 +130,16 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; $scope.saveField = function(){ + if($scope.isEdit){ + $scope.myform.form_fields[field_index] = $scope.field; + } else { + $scope.myform.form_fields.push(curr_field); + } - $scope.myform.form_fields.push(curr_field); - $scope.$parent.update(false, $scope.$parent.myform, false, true, function(){ + $scope.$parent.update(false, $scope.$parent.myform, true, true, function(){ $uibModalInstance.close(); }); + }; $scope.cancel = function(){ $uibModalInstance.close(); @@ -184,7 +192,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; $scope.saveStartPage = function(){ - $scope.$parent.update(false, $scope.$parent.myform, false, true, function(){ + $scope.$parent.update(false, $scope.$parent.myform, true, true, function(){ $uibModalInstance.close(); }); }; @@ -196,7 +204,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; /* - ** EditStartPageModal Functions + ** EditEndPageModal Functions */ $scope.openEditEndPageModal = function(){ $scope.editEndPageModal = $uibModal.open({ @@ -239,7 +247,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }; $scope.saveEndPage = function(){ - $scope.$parent.update(false, $scope.$parent.myform, false, true, function(){ + $scope.$parent.update(false, $scope.$parent.myform, true, true, function(){ $uibModalInstance.close(); }); }; @@ -267,7 +275,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField ** Field CRUD Methods */ // Add a new field - $scope.addNewField = function(modifyForm, fieldType){ + $scope.addNewField = function(fieldType){ // increment lastAddedID counter $scope.addField.lastAddedID++; var fieldTitle = fieldType; @@ -306,12 +314,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField }); } - if(modifyForm){ - //Add newField to form_fields array - $scope.myform.form_fields.push(newField); - } - - $scope.openEditModal(newField); + $scope.openEditModal(newField, false, $scope.myform.form_fields.length); }; // decides whether field options block will be shown (true for dropdown and radio fields) diff --git a/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js b/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js index 1e61b889..15f5ead9 100644 --- a/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js +++ b/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js @@ -16,27 +16,10 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', rows: [] }; - var submissions = $scope.myform.submissions || []; - - //Iterate through form's submissions - for(var i = 0; i < submissions.length; i++){ - for(var x = 0; x < submissions[i].form_fields.length; x++){ - if(submissions[i].form_fields[x].fieldType === 'dropdown'){ - submissions[i].form_fields[x].fieldValue = submissions[i].form_fields[x].fieldValue.option_value; - } - //var oldValue = submissions[i].form_fields[x].fieldValue || ''; - //submissions[i].form_fields[x] = _.merge(defaultFormFields, submissions[i].form_fields); - //submissions[i].form_fields[x].fieldValue = oldValue; - } - submissions[i].selected = false; - } - - $scope.table.rows = submissions; - var initController = function(){ $http({ method: 'GET', - url: '/someUrl' + url: '/forms'+$scope.myform._id+'/submissions' }).then(function successCallback(response) { var defaultFormFields = _.cloneDeep($scope.myform.form_fields); @@ -59,6 +42,8 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', }); }; + initController(); + /* ** Analytics Functions diff --git a/public/modules/forms/admin/views/admin-form.client.view.html b/public/modules/forms/admin/views/admin-form.client.view.html index c718839a..bbcc183b 100644 --- a/public/modules/forms/admin/views/admin-form.client.view.html +++ b/public/modules/forms/admin/views/admin-form.client.view.html @@ -59,16 +59,16 @@ <div class="row"> <div class="col-xs-12"> <uib-tabset active="activePill" vertical="true" type="pills"> - <uib-tab index="0" heading="{{ 'CREATE_TAB' | translate }}"> + <uib-tab index="0" heading="{{ 'CREATE_TAB' | translate }}" select="deactivateDesignTab()"> <edit-form-directive myform="myform"></edit-form-directive> </uib-tab> - <uib-tab ng-repeat="tab in tabData" index="{{$index+1}}" heading="{{tab.heading}}"> + <uib-tab ng-repeat="tab in tabData" index="{{$index+1}}" heading="{{tab.heading}}" select="deactivateDesignTab()"> <div class='row' data-ng-include="'/static/modules/forms/admin/views/adminTabs/'+tab.templateName+'.html'"></div> </uib-tab> - <uib-tab index="2" heading="{{ 'ANALYZE_TAB' | translate }}"> + <uib-tab index="2" heading="{{ 'ANALYZE_TAB' | translate }}" select="deactivateDesignTab()"> <edit-submissions-form-directive myform="myform" user="myform.admin"></edit-submissions-form-directive> </uib-tab> - <uib-tab ng-if="tabData" heading="{{ 'SHARE_TAB' | translate }}" index="{{tabData.length}}"> + <uib-tab ng-if="tabData" heading="{{ 'SHARE_TAB' | translate }}" index="{{tabData.length}}" select="deactivateDesignTab()"> <div class="config-form"> <div class="row"> <div class="col-sm-12"> @@ -114,7 +114,8 @@ </div> </div> </uib-tab> - <uib-tab ng-if="tabData && myform.form_fields.length" heading="{{ 'DESIGN_TAB' | translate }}" index="{{tabData.length}}+1"> + <uib-tab class="design-tab" ng-if="tabData && myform.form_fields.length" heading="{{ 'DESIGN_TAB' | translate }}" index="{{tabData.length}}+1" + select="activateDesignTab()"> <div class="config-form design container"> <div class="row"> <div class="col-sm-4 col-xs-12"> @@ -175,7 +176,7 @@ </div> </div> </div> - <div class="col-sm-8 hidden-xs"> + <div class="col-sm-8 hidden-xs" ng-if="designTabActive"> <div class="public-form" ng-style="{ 'background-color': myform.design.colors.backgroundColor }"> <iframe id="iframe" ng-if="!!formURL" ng-src="{{formURL | trustSrc}}" style="border: none; box-shadow: 0px 0px 10px 0px grey; overflow: hidden; height: 400px; width: 90%; position: absolute;"></iframe> </div> @@ -184,7 +185,7 @@ <div class="row"> <div class="col-sm-offset-4 col-sm-2"> - <button class="btn btn-signup btn-rounded" type="button" ng-click="update(false, myform, false, false, null)"><i class="icon-arrow-left icon-white"></i>{{ 'SAVE_CHANGES' | translate }}</button> + <button class="btn btn-signup btn-rounded" type="button" ng-click="updateDesign(false, myform, false, false)"><i class="icon-arrow-left icon-white"></i>{{ 'SAVE_CHANGES' | translate }}</button> </div> <div class="col-sm-1"> <button class="btn btn-secondary btn-rounded" type="button" ng-click="resetForm()"><i class="icon-eye-open icon-white"></i>{{ 'CANCEL' | translate }}</button> diff --git a/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html b/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html index f7470c81..994ab73d 100644 --- a/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html +++ b/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html @@ -146,8 +146,6 @@ </div> </div> - - </script> <!-- Edit StartPage Modal Dialog Template --> @@ -291,8 +289,6 @@ </div> </div> - - </script> <!-- Edit Field Modal Dialog Template --> @@ -312,34 +308,34 @@ <div class="row"><br></div> - <div class="row description" ng-hide="showRatingOptions(field)"> + <div class="row description" ng-hide="showRatingOptions()"> <div class="col-md-12 bold">{{ 'QUESTION_DESCRIPTION' | translate }}</div> <div class="col-md-12"> <textarea type="text" class="form-control" ng-model="field.description" name="description{{field._id}}"value="{{field.description}}"></textarea> </div> </div> - <div class="row" ng-show="showAddOptions(field)"><br></div> - <div class="row options" ng-if="showAddOptions(field)"> + <div class="row" ng-show="showAddOptions()"><br></div> + <div class="row options" ng-if="showAddOptions()"> <div class="col-md-4 col-xs-12">{{ 'OPTIONS' | translate }}</div> <div class="col-md-8 col-xs-12"> <div ng-repeat="option in field.fieldOptions track by option.option_id" class="row"> <input type="text" name="{{option.option_value}}{{field._id}}" ng-model="option.option_value" class="col-xs-5"> - <a class="btn btn-danger btn-mini right" type="button" ng-click="deleteOption(field, option)" class="col-xs-3"> + <a class="btn btn-danger btn-mini right" type="button" ng-click="deleteOption(option)" class="col-xs-3"> <i class="fa fa-trash-o"></i> </a> </div> <div class="row"> - <button class="btn btn-primary btn-small col-md-offset-0 col-md-6 col-sm-4 col-sm-offset-4 col-xs-6 col-xs-offset-6" type="button" ng-click="addOption(field)"> + <button class="btn btn-primary btn-small col-md-offset-0 col-md-6 col-sm-4 col-sm-offset-4 col-xs-6 col-xs-offset-6" type="button" ng-click="addOption()"> <i class="icon-plus icon-white"></i> {{ 'ADD_OPTION' | translate }} </button> </div> </div> </div> - <div class="row" ng-show="showRatingOptions(field)"><br></div> - <div class="row" ng-if="showRatingOptions(field)"> + <div class="row" ng-show="showRatingOptions()"><br></div> + <div class="row" ng-if="showRatingOptions()"> <div class="col-md-9 col-sm-9">{{ 'NUM_OF_STEPS' | translate }}</div> <div class="col-md-3 col-sm-3"> <input style="width:100%" type="number" @@ -383,7 +379,7 @@ <div class="col-md-4 col-xs-12 field-input">{{ 'LOGIC_JUMP' | translate }}</div> <div class="col-md-8 col-xs-12 field-input"> <label class="switch-light switch-holo" onclick=""> - <input type="checkbox" ng-model="showLogicJump"> + <input type="checkbox" ng-model="field.logicJump.enabled"> <span> <span> {{ 'OFF' | translate }}</span> <span> {{ 'ON' | translate }}</span> @@ -392,7 +388,7 @@ </label> </div> </div> - <div class="row question" ng-if="!!showLogicJump"> + <div class="row question" ng-if="field.logicJump.enabled""> <div class="col-md-4 col-sm-12"> <b> {{ 'IF_THIS_FIELD' | translate }} </b> @@ -483,7 +479,7 @@ </div> <div class="preview-field-panel col-md-6 hidden-sm hidden-xs"> - <form class="public-form"ss> + <form class="public-form"> <field-directive field="field" validate="false" class="preview-field"> </field-directive> </form> @@ -507,7 +503,7 @@ <div class="col-xs-12 col-sm-12 col-md-6" ng-repeat="type in addField.types" style="padding-top:7.5px;"> <div class="panel panel-default" style="background-color:#f5f5f5;"> - <div class="panel-heading" ng-click="addNewField(false, type.name)" style="cursor: pointer; font-size:12px; padding-left: 10px; padding-right: 10px;"> + <div class="panel-heading" ng-click="addNewField(type.name)" style="cursor: pointer; font-size:12px; padding-left: 10px; padding-right: 10px;"> <span> <field-icon-directive type-name="{{type.name}}"> </field-icon-directive> @@ -545,7 +541,7 @@ <div class="col-xs-12 field-row" ng-repeat="field in myform.form_fields track by $id($index)" ng-if="!field.deletePreserved"> <div class="col-xs-10"> - <div class="panel panel-default" ng-click="openEditModal(field)"> + <div class="panel panel-default" ng-click="openEditModal(field, true, $index)"> <div class="panel-heading"> <div class="row"> <span class="col-xs-1" ng-switch="field.fieldType"> diff --git a/public/modules/forms/admin/views/list-forms.client.view.html b/public/modules/forms/admin/views/list-forms.client.view.html index 3ee36e0f..25013d05 100644 --- a/public/modules/forms/admin/views/list-forms.client.view.html +++ b/public/modules/forms/admin/views/list-forms.client.view.html @@ -25,7 +25,7 @@ </div> </script> -<section data-ng-controller="ListFormsController as ctrl" data-ng-init="findAll()" class="container"> +<section class="container"> <br> <div class="row"> <div ng-click="openCreateModal()" class="col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item create-new"> @@ -71,7 +71,8 @@ <div data-ng-repeat="form in myforms" class="col-xs-6 col-xs-offset-3 col-sm-4 col-sm-offset-1 col-md-3 col-md-offset-1 form-item container" - ng-class="{'paused': !form.isLive}"> + ng-class="{'paused': !form.isLive}" + ng-clkc="goToWithId('viewForm.create', form._id)"> <div class="row"> <span class="pull-right"> diff --git a/public/modules/forms/base/css/form.css b/public/modules/forms/base/css/form.css index bdceacd6..7e467bea 100644 --- a/public/modules/forms/base/css/form.css +++ b/public/modules/forms/base/css/form.css @@ -1,3 +1,23 @@ +/*Modal overlay (for lightbox effect)*/ +.overlay { + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; + background-color: rgb(0,0,0); + background-color: rgba(0,0,0,0.5); + z-index: 10; +} +.overlay.submitform { + background-color: rgb(256,256,256); + background-color: rgba(256,256,256,0.8); +} + +form .btn { + border-color: grey; +} + .public-form.preview { border: none; box-shadow: 0px 0px 10px 0px grey; @@ -11,37 +31,38 @@ .public-form input, .public-form textarea { background-color: #000000; background-color: rgba(0,0,0,0); - border: 2px dashed #ddd!important; + border-width: 0px; } -.public-form input:focus, .public-form textarea:focus { - border: 2px dashed #ddd!important; +form .btn { + border-color: grey; +} + +.public-form input.ng-untouched, .public-form textarea.ng-untouched { + border-width: 0 0 2px 0; + border-color: rgba(246, 255, 181, 0.4); outline: 0; } -/*.public-form input.no-border.ng-invalid, .public-form textarea.no-border { - border-color: none; -}*/ -.public-form input.ng-valid, .public-form textarea.ng-valid { - /*border-color: #20FF20!important; - border-style: solid!important; - border-width: 3px!important;*/ +.public-form input:focus, .public-form textarea:focus { + border-width: 0 0 2px 0; + border-color: rgba(246, 255, 181, 0.4); + outline: 0; } -.public-form input.ng-invalid.ng-dirty, .public-form textarea.ng-invalid.ng-dirty { - /*border-color: #FA787E!important; - border-style: solid!important; - border-width: 3px!important;*/ +.public-form input.ng-dirty, .public-form textarea.ng-dirty { + border-width: 0; +} + +.public-form input.empty, .public-form textarea.empty { + border-width: 0 0 2px 0; + border-color: rgba(246, 255, 181, 0.4); } section.content p.breakwords { word-break: break-all; } -.public-form .btn { - border: 1px solid #c6c6c6; -} - .public-form .btn[type='submit'] { font-size: 1.5em; padding: 0.35em 1.2em 0.35em 1.2em; @@ -142,7 +163,7 @@ form .row.field { form .row.field > .field-title { margin-top:0.5em; font-size:1.2em; - padding-bottom: 1.8em; + padding-bottom: 0.5em; width: inherit; } form .row.field > .field-input { @@ -243,15 +264,12 @@ form .row.field { } /* Styles for form list view (/forms) */ -section.public-form { - padding: 0 10% 0 10%; -} -section.public-form .form-submitted { - height: 100vh; +section.public-form field-directive .btn.btn-lg.btn-default { + background: none; } -section.public-form .btn { - border: 1px solid; +section.public-form field-directive .btn[disabled]{ + display: none; } .form-item { @@ -330,42 +348,16 @@ section.public-form .btn { top:0; } -/*Modal overlay (for lightbox effect)*/ -.overlay { - position: fixed; - top: 0; - left: 0; - height: 100%; - width: 100%; - background-color: #000; - background-color: rgba(0,0,0,0.5); - z-index: 10; -} -.overlay.submitform { - background-color: #fff; - background-color: rgba(256,256,256,0.8); +.field-directive { + opacity: 0.2; + padding: 2.5% 10% 2.5% 10%; } -.field-directive { - z-index: 9; - padding: 10% 10% 10% 0; - border: 25px transparent solid; - position: relative; +.form-field-wrapper .form-actions.activeField, .field-directive.activeField { + opacity: 1; } -.activeField { - z-index: 11; - position: relative; - background-color: transparent; -} -.activeField.field-directive { - display: inline-block; - border-radius: 7px; - width: 100%; - border: 25px transparent solid; -} - .activeField input { - background-color: transparent; - } + + h3.forms-list-title { color: #3FA2F7; font-weight: 600; diff --git a/public/modules/forms/config/forms.client.routes.js b/public/modules/forms/config/forms.client.routes.js index 29b04a83..13247964 100644 --- a/public/modules/forms/config/forms.client.routes.js +++ b/public/modules/forms/config/forms.client.routes.js @@ -8,7 +8,21 @@ angular.module('forms').config(['$stateProvider', $stateProvider. state('listForms', { url: '/forms', - templateUrl: 'modules/forms/admin/views/list-forms.client.view.html' + templateUrl: 'modules/forms/admin/views/list-forms.client.view.html', + resolve: { + Forms: 'GetForms', + myForms: function (GetForms, $q) { + var deferred = $q.defer(); + + GetForms.query(function(forms){ + deferred.resolve(forms); + }); + + return deferred.promise; + } + }, + controller: 'ListFormsController', + controllerAs: 'ctrl' }).state('submitForm', { url: '/forms/:formId', templateUrl: '/static/form_modules/forms/base/views/submit-form.client.view.html', diff --git a/public/modules/forms/tests/unit/controllers/admin-form.client.controller.test.js b/public/modules/forms/tests/unit/controllers/admin-form.client.controller.test.js index c9ba87a3..ba92adaf 100644 --- a/public/modules/forms/tests/unit/controllers/admin-form.client.controller.test.js +++ b/public/modules/forms/tests/unit/controllers/admin-form.client.controller.test.js @@ -60,22 +60,13 @@ var newFakeModal = function(){ var result = { opened: true, - result: { - then: function(confirmCallback, cancelCallback) { - //Store the callbacks for later when the user clicks on the OK or Cancel button of the dialog - this.confirmCallBack = confirmCallback; - this.cancelCallback = cancelCallback; - } - }, close: function( item ) { //The user clicked OK on the modal dialog, call the stored confirm callback with the selected item this.opened = false; - this.result.confirmCallBack( item ); }, dismiss: function( type ) { //The user clicked cancel on the modal dialog, call the stored cancel callback this.opened = false; - this.result.cancelCallback( type ); } }; return result; @@ -173,7 +164,6 @@ beforeEach(inject(function($uibModal) { var modal = newFakeModal(); spyOn($uibModal, 'open').and.returnValue(modal); - //spyOn($uibModal, 'close').and.callFake(modal.close()); })); // The injector ignores leading and trailing underscores here (i.e. _$httpBackend_). diff --git a/public/modules/users/css/users.css b/public/modules/users/css/users.css index bf52e2bb..8a70ecf0 100755 --- a/public/modules/users/css/users.css +++ b/public/modules/users/css/users.css @@ -115,7 +115,3 @@ input.form-control { font-size: 18px; padding: 20px 10px; } - -.btn { - border: none; -} diff --git a/public/modules/users/views/authentication/signup-success.client.view.html b/public/modules/users/views/authentication/signup-success.client.view.html index fe5d0b35..64740702 100755 --- a/public/modules/users/views/authentication/signup-success.client.view.html +++ b/public/modules/users/views/authentication/signup-success.client.view.html @@ -27,7 +27,7 @@ <br><br> <p> - <strong>{{ 'BEFORE_YOU_CONTINUE' | translate }}</strong> <a href="mail:polydaic@gmail.com">polydaic@gmail.com</a></p> + <strong>{{ 'BEFORE_YOU_CONTINUE' | translate }}</strong> <a href="mail:team@tellform.com">team@tellform.com</a></p> <div class="text-center form-group"> <button type="submit" class="btn btn-primary btn-rounded"> <a href="/#!/" style="color: white; text-decoration: none;">{{ 'CONTINUE' | translate }}</a> diff --git a/public/modules/users/views/password/forgot-password.client.view.html b/public/modules/users/views/password/forgot-password.client.view.html index 6814471b..9d93d4c9 100755 --- a/public/modules/users/views/password/forgot-password.client.view.html +++ b/public/modules/users/views/password/forgot-password.client.view.html @@ -13,10 +13,10 @@ <div class="text-center form-group"> <button type="submit" class="btn btn-signup btn-rounded btn-block">{{ 'PASSWORD_RESTORE_HEADER' | translate }}</button> </div> - <div data-ng-show="error" class="text-center text-danger"> - <strong>{{error}}</strong> + <div data-ng-show="error" class="text-center"> + <strong>Error: {{error}}</strong> </div> - <div data-ng-show="success" class="text-center text-success"> + <div data-ng-show="success" class="text-center"> <strong>{{success}}</strong> </div> </fieldset> diff --git a/scripts/create_admin.js b/scripts/create_admin.js index 18934e5e..6d5ee5c6 100644 --- a/scripts/create_admin.js +++ b/scripts/create_admin.js @@ -5,17 +5,14 @@ var config = require('../config/config'), exports.run = function(app, db, cb) { var User = mongoose.model('User'); - - var email = config.ADMIN_EMAIL || 'admin@admin.com'; - var username = config.ADMIN_USERNAME || 'root'; - var password = config.ADMIN_PASSWORD || 'root'; - + var email = 'admin@admin.com' || config.admin.email; + var newUser = new User({ firstName: 'Admin', lastName: 'Account', email: email, - username: username, - password: password, + username: 'root' || config.admin.username, + password: 'root' || config.admin.password, provider: 'local', roles: ['admin', 'user'] }); diff --git a/server.js b/server.js index db524e99..4f516183 100755 --- a/server.js +++ b/server.js @@ -3,11 +3,13 @@ * Module dependencies. */ -//Load ENV vars from .env -if ((process.env.NODE_ENV || 'development') === 'development') { - require('dotenv').config(); +require('dotenv').config({path: './.env'}); + +if(!process.env.NODE_ENV){ + process.env.NODE_ENV = 'development'; } + require('events').EventEmitter.prototype._maxListeners = 0; var config = require('./config/config'), diff --git a/start.sh b/start.sh new file mode 100755 index 00000000..e19cf634 --- /dev/null +++ b/start.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +node server.js +#pm2 start process.yml diff --git a/tellform_installation_blog_post.mdown b/tellform_installation_blog_post.mdown new file mode 100644 index 00000000..f8b4389e --- /dev/null +++ b/tellform_installation_blog_post.mdown @@ -0,0 +1,57 @@ +Introduction +=========== + +TellForm is a powerful, open-source form/survey tool that allows you to get data from your users quickly and easily while collecting powerful analytics to improve your surveys. TellForm offers a field by field analytics, custom subdomains per-user, an extendable API, logic-based field jumping, per-device visitor analytics and 11 types of form fields. + +By default, TellForm is setup to serve custom subdomains, but you can also configure it to work on a single domain, for those using it in more restricted environments. + +Exporters—both the official ones that the Prometheus team maintains as well as the community-contributed ones—provide information about everything from infrastructure, databases, and web servers to messaging systems, APIs, and more. + +In this tutorial, you'll install, configure, and secure TellForm to selfhost forms that will make it easy for you and your users to use. + +Prerequisites +Before following this tutorial make sure you have: + +One Ubuntu 16.x or 14.x Droplet, set up by following the [Initial Server Setup with Ubuntu 16.04 tutorial](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04), including a sudo non-root user and a firewall. +Nginx installed by following the first two steps of the [How To Install Nginx on Ubuntu 16.04 tutorial](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04). +Docker installed by following the steps of the [How To Install and Use Docker on Ubuntu 16.04 tutorial](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04) + + +## Step 1 - Fetch Docker-Compose Files + +``` +$ curl -L github.com/tellform/tellform/stable/blob/docker-compose.yml +$ curl -L github.com/tellform/tellform/stable/blob/.env +``` + +### Prepare .env file: +Create `.env` file at project root folder. Fill in `MAILER_SERVICE_PROVIDER`, `MAILER_EMAIL_ID`, `MAILER_PASSWORD` and `MAILER_FROM`. +``` +APP_NAME=TellForm +BASE_URL=localhost:3000 +PORT=3000 +DB_PORT_27017_TCP_ADDR=tellform-mongo +REDIS_DB_PORT_6379_TCP_ADDR=tellform-redis +MAILER_SERVICE_PROVIDER=<TO-FILL-IN> +MAILER_EMAIL_ID=<TO-FILL-IN> +MAILER_PASSWORD=<TO-FILL-IN> +MAILER_FROM=<TO-FILL-IN> +SIGNUP_DISABLED=false +SUBDOMAINS_DISABLED=true +DISABLE_CLUSTER_MODE=true +``` + +### Build docker image + +``` +$ docker-compose build +``` + +### Run docker containers with docker-compose + +Create and start mongo & redis docker container: +``` +$ docker-compose up -d +``` + +Your application should run at the BASE_URL you specified on port 443. \ No newline at end of file