From f1cd549dd360997ac6e49d897c2c471ebb8955fd Mon Sep 17 00:00:00 2001 From: Felipe Date: Sun, 28 Feb 2016 10:59:40 -0300 Subject: [PATCH] Primeiro commit --- .bowerrc | 3 + .editorconfig | 14 + .gitignore | 6 + bower.json | 7 + config.xml | 43 + gulpfile.js | 51 + hooks/README.md | 83 + hooks/after_prepare/010_add_platform_class.js | 94 + ionic.project | 4 + package.json | 26 + resources/android/icon/drawable-hdpi-icon.png | Bin 0 -> 5494 bytes resources/android/icon/drawable-ldpi-icon.png | Bin 0 -> 2283 bytes resources/android/icon/drawable-mdpi-icon.png | Bin 0 -> 3383 bytes .../android/icon/drawable-xhdpi-icon.png | Bin 0 -> 7798 bytes .../android/icon/drawable-xxhdpi-icon.png | Bin 0 -> 12965 bytes .../android/icon/drawable-xxxhdpi-icon.png | Bin 0 -> 14256 bytes resources/android/splash.png | Bin 0 -> 76284 bytes .../splash/drawable-land-hdpi-screen.png | Bin 0 -> 53480 bytes .../splash/drawable-land-ldpi-screen.png | Bin 0 -> 17880 bytes .../splash/drawable-land-mdpi-screen.png | Bin 0 -> 29316 bytes .../splash/drawable-land-xhdpi-screen.png | Bin 0 -> 89822 bytes .../splash/drawable-land-xxhdpi-screen.png | Bin 0 -> 115611 bytes .../splash/drawable-land-xxxhdpi-screen.png | Bin 0 -> 144782 bytes .../splash/drawable-port-hdpi-screen.png | Bin 0 -> 53674 bytes .../splash/drawable-port-ldpi-screen.png | Bin 0 -> 18010 bytes .../splash/drawable-port-mdpi-screen.png | Bin 0 -> 29430 bytes .../splash/drawable-port-xhdpi-screen.png | Bin 0 -> 89718 bytes .../splash/drawable-port-xxhdpi-screen.png | Bin 0 -> 113804 bytes .../splash/drawable-port-xxxhdpi-screen.png | Bin 0 -> 143202 bytes resources/icon.png | Bin 0 -> 12409 bytes scss/ionic.app.scss | 23 + www/css/style.css | 15 + www/img/ionic.png | Bin 0 -> 4757 bytes www/index.html | 35 + www/js/app.js | 23 + www/js/app.routes.js | 16 + www/js/controllers/calculoController.js | 22 + www/js/controllers/resultadoController.js | 4 + www/js/services/calculoImc.js | 29 + www/lib/ionic/css/ionic.css | 9729 +++ www/lib/ionic/css/ionic.min.css | 23 + www/lib/ionic/fonts/ionicons.eot | Bin 0 -> 120724 bytes www/lib/ionic/fonts/ionicons.svg | 2230 + www/lib/ionic/fonts/ionicons.ttf | Bin 0 -> 188508 bytes www/lib/ionic/fonts/ionicons.woff | Bin 0 -> 67904 bytes .../ionic/js/angular-ui/angular-ui-router.js | 4232 + .../js/angular-ui/angular-ui-router.min.js | 7 + www/lib/ionic/js/angular/angular-animate.js | 3721 + .../ionic/js/angular/angular-animate.min.js | 52 + www/lib/ionic/js/angular/angular-resource.js | 669 + .../ionic/js/angular/angular-resource.min.js | 13 + www/lib/ionic/js/angular/angular-sanitize.js | 683 + .../ionic/js/angular/angular-sanitize.min.js | 16 + www/lib/ionic/js/angular/angular.js | 28364 +++++++ www/lib/ionic/js/angular/angular.min.js | 290 + www/lib/ionic/js/ionic-angular.js | 14044 ++++ www/lib/ionic/js/ionic-angular.min.js | 18 + www/lib/ionic/js/ionic.bundle.js | 64386 ++++++++++++++++ www/lib/ionic/js/ionic.bundle.min.js | 448 + www/lib/ionic/js/ionic.js | 13298 ++++ www/lib/ionic/js/ionic.min.js | 20 + www/lib/ionic/scss/_action-sheet.scss | 170 + www/lib/ionic/scss/_animations.scss | 48 + www/lib/ionic/scss/_backdrop.scss | 24 + www/lib/ionic/scss/_badge.scss | 62 + www/lib/ionic/scss/_bar.scss | 404 + www/lib/ionic/scss/_button-bar.scss | 64 + www/lib/ionic/scss/_button.scss | 252 + www/lib/ionic/scss/_checkbox.scss | 180 + www/lib/ionic/scss/_form.scss | 327 + www/lib/ionic/scss/_grid.scss | 159 + www/lib/ionic/scss/_items.scss | 815 + www/lib/ionic/scss/_list.scss | 125 + www/lib/ionic/scss/_loading.scss | 51 + www/lib/ionic/scss/_menu.scss | 70 + www/lib/ionic/scss/_mixins.scss | 640 + www/lib/ionic/scss/_modal.scss | 102 + www/lib/ionic/scss/_platform.scss | 77 + www/lib/ionic/scss/_popover.scss | 168 + www/lib/ionic/scss/_popup.scss | 110 + www/lib/ionic/scss/_progress.scss | 11 + www/lib/ionic/scss/_radio.scss | 47 + www/lib/ionic/scss/_range.scss | 160 + www/lib/ionic/scss/_refresher.scss | 113 + www/lib/ionic/scss/_reset.scss | 365 + www/lib/ionic/scss/_scaffolding.scss | 295 + www/lib/ionic/scss/_select.scss | 142 + www/lib/ionic/scss/_slide-box.scss | 71 + www/lib/ionic/scss/_slides.scss | 529 + www/lib/ionic/scss/_spinner.scss | 100 + www/lib/ionic/scss/_tabs.scss | 528 + www/lib/ionic/scss/_toggle.scss | 198 + www/lib/ionic/scss/_transitions.scss | 188 + www/lib/ionic/scss/_type.scss | 166 + www/lib/ionic/scss/_util.scss | 296 + www/lib/ionic/scss/_variables.scss | 761 + www/lib/ionic/scss/ionic.scss | 54 + .../ionic/scss/ionicons/_ionicons-font.scss | 28 + .../ionic/scss/ionicons/_ionicons-icons.scss | 1473 + .../scss/ionicons/_ionicons-variables.scss | 741 + www/lib/ionic/scss/ionicons/ionicons.scss | 16 + www/lib/ionic/version.json | 6 + www/templates/calculo.html | 19 + www/templates/resultado.html | 15 + www/templates/tabelaimc.html | 34 + 105 files changed, 152945 insertions(+) create mode 100644 .bowerrc create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 bower.json create mode 100644 config.xml create mode 100644 gulpfile.js create mode 100644 hooks/README.md create mode 100644 hooks/after_prepare/010_add_platform_class.js create mode 100644 ionic.project create mode 100644 package.json create mode 100644 resources/android/icon/drawable-hdpi-icon.png create mode 100644 resources/android/icon/drawable-ldpi-icon.png create mode 100644 resources/android/icon/drawable-mdpi-icon.png create mode 100644 resources/android/icon/drawable-xhdpi-icon.png create mode 100644 resources/android/icon/drawable-xxhdpi-icon.png create mode 100644 resources/android/icon/drawable-xxxhdpi-icon.png create mode 100644 resources/android/splash.png create mode 100644 resources/android/splash/drawable-land-hdpi-screen.png create mode 100644 resources/android/splash/drawable-land-ldpi-screen.png create mode 100644 resources/android/splash/drawable-land-mdpi-screen.png create mode 100644 resources/android/splash/drawable-land-xhdpi-screen.png create mode 100644 resources/android/splash/drawable-land-xxhdpi-screen.png create mode 100644 resources/android/splash/drawable-land-xxxhdpi-screen.png create mode 100644 resources/android/splash/drawable-port-hdpi-screen.png create mode 100644 resources/android/splash/drawable-port-ldpi-screen.png create mode 100644 resources/android/splash/drawable-port-mdpi-screen.png create mode 100644 resources/android/splash/drawable-port-xhdpi-screen.png create mode 100644 resources/android/splash/drawable-port-xxhdpi-screen.png create mode 100644 resources/android/splash/drawable-port-xxxhdpi-screen.png create mode 100644 resources/icon.png create mode 100644 scss/ionic.app.scss create mode 100644 www/css/style.css create mode 100644 www/img/ionic.png create mode 100644 www/index.html create mode 100644 www/js/app.js create mode 100644 www/js/app.routes.js create mode 100644 www/js/controllers/calculoController.js create mode 100644 www/js/controllers/resultadoController.js create mode 100644 www/js/services/calculoImc.js create mode 100644 www/lib/ionic/css/ionic.css create mode 100644 www/lib/ionic/css/ionic.min.css create mode 100644 www/lib/ionic/fonts/ionicons.eot create mode 100644 www/lib/ionic/fonts/ionicons.svg create mode 100644 www/lib/ionic/fonts/ionicons.ttf create mode 100644 www/lib/ionic/fonts/ionicons.woff create mode 100644 www/lib/ionic/js/angular-ui/angular-ui-router.js create mode 100644 www/lib/ionic/js/angular-ui/angular-ui-router.min.js create mode 100644 www/lib/ionic/js/angular/angular-animate.js create mode 100644 www/lib/ionic/js/angular/angular-animate.min.js create mode 100644 www/lib/ionic/js/angular/angular-resource.js create mode 100644 www/lib/ionic/js/angular/angular-resource.min.js create mode 100644 www/lib/ionic/js/angular/angular-sanitize.js create mode 100644 www/lib/ionic/js/angular/angular-sanitize.min.js create mode 100644 www/lib/ionic/js/angular/angular.js create mode 100644 www/lib/ionic/js/angular/angular.min.js create mode 100644 www/lib/ionic/js/ionic-angular.js create mode 100644 www/lib/ionic/js/ionic-angular.min.js create mode 100644 www/lib/ionic/js/ionic.bundle.js create mode 100644 www/lib/ionic/js/ionic.bundle.min.js create mode 100644 www/lib/ionic/js/ionic.js create mode 100644 www/lib/ionic/js/ionic.min.js create mode 100644 www/lib/ionic/scss/_action-sheet.scss create mode 100644 www/lib/ionic/scss/_animations.scss create mode 100644 www/lib/ionic/scss/_backdrop.scss create mode 100644 www/lib/ionic/scss/_badge.scss create mode 100644 www/lib/ionic/scss/_bar.scss create mode 100644 www/lib/ionic/scss/_button-bar.scss create mode 100644 www/lib/ionic/scss/_button.scss create mode 100644 www/lib/ionic/scss/_checkbox.scss create mode 100644 www/lib/ionic/scss/_form.scss create mode 100644 www/lib/ionic/scss/_grid.scss create mode 100644 www/lib/ionic/scss/_items.scss create mode 100644 www/lib/ionic/scss/_list.scss create mode 100644 www/lib/ionic/scss/_loading.scss create mode 100644 www/lib/ionic/scss/_menu.scss create mode 100644 www/lib/ionic/scss/_mixins.scss create mode 100644 www/lib/ionic/scss/_modal.scss create mode 100644 www/lib/ionic/scss/_platform.scss create mode 100644 www/lib/ionic/scss/_popover.scss create mode 100644 www/lib/ionic/scss/_popup.scss create mode 100644 www/lib/ionic/scss/_progress.scss create mode 100644 www/lib/ionic/scss/_radio.scss create mode 100644 www/lib/ionic/scss/_range.scss create mode 100644 www/lib/ionic/scss/_refresher.scss create mode 100644 www/lib/ionic/scss/_reset.scss create mode 100644 www/lib/ionic/scss/_scaffolding.scss create mode 100644 www/lib/ionic/scss/_select.scss create mode 100644 www/lib/ionic/scss/_slide-box.scss create mode 100644 www/lib/ionic/scss/_slides.scss create mode 100644 www/lib/ionic/scss/_spinner.scss create mode 100644 www/lib/ionic/scss/_tabs.scss create mode 100644 www/lib/ionic/scss/_toggle.scss create mode 100644 www/lib/ionic/scss/_transitions.scss create mode 100644 www/lib/ionic/scss/_type.scss create mode 100644 www/lib/ionic/scss/_util.scss create mode 100644 www/lib/ionic/scss/_variables.scss create mode 100644 www/lib/ionic/scss/ionic.scss create mode 100644 www/lib/ionic/scss/ionicons/_ionicons-font.scss create mode 100644 www/lib/ionic/scss/ionicons/_ionicons-icons.scss create mode 100644 www/lib/ionic/scss/ionicons/_ionicons-variables.scss create mode 100644 www/lib/ionic/scss/ionicons/ionicons.scss create mode 100644 www/lib/ionic/version.json create mode 100644 www/templates/calculo.html create mode 100644 www/templates/resultado.html create mode 100644 www/templates/tabelaimc.html diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000..e28246d --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "www/lib" +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..aca2523 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8f7ddd3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Specifies intentionally untracked files to ignore when using Git +# http://git-scm.com/docs/gitignore + +node_modules/ +platforms/ +plugins/ diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..4adde03 --- /dev/null +++ b/bower.json @@ -0,0 +1,7 @@ +{ + "name": "HelloIonic", + "private": "true", + "devDependencies": { + "ionic": "driftyco/ionic-bower#1.2.4" + } +} diff --git a/config.xml b/config.xml new file mode 100644 index 0000000..e7aeb72 --- /dev/null +++ b/config.xml @@ -0,0 +1,43 @@ + + + Cálculo IMC + + Cálculo de IMC. + + + Fábrica de Código + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..5c283be --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,51 @@ +var gulp = require('gulp'); +var gutil = require('gulp-util'); +var bower = require('bower'); +var concat = require('gulp-concat'); +var sass = require('gulp-sass'); +var minifyCss = require('gulp-minify-css'); +var rename = require('gulp-rename'); +var sh = require('shelljs'); + +var paths = { + sass: ['./scss/**/*.scss'] +}; + +gulp.task('default', ['sass']); + +gulp.task('sass', function(done) { + gulp.src('./scss/ionic.app.scss') + .pipe(sass()) + .on('error', sass.logError) + .pipe(gulp.dest('./www/css/')) + .pipe(minifyCss({ + keepSpecialComments: 0 + })) + .pipe(rename({ extname: '.min.css' })) + .pipe(gulp.dest('./www/css/')) + .on('end', done); +}); + +gulp.task('watch', function() { + gulp.watch(paths.sass, ['sass']); +}); + +gulp.task('install', ['git-check'], function() { + return bower.commands.install() + .on('log', function(data) { + gutil.log('bower', gutil.colors.cyan(data.id), data.message); + }); +}); + +gulp.task('git-check', function(done) { + if (!sh.which('git')) { + console.log( + ' ' + gutil.colors.red('Git is not installed.'), + '\n Git, the version control system, is required to download Ionic.', + '\n Download git here:', gutil.colors.cyan('http://git-scm.com/downloads') + '.', + '\n Once git is installed, run \'' + gutil.colors.cyan('gulp install') + '\' again.' + ); + process.exit(1); + } + done(); +}); diff --git a/hooks/README.md b/hooks/README.md new file mode 100644 index 0000000..d2563ea --- /dev/null +++ b/hooks/README.md @@ -0,0 +1,83 @@ + +# Cordova Hooks + +This directory may contain scripts used to customize cordova commands. This +directory used to exist at `.cordova/hooks`, but has now been moved to the +project root. Any scripts you add to these directories will be executed before +and after the commands corresponding to the directory name. Useful for +integrating your own build systems or integrating with version control systems. + +__Remember__: Make your scripts executable. + +## Hook Directories +The following subdirectories will be used for hooks: + + after_build/ + after_compile/ + after_docs/ + after_emulate/ + after_platform_add/ + after_platform_rm/ + after_platform_ls/ + after_plugin_add/ + after_plugin_ls/ + after_plugin_rm/ + after_plugin_search/ + after_prepare/ + after_run/ + after_serve/ + before_build/ + before_compile/ + before_docs/ + before_emulate/ + before_platform_add/ + before_platform_rm/ + before_platform_ls/ + before_plugin_add/ + before_plugin_ls/ + before_plugin_rm/ + before_plugin_search/ + before_prepare/ + before_run/ + before_serve/ + pre_package/ <-- Windows 8 and Windows Phone only. + +## Script Interface + +All scripts are run from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables: + +* CORDOVA_VERSION - The version of the Cordova-CLI. +* CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios). +* CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer) +* CORDOVA_HOOK - Path to the hook that is being executed. +* CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate) + +If a script returns a non-zero exit code, then the parent cordova command will be aborted. + + +## Writing hooks + +We highly recommend writting your hooks using Node.js so that they are +cross-platform. Some good examples are shown here: + +[http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/) + diff --git a/hooks/after_prepare/010_add_platform_class.js b/hooks/after_prepare/010_add_platform_class.js new file mode 100644 index 0000000..bda3e41 --- /dev/null +++ b/hooks/after_prepare/010_add_platform_class.js @@ -0,0 +1,94 @@ +#!/usr/bin/env node + +// Add Platform Class +// v1.0 +// Automatically adds the platform class to the body tag +// after the `prepare` command. By placing the platform CSS classes +// directly in the HTML built for the platform, it speeds up +// rendering the correct layout/style for the specific platform +// instead of waiting for the JS to figure out the correct classes. + +var fs = require('fs'); +var path = require('path'); + +var rootdir = process.argv[2]; + +function addPlatformBodyTag(indexPath, platform) { + // add the platform class to the body tag + try { + var platformClass = 'platform-' + platform; + var cordovaClass = 'platform-cordova platform-webview'; + + var html = fs.readFileSync(indexPath, 'utf8'); + + var bodyTag = findBodyTag(html); + if(!bodyTag) return; // no opening body tag, something's wrong + + if(bodyTag.indexOf(platformClass) > -1) return; // already added + + var newBodyTag = bodyTag; + + var classAttr = findClassAttr(bodyTag); + if(classAttr) { + // body tag has existing class attribute, add the classname + var endingQuote = classAttr.substring(classAttr.length-1); + var newClassAttr = classAttr.substring(0, classAttr.length-1); + newClassAttr += ' ' + platformClass + ' ' + cordovaClass + endingQuote; + newBodyTag = bodyTag.replace(classAttr, newClassAttr); + + } else { + // add class attribute to the body tag + newBodyTag = bodyTag.replace('>', ' class="' + platformClass + ' ' + cordovaClass + '">'); + } + + html = html.replace(bodyTag, newBodyTag); + + fs.writeFileSync(indexPath, html, 'utf8'); + + process.stdout.write('add to body class: ' + platformClass + '\n'); + } catch(e) { + process.stdout.write(e); + } +} + +function findBodyTag(html) { + // get the body tag + try{ + return html.match(/])(.*?)>/gi)[0]; + }catch(e){} +} + +function findClassAttr(bodyTag) { + // get the body tag's class attribute + try{ + return bodyTag.match(/ class=["|'](.*?)["|']/gi)[0]; + }catch(e){} +} + +if (rootdir) { + + // go through each of the platform directories that have been prepared + var platforms = (process.env.CORDOVA_PLATFORMS ? process.env.CORDOVA_PLATFORMS.split(',') : []); + + for(var x=0; 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 BEI0rF literal 0 HcmV?d00001 diff --git a/resources/android/icon/drawable-mdpi-icon.png b/resources/android/icon/drawable-mdpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2d65c5514e0163a0b52805466212cc706a456902 GIT binary patch literal 3383 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 L8*9~TIOF~U)U;MT literal 0 HcmV?d00001 diff --git a/resources/android/icon/drawable-xhdpi-icon.png b/resources/android/icon/drawable-xhdpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..992901edc7e02fa99c52f1007873ebe92069189a GIT binary patch literal 7798 zcmZ{pWmr^Qw8sfShVJedKf~m*|mQEwRViAx&jtDIXVIY0+y2E2W_}D|F58-!uPvbzCv*G#!gyI8Udjp3FFxU z1%8a^sjVP`P&-9=0zaU&Qq)#MKnMULAcRIBApC)!3Oz*1Y&fq}2ac}z|UA9-1dEiNb&+J{ugB_K_k3JOPP0)94E}=G!MT{b;WhWbv3R%x?K56E)5>?1E+o*6&TAv zYM$8hxa+6+kSdVKXOz{RyO$JM@nrHG77j6wD3N!O-lWYlD3AhtO-ld&)8ErtooWimY3w3(Cce_%;~w_-Q4bbiyKTT{GsT{&^fW&?#?M<#6G&Me!e80Yo#jh1yM^@5j&9`JPN zBagVxvrtAlU#{AeQA_GL#}CpPera6I;}eVigUsCyjzni(5dn#VCOh7|J4^)G56jN< z5wvKsvA=%RUqbrgwD|p=oSyZ+jH9fG>0mvGV#0`)ZfV~Wg)Q3I(e8n{JBDi6XIzx zb@F{vLa$Io;Sq~pmYO{1lFV!c)u9{_lIzX`kzIz(UaED*8#{#hW?WAJTbbghZ zB4%&l6KqsNnZD7uUSBo9>k-6Rep;x-XHc^m!)9cEkkAA^+j~tZO{5Um>D*9a_JO;x} zfQ2|vtB5{D(d~EyZ%AGNPo^2|SKu_Y(>f4MHXslK#5{^J@c6r{E}Q|yffc|XL7u9u zSgeQ=_`^8k zYU4({)n!YaBiHKe{sNQ{xkNtR=r=Z$K(&*T8s5xA3gx@!Lw`$-p12)mk$HvlLo84_ zR#T%Ty#vui5|O*1+rM(EAV*^jUo}%UtRa@Tf{o+EePY^nH47K1j1c+d#n|^kg_QFP zu9QTk)xWS$Vy!k9qt>a`JfqhmXx*NRdQKfMbiRP4bn9xEc80kXw-Uob6TUwBkE$jQBl#WUI#=QkFEbC!c^b7{Wg!PW(TZ^(KwE*hMOhuKaDC99KV{(=n<6`GX(sr zAFp+kO5)XdLHmm5sBcGQ`b!Lgwh?9xpqnwg$)MQmA<8rx>JE9JzNZoTj2mw0%Gv#Q zqT=TH-ycf&q*BnsgAN8bXoO1|r|wK4>%{_AJGy~;XOPLZq$U4=kW?3012SCKr-D5W z^4|h7tSAezlV|$YtRfy$0eX;09RX+S`SOHzwX|YYAf;8gqj*JX`eVa#-H7{i18Nt~ zcY7Y3^r(2Ir&aqjJdN4H`Qbj0h)5FyT)&Pz|5q1>%9tX`1T5U227k zln`1;&62O0tPV`3=g{nZ?wUWKM=H#0@$cQ`Ta=pYQLthwwsINa9PX%#>hMAGBD{L? z9^I>?NNrlLEL8ks)-I$rRgil-+$%;Pp!w`kJ=zrzTET~rN}NfOYP_*WE8HS96_;uK zxZHn7_6`lRM1~J1f&YiCR!0@I>XMuG&tGU`QpH+Tp{8sSga1^x7sM*RmOV6TF6g6c zq$}lj?gh*WE+H$W+EW$SWs7+Av?vuX-N(a5neaFmc2b5|<9vhyGJwvn^SsT{=(n~k zytYvJR^1?{+1Ce`N^n}s585NuCspPFnj0e5-(r1R7w>d1_2_XsP?sfz z1|Fg}g#GIph7xgg!v4`dvmedC!SQJBCBE6vLuEB_JrolIfc}{WV)k>&ZcO zx3moM8z+^d_5r6h)}z$aOFt_h%MH^nHksp+m?x#HcXH^O^mr+X0BEcVxD-(pjZ0#IC zUnte=KZL=rP)smW6WCsbS@|X>YHmbeO-oL?mdL^L!mC(v593d5e@koXDmGHhNdps3 zBENs<2KXyy)N83+Z%Tx-1g_aYLjBJI(6TNrDG`CAc-4Xuouaq>{QxA_bG@X!& zKpVX>GIn@uGrdI}m6dg5y>A216e-^!T|e6HWAnv68mkOSqzXFVrO~BIWze@MF;!%5 zoIYX<%t_>&$g0dRU%DO*lJ+IVy`W_s#MJOOEb+Y2redX6fLzXH9?y`?q`lrRoJ{KY zMj~?e0RXLpL#&XSyg8tzAPFeF`B+1BlG&@7n+}wcotrzao8u_-6OWr_W>H1RRb@`Q zS&vsH>+6zRwEl-6|8n+TJ!Sxz#=pD@a|>+`z1cU@B6qRF;&P(~AZL!ym4()yL1Gfn2(-dQyHRaI{;ICSZF~1s_+DzHcF&6-gsnYZA(%( zx9UkY{4q{%24$VQ;5VEJ@5BY>wL13YA&|O6J^KwDd>L=7d85w!CN}#z-7>uHybe0f zO;BiHnC8n!;VH1pF$sHSF>S_vrZ4Nk9tg2768(O9pbLV=~5}Ygb8ga-)dk1TAxvI&x(YB(7FPv zdo_7W>(ulyRU@~`EiK1HJ7n5i*a=fOEZB-gok@24!z1mvNmxz12egjxa*hzO>h;xy- ztQ!fJO)7HZB_+MjvEt`h{vJs>SVvRc0Leg46p9RR=(VsJx^xu5@0bY9%9=LGvUDGF zJkxuJuY=f(}T zz804b-VobXqJFQ@CD&v8;q9AULqwyJM^2zlv^yq-66CcmR8l}sXLstus*3&hxw`*` zxZFtc4CvL($1QUW?~Gd!;*S&xEUlj%!**XZ;<23TfgsUPGVs#Rfuhh% zgb<@8SqI8svWiJt;><_)%13n9etyoIZ26Qu(o*^-0@q9%MBf{k!gGW=lJu*6h4Z=6uB2c*7kLg z?EoZ;*1vS${Y6$*jOVgNT~&}2FSkZtx9N6sSpL5j3FlpO&BAQOjSqZouq0DE9Z^;pf%ytx|m++ZeYAts&ktfy8 z(2cvrd<{Q`tdSx#3pCeJUoTBEoPT>Fq&kaG4UHiv;`1}yi^QEVeXC^QfuH6%&wRt~ zgjhT0hyDsHrst#)6Hnb*+d83KBXK?V1nS! zQBjoeaZlNz$SM>lCD?WEr~nR~R(|7ayR3El+l7vA_-$f7ES_C;vz?Ho_EH6Aa28iR zwo;M*=oU4kug<~$53VnAebeF0O=)6cb*N5uiDufJCvar>8@m~?KUoFq{3wTAF|L#$ zyyIPd7^QA2Bfb!HVV(e&+XtEqw9eU=gF;Q--zT!F8^ur-rQk1FW>daVsJf}1SkXcC z$^!`PeKOjUrbZ&YC-kMNgf~*>=Pp<+w3JTQl$_U=B%5ME2HG{1W|7y#_v+;2FNU%cCBb_v_%1o1@;com zvLiCInGhsX&*t3l&ZQmFFYwkQEW^)nM#MNo}>a=fPPayeIbgG_V zwHal3$9;LKp`g=$2b%c`h6$8;(8_W&`F*iTw z3GUJ~Oc%U_c@z0284Ea3eST>?TKjl)Lfy^W*Ei7>a_RnA1z)8PwPkBdHvAPLll)1Z z%`)Oh!tV%inVOsT5&8Na^Rr-3B_6DX!COa!1z1}CZ96B@LEr9T$tLh&R)iuBkgCm< zTyHqg@J3AN5IV2b_5}_4Mc%?Oyr7LsP6oY8avug-WpD<}x0cd500ao}jrCNE`GQ_F z6D&9x?UZVbGMon^TlIqAF5ROZ?<*X*{wH&oXE60~vcTeV&n?Xoo3LM&U>|wi`*RDa z4-3Ef3%fTZ)R!_AWaZeovg;kcf?t{=tEbi!5#f{jd9f8=$zkrJB&E+&w*jZ);>|zv z_FiV6bW%l7{1aVKl!St|LC!_=b1;)ISN`vSU!ZKOLGhT~5~>ROOG~>Kta_ zx{ih2q#bzea8QNUn!VS~C-Z6e*COj9m21?#GhTK@)Brrda=+626wbi<6kEnRKk?gv zf6Ku}3R4>mHI*32Pd+5aj#F`mH7&@j(ARJ}m>XSkMSI2-kSHkoQDW^s(D&T#V>7Y^ z5Tqv6UNJcU{`2Pb6@KO`2k<|$c9t$=fJ;Kvo!Yv`Wd?rvoLE=*5H22chy^IkreT&d z$|=A&qaB|or+8ifqf&FbE$`=ylRZ~Vp~9Sy>!wIy6PyG=GF5QOkM}=(D|<1BD}L7I zbd-np4EP4s;E@M7jjmPqf39oi%CxjuV1qWz0^u#@&e-XoSMWDc(9gblG+5Rp4$)-+ zQeINBh^BU?Q^`*epyqAJyTJG5ga+<@6UAFXe_}6JM#pwVp!7Wwbj_8rr6K;j(VWD@ zMSKl1;e^k|wqFErGL{juypD%sj?W9UUDRC9WMw1N3oZV}1RH3;C4Lx>@aE5?r5}6d zU$iu!uNVPO$A3)uuAhDp-Kfg6mh0L$k0LX0^cPst(z*A?$al9nQv(;cvKrxX&;Ov& zDQ@+Uuopr@ZmF^==v?m~EoquRY=BC`6^yahWm)!ZDS!5ba7FD(r96M@nHq$udDBmn}Fm+Qf_Zqoet)Z|ON&GE7YA^k#!*F|I?oq?udT)o^({n)96LN->ci*(FJtd~d#0 z$f1GbN;5IGN8+P9%^3{4q`>ij9A7&*IckL1mJrMyu$j{Lj2E?Hwqi7x5*h`MQlK~* z`t^}L#Nk)e5Cl6Y)ix{dpK+a>Otwk4i#fKi0{gQkc#JAwPUklXqm)zN*=M~JUh2UM zzoK%zo-51NFY#JR?F`~l5Z2rXZcb!))6Ee$gps&ehG*Qw(%*)?{0%i0o&s<>Rnx@L zyLGX8+IJp3ji2ld=z-dfm^o1$b=QpSD6W`dwRdoi!ja`vl|?>_^$SqT#)!rr6tZFy z^4m^j)kP!ldCt{S8dsQ-R z4Jp>ZSn#}2Q-h!qhw|on%J=rpJ4*{n|Kr2A)xf(3~m9VNwpleP@`}+2kahgXjl%NGI-`;9o()S(yic12)P9J4~LHzZt%hagts_~y@Ac0ylSTO35M`8xeZ;&&Z6h;{0V-beoF_rEZwbFoB^G|h~ zgm?EtMCR^*c#qB!-i4&3D<+)VJC)h=GeZNaioL0&a$`AY$TU9v85QIV4s$W#Wvq}P z65)XlqWF4kD28cq=l9`OhS9sM;BN8<2dmL2}PhhnU%IIx18Bnq(o3n0$MA#T5P43O{*Cc1&9WuH;%q;Gewlf$%} zf*#9se)IQTkViDYc2S0Ca)FSLfY{aa%hB3MOu*tN+4D;B=%EBhq~J1eR^ww^1v|ZK z9P6KZbB6siQ57+vCF==;M`ay2D5}}7H(SIb$S;L74-!8S^#92l`5AoK$0t~OQnamj zN#oUTK46s zhmw$ggMB$6&y;a%$J4BO8?+78Le(MGI8&KJBMO^iVI@_~C3AJDBvS-^xaee$5j~CS zgzi|}F9hLhYkD!h=Me}zlb=Qo^014UzGO{nVDdL|`#7~D#bCam6J+5U$>1__ByhW@ z@Z(cC&perD>$WC?^#m{Glwr7F-PnA5xEDYenvZz((JP$>`=>RVbQ1gO48#i1Tf&so zUz_a;-3Fxziu1@Y@I6dN$sn2KT5iKt(~q4Ui!N9?;?%UyCF^tyV%HLg^xNZET%6On zn#b8CPuoS6xx?d9iU_ za8s+XuNp$1#=_nO19)2xuQ<+*QmLb5T}DI&lIq*2-QYZ)WJAW-_7@+vt!{op?J6;yeX+vg~21P$;>QeVXo8f#6Ru|H%;J45@8kC zJ->LTyA3whMrX-D{@W_JJTO}`I0*51EFp zQf^2`hax+fyeuX(F#gd!4-&$?kduzTep3Xb&m*(BuOJ}=P4wK<~Wwem)tVcnzYmnJJZ`f1IsX zQAU?Rfe%0ny`jV3Nr@itz^e1_tX5aR*C9MXYgch8G*Etv|L<7i358m-0tSeR6YGi& zh9T>``owsmde6QJ_CzGgyGSKwfnwo2a^7kySU{0LfFYu=N^2hp zJ8!B`sZ;amZ7coF7fu2p{*r}KLZG;Vx^sjt;Z%L(S8DYSN@_#uMYGmUqd9rbjb02K zEmE^+-c>@h3$rtLkm5gvxYJ|2LSRcvAc*-v%8r@VkhOsHSaJ6I| zv-CL>?*wjvKmPg>LnkXZ_G{s#lck;MgIF4P<|+$wEt$k)ILz?O`)(#a*f6_6E9>F6 zcl%I7`O{F`ue(qY;|7BvG zM>NCXf1vUmH4L9N^x zG3ztduK@pyxAMkph=r>#U z!Iu;-IBBwtwsb@gblry(3>eLb)mSyKW*fB-wANtn$q47>w00J2=BMu(%1R0GRH6y# zu9$$Qr;bW$zd>i4qZodBIMC2+Y3;%j^e=az&P0WI?8ly%^II*gZ@EVAY!{pwYIaMw ztynUF?5}>_1r>KpWOsxIQuFb;D!dDD0Rn4?iwpA6$cCqc;Vv>FO9nwhmd-IQ;5WMG z$wzmyFFUp)!LnFRbjRL|nM4FZkA0>YWk>ffR-Wi`Vy5>-dv8DJmaLvB>f4^{&)IAk zIK>U&sAfb+Wh1SgAam}97$6OnFcoS^4#Wz0%h6fnl^$oq)v5_UgELsgLu=DQ$eLx+x;xua5jVDG}E7{4zep}FAp+Z}9-LpdZlQ8#J=hdPta-(eO z(j3?^0F7T5jhJ23a}$>r*}Qm?oH?*Ar*+6lXu$6?c+->KSTwS!QRv|x^W((>pwQwm zWS`I|>7N1V0eoqd$x9C8Wo_YQBVy%Y12+gfT-*ZeTs-VNg1S81BHRKZ{5AlTQny7?+ZGvwqCv#9ySQl)~=Q|v`Wqvb~f5J7S{gm Tqc;Do{~{>Kseh=IF%SPARkF!7 literal 0 HcmV?d00001 diff --git a/resources/android/icon/drawable-xxhdpi-icon.png b/resources/android/icon/drawable-xxhdpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1b353824c2de420ee1e880edbb6c83086e62a4b4 GIT binary patch literal 12965 zcmaibWl&pP*ln;vkqTNUS~R%36%Ve3;KeOC#fuaT5Q|Xe-J9swXLrP$#sOO4@1wfFBb85F7>o+@pR9J_G=~xB-A; za{xdz9RMJ6&1%;YNB!~4LPb#y)uKLkvK>LF=DDj9*aOun{ok*`h@&I`z~cpyd#~%W za+>X%Or;-)kh)nszh0`CH-vyw8I4RahlZXF@i4j&(%E{U6+*_HMi zdlESgQ`q>|+H?pGrfV$5&`@ySn=eAXDPOHXRYf=Zr!}emh^=qKbG7%SUKg1$>#4Xor}EO$U@;Bzcyzse6?fiiiQ)88>Xt z5?`Uy$(2O5XO=pOM3G?yrcxsebs&kDB@QR zx2gx5UOpnuhlDzFsx6R|QNq}{n3$XGSF3B6BN`vUq{~j9Hl`vz{+OTV7yD#9iM??# zj9+OQxcKF;vbld}qUS`>+hcC?AI3M;2q(c9ZQLT=e16BOq)q**V_O7${JE6WeapPV z)t;m+TXquwipC?!(`So%id5@u;TIp@F!ciUSyeSOb|2nbBw)RlHgn;U>iLJ({Wtp$ z13=8^s1i$4b+hfSKR&gn9A_pYzHDJK=6mTbQ^ZacncDJ>@b$EMBEa(@6G-wftvWaMpb3`aA2z%agA9=F6Q7@i&nLdo_ zpC!KioGl|6eOiu1N#J2X+G zTBB|GN}eoM@3)wqTNDT@Qri^~J3f1M>pj(;>QEIy63tGBnUti{@Y}a}1`O=C$jHcI zh)uQ+E?%-43(p)uc=S3|=Qr7`HdiUw!=7wFF$oDX>KX+Fo*&$E(~sj6*oMOE#@pN5 z(<@#$;zu5x9`)6o%3&I&&Jg z>;k>P4V2QuwG?QE6-1`o7lc*xuX3`FU%ED991?@3Fj^b3Q7e^_1Ny%lqckI6-4+#h z`pbTjbK+QR85lqU+=i&cMT>H?_fs{`WFQB^7i{yxp$?2Q(0ys;FR`!qj@SZ<+zNAt z6L5GQ{@IESt}PHw>t-anbZ*NlCPJCov@ha5Fa+~Iqtr+ae7bW@!7dTcP~KJUgK?&% z)r`5xr#0NlOAN+nC=MxzM@GyBoY=+v!C!de%!*knYK`0xAUACmR8fYKJkKY=&P{I! z`0JX|^JE>Z#l^sgMcD8&K3UwEs{CS;ll44tg5=G??*)fATAW&)vNke~ zGw{J=LC((Kcr|x~9hFfq72Q>u9=v1t?V6-9f_~NCAhY=cCBj4tfZOzOcT-$@_iwz$ zw(=WSj`>)sV;OBc5}E)D=;x&!`HDHb#n+9C&(C)nVeVz_;|PmMor)zbtyzim%Xm-G zaN}Os(3U;x!~;#{-gSZ~1~6KhfmTrJ`^_*#GR?Ow9gUNM;RH4)QPmqpL(ATav&P{_ zZ?%MaOt8w9qgpAbJD_UB0Ntop&0l3+wrgu}9C7}GT#uyLnnzU9W{8j3y}ZfB$}^c3 z=j-d>#@RiOJ9%sRrxVTWKk{2z6rto71dZE2DokP?m@*y*tB=%O=6D+40f=4nWbL0U zZul3Z6H>QmBAYNN+*8e677!&wYP|-I5Gk(qKjnIXKea;B7c+EO2R8yWczh0D$>4-? z%K=kdOCmo>hFXI`q2M$IoI$hqDPiQA2j54Ji?@dNpV2ig0GZ~=IMs&r? zP_(arZefG{Cs4ezA`{bTG|O~t31OqNyRt^uMvm$1H~#l;(9Kr`Qrxd)or z3zLf@ zok-Vd`xL%*zv#myuLxwvp>>3}-$uz#W(Z&yyFM{d`#-v^$%Js@kL=e!ZYg>fG#xCN z-J+kjQN~Ll8O-j3%+y9hdWqj0)PtK%JYUz=!l(>sH0@dW1;X}VY{k2NQ`@1zkt5k-~pZ>(9gmU`#>W*JKX$42lXK+WRzmJ<~eL z;UQH-RXq$^>vN9nfYyS)Fapl6YEd@7EHGW#$uPClh95r-GLCQsY+SVN?Lbu1lp8Md zWa#3*5^mm%?7IuY?%>4en=fl2F`K^2E+1E~D@S3UfPxe`3z_+^kDCQ$?0*=9qPnf2 zEN8ddP*J18(iFdQp{{akrTz+$B?B~^rAQo44!W!w%kn!kdKBqIP&ptDfcPy?WGnp z$xj3UOD+F~SRk+B=mj<&ellQnNFc4BzquiH5$)-HX!go8cr<#&8qUbLOGFg#_wD8m zvs71F!i<*qlp;Sbi7sGVbC_-81=)u5ib&jE&^Mv}(h_c1F+BsXZoCH@{Z8GLg|B zcKd`eYjDRW0;3iukR+ap&Ln00KbM=-+kp*U3Fo&=5<`FXffH(C_dd=+qR1UCA+G`4 z7&3?k<5q%w{5%lnTmeU@dV&+^6Aa!duW3oMHS<5^frFK|8gm?rpEBY^y4?zg3Ts>k zqtj$DV8KV49#cL^i0cwD(v`!g7sOnXU*^6rfn>_%Oqb99#1Qnm#?b-J~3|Ytq*L6GLt=7Lvz58uINWL&VyyHEx$k4v5vSej2 zS1eDOdHLXgrm+wTz5%NnetKQZQ<{AyL(S%|l`|G?%L&kUpGNO{B)#aAYf54BYLjiF z)`SF36EE=7_;CVD}i>tI6X!q_~!-IUv z$K!|J>Y@{E$B%8K2)_C^Yo2mN9`kky;jNIvb|rplkE+rGEj*s}T-% zsy>B>IJnKUE_hH_;aI{RWH;z8(@g!s|79%FZbY%3|NVrIq{fLm7~X8p8mJA+Z=CsZ zy@Z}Y1+Cx+H{ybQd4693 zE|>T+x`6RFiN?f}UB!%p%JR%NgD zp76S?#apO{^UYOc)=j%x6n5o_MA$rY9n6{5CM||x!;;=e**KE*$YODYj3JC}gIQ@q zTfOLQ+F*h9-x^3tTw|$Ef@l-{#r$8)bazL1)Pc#W`W{ z!jxtzZhTZBl5ztQueTNQhpE`1XTy3=k8)vv(y>(G`oKD3Z-mlkFkqsxh?Sl8^*_0r zg>obazBqgptZx0V6IV0fWSQ`R=nXv40R0b-98A6F$Q|=Ho!&Zpb~(D-I4u2-0e3h1*w zl=b{8Cwjt%=Jr-r4gsLOv-3)d9%x2pW*~lKK~1h0j$V;rQgz& zuqtfxQ8XD3cYgEZY*v7LNId0oS7hMN&)`mXKu^jCXNbXKeW{GvF|?gdmvoA#pI( z1kQH%lcdXdDb405o;_<46DvX_nECfdJ9+y;ucEu%n0B8BtZ+sx&t2h_ZG|61B=ApX zv^=C+?Tv%?=@=Y+2I}FdG}1E;E@NVQP6>t1Ik8S?Qq(S*cxgJ~}e7XA9hi~HvzC09r|7YoCU5fmR3jKbtEmc9=tOT3OQ z1tLrRgIeHFAsxI$iC+-_3LJXxhB;CLbvtJt+_C0?sI~)1G6wwTd@9g z*8Xs*9ywp%7L_7*;r)qI`V5x@xL!dyvKTr>P{H?T7zE8Q zgbMNp#DTuV1(`a(X#53$rff;-yMt$}y$4HN69c+i(Lb)}2l$r`p~5+%QCXp?;`eZo z%oYge88#U)Dk%(Q;F>w2u$tOvKDTT&yEUVoF-d(7^;rS(nXl30F`jRy+rvs@RJ2ZD zTDkVVZYjOU3@f3L{#C1iOd|=u?usk)&x<8;!<}m4P*Uuu)oT1gcGNl-uNvFW?@S6- zoVg!QtO9w~7{M0FArXapBLrAUqYlP6neHmPy~a3R{K;d)dgiG@vPCT`KiQPY%hv!9XOP(hCK8zlQFDVc-i;|ol8U*DU zNOgXs24-zM$Dsls@E=iTUJy!~cDv)-oGNDsU6^5b$Ik-l1^f z*->9LOB-VE)<9>8G;*vzaItkvn)sj(Wk2Ejw8J1yPTuo%OL_wFMMHHaDoe>$<^@lq z+>!*5n)8Z&v3Uz~d#@*N87B1Y(!N2;@nan}3Z*)U)=U|62AHI-04a@LIUKq%c*oA) zZTc&N_`*_Pd9>#=r{%YuH+3MHqPkUL6E~7$UvOqx6~qg8#88#4epO=#-wn;06C^{& z=%!XY|MrFC>643n>ho?wkp1o}iCLVxT}5Vc=dit1yHm2HUMtpahw#g&2oeA-Ik3-h zmh_*SC2R=zBkwlJq&cizsK&J$AloA)WD zMuyNpcfPvjFREtD0RPrWBO1zGbB^3$`x@p?s?EXA&5)~(^_@Pn4e#XiRjC{=#ApWb zE{^_M|2KJE&JWIkv|5GC5`*Esky34?F^C#v435a%qtBK$&6_cA%YrP-zHza z=)<~I_im<%#}av0@uAKyB>PT-tcnFN7(?SQ(LwWVPwczEy>WC96jtvuQxuHi^~h8_ z+{(H~x3>;Hb}PH^ z7s+>h1{hUw4W4xQy140Q#6k5|F~zr?4++l!vxzzfa?|MA0@M7-#ZyhK`D6Pl)M<`> zI>yP~iI&W(j0CYlveX&Zt+x3iQ_K?AdV%6qz!gFx_ReRUq@g@qdsr2G0l&^SU^(G# zvrQ&tfKbw?Za!l~kCb4vLQ-l8=cEO6IY`HzV$?OGlfwYsyqxIW%3|9f=~zbxnG>LY z&@|8AB+A(_m)J7rF!vs`H4`vzBqy}f@k@riz<5FS@eYhWBtF>G1(dA&o;BM^Tos0z zK|282$WEYl>m*!UFdC|@O18TT>ZjH+Nh?wNUh$^Z9;jqgRekC9q$b-W8X_X|wLV?% zMIjklR=Ntz7ixB*azU1MU2B7tLliXLsxKP6QyyiI)rH!MtReY!TrcDrNJBmd=D%}Z zaQ|h?KC?1z;A;w{8&D%23K(>$oIKM{yJ8wPt1|zU?gc&qK!FD@q~K2HA;ZkeMg)g3 zk8&y!A-j;3BLfyT)`_xb8A4fU2nnMOCHXiheO^TLQ7qc4#>$2-O~EgvL?%ouuL_r@ zkL)PCM1co>jAlu7vDi;dZ}W-XfbX)HzYTxGq_qnveeEFG)iYl5Qr9l5SW1Ka_XpAC zeoAT`Tw;ws?!JGTovVL+QaiMK{kcqinjD)pJy3aaib+DU-8REaRd56xI{uF2*Bl6$ z&MYC{m(b}a3u`gaRK;b}&q%7J5~WAOY>2ln56{Sa`JvUfc63HTI*p^Qz;Lk0QKgAH z!yc(86SsIEmm~Ev8BtEHqvck7D0VUVM-`=z@&z(HIHJL&47QCF9g{KS6>zmvrR#+^ z$7OyHRvph6UY=2zaQ66r&LOK*-pzRrJ&!(&#ePNUZ@2azi;*R-k z70@+cz3}IpsC2E096HHvU`X?B>$KKDx1+WyiDIY!=_L>wB{HB1^ zHtcC#lfW2%DD47>xm7GBQc_-dRL5v&RYy`7_4BeycF5RT7u<7`TZX z>ElZCOzbN)X*QG`U(6wyq%xiAJ9hZC%SxFxeG=8oazDV|^JpNulz-PePuYHl>k%Kz zXaKMC@oO3Lc;GWO^i2FAm9^|Q8GWcvh`N(g>Z_!o`8+B9)4GbC3%O<6QJq-7kM8r< zxmT4wMp;p$a83wb(s&OOq)yb@&3xD;cZ-%#@$ae^I(d8)(tLrE%;)ed z_M2gyj68)OR-OT$vYvPvj$(-qZqep=)VROa!~6lUQ1K8p0YH1Qrvipu9)ClQ!_0GQ z6<0Xlw@CxQo$|#6Fy2o$mL>S)VGeJW?|}5MX^v{w32WT=Sjl7i6B{dHwXjw0Akvax z<9u3}F#TM>Wg{7J|8&XYR`@B0ali@7n~ns2VZuj~ZVR0Q2T6h6Sa!dfP}Uq3L(d%; z6_JPb(FOZ6OZZWNRtP&CWHaK8XZc)`!auzX6ECW!hGKV|5F&12{83+D-Ua?-aYp= z?(dV`7b!o_(8t)qvRll$*1)mG8lTN(&W-xAueIJ(kX|urYE(eVHGkVnX&=^k^e9f# zUij90G2-uXHSjmJV>-s#^oSd_;TITtQ5-n)#`*N%{xeZ#yLIU#HVvGA{Sx73v`Y9) zThK*RYKmw z0`w336`CW+^nE{HD5b2Y1ZOR@7mp>Z@y!$xH_DVCLx%!kLQg!UQsKG4ATU^9N_osIl229p^Ny^4;6N&o%{dUDT@ zS`+E}t3%z)tya&gy`>cL)^~_aiy|bwPF?xC?F-#nOk#GAIA0|H=G!vG-O~Y1g_G6j z$Y+MkF8ZYt;Fo0k*?YlF=?ic;WWg1LHW#wP7FpiP%etgRp`SiIkmuL?AFMLS25oF< z%9a}XCDo{@bY0oU^!feJ7*bpRP{T$J345&HncH-H4L1gcy*5KwJ2me?n8XLG>mzAQ z_}1{-0$V3*Y9{4O9pVN6Vl*Ki%mHU3f!2N|AmxlFNf{hYj`m8B(XDbr#SZfh%QG0U z>#)I>2c}F<5p*ecSDP?5hYg`4o_)6V?8&R=$2h^_MYd?x{(bug75DKEcW(e@QpUR@ z^%^y7_AC?fB9XFJuZq-U9<%8QK3jS*ftAA5GrTHTOs^*KI({ZMm4;`${mh%(c}1us zPsuf1g-pR1bQC;Dbn1)$!+}J0F=_+xjBt)$JD#Vg%TOWjNSe7Lk)J=;%50Dd_piCo zLXh26>nJ6sKbp7?X!fo2FFq<(Pf@ZkQ=cXiJEmf&!`nnx@roQCV{fvo@Vxfs5c@M$B0DL_*e2a3P zhzz<8R!JB!sG&p!uUNY7bsHS(fU+@}UvzznDT5LcMqJrS2|5dbtc$m7&i@)l+j3T% zg;2wTx39NFZ#4Wag+o!n_8}9u(_Ak@=+Pp!lEdzvPU?;0S^mPe0dx~*e6LuH_W^|Q zb>`jN259Trxo|3oUFV&dgt4XBpe-$gXB)^lzC17Uy&HqTM3B-M^U=OpjQJ0DOfkzyucCxXkH+!oLd{2o!*|$3F5`N9|eiqh7DWgfy;@OXqfI-BI4?hg5qCN{afzv}A zy3CtjtqJPx4tXs%C`LOE)?lg?p?W~cEsve>bv@+WQl4mAsigRPZPQlz(~lY37xU=l zAC{X;0y`eXlRNNuxE>YiWek-g~gF) za?zC6*EmpU-MuzwCd(e+t%%6zGc-T2!b{4~zHV#XV(*}CtOP)rKj6i+v0={KkP6!f zz92*I<~OizBbu_|3*;b7h3`dY{k(>Rp7PJ-4phZnTUG-o-zZnhwt9ZCBh#ee~??vt*2CYc~!k zO0sMZPlwEyET5iNZu}Ra`MxF+JN21Z5`0Px;N<+-s?B`_q~^Hm{M(OSW1O~I5m{bX zM6M&C+lhP>M+qiMeDgoGHF1eu+Jj=vJ_O=6TlMR#NoorL3~eOrd^I32Cc*7+g^@VQ zkkHg3;wckcAD@+7lm@*=Upp@|;V5(vOHG&G?uqaHV>Qts7p43rS;OHPg7y&^4yBq2 zVAJQsW+KM>4cM$}Vjlyf)r!dNS#xGi-K|?xbnJ@*cNt%JT0J?=?INI@Y4&E@IF=-V zr%@u8gG&m?c!`0K2&G6SMl71n!c1Gwj#!@|-6`-8ndgl`l9PCZ{}e?v+eu$8(6tyC@Px6H#5Q^d&m1hiOMXKlae;kc#m3fHZ8IE zQV}Je4~{L_-u<|y*4Ea1!EbFwAI_ck@;#wqNA;9}23scBB%&cXfSxIUAk*WzlGfs}4aEiQS>ocfI+twOn-8+V zH!(H7`M*%<(k{({u31@@Um*`6?Tv zsG?Y8Nf)N3;rF=?ooH(9a}pRp<9lk>_lQ^l$5``Odm65XSU8PzNMuSYj-E|Wr zQDkn-gngJ>#kX%BcB~VqxIzE9V9I$+?BW?*gE_kng<(OWhRC_D!yah#6;)mT!Ke8s zlBqU+vzU}!NH5P#A&HLY>k03vwyC(J9m_hg&3^}yLEUoqx4E0by;2QlmNshS%xzO6 zLv2}}FpP=3Hd=8-=3FSY z=!g(i8YvM+DHGvY5W`>Hc3u%na`u!e0-J41oK}z(@XM}XM^YIT^xQipQ9gq=Z0Q~; zou4+(KFNmXaHkyWYay8(|cz)s>ZB*Q_hWv zwU|j-8AEX=^@Z$xVnSqX!nlW%YDvP&0k-J2&M_NF6Ta1DX3uqJx!H1t1A3uwiG~z6 z3EnwvkAt4%_Kp0?S|3`oHEA*Bi-Q-V4Y(zX7p!Yp&%QO4uoqFF2kcm@d z&)5tSS&BYSZgKZbJ1d^UCI)@qb9+$EbstR5h`v-65HWaJCa-lB%5nIKA;|T82*lTR zk?FMT*`s-5Ujbu0Y9|8KMhP!FNR99WQL@BGoy8n$=S`vIJ;z8#kes;YN?|5zZBedW zCh!0obJQrAMTcJA~_VW`vSit%dNPI$$vfyI#@5eE!I zUJSJrzo3NDBX_xenGkRhfAcF;-ah!g+Cd)WZg;&HAn9K#!{mTYQsOgkBlz(-5w6b( zmOSqTKAmY44NTzH%wPEz>qD59!j@`+;1OHSD%{3s14R1p=Q`yU1)k_-Rysq|PY{Q2ys5p^ppB zV*GYZBG#T&STBQ)nxFHR8YvqbbDsufCLc z>I&HmEu5y$FZN|j1qC^UPDxpkkR6O`qXMfmxUir+-iut!clqh5j5p|F%)UO=TyL~L zX62s^dk8&aw*%waLjEJIN_vE$OQ2m=!Bw!cVqyd4zGgz)^>>|&jl-|)G%!IQe~+x7 z_WB?Y3}(n3Y%|*BXLrAkX*h?oo$|K+7fZY9Ep#>FSlsX&1>^*PBc}ykzq5b1nV3Os zN|B9BalLpX6~>u2#=5-;RjI5g(^(SR<1-4Dj8{tZdsE(OL=I~4^!8y2S&s+O5s1s8 zk=0O#Twm7}OW8&+%GPi@n}=Ir9L=ceH;}TGtvDsw|l88(+U!!+g0Ztmx zj{e$Clgsn6;WTdH4yC>dX&}f|%7JZ?nlnwcrJ`Fi{ndX)hVv(gN!SX2BWhN)aT>IB zIlN2Yyke9;mfDKS5X2I&J@2V858oL^vI)ypa`z>>FQE|9LJGU5fF)wZ6SNBLR1p+G z`;%?9^-TgOQ`P2C*jFVhU<`btWF)S2es{Y;7}VWmJ5vpnccXm`u@aUY(X}(>{klEs z{Jj~z3O~4^p+wlx=h~?Rm?0aYnU=1K^3SQ~a!2&1cX3VI1!c1;5ROU9w$XQ2^ueeq zF#aO?Gi_3}A|!vOi=$A@a(d>K&EE$vri4lg2UHoK6iWvSr99f3a0dNr?6%U$nM<>9 z+}O^38L#t_0Q=32>=WeY9{HfiI=Wp%#;H6rNVmhykB#A_vIh9AbEDep(g>qG{_h&(XGWQr3rS5~0e;^Od+Z zoL~j~A(w9)s>|oy4$?!scS?DSo%T9?45h%Np}fX}ZxWnSztr3wT(cXK4SIF-q$pa* zn-pjZ8hAsMbWy83Pl{#F1q0=*(N!f z>}wK~40pn}nBO{`kGAKS)IIH2LHibNNCYvhoMu8Bup7A2END_99Fc(}&h1XXbX3-N zJE`*`qG<;bs|IQ+{MMA*mOvAFk6`Yb%1B(JH`Pn~N`lOzb^)%?5t?IfMu(wuznSaa2_k6PHapy&-ig!&Hbzx?4imGKhnL ziu^4~-W6J8*-!{^(_q}`CSMqp*XfNo94UUq>qtJvrG9pkMvLF>1CVF_Iq=Oj)qHUV zL)r0qDYWpk3jKrp2Lle>0mgtj5sDkO+M?d)YH@8|S(IvMN)T$wp!_mJ^DMo)Tmo+% z?Bb|_vPE4{k%|p{yFg7!u(75IHW$>Kn z$jA-rke_|Rmv;LN;q$9tsQT3}0AzEs`|Go|`&7n+WkjeD)gzvGQa5P*yswbv{M<`q zqp2u8Sl0f~ZNHL~l@Emb-#+EG2B7$P(A#okebcuAy=j@uw)Uk2PqD-q8>NlZWbr}$ zm-=m$KjY|)(9dBr&rnQxlX3~k`%+BkG0SeTF19+zG^Ew{hisByC@S)v4U0q~~+BE6S-yrzo%Tx@74fq;7jzirqEU+li(kEM!|4*#^FKkrd4G^MQ@q5U?O`VsR9O7fHz1~Vz`{pM{7b*n{Nj)dT0 z{j=X3CLpO?1-oF&=kGT{YpANv7rrkP25Gd=KTqaqb3rjRtO_-94|?=?dV*Ht83&HX zp^Ni1iN(TSnI8P*Av^RM>NALpS-5iUq5HU@NdJ6h2*@(<;?DQU?}lGS$z3aD2reNa z-{#Yll)h%Lv9ENY#eb;8gaQfHVT0Js z#6I%6xNA7u<`U*BIwQzM!lC=_nIa{Hp^4Os;u;?zsMn5DUZa(xW@^oX5(zG;fvp z3|^+6lY~I|@GaK|4P5CbUMb>ywl#rCb+w9V9YnsRv&>PJUWd22RXk*@bX~e~n8}hHAXIzPofyBh<#W;e2`}eon$qRk!+aK4z z3wND{#b=OTJW{ugbLQFi`Jdn%v4ou>ju)MJ`{qJbq(0;!;Xfk=}sM~ z%uu^P(49fCnxRWw~Kir6fS?oG8Qo5CsHNAh@>8+%rv*aUBGTJ zV?;vYu+rSXRUtRmpVZEYt3Z3_H%gXVAK9H|fK|%F*+3Yh$~fopH?cz-UHE5SWsqC{ zBBRGr&Tm zFY8xEILx1?O^A66D?{Y^&OH+*v_Z75%n^}_Db3swVzA}K-0>uLlOZ7N%sHM9#ssZqF^9XWq^K$SC>GJZ3@(79w@Un4pi*j@O{T}-L|6Krav9h=E z{hu$uYxw-%J0|4+^`PTo{AYL&2!tdpC8h$jJ^!AtAAwhubz2yqfwB;m7Y2c9 zV-a4Apn-D;7ZphnP}LOv32;JWBBde^0(nz_K!G73&=c@h;4ui~#smVL8iGJPX&?}e zV^*6oA8_HLv8<#R&;pM~(e?nKfpe77asgVY|9VP{+6aI^9D&ke!fKwY=h+@vSzx!f z?tA)qi+1n&46|{pwNJL+mGXljC_br0O?wjH%lx8gYfx34i|M%4D(6irC4%4QRaFaUz`@Smt+RoP2bgE z5GhR5JjWGn1>3&cC7U0g75*sYJu=el#J>N~@UOx#)Gd=xvv z&trc$nGWdnaCn1|jQKLyKxaEH^64X_lFZJtK-C!uVlcwAVCn3aHF6kh zbq~LBx&~6h3DeJXxb0?%d+2s%&ttED5WX|kYT6DhG09_4lP_&uvEMwt=x)tfMIu9( zL uzg*m3@u8R`ByTz4v!o-g*rv#FL|;C;1u$YF-Yie)tzT!hA3ilH$h!9B)d!x( zo*RxYh6CT;?VUe!(rN0jzGe4j{P^_L__E7y-TOKF8zp*3knqn9mhrlW1-s_k_3~W5 zv0^nCO383gec;yX+ZX)dO1$e))B29zDAfl@)$bT|HoMn?@7&;9#`h;UgrQV;$e{?gxMvy`ICFpQPTpUm00(-t*~Qsccq zvw6#TNv3H5!-N=YN;6nB>@j_Jp6z~&nm76hkMQUr5+kix>)NFV)19ct=ItRlvCHGN ztjxurl!1_&|TAU?0<7|!he1=#kk(q--fg*8`iH5LpuPv+5iS%r#lK|bth!`qZRMf@Kr-T5Q zYbEqWpj?>5 zz9e5V|NpuZ|D<%|Pb-eJ%J?NabD9OgMo0kJfSaV^dV`?@bmq~V0e)vN^!NYGAs4+m z@m$Vs)egSS5P@!)QqO6`p!x^msfetU=5;oz?YCLJZoH|)E7vFYSUX28gE-3jk4N5~ z^21h~c>bPb{i%P+S5mLz;G=N=zz-hfGI?F>GF>juhzI2Hb9T4Ng>SN4T$OFWefd1T zClyM?#}Do6Wso529n@hWii6_{^Z7ZCqt8kd1nv$0f_HG(k8As(z})RRq9;D;@{7Xl zwq}lE*3$5yrwyJ8RdLR8nQMj`&v&a|=&l@*PUF{fms;h9ojfB1)2%N#); z$B6r!mC11pF`cL1<_PDlh*O|+TK`If#vv?Z|J#TYM~iHLPx-i)F@j z(lmkb@w3!hmtOiCW6WikwadTd+IYjAJML$d`QXr0l`c=<{uJ!eK5WM@cLk8K(wbPY zDFhbmM*;hjk?o;=Fi{1=&(?yr#=^J-2p0S>m)ZLv zI#g%(_gt_iCc9nX>CNY&v)cZ;U8L51^0Zj6pEt}oYj+hwXax1QOslWCV%>>}HTfYs zg#B{vZf&8DOgR`D%2u&OoT@!^WQt=>_5@Tfa1)i}qZl8jf|# zbczojKFAZ;jDdg4`z*8i`YX#i&gZk~3>{TdvpK*y5}jRFekkLa%~1^ux;XjNRRWr4 zTWRs<&(V>sP@)?7fFdwJDfo(uK021{0)(Z<<&rl7YO~6pS(o$k^Zl!=i)?NcRcb9N z@+X|~A3t0r@6P+6d)}&z7;lCNch_)^rcp++i+~!af7$ZwMbSPCRy$NaJM1{78Em=p z#-1;aCNgvcR(WQ9fI)G74@TK()7MkC8g^Q4a1x#O3(O;iO^00Qq4>lB-Ay>X{0RJ0@e~uAgTnPYHfno8x6@{OPj|mJ>%$ERTqrQ%on8ju{9opE zlw^!Pf9y4^x!8w64eLcP&sWwTz|2CcUCzC(!ShThhA>#m-Cc?9W4)m~M8BPbYBLIm z`lg12q>nw3TY|#&?zvS*r+=RT&i}Q41es!n1{WSFK@uX8FRi{+w?c=LF2N+lZlpjuWJ%$qc&PTWm>9Ot#MyU#YjxU{r3WaMC=W9yWK_aI0$<4D!2cma22S zV1`e&zb|#>9PvGCktL3*DwsIx;!u-2JVp!V)|Cj6YT~nb&d$N6f5b&)fkKJpUFV-$ zueq@`(MK~}j$ijCku2?95Im!0I77Jp)wMEd-(Z*7?Q^vD_(QNG#dni9bzD&z%0Nb? z4AZZZ-}j1eYj|PW`>-MgZCg=e_!BH!7lPC_O!yHvYM|p3^F3SCO5kDn)AdI_dT390 z`xeW#W|?lJkwyUJ~p(E|$d0T^E*k z9)&S%cDSGF!=49vi3Xlar!K8?Mi8f6_kLG1{2Y|YsP_vyl)37NIIq}bUw20bM)l=3 z<~q#%Ylm7ER`cUjBF=Pl+;PV>ggxOz{I!L@HC)^^))E~;^B_PE=*#UW1bZ6Ce^f+k zb0N`1LWtJz9@LVqtYapw^mPygLSB3sm8aG7V0k!hc|X&bwBNT7AT@{Aucrx{59Fkq zL72=Iy(Rt3#t2)(cwS3;fNt6Icls&Hf*!fHSYG4ZeUN>;uL3a>Y4FzW!v(?Q^j)PK z!fg=f{yR6>diwAi7Aoph-NCu)Q0gBtNf!Z_dV%3vffWgpIC+s&v#WJ-BWI*`0glOoY_qV#!i0uq^m=|aZ6NLM2)GuLK8u7Mu{zs!?v$C$GR z1n#TH3AG@Kh6{QILA{{L7V!DV=6*4U{1v#Xg76VKL9{U1 z@8Z8FJ$+4&xVj0(j6U+wEK6&CPMm9}B@wVgQo%@ITn)ajN+oqNn+%w^WsaVL3D+8@d(<^IMv$T^zE-1Nmq<_4>06c@A=4@pe}{ zAFp;zox2VNvn-qG#{;~^d~;mjPRx=euxxduRhG&|Lw58uusD|D9U5ergLJ|MJz^X+ zu#G+vt~wZbxHgis3IX+9yS1h!quwQuvOS{osKxBie>n5i>av|yG4imsHflSj<4AQ< ztc`FTsm|hUzIx3{!H@Y0>0lVnTq9)5tm2WzkZl>(PL=ft#r?q?#m=hZ5M?RKo&_)# zlQl-D0o|+YN~dl~F0b^Ad(ARlozue72GUjMV^f-!fK0g|LMKf#dT|~(d$X1Sds5Wq z1#oqMezrz$BMPg6(h!wNd(R56sc3fCW<3IEVg9h10n%#{p21{Q2*;kO(_W*65uuMvp>i!gWYt#MPIM*Tvp1noYF90( zghS;-Dkx^&duvI7h^1Ih5lhJFq?)KxGO>oA7uKhlI7)eojihX0~9UmLz8tXP=P6ZBJ?e6CJi;gOCMDz}=p)T)VKI^;G6> zVF&IJBv$sFxyOzz$EuHO4=x%)`&ZH8Kw?j>ohG&HZ7kXX-|gRD0>dWrld6wvPFR!vCK6{XLYGs9W5FqYoi~`_}Nf2 zn*IA+*KSTcU++f|d70i;7phAxy@va@kfyKGXYh{irK~1xALV;DNVz5Sq#dH|=IqzD z&(GRD?|y!2&K_}Ia?BZ4WgxAJ-3u05;tNOW6`I-q?HOpn0Dt}M>r4gKl49sP-c-Hd z-Xzz8NWSQ@OW7cg9uS*B4ChEU-#@T2LN$k^fFJK7=@<=|IpJrcAwO2@;vOW^{vhKY zjO>_Bqjf4Gu{^aLO~_ku{Lo{*Eh#yV)VZZv!)940u(|?~5rp6aNr#;At<8BzA>FJ8 zCD!!e$H6T3v{S53kSCs781-;f((t9^4HDWc^&dlfF|2BJOCLf|UNe#Xf>fQ>45}@G zM~jQ6zbivJEdV@4MV6mCrm$YmE8+D9I*33$tRF>?vSp(B0suN~{S2Ae+J|8ks}o}p z!B*q^44(ousdd@APB(!E34n!livYVV>;>WE?HRUo+61R=x1e+#z@8|vaPFbBi-(q| z4u`3}4hjd4KZzg_(xr=VhUT0XHa>>I4CDKI)2$_q%rDT7sat?~>koJ3_^kmuH2N_^jU@HRCBu34DMqb&^#RRi7OE1o1V|BRI1U4e4`N$0Bg-`t!Q zh_`I%S_aSHFnLhUl3+H=P%j{0J5k|hz zC>OnbKzp=wigFtV0x=q(8R`A%vzoy~w=8-1(LU7r1KN80JS1Q%dppHsr8sNRoNo{z zRbqL0x3JUPP#-;Sjl;7)LsPZkC|c*ez4`l1`_5vq+%#5~JJDe3Uy4kY$5#=&pWR%f z0!z*8q!Y4`pbk^55QMf5@@3tP(58N)K3@oSzG7>{PC|G2QB8KAf2Oon=(al>1sEDI z_w1fyt`dzl(TNOUH|rFtc_t(FLJ)=fk~_S{QM>u&J%Sj|WpCoMO_swfWkd}1X%@xl zHytGa?ZIv+tr-fGP57se98E=kZ*Cu6{$~furLSqoJHPu=q3i>^K$}gLB7Y8%AzM{5 z{F9d#{AO2IbQQK`(iHaLYRQzbWjG1fx35 z$hVEJ)CDP)V>tRrmR{F$u+s)C0drqYjW#h1y+-ysGuy6{t+i81=>OPXtxzVsEG!x! zH+$6|ja~(idg*(-6E!0pM(9k|J_=_F(DqXVwAb2HIn)}#va4?Na`cCL#N6I}pl-|1 z4T=AYB^yiuNCktkDdLAu93`O@)em!BWSqYhcW4(HV(#)x-g4A@4};!PjuWRi6!0KT z{RVUSxds-UHcH#lIS;Vm7pwL04=c~wmOt5SdETD~a|=9+1p#cLbOqm{86OUO4L;lL zFzJ6Wc->(m0rgxo47;HqvRqI@%D?Sm@$4_z;pw*1^|{#?)4??<9y^@1^yB=ccszGh zz$xPNIz%8kp{~M*y>3N#UemuYUA=eXK?619Od2>4^rF|#lPrKUV8=x%rghK{i^fS^ ziUZ05+rw{tFC8CwKpXM3dP*dpEql-WS9kr99Nk2-qkT`V)Vh)x@;N-S&=2gvc6&>W-w}f*~5jn*I7v+dWeh{U< zW~jbw43OW7w8_(m(S*3c-9X`WmQ$V*?y?cjC=;(-QtsFfxVh)j;d<1u{aUdNCG#nn zZfWdTe9&DgzNZ}mIjpf`_=?aa><~hU+Xy}u0hFa-)vm0(idN}D<1^+m&1N%rOt7Dl zD|15vLujSFqCzM~pWw?}uVcs?etFUkUt+W22|Bu?FzN{i_I0!NS}B5N$R2#ZLb;rD zNjHq{E8dJC3Bh)@O{>R==Xn&wSzXn-czZ1t%uoL=YuO4F0tGT&%H9yRV*u+&I{4%f z7Q(c!V3_4$$>quOspn8-408y4iqc66IhV6x7U zMrzzdQ7~5p@XD{-ZS2gOZCy6K{L#?TpqY|VgO${M1Rnq}S8C`+e1i)NZ^Y=|{8jI* zaQAYNvFRY9mQx%bm#dtBtO|nzCoDLNma0dup001p_PE#qBAstR^9l+?aQn9S6?5rQ zmgVU zo}qHEINY>bY8;1fILPg)C$0bPIpM{eD_jjVy+mvV!=R4L(&_vLwpt&{%nGl_vH1fJ z6c?O7Ytr5!DK0QGNzbT7ZhIt^j(y3%eRFZ6?BgUI)@Dg&`BMYcfG}D7RT3RpkS}2; zrWarG)?Zq=N)J*JUa$60O7B;I244>$9o%h!nGrTL55~LcG3quZ({HJNAC5y=$H#I3 zoP^9IPN7$_Cl=04mg>PZ<-0xRuHx*TiW4)OAT=RzuMrSHPN0Un2;9f)w_31GFFJ+) z;Lfe6W(v_rt_hj4w2=r@#{O*c916!6a>3S0VSK&6Nd*2I-jc`5RPFk>22B9T24Q7T z%X{Gbp4N|Hl?ud+JugDV)2XWikwr-Uuav4Ky`tpdSAAV&<-AQ=ROW z_-<@Jjw^mX4nf61#U_IQSd>rre2YrFaBkLL7`aUsa}SFfMkYEbNItH^8pb`eW<=kj zh>wW>_+aLt)J|n^tEi6TS6^spho`=G_zfst$As;cl7BgyqsH1hx?gDnv9+QWX5tN| z{=y#3SndNfgq|v_NO9gU$LS#wb;C>KPZuP~AQkwvnI*23PE$Yiu`|X#%%BI%Q5lsJ z(T*S7vCLqSWQDV1q)&)Yavy_+lG+L$`yM6k9MVO??T;{4yTUhC(R3BNwCZ1(@wGtaJXPyT?mXtBcQ5PE2Qse@#yU6+kJ(HPHXk{ceWi+&_Wx zG@fgVXienV@GEx(VY8{ZY&}n2zv$~KC3#L|!U&}G6=FfuirEcTn*f-+<4?Qu^h-;`F`zq+Sy1PZX)8tY37FlX)4jV$>dvYtuzCvHY5Pvqib>8P9}u zFL}fnr2dG}>60458mIJdK)rYI_Wmu@X^YW2N_SoRILl%zy)DW+^l%m9G}l!yjt+%@ zbOSXQ!tBOX}rytZiW7=Ln!0YmHPq-auc? z9E&ZDcBuXOq1kL#!&T}gs;9MbF^V2{huMsDI^+k>Z#6zll1yT4y_FxqcqtEL0MxsG z#R!6hEaHp(#Ah%oVAJVP(#7b%Qeu%-DVitX`mQO(zzp4BEtnp3<1#_CFE_6ZH!;dKPoczDt)8(voc8dRwDBjBBEH~96bv1_aYgNPF=J%!Y*X7 z5xAs3YxDH(Zkmog@YQ#^giA0pPsnjhUZM^!F(fi{?jQW{XE`Vf#RKW+;dqL<^9SZI zg<FqA5pyb15u@vks*wf)8YWwdyH`kyom!kKgj2iar44J5GfW*7Yu{Dk$}_*9xpmK9^omU#}7NW^mHN)7|sC?vXU^Mpkm zhYhQCEzZ9+Z9?26L^-TbEwBHhwN-V=lhhNXv9=eLnPXRjozl8RH3*j@|Aa_*myL{1 z?>=<>IY~MR_(0fbMmB#;R8OAFeHBsgf3*J01eNRUn`OU7q$3sSUPu$UW?pD)Hn87n zRw;H?xh^aku4G62>7L9$FwU6jGF2o`ynDN>b5)q}FC9j~93~u|H-92L0K%$O?gcaD z8_yhW^)Hz7{B>Qs<~M$Rm(II#p=r-tGes2*+(S25Fik zm%tA)CnBkkVn%dbbLCz16k}w1(B*yDgo4e@1w~3#WBqI)LNpKM^!?ws5(+7~Q|@JH zDIgZ@TQBDr zV|Tb*FQ9sUu*_B9Ih}PbJgS z!Wah>>Rf_pwGNBAWBKJ@`C}2(GL(IJr0UPC3;~ZbOg?k^C-g8q&u4CW1r5(LykFKbCsh4Ht|R{BM8-*| zaC>iYI)8GC2^mUpr|KPC5v7Sg`M7Kx6d~R0K4d=wttd@qav-(wR^N2Tmt`R|M=R@>#O$)0=;0?xF(t8YK zP;u{y9*3+b1#KS%7%4;(jfECpZ!OOlM#`(sd^aOBafS9-bbs8PU$sX*Tt&@=Xm3HV zf@V{81QReXMpNyy!e+X9pPOTyNDS}}XbRSwAD+Hq4m8gL}#?XYQFU(E)ZLB8+#YHSjey*^gC;n?OS)H(p!xW z3N!SXJDBRl2Q%hK%}PD;klBE__k~S%#~AgocL13nYJ(n7UhpPwSD(W@r*=^@jX8)_ z0k#V0ieK%5?{k%eN*f5Ort^`63F|}>y$FHz$qkhU=UIw0}d-1%>!2$RK;wg=y%)h2 zcULdu#6$e*MiMKK#wk<;L4$O!@VG&M^nyR}^s=v6Oky{nuI*dCNzH9J|7Um8a1cVX zCvaHR+rkRmKo23Imn$rp5YOX4eomW^WBhYS|Gky6cdAezj;70jim}yNIl?V|l(Pd6 zsHrfi9d`X<)O_!iK1aI4Mhh|qn2qUED|RR3yghquK)mg}yv=b7^(8|?(92vZs;}HC zo-HL(sk^^2gRc+#%H}Ewr=JV?w3uU(O03;O)5stGJic~VnBa6a3D-F~Jc>X~Ca)ec z9^U)N)KVE<&FYyTVi)iZp2hMc*rZA-tZJN&y(tae&YPtAJ{x*hmCP4f>R^-t!qj6F zmA@7rFJqZaA7*}_z}hx@xk=K|Kr8y2tNic6Tn~+j!|BBVTt+d+Jk){)SD8Kldwq)( z?aqYrz}tDm$4y8a!yovH7?o=8VB~un$4SWewVW?*6QVQE$JDnI)~v3?%% zUllBtI)p%3m-g5HzMQ3rABJn=%5&_%QOh`;*2rxj1N@n%gp^0I8+t@`u>A|JnZ+2n z;qiKAQuV{WmmiR!G4oI;Azan(X}OcREtXP4#RPd&TxQ&uHU_UqT0B}oxR>a13^e?; zRG_IkM!B9s(sSXjKu#M>Gz@*)Wi=D0m$7o`0Vjp%^%v)jvuI+o(Ei~mcj7u@J${%^ zVN4DEyz-sdM`HNJq{V9ZnaPeGRXUpL3D_N`HHf#kFjx_qpB zRU@P_s^HbSMdq2&XO01gk7b3dL=AZtyLqEgaoh*@;DO$X>8Zl;-U`XSd6Hgc)f$!x zGrPscWwNYBMOn`TPCMK~Ss+8Yg-UCD z>C>H6vt$$@m9ih)+0#qTk@JMN;J+mgeVb%(;OM1~h{~MLss(p`KL>O1;c{2`r{u!{ zQPpiMQTjWrVZiEMVmrpmZ_gBfe;#Dfu(KO1v>r+47;J)VWx0TQ9mgZXnAqGkurQ6{ ziAb_@j#f|`jU!47udn0tCtei>VH4xjbi}T?0>e8~tC)S?H>=@K-MACP@NRR7^u_{L zGim*PKajh5;`c-??q^uP>lL9*e1?dM6;UcLIl-x5P?aks!t6!__rf&A*3#HIJ57gF zeXF*vF3OXTtba(4QG*KMK9?zsJ^y_4M!igXN6PcQ3C-V` zPBhg_O};CLM0ZCZdTc^_UM=&J!zRlFnBnvG#PR?bU?@ksjjnc88iA;gA|j|P+o_aw zu9u(peq{R4=1AW)BIYqFwHj}+W*ph+NdANOBf3q=_p!7)3>S|kb;6eQ z)UzdbzC=A0y9;mk7>cYOSPZj#YfpG@tLYZGYX0{xJwT5pSU+|F_Jp`FMv>u2JpQN` zR0!20T+_^5GZ2YKk#Jzf8ywZ-nOn)B$_rAE>9PH*x?!cB6B?C$w8@jU1haN%pH*E~ z3Pc1;(^xuajB8nJ(V3u3Vz8@t5^klF)$4ry9fET4$JHt{#YeBzjS^kjAptDOX&C+i zS0bWFWep#OpNqoBF}B3;h3XNSTgxf{%kI+6>72Kae{d(OM4kB?T;wodKn+W>bhv6Y zs0r?rt_I-}m)5Ms9{FuPA5&R%t8{f9*H^-4+D5I=A!$h!JrfX)c?0l+$lE4W0t^1f zYU+3oX3gZkO@dd$xoOSona%g8fqH{fKiuj*zOyDIf6lBupvuJaUiyijElP`2sB^cn zLaoEgE-MvV25Ojplri?`VY!N#41;;4hI*OjqK5ROu5}xQOC9ZtbI zIQ`_HjaSmlH0ukH{^^??0+W3NmZ-rg4wM+~b)K|6XlQEj>Yq^q@lo=699tcxXvH(M z7r+1l;{El^Lx_C|mG9L1m+>T6rB^@9M)~o}vuK}0{IMt3RC!Isler-e`{Tn5v-r=6 z1FDWhdrn)HISXcQGt)6@J9X>XbkPx{yc5puiyltjOvROm>~UYV z9mBxY-?D%8IzZK%8@58nm!86D3P`un2d7p?T-9OC!avuRM%KHnQ}c6y7ih$mKLS}$ zZ-;?*Hc+uJ;aybeM)R+R!*Hm2X4Vyx4nf=Zu>eB9hD~=b@9*kI9CsL*wI}-FdUlZp zT!ZVrBDA-+i3^~bmj6V*gKa`*$z$OGH7syV!IW}H*#c(40&ehm>4x&Xp*1yvnkJ+j zGAzZ8&R)e!>ufSpBxxcV2#y9hBk1hnq4mhxE_ZI_CT{0WvOR63gS21?TAulr=~=nS zi!-UgE&JbxX5*w-GPq9T+u3++0DW{EtWi4R!+H3`r%1@5V5iCgvo=b~N4 zr9mzBN%f>ys0!@p``~!s{J?VfRBJi*0Z!W1DR9PFGek-Ia`&0S;ue(k;w!3jP{*nTG**wS2 z4eI8@SI{(dqRBO;@19V?26c6@m%%Dnx1MeSu$n%(l1W#q{F+F1^!L~<6j(Wp5MO73 zKP(SJReR8$9IChgeNp(4lYM2&T5H^o4=vzsZVXd)A@vWBI>%Z4!{(+oz#)2$t|@_z2m zTP(kHOZCt*gUL)97!%I>D5 zn<%r}*8Hw_c%d8jPJ73s)l?9B8$>PKwSvFx`e0Q3jIhi?{MtuG+Z{#?73}q1NV^oD zHQifbfL44rOF1bXP}sH-rV&`xsnIvTp*J>(4ph-W)RXY;?fLfhWm)A|4AyuBy=W)1fLYGU6}T1<02_nkj(d zB{Afvx=tfM&;X`oF^`0URFl+#io0)ga1?Its&6s7y0>s=O-lV&)TNmo^3BjV)Bt^s zg;q3%?mUQC)bUa(rxUl@-iH>>_sFn~!D;F;M;E?Cd14hg?%GUTO@x}Dk&2T(=FoTZ z{+MbF!+sDxDK+Xlb96mC@k|5Qr+Ax|tD3f_ScI?j#m#&or*6dsE%h(7jp=l7*!I6# z!Q3C|ZSGF1VEhs9BK0e)*Zj}5+H0tQk?tw2Rpq)^Kb@_Ibw>fRa3hqCfs!#$-mf7a zyKip1=pLA4(E8z%NVOxOr!AuF@znv4$t!JEYc1fzRcmn*+b7?U<)}c7Q;05OzC2il zNutLHsM9TH51O{4fo~2QovJeW(*1yv7T+uLkpw(|dRuc4oHBY$?j?Ji=hs7%x9 z{Bn20bs?WNKtIf=)6HWBFS=^iLi2H@ETJEotvOy#H&g?42xa|w8%@3KobIBM#a`-;#P06b9v=QmeNEO9lji*4B30~kUxey$Ib*GP}jnC>w zEISEdM(i^Zjk0i1==D)~ThFpci9F_7oVJ@-C4QM==$4a@Xc)aXjeF+b;`< z`YkH4s#rsrw^;wIwr-TOVq%eBr+J^%+*iGv9pZrEgyO_UTVQZrWCk^CedQVoc3~VrTC86svY!-8mw$2M(YPdGdLMkb$DG!}KkNs%pKWhE&q}a( zBC$5b&1dS4C_SC0VqCa3Z>NY@`wMbQSQWFrdPqBDtlMDYl&+?)hIZ-^w?Dt4=5kf1 zmKL#dz1G=;e1n5nbygirej@XBSwD2a`3q)ykoAhHFj$lA;h?yvPg7O1ElT=>$vnQj zcXW4M$kNVzxum=*@vLZ&mw>}}G zRV;S5$Pb}B&mC>|6}}PaN|&dE17!hkh06vNt84uC6DXW*q`(O4b<(y9S$O2wm@$;UiO!ff?AS1qdW!x|YT7{r^C*Pv=GtON3K?L=gL8))Wt&IAjKIesf1kpVWqc?0Z> zis)6jx&3TAxNH(1n)F(gUW62hPiex5O`W*0FcP=FdpA3V+x07vm~n=TQHiD7DMQ#PT(DlJPcJD4~!%i|4^5QkvE`T7UYetMu@+Y z-Djjm0qi<~ftU8`pOeC8;p91YMmXZl$9GY~d+x+nlDP55y4oY}i;iF{P=b&|g~KI% zWh6OgX4AKGoiwhbzl*KX@NAoS$DE1KW;YcHQ|uS9g6P^H%nR&h!5sAXZ#H!O$KJ00 zID98GTjLDXhIIz&dqCu_;+n3eMy_T&CeCI+17cxf=AdU{p=aS#V`1iD=HOvxp=Dy? zVPf*W7`piXI@mdwTA6$O&m9oz{r_#Z!~J&$RR?od4kRyDiOn={{t>&#(v6fzgLH#{bV=u?yK57h zGuOWV&vVA}j`Myv=gS%AjC+l7%UWy3bsiQdasVMv6xIhHiEpM#8XbOvzH> z&y`&#Hm7^!Xfz)94%{rJ_LujQPsO0V`A ziwmR;|0)C8CjM21f0f~1kBK&gf5QX>!@tV#uQL1_8__!OZ)}8M_*WVJRfd1JP-q?a zH#VYS_%~64VEF&OGEk6#LP-%u3VYuu>d(SPf&&H&_I*2f2A&8?DzCYz*Ap`i!9oSD zF+vX`unAOAo|T<2_{p zaNh;p!_>Z|gL^CV`{P4=aG!e%>eKe!Ng@&~o|hJ4TQ&nCqXm_bd|AzC!94-g3%WQU z0!4A;+Ou{Tw_&icj}T|zy613mh(bI71CChTPnPzMtS0rqI*Wc_Nr2YPj;fLUol%iD zIA91CRE!!6k|`KKBO`ix7g_~IDMNHFMFj6T!SDkB&08ZhynNJSr+>+S&dEWwtqJ;U z5(tk~e2B9mQksx9KwTWYGC<`Y-pc!8Ry1_mFG*prxh{0aG8{r<<;O5ssw6bY2=6Ek zAn40313g6;*Sc|a$>gX45aR!@%VqAyo}yr~XW`IN^Eyq20jVi@Xt3(iK3GuW7JA$` zfaBl931IX8gT%?r78B@hq8_|KZ{G@zI-Atcuf6sk8!GyQ?K0awYl+tz+CKRa1J+mz zi9dEoC3wdHZUNphOu2%$Eaf(KQAv$_?e#%46f_^Op zbjeqXwc=+vrpfGrRr592TTaMEtV<39Ch!x=?x79P?pR16 z3G!>B$}!skNf;JnGP3%VA$!Nk*I~XmkX_i8h%kslu+K}4%Zdlg%m0#2Q zv(i;6_E5hO-2j<}FY}lv-ixq3HVj}L=$3JIGA`G_c0X<*D>2Lw*i$QLKO3LBP(~b9L0I=P97HBc3#%MR^utFQLOOeuF-v>}R zUU#cpC}FTf8sKpncfQo>ZEx4>)B{SDXhT!(!TtEuWYSQrC(CDA?mF9sF3T7&?I zuc)9=X3m|r`DPmIyxMKxn17DN}$+N>(nl`0#q{! zn(CruCaF=wdBmx?VP*SdB)=|ZU1Y6yf|~m4L#pc}ci-P5dU@@o_{|u%I6Kd{(IcnV zu1=21ukB`yb(0<)4ZC^ykNWGAF;sr{dyYwKNS#zxGvuM-lwYyUnf;UMqkQ(6>a@d- z$jZ#liBbwZwT{Y(@QOg6z{-_SpF=98<&z=~7lxqU1pqe3>p*iVzY5wDI~sJ#1Q&-m zwig30;zgAU{+(M>{z|Zwv%4I3O>xDZe4`XVGtB_R1anV6oVl8+>Tl&v@^|y2>yFS*J01*Zvk1t%3p8~YrW8b!EPq{0!iZMq-1GJN`nSo z83^*M>xa7YoXIHc%!r4N1nsZE9vVUu-PFOi_&pN~g38l5OaS^b7Fttz*@glp6MVo2 z?I$pm@B1u4GUlLL^0gedfb+zF7^Ic;DeNOUI2Er3Q~&-55&T3Ttu!3?Gb;IHG(m0-_=wA z0R02Y-td8KYl$UbOZW!gw3jk7VAE7~Rw}V|2bslo^=d$V9+!Y13`A;1V+h9E{Y#ZE z(JUoC0+Zi;tV9rzJEY_$E))uap5(_odSDj)KQtI7++jmOu@b)k_q3nTUCFK~z|G)m z;T!zAz%YWkA=uTG@@K}B_PVnoDAI5NuV_uUDKno%)BiY5E^z81{9PysSXkOGFt6_z zrxzBl4A~7>qwhV4nWFp8fdqelg&@2ZktcDkG7Qwhl^0qtjE!2uE?s2;aE=K*f1(+3 z0dL2Aq0Y|{Y2K!R{lI_>UIHXx#pw~aR`{#eVf`nNh+x0O4}l=|s38_z--rS1=OUnn zyOM1MiqE1n3u7i zq{3%jQ;{YLELf`EZJ<%UhLeBq=9{35t~C;U3|YqE18J5PH1ApB(fH;#kx!@&7>HI8 zm}EpRopS_eqk4|kqU(+h^wAmFgsNshmNU{8K)+T6o;TmzuCj6|{P2+iW&U_7hy<`z zPYalX89bp!evVxkzeRrymKq4na9Aq-cS)s#pm@g+JUz>E#e#H)y*Na11Rnbg2;&n5 z7sTVkpeyl5N^Z&WQ^1$hJ%(1Qt4QfnongqpNpT4d0^Q{SgwJLbhvi0krAJVMHDJ&T z+U7)}`-^Dp(f}s?3TUR;=|pJ4_tcH=fl-hO!$i_KXDHV`eQ6g3j(VE_5^CLm0*?z4 zu-tEihT_|Y8gj$n>Nag|utHHt!NK*c8M4S!zMF1?Vh!@n95#1BBMH>luX366;Sa?4 zHd;rfxo#ob-x>?+wg7TEkf30xS8>`mV9!$SL*#Tg`3aph0DApq5V_U&*R=bjmqD+4 z)X;R#4ly;szY=J1g_3sv5`$7L$52Sbq8UZF(|o?zc)&y8p*!@FEY`}60M&7X%o@6= z^r40KTd9@+5~*?!iB!M5H(3BnUwJfxpcCyEsQ2oFZ))H{P#glLU*iKC7;O&?0GIDa zG_&_Y65#f-G=L!&X#KvSMQm{+&=?7547k2N{htHCtA8d3H~+8#^|}qYJlJ;^;4^su zThCU|?hQ2HzxsbL4;Ux;@PEj~cXb*VE>J#Lssprq==z5yxcOiDLT&$$eZ~!Rx8l`* zOOD*`KqAx(GapRzzrYEN`DeaW7IZuaM{7>f<1x^%dhdVmk~#@yJ(;u2lM)7kgsoyi ztzME+kAb%*}zHIYc}5RThGupzC8O$oNt`9o4@lSq^&lqD4T?unyWj zMWZDa@Vv|Qrj^G6oJp?p)_-YKKieMg#g1|49uZ9)u$xb}b~Tv*ZBDdCMRps3B~?Fz zpswSH<)Ziq!apn=tqeNDvyZ|sK?qvKh5BAfB~8y1>*y@pfRxA!tvy(0?AYNA>5h(E=0?nV~5UBgXN9WFsvKCoq&opBH^@PpclorkJs7Dj5$CN`R1LFD@cM>{22wI31I_Qp$&a}yiH$g1mo@oNk>PqP{ z@K#(s5P%&O1meRtf`LCIov*=GZ6J(qeo$l=e{mB)$nl>L@a(@s0Ei7|{~a5~-nz7Sdr1q)<`=J`a^>Nv(}1`OE`E$v1+NwDLlvWAv=_p71EXkiBM zvyG)_#VWe5LGzzr2Ah}BC+F?L1}6US9@?Ojqas1DnwJ7P)A&|uYUr|aqrV-CAEY&C zHS-Pr#txj2CFF!2^3(76h5~-2(E5w{+B{IE1lqV^phI1wzu{-Vp96ZGZ}3wN)oh`) zF`>!Si{lT8Ll*Va6wM>!H`ix;AigX@?)+H>Ki5~1V4O>CY^Mh;}13f!ww?!Rr&M&UH&x| z0F*3b7Psja(k|IDh_C(E@bLqf@(Q4H6N>dPe1*0a*fANJQFKmK^kl8o;1S*#(44yu zAT4iflya|rcLvafT-)4%?7aT7)hED)upn~%@CVzEKFS+F?HSOET}Q9i{Ly=JR5w6w zfYu0h>V>qhHGo<_A9_UK-@UaiU43YTFd9eV^{~e!U$8C#Q)jUdQ)kifqL+UOWM_ds zWkdd`@#Uc$lSZ4LC{SlFNOCYQd9T@-9gM6U(0JoR!nWv7LcrYjGbWNZl%pO;y1--@ zpe(DgbUnMI#7!8Zb^GRjRLl2y+NzBNL--mnBHK3*f@6{?gfT|KUVUt!&o#83HrWG@ zZUpnHbvU;SMl)i9HVm27F8opuV}X6+%R!99&@VL2I8Fh0^B{cQ+IF~}yK} zuQc!(^BF(x8`)6?CrRM6i6FB}Rq@hx$ z3Mv%m%#6>V40py`Ls>YJ_a_=jfi0E*plO`xClALV4%?a2DsS8D*$U%gQ6W9;*_ z4)}v9C*CAr=xAMsX>s#AXe-Y+ad`pJ&ZDD~7T@cQSf-{89d}}2E`bpA6W{NI$!F?; z$xnKpIK>aM!#Zl?q(pGX@A}DtGfUVxHHnUS7|D%l8dMTb0C*9h=m! z+>7J$x7$Df|D-sMpEa-OjwD)VLn#uy02=?KqPU7@HaZ}Y@F)*+VFQu<1GEM~8T=w1 zjxU&-o%Q2UfW?0_-0s8sV<$Lm(I|fP0+7HnhYc$EZ zP!8V#OK>=uD%YaRxiM?WThG5Hz< zNdL3ZcuV!k?PdtNIRR?E`6<@q9>m$(duaQg`{Z^O1vTG9+tba+*z6Q^b3eK{HOMVO z9@@$Iq21UgH+(7d6I!;O$*~Mf;=nDT*{uAU!B7r8H3~w)wY4)yKK;4@JRn-xV5IjC z4x=GLm5fkxKfaU#UxyPI8v?D_wn$N!xQ z5(BvYv)2K4|J$t#X!{rT|F^M%GI`6MrnF6-DD5Ybneho%%T&XrS)x2jBIU}X5#TU| zet#{Y?GDnh-;%dt|MK~IIC7$HMeP?Y>=_)Syp2R&qlD?~v5dbC2)uWKkSC)2>2%k8 zL+Z>;kV$G^z}xK?{a)=eNws@MySjgvCK%t!qhT;i5h^>@Ceg)nS** zgUJhOH8p#^;`|>RP;X$b<@2HBnF!08>;W2V=7XbvHcS}r?$p4A6AhBr=g&av**Btq z8?aS&pmt-wm;>zDlPymkjRh`S?0CIhwp3}vfC=Zm5OlpvP6OQy>X0*7Cfg|oxD+5G z1ECQdDk%DqsX`c<8`!UJa67BpFyfwanD|kJNS4ROTD`e zJA4FOo@K8o+vRXg=hnr?q2aTzDZYb0FXTWY>3M)xlw;A6O(9Q0gYDwQban=CqF$1K ziv))ub;R6j=dM}rtcla`b7N7_x;zM|Emk8v;i{uGp%CMBxG?95P*|Ut)IS9uU%5Zo zel}HkB}+DXX52nUhy$N@ArD}wH*ADnKkBf)EWcEcXSrxg2f@m>o(`-=uF{U%M}@9p z$>u7FVHxh~smpa87V|6pYgJ}Q#g6CZ)V_l7QzZ-DG9bK$PV?(9(`l^}8?Uq86yd5} zY`mVIB`{dNYfr)cwt=z5?0MrfXYaVhs=YMr)WEvwF4j<1yt2k>IT zH20c=nnx&@<8;g}#xRDixV44@08R=3r~I=&Ihm|1PWI+iC?G3&x6ec{)A4MR+>`{p z@l6;1QKp8yu_=i@7K>*f%fC0}c=9G624i*KKy|V%_`kAXQV^8%_c_1|?YTm((aB-K zEIVZ?2pf!D1c)*7^;|tY-H~un-q9j@7O)5VKVt+`-0PQXm3piS2H4|P4XDfC?&YZuJY&unA&i=il@hcV~nXeACot%FCrTp}o_f|k@lR6uD za!kcii^EB)5Td%2Ib^r!&XvO$VGFK?oV`sqW{y35UEMw0CpjIS^a=8r$;CW~D?8(@ z)P!7~EHx4*EJ~P&fCeZWzI{hC?#SVQID3k?JU@OxUprhVvS7`7OOZKb`J2qq?u;k_ zCSq1t%j&noQ1j$*xc1ox=~i)3a&MhqjCR$UDH>*&xlYZ>i51M&&BwKQiFG9rlNx_E z84cU)*M@x=YDji1*|lqPHhTWXnTuRF6r+&743-x~O??I2p==|4DjNzc!zOCKe6ARc zJ|H&zlhVS?DHu%-*5=}teizx0>HYNgljXe?J*xQ3ir@4&x+Es16f3X<(P65_QA)I% zF_be5XC4pEGb74S#6DU+?9^;5Eg{+M9wBikYa<9g+U=7dZoZ%8?U*xj5OIi7bar8K zP@&^fxvNkTmv-dKAQ`eeh=A)Iws?uos`AxpDikKAwhRR(T6DEJtmOteAoj{?VsCrsRMIpzx$(@I zWt9^SW;zxr|$YtgajK46HwEK~Ou}@9%Jww(H<+tmr*Y zLE-IA#6S#Qq2cKD z^%a;7{Ge)_po_dv10av;8BTA>?c030Mw1=meZFU%7uHZ1c{!8&Dv=+Co7b10(Y`A>_BuFPMn<(2XP%iD=TfE=h}NqI+j8xUy>TC!Nz1n~ z6d+yn!)_=$Wtk*IQ3fBei-wY*`lcp$1GHQ`&3I1TT)mf2RZ$W|<^!V50^te`T*6O+ zwDIHZlZIu?7| z=b(TSnN8B#)|@G=h`fBCD-pa#H9>ifAPBzN89*+o`pwkZtR8P=vih8_H^tWPR$^bV zlD%iwRJHI#z_ewwl&~$X$Z$EcbI}@Lo)V{X`|1TT?}gE1u+6xd)Nj!{VW<>$TY9pr z2#+XyTzU|RrnsXU@)F6rj9xiBr~B;S$Y0P`fX8CN<d>n+ZiFB>(Yu`@)DjrnjPE4H52KKO$VA2(MPZIz8M6{xDE2V4LIG zDj5h*dJks$F6MaNxooqvUZta2*D@(DIDS$6wT$hWSL8UkXSn>=&y}3vcMKtTZ)rLTJmz zOg)b;I#W_K&p;R$8h({P`j8?D?$|TNOe6T@YWK7m#Kh^U7T_R(_pr^L;!zP5PGmOz z@ZvAipO^j;Lp9qX#JsL9&W8>B{QJik1H^}vv0BJug~T;^`ukOC3Q<0D>jR!@&L?#K z?NidFRoXTb8b2;u9FGe7SVV;Ngl6Lcyin?>?81~EhC@>0N6O*Fo`(*e$tGF$ha?l>GF>fmt@Jvv2=wO3VY_adqK1_+HzW>P9s8?jOpEIUTN$Rl z!-c92JL1-nxM5u1kcSO5){lh+=lgx)EgV8)M(AxW7i5oi`c$sAHwP{As|MdI>$`9q z%xo|e6o@;l9WCH>U!Vq%y=Agv)2~X_*h$$vTg&IM8SWsQ-o>=2Kh%kwg@ z%ENVe?c(hO@yW>^&k``Ib}obX5z*^tJVa_i5U!xQ;bUjMrl7zUK(ia+GzI$<50WO= z2@PsV9hDBc`E*^44*wHlavaxY(&u2Tz2BaKM8R`ztT}t4GG$h)vyFCIDqqBo%sVR zE{A0;RSi3;vV{45V&kzHLOEqWji}Xeh;7Jv0`+X*uLU^u&gb@!4MH_!D6wA+8zuJE zi~?)&=2kbm%U=jGUF!>dvAk=$%~R7^A^*T$XXkBFaCo!+VmxAMOXzdqlm?qgb+HcO zo=&Hsu80b514Vq{(%dflwhZDM7BwXiI!T*^x?CSwi_~pU;}c5s zc)j`JHQHn9qIHE2#sl*%P7<*qIbs2=FhyP@_XNQ!Ckm1b<3Qo=f+jK zwc!yyTLt?-c+&!uI7WV5rQ=D&X;6?ywLW#08RlFplm*KWX2@^zTl^!}y|x9Bgjo(G^-Pn&(< zRfko`DEYg$?CP&G8GYE@r@6S(J_#4D-!;jOew@%VqzyNc7_t(4@Vnmh`|dt@Ca~HC z-Up6n&8TMrq}HcEa!EC{v+DGc(}Ehe8o-9)vOlO5E>g9s@&P6e&JCYECfEDva@dne zfIQSu%Ip1>&OMuA5!qn+-L^#%)sUopIvm({ zavawa7xn5FyZ-5Z$2{ptq#pO1O{*kRuly*si|JL0R42!1_RY881oGGXY z5i$L2z=Qv+tE06Y)udbIxTgWf$dF6P^W6ZErQK&6Nc?ofo^A(b_IIK2I%hQ`*m=aV zXqTsdMMif8?2Kug?JyAgZ0sSMSh#)0U8ygs54!h#JT12uhKjLA67ZGMLg@d(td&UbYarjPa~u0xC_3CU3Mm+!VKu<;9F^lu-P(t}grH}VhiJ-M585(^nc$K?#cK?8DZN}A?Xl?{EhlCx`;_vHId9i=+$uUirE zNpVLE_Lh$^WcVAYO7dADJb-*<_M9D+MQ3a3|L z@?+>_Y~hSfIb{l4?FlM5_tp7%&LG%sPg~>+MM@9$rD0q1u4*dwaAe}1i!KMJDS=QjXSB@KL06#9aX`>%ZLMw9 zfbgRMd@Dp*d!ew+e!_{`eByS-W3QV_Id-U7xX+}E4hKn#qlpebW38js-e^h%Yi%A$ z|2sTi$=Bz+TQB*$mX`$JX zFLc>wJ0QqrOz5x4`FvL!c7yA};)V;}(z^y7{jLThy(OTL>c~4}&Ast;cjtX%@A~_W)z&A9I z`Sy&EkUvrM=lfu@Bi;5iS!T98-&9R^&Z(wz&&{(&EbDWeiw>9S=9!ge*?{o$45_a* zSx>{xSx{ln(t~gArKLt22+K17V096-(4DmyS&~Q9D?R5=uH3(JCQB?--0LSj!S%NuT3kUR3SV@1{x!IYxP=GZqnA!wwq zI5g`syy`+h(!pTpN!s&LDftfHg^pU7S6|faga@dR%c$LV3d_T*urY21JXnO=b!5FT^t?g@a3a)zvdy`y-c&E<5glWp+TzdHgqeuW$K=9YJ%V=z-7&H9%T#7fn zw`{j35Q%ke@7YsW$jH{O5++BtpXiNDpS>v}Vz%xf7m|iM%H>hAkgqLH`aT&yOgM42 zF|72aP07nfoj3AP{;0KIQN8n_$GEwiTeRJlpUmqdibk)&g|YmRq$s&1bsCeAs#0#@ zG*{$Qi@pT)0Zm}Lu3+Q0FD<190Q$8pndRn!n3;7!tK3J!W$*eZyYMDLu?s1#wh((1 z^=n05eWYDiyNKdCP6{9be>`yP)GPiGr`Fm9`HXlc2V{;bI5S%(bX$yu)@01TPGbnv zbi6vZ4VFX6b-c2-weyjGE>u-b?!Z?(3dnt|w*?#>B69t#2Rp+iCpm zk(Y2FFD0vswV+v`^1>c&a#2&mO6Ndfu-BcE@iNL_i#7R@EIIAJw$4uBxy~czGH0>7 zQIntb8Y*Hg4>~f>f>?Dn0@R3is_4h5+eh-Uh168=uUvm0(I9u~%pDmm=-FYcvk|7( zVd`ofS$bS5+xzZM^mtWQ`&qT?#$~PDma>XHgA0Fj(7Q3^PL>l_5YM9oH-wxcXS}x5 zFJkU88-2j_Y8%i#8&;ZT8?Cqf{xz>P>Fljs6}f-63)#eByk^bkI76#*3m%2_xK z56@r6xGTxnhKbbLl`=zU!#au4b2jQ7k;RSF;am$j7;IyEN@E?Bgm9v%@>>eM7~Jxg zr7o@r=p*l`IF$|{_s5*Q0*R+nX_rbu&$wK#LzPkOZh=J`{y^L0{u*xPYrWE%smmLC zHY8mP7KEsz;;<)Ldmr|inR%;TPnxpnpD5Y!$3uxI&TWk*OC@##xAvu$!mSublj){3 zOV>LO$2}P+J26{2Qhe?upVuGsOBN>EsQ=*O6MCPQczedl>4TavbC%y8Yd$7vXvzoWTmRht4iHpUJ450`HoQ`TPk};c@7NlKkROVe)ztiE@~So(PIE8ok5<=1MRN4Y`MuKOq@A6Pej=vY4&IeKFRB^yOXp0%MUB5l zTz15XFgw!b?%VXpdXx3MLI%Hea%^VbbcxRJ*$bTtkp&WJPLv)%(h{ zy1YbIqYpS|4z3=0L8~*~N`)5n7C#+VdMP5STB6l;nJqF$b=79h_yVSFI8&1IU%HWP zF&lZDMr^HwES*GhN-SIS%IO>f#{qY?V3ur5B*QTecq)JWz*Y?Veem6H4OTT%gkuDDnG+*HLb@v!O`! zYc1^!(pE>?)Y>!a-@BVS+6k?MsPVJS(_K=&bM+RKeL42Hd8M60*(?4pd7cRT%t+j3 znNoZD={1dB5X@(tHI}mBd>eo7Hr@mWYL34R>fEd|@2mLN7gtA)o8P9Xb;9x4rzF#H zwdCmhz5+7uWZ4MU&aFwAliq^g4r<>31OH?&Kl`XEQ1 z1*FEqEjqiW2Kf`F$pyU4J~#=qq?qTOahv8{So+NVTkr@Oo4)LJ`?cWXVnzBtucjjk z$5p`gZ0XOg%A}0MavxrAQ2LClNU?f?t`Lmt`MPJmfZmm7b`NHgB>2ogQJ?Q&C+4IO zvNNSFbMv5m-z7!Ue2+_FY0+Nf!VD46m&XlNWDl2@Con%`6O$!a@C*&78|UwzuVlxF zx_YLmouBk3WyV;sJ0pnmx#J~b*0ZBGvVVrW3(gH1NyjeBEX%o;K7QCczkWB^%Ky-n zjVl7X8P0I9X5x`SMW+6NsC?s?ocv2mOXyxz)dajp74G1@v}#~gKB7+99gKMYwa=10 zqcCp~7jLEDQLl@2HSn^?(H*v{ZGr=xZ7#$b|J34j&ofV?)Qe9M}T6H=hpXX|&YAI@!f`+^&bN25>g~)7i`r$@c;*R}R zDq)$iLw%V7;S2^iDgcF}100V4PARRdWt%>>x|Px)(yOEwf|Z_(9Scp1}1BKlnGjoVzZaS*oM7N>({VWR6h)3 zHTsRSvyv|lJwN3M*UE3z)9BFQi1b3aqCTgE)~cL?+?4gEu+qRVkTkw|0 zK2npW4jG;{U>UlkD%PKU68n}_k}Z$?%E!swEKPzTzQgk@;n?MZkS9f?0Y7x*B&E7aLtRu<^xH3RP%N?%MfD^In#RT8)A; zw?G9@DiThK%NIRpU>i;dV;`Z=lf7&?T=$vQ=>`XBr(g??Tla-lm=SfjXt05I=NG%> z2_Bi&X@2|idXDkeJI&i(&v#f&KG+*O9otrJsVS>&Y_dOOcbtz4B7JoL0{zwW_)>wY zx#mo$7X3c^#$s~>!tOA}BwEzj8L3n{e6AV%DBi;C_36=}`eWhTZ6+gJoTcX6oDGS6 zP(Dp|i;5WUu5=kvca<8+={~jTWw~66TWSy~b+lZ2976b4|AbzOhKLf_I(oGl z?)B!_GYn?g?p}bcIo=dp>7bJjmb_K+oB-B;8)4Ol;n3kavYDbMIyDg3q{X4qEo{Sb zHNe$nXOS57YW>1^Vizo+%O0=u3&X$)!4d2iuIJxbBy-D8Xvn`ynE zpP&AgjowO9H)p!4{2Ae4#6WB!RIGiq)xNSLP*FQhJ#SfNSAN#|WF_3 zD|0_dRvZ&WR*?S?r#K*^=mj2B^l$T-tI%UXFX1X>s8Tx^^S7{qlauA|Mjwkr8)9Hb zZIeZ3q~p;|#Mk}vb|REn`Pt$i{f8M%hq5kzy^X7CQ3m>{Z0Mv!@}YAn+}mD%A#zpD zBT$gT;qm5r!};$EtWZ|rnSIYC+lH%{^njyn7=E#pTiAGU0Ym+H zu{Cp$pS;sdaLBir>uAst#y;$G8GZmKb&lD>kK5J}bTUcQKORI=Q9DS&nrqoe>0= z1$knI;q{GHpQIW%apApW`E6_hUkA@b@m^{MgBe zvcZdahOFGH{r*3>kLBoEqVa?p#aQ#g)WTN7*AL2GvE7PRyhQpQgOlNCucY|p{eI6a zVv6|7-?B~xTcg-s`tq_{3qxJwRF#Vd`%ALB%eb{!8^x^?VKaOOctc%Ut2n?!AbVYu zJp#M_I8SFKa!B=3u?4O@T3EW@Plp@E^tC#gK&D#n*yjt&8WFnsuo*D64#-TwDXuH!J z7ark$P%ivlEup3LQ6%DLi!rg31-DYe$?pqrXe&uUK3y3?lb8EzU%!yFW0q5Q^*3(a z%G7?Jr}Z%kS9a6l)n!|ji<41e-Hax;(L@m~` z6Py+J)0s98_25l=SZ5A+P8ZmJBz1acVxHAUAA|cLgVlPxx+Y6nNbspr`GhH|sn}o7 zWAVZgOFk*zv9)kqgq!3@xB=9uFTUY*|3ZFmqB$sY@m}A=)8%rO$Y95+E{X8iHkBz2 zp@|#*t3BPSHE!qQ>glvRbY7T3*7?f$H3%5k?FTY9h2JEV_>B-TW4DLMi)SNluY@IQ zyI!prPvXh3GYPx46k_qYS=~#{YG7L*j%x8b(F*JHU+7RIWtiFx^j!Qqn2w!2>vH)U zr5HI}UO1t9#;(w<(7p)*Z>%IZ>rF0U_^uVcdz_V!`^#qhplx4o;F$JHTvQu7rNC^b zv?%GMhOC6vr}5~%UwSTgY_|ARYloKx;psJF~kd8Ry{pUA0>^J2Kc#}Sp3BI@DuBHGGxKz#3|6`a@;oXqFqrT93e zO^56IFr7zDe&bflBY#dRamY>)7vfA^g0Zw&U~r?%)5uaXY`3R!Y5jSBVZaz(@=J`w-8%l^3;aX34}H|_6e(#6Is0S`WN zNsc|Q3N()S?wUCN$8&4?L|)=tw^2-NJhZ_6Hu~GV)9>MyhAaN3@K4&3ScS79e^GZR zPGk$~r5C?(4fCoo^xbTV36ZGc94Yq{oIJ)rnEX6i>oIiV3tOQH!rF#63`(2PSQZ3% z))0;@y*gN3&NV}9hh{wVsGb<(XPh7&xb(~)uQeR7RvulITrW6iiJo0k*a zXtPPE@rrP<`pzgrsov8!l|S+Aa0JPEW}J4aKv}-OWvkk#_TCo3S$p*Q)u`7HLpt*v zkotNr)_=&+Q(+srn%PAT=|JFS}eK2QlnXUXwH9Yu&k+`xpF=X-i^ny%T2*Ix(x>RJpitwjF z)kW-0Lmonr+&mB-~VDqvyN*PpQ3FJ_b{WsG$J5IW+)Ot&?4tXUkN{RTmzw%{~y{cX2 zzEhCnJ#Bl_s-F=;WNU{>MNL;b5-am5+aIkiN+cP|MQdMs%=&Q+|Byg{qY&4VoXlH3 zbJ+BE#-BA~>^6)E;XSPiUFhwT`DWtKOpke;>e*MSCYEJd#SBL22Xt{+bY11WNKX?j z(ZEu&-jvOnZ#$M6B}=7-9S`W<;7f75r+xVB117# zV@mjmZ8O}~*dWvs+Qb?+z*otr^i(~SZ`@MnvW)-p_3n_*N1oC?yYfu=l-jIbosP>_ z(jS5o<@tGwL}rLrc-~=>n#t5fH0HJiw#5okCJ8^+(0(+}Qa8I1lus$uV^tGBH7H$B zew2;%%_byMX76WVNCw}5L%_hXSuu_eSBwai)lK)3xDtG$u(s$ft>Y8uHU1-_Fj{L)eH!O5%mVK6Pe!+S90;mV4^=6;72MF;rM z9;OY8a0S28VZ1G8ozqg?ZW>n~5nu)n<4aP>9`9*a_VcjMwpgEXeCmu!WH=)*nXz0@ zKZ|}@A?-)&0izzw@=FVr6P;@H0jd|dbL{wSdEUX_oNGSKYlVs&8COTs*LB^nC{MW z(&S$eU<7epU5==qO}J-=_9c+iZ3HM0CM@?d-@X%O(b}89_m#8UpG$4@U@x+w@}*|G zea0;Jql!wkmk(5jE0cu7qNi2ExQ|M>Nxl@n<>vTdsnjTtXAi!bD%as;yp3IpFVrr( zixOW>36l_@A5S$wWxu3e=@WQ3)LTb*zN~(B!p6Cgq>@_oeWZ??YUj%j!pHde6l+~F z76buI$u?yAU;GV=rx}9S(wce>uIKcQZP4U=)D@bP=AULHEG_-T_=^~_ zyRh~HVwHnHQyweqG24uMbsZ7>y^J*9R)gzkCbWIqve7>b4_ziT{!A zny7QYrU7bbj@FfWdh;9COP4eP}MA4I}nCTojoZ2YvrX?T<)o15B~jn}V=Kcdn_ zt+9$G6Y6p;1jL_s7BV*eVVG5#`re^_6Kk|aKNLxgZ+j)T>!<@ti7=lA)_BYY>1{?Cj_P7$3SRBq=P zymU{~tFP)13N)a(Q(&Y$-PV^RP4TJck|oud71wsC`&&G+O|m*eHy81xm@W~)LzKZ_ zX8zludZ$X9)c(yaF*83=AQhZ#?Y=kS`q#4AJ0}l~o>x6bEYFQ|4$vGjwd0%*r9{f?0MS^pyM_H=cU&g)a$ zl&+HF>h%(m6B?cOLh;DOWGPbBAJ1oCNyhTcDMIj&*q-wyJH`~Ds4u3*gdMu+S{H*a zaN`kmLEXn4Yw?K8w8f*)E+sGX_g8C8;;qJJ4xt^|e!|;f40pMHCh!PX{1=&r&+{Kg zORR@6IDQLUaiy}-*6mt}B3jCWi%$>!>1z5`7#MSt-nVzH} zH~*vp$>!`C6s5Zo*Yw*TDdqg~?Mw1FCyMy}ER&`)PsArTX` z#zuNiVrILohI^Km=hmdwcVaT7uSrl?;;|fd_42eRVFZE0sv&iTQqJW?gv@o$wE`W& zZw+>5!t>NWnEd>dY!$h}7!H|TKbpCVHzhdy6^_Vl7FoN@sp_u!yB@_KPoqaJr6PGJ z=he%_hjG6I5}CyEOT_G~Uhq_%PJY~scoX0qY9~$R`7~>0a(!XHEiKUl*2eyF@>y@3 z%y~E6g~1=wmC|=5zEMju!5?zXr5{dS+M3KI?HyW9&ShT9Ode__p3tikNoMn--APo2 zm-#9z@+Cbr-H$ss&H}%4@O}Iq`mM_|!lzA44^rjt?^rC^{+=LJnN3<-e8l&VTpB*J ze8?<1bl-M+F8t$@;5nq7&pcAepYCX1lI)2jguDCF=a0rW4^c>pe-zg*PZe8U9kIEJJqvo{UFc zfeX9!fr8hg*5=YQ{=7ukO1Weu6wop>F!sbveT%f~kX4hOKhwTB$irxW11GH3=hmS% zmeX{3kvKtEd=b7RDaaR5{CILg+w<^ZKh>U7AUA@+i0a_=t=igbG7QQP&pYp9J}o<2 z4|f`1!$;RZICZ6_OZCiju~<=my^eGvK6yF(NfkHAUf4`Wd0~IXTPh>p%*m=4=v(Bq z`#RuHYIB;{eRhK3>HK;^YFvcSj=Z65cRbzI5gC5YWIvM7x)ki#cKm91 zU6B*$G?4)AY+68rNOJN(+0&@dKBR}P(#mpdVFZnwHPfnV$*t>@=W0_=13L*<^i^wr zCQVl4x&+q_N&=UN`dn=0PWL`0+>Od;G5>d)f2?)e5oZtvlbKP$=h*PdSZ7o;An9A+FcoSWo#*m9?Z<;sTzQ)|@5NC-byc^b=GUjo0# zU*PZx{T*f`BNTZ+>LUAdR+y*^*`kwp-QsuR$c+ld-D(0-)t-EWd1qhwA9kMtuDJ_= zzyM-ii9?EU!lQ zF;T|(HIZA@LkZ5dAVd9vAw}X%*#s5|W8+Xho6xqh{aZKd_SCZ!|AL<$`nug#`~{K? z{;ok^#W?o1rKc`>xjye>#MHZIerT=`nRq_vGA`f`?Osns zxlzLR?=o}q=WoYz@ddn7L-iiW=qXaN*>)_et6RMKu@$5tJXAvUci*Ds;9Q+IZRD=W z7h{E^DDdM7*lX7Rgs|sT_&6#g?|PLO`-|6!YxuPXvvI3)$6X}8*_78reW|KU6d^ua z8s^zf!dd_>|HgD-GQ;40~dR zlYK5l6WO-nx#u}+yB&CC4nMl+?i8F)UYwMjIhfvL>lkLc!^r%ivnf{f&Get8=(?td z#7)%t1uKTv9_+silYa4XW%~ZIJN4YdCIZ!-&+F>Cv|S_yDn>4^T>aYTIp+2>v= zpqls%kM#faINmfq++?qE+q|HoovdegM>*qhiK*H}Jhs6E8nI2^u=!}L;cFv~%0@>^ z?;Q{zOFw>_>;h3Sx%N2qv-A|4mRrFXbFZG>CD_?CNEd5!V6my`a9L_q#JStqkC-rN zi8?K`KJ9JE$dr?ePVA!sVZ1_$Uy%5;t1DqEK?7)wWVnV>sj)OxPI9#9L#*;^rNvL> zT?fj3Wj4h=mwq?rWT;Q?JBhDs3O_wzj1AL8xn~l<_(m?rjN0AN(uCNgS0lN@9)u4? z88KKT(X~lXr1@uehMxnqb8m>>GXa%(Zxr4lNLPzPUG^7O=8h^lo@S56d5MW`@iKCZ=^FWAUv=E0Cec6_I~XRt|;Blz2FZ>fUnGr6J(xvJ(- zdu^YlY(-CRdK%-1D2`BD6s40*v3+?8rL!ueeu#N5Bu_g3JyzG`T@>ch2iw-$XbzvG z0a4O08;YU2h4E41j1lx{((|-d!<41~B_lIC@inBgLij!vRU?7Laxn)tLoLanBnydj zL@Re-HdY#*fxmxDm)fpqeg4Edo~EX@&ff1?$u_ok5-g^9H5K$p8i@& z+|iK}#W;Qr9>G0LzL)0cTl+3aiWL_jBj7Xt;VC%H$t+?orC5fLh)H`N0a85Y>84)O zP!w~#iehM~rr1qI4JrqdPswbWIg#lLfM<{g#L*^PK7tPngLEDwMqn$%`~wwJL*jYy zZIZQ4w2G3ob2U#Vh_!GS57$=84I^T+WE_iXVvgFdv>4mhR}{)mh76y4t+pW^qxC?? zeiJyY0v~(tEY{L7%FC}bl+TLR?yRrGK>WQ1RIwkj#L9H%nOtxVU>BY?@gm)Gm)KYY z=OgpeSvF-P9%I|SVfIg%b{~YP9Vc?7F`GAWP#D^zK5@$yK85{iV02YhR!OMw-M<|a z_d`)g8w6c`l?B^vqXvM?nhu__YNP2&Tr`PLa>oyvGxp})!{c`*(`1@H2-Mp-^6cmc z%53gVac4}}(V({`yrGtEs_h#+NTKC|?=oXsj`Ok%rm9M|tJMr`e@4a^SmZBe5H(oPGKDmHP@9o2203*3 zoxHVHI7WTtLbBVT!y-E{Al`+tr1F! zarHE5JUhP$f$@rNn6|=JikkE9YkY^qxkiq*mA(5xgJioqz_}Mv8#n+TKgsu7NfdHB z?KPM_hO!T>P3$+d4Jw~(+v)o?j1u1D!E#Kx5>KAozb{WY){#h^7+JI+B(Y~|$#ZK^ zAq>UBHl@NjSW{Yemg>9IlHIi%lK#HO)@5XsGO#jvTxb$Y`3cwh2K!ghSj9rhE=wS65HeWr_I*@54n0gyyLFCY9IC~}D)yr!b>c?(* zyBAPh9GJS^#*+ueQB~d8ld-+`kD^3H`^ZHYw5@hZuWQ&6+gSxGUbDPJy_8wZ*hqYH zHW4aO*rdiXG~U+CNY>z%s}g*rvbMapUB{n4cJL23{0W0&{7c6CLDuA696gv23VN+H z%6O#oYx+1PB*9?(^bs|bc)btF*xYdcLCnR^`txdhlEjL8QfXr22j zXusimBoe2npJxSWyC*$EYFS`=Hwb2CHU!TBk~{AB(aP-F&h!R|q)DNXnh+lZK#`3; zrh-;l-^JJ+&c8S}KwjEN6Yid`rcUEsiN6d|A+p!xpYY+#mmhdmlsmr`N*9i-DB-Jm zc2h~u1YG8U;d8%Do zGr@6wQ-SewZ1wy6ObZ*k%dJ4&3f0-U?Qnf!3v>>94mL)jf=fDg($q92JqHTtb zrfHcwh0b+VIID>Fu`MSU$qeOi+5BFUj83yO#(EqW<|O|AI4_Kb0ji&1ZRsB7H0@!3 zL-W2p*2`()ELyY)OXX#MTAp{J2W=pevgUqH!mRnbQ7X|M8} zPMoEEiopJQxXWvprJW&jm8LHqjeGDz0(0;?)tH8`V~C4&$*ZuZRQTC7mKGH!@~~l- zjAY+%C%=X&I3MQzW2CRpN>koo3qkG(;;4;rO`^d_k~vR`f#Kv%rQ4?nkX321ZN+B6 zZNH*EUVO{%=0700%|V}@CHcXhl!qjkBA75z^)GDB)lw#Xxki`8bXUm{f10xtR8k-D zGJaXbbXnY8n$A1IXN2+(&Bc7UpoAH?Yp@M9%Gcyw`)!sS%P_cEAGfwuj*8naj^uv1 zICsQ$B0BYPI6W9toT^_ud9qz;Fx~7e`=kDB!_}Sh8DavdCpoJfi~fL?Sf1bQ8*Sgh z5j9uz(Ao@{#(wFCY#qduWgsP+sp+ zbfBG!ccHm9qEq-&XF6#5fmbh}Ms_uh(dkyPsEM4!jE~j(^~L>$;Nh{#LFGj^$7u?x zI9a>v%iF~lmo`I9sfXX-Ja|r|Sxd?F&Qp<%q$)D|7B2j~^a%@|^YA>Hxz2B0gi0#$ zGNLHGvN&k18N0WB+6k5!FB=$HY3E3NRp-RAutc!*yI#&bgT22uBwofIv@dI!C1iHL z|Bn7B-{-TyNtq7#6Cs8bEY4N#hnEj8xC%dJ)C3qJ`|8ZuG)G9I^H7W*4T_#@uWceW zIfAy-w4f0yiun+h}$+Aa3#Q_0qmC8?7Pl|4(gpTzY@c> zzOwh&*t6*??3pkDRUc|BaoR!EpqnOSL* z&A8n?!sN^}DQSdN0S1W@p6p79;huQ&6!k2v<6}kWG6GrzKvuF`GVI0NE;B~=7mTs? zicKAdnqFPWIW2_TZm802g|2oAzJxSp4K&O=z{6)eHevXV+c<}w>6dXTUY!2I7$q&o z!GXm$q$On`TFE}=5I1Xm;%w(2Os?`URX&QNS5@9>9;`xzgBgUfemgD3w0M+LbVF#& zgDEr(aQ?U_!KB!axFa4M5D(&SXvIDQq)BdwE>KMGRH2P%Cln7gX24N6~MU0kUu zu;|BJD_1-IfJPZcCl2Dv%TwKHFwoej)NC2ub6@LA>!V9@j-G=h)&z2L6H;AVFidvi z-_Ls(8WVNTdkTu(G@u3<=ti_yXe)3GFqPm?xdLQoMowgq!&xR(g{9qO4a{46NnODbxh&c+85s+Gy6j)} zxEfayD(E>ng!@&wMITo@7&1_AEBZ@XRG&kVES=7VbD_E$`%6Oul<+a`wW``m5_`M^ zLSoOwkyJ~^^&vobJT@V{-w*|%ua<6h<8cHU_5RgL(Q`QsVs7fWg0@>qn+PqMbaWsM zj%+5wd%YQIM!_FLCtt@LUnr^^AP(2ErRJ<4dRprGyQsPwHkV0eyO{}$T&NbEwl)C% z>Xm-WSy7cM@HQ2GqMAqW=4bm?FLLPT~ z|C9$KS1Et>ld-#B%`+ZwH^>_5XR53PV&hbwG+;H6&6@2(yWYV)y*4)cD3?7l9ETV8 ze|rdTnlYg^-}5(%xODPSK**J=4^lie8stc6do@>lX1d9A{P zk8W@2Rd)D=RK#(ZX05f>*qmTb+%*|?0Wn!x^NQ*2A=}Crn)-Q}2s-pK77b4=nN~MG zZo7DbM`LxZ|HRRBuwQ19(>1vz9eVSsHCwsB`|UH1bLjidxz%*XZt~Nb7kS_(x+^{t zGxfFzVyoq@I#ZT@Qt(c_JQUtT<(DY^Z0{K5{i&Q< zwT`&yoQodNBcpf^W993o;XfE`<_n#rkG2EDoo6y>Ul8NOnGSCiES^nk*1}vtW5nZ5 z@u1V9y@_q&WE%c>RDzj-F2T)}#G0{z_sR$oEuloD5cjjIQHStqd&rN)?73$jb~g5{ zc8G8!cc?4A9*P_mJO^t=cTE|UeM5-beKq!m zE>fidZ&mM~^O(xg0`aUl(Vtu7#Iig+iEeC!|2!~BAPvt8P2~upM1h&YMEw@O2FG=- zVTfyM9Z?5V-0caS#n)xD0SPkJt0j?QnQ0iwlMh;^h9W>ZcJ(-VsdWlnw555C-}`xK zb0Dl^A2ndy`2!{^ibjUYj$weD`jM!N8O+U!?*T$rz za)f{uNBcJrl9hK{#vx!Nwg=F|cy%9ULiQ}jb z^P7!*y>N2xg}0UxD&6=AUrjL8ba78VugvT(ew$rGm!2lgLYs&u`l0F7v`nh4lvDbN zJlslraK@|fN_6>Y*Jse#4w7pcYonN6fDC(eii*qS>MTHP*<{O^K40(d=?B&?Yd1gS zD$9dWOq&_Oz3sJpv7tgt?DjV!F~*gQF~cZDsAw$~Qr%A!<%uH`ie-N>eivLA9#=-v zF%?Aaj0u((YZ`)@mmp2 zQ@b#S^Q&c_)-rq+F?%$?AuZ8H;$GUyL9~==&1)iSu%y506zKbl??({+;rlT)_Qoj2 zByO}`kA0U{RWBw-fJ$=gE-Er&H62yJ8z4nJCx78B=+Ar0c4iujmJgr&^*t!9ixh^1 z#f@k7w8K|hDoG!Psv&QTCfHF7CUz7@d|$)L7=Vtzi%$cO;(=SQ_0^n>Nv8HBT!kkF z5-|3|-PCUVgF%VTNF98JaI-JJ>9YtQ5Aw8|d_os%%0xb8l9uTHMuVv@%ZPVXQ3R={bWT7NiRz_p^jIc42cVueg(;!TvQW z`I3O4>R>fk2PbfQ&(N3MTushPWP{A^I%jjXCt)+f&ERS%9j; ze`1)2D~T+?&p1RXQvx?dQg@cf(~h-#5|+C>rFbyHLxm-;)6z8nzE1>y+F167)s;xD zN?}f6tZ`fkhM>jm&g36}4*~+nl0&hnTA>CP_nJgV_);B5@zer*UU+A%Erq2Fe+s8u zK_Uim#b@%`o*9tb?>NEbjD2Z|LZ_=qTUA~w(@SnoPjP9v0?oXrcmfRK6a=lK+n|l; zQkeZJrI4vZ|5#Da6Pc+oX=*sKR-r#H`d&)D$%2}0`Z>;$=>QdMMw3L_1_%`Kpm7aFtrI>bJ7S zJ>3XqO?d`HF=;S2ua=mtlz%A586B~wT-XYlqk0@2-(0?r55U)26{&!9$;2rC9szQN zMYWy8Sy6fDDXsRq8=Ki@0Twq<5RI-DN)KKc+;%pzd9+~=xm2)gt;^V5p2rX*oC<7I_bEpVz02f9}+lB_&E~T5E6Mj&0xs603$(#NN7jp+?idj9f3g{0lpzC@7Co7H(2Dh`Bhrh_Y1SSq7F!*fN5A zVKZnpY;+N`;PWj_f6i-db5*V^37Bkr`UQ(LWLIISQXbY2a5vXFmz!fh7MF+@F4X?YyF=4|$ECLM@7@J+M4dC*_AOAf`Gg;?B6f5ul2rat3(>EYSx z=NP-H)`M`HD~2eR3DLI!CdOt60BTX*>3l%C@J$lm*OHqb)Noza)CdpvtLYwwtcE~^ zx#t>|cmeAoREx(Y3NtltYUyDO+fG~6LJy%>Fnh7F)3>!ov)2BDtsQWSZvd=GsPN~J z-tY}Td1gyltRy|_9NvV`Z~R@Lf$V8+>q~_g6=ezf{all)Cu46(CJpRBiTPe1_VPij z#+5IN@bppO3H!N8FL`QjEE=Ibd&!-^tg#evabZioFNy^vL3zL1w(z$U^Nh=5ol8HP zw?{fH%68*$nEWaXuQviCFS!SmA)2F|F@J?)Z5I#UHt7^ZJllbw@>QxQ=8Dlf*{He# zJ3_)N|F1G|0Q#T%pyaFm9#`Th+n6kU?iV4%pj}+H+)Q-<2a*GEh<)D41WaC{xR}#s|B`5Rk7rkJyMf^ z+L1d~)quy>4h0{p{cwF#j3QT8#z$W5t!Y?KyQ^R%1Ay)=F`U7DktF@D2q|I-L5`GH$>P*?GR`NQ7QSK_g8{Q=cmj z7t$sIkGlw0)Kg`}nx?KDcCW@Bqk}r^f3`iH_up=AVjC&je+FKqzUuX~0xzwNGDzAu zW96$2kGB6OkSd%-V`wYt-*F$#3XW$yXM}tZ8&FX0HaN zKRR@Rq?L+!1ea6w4{&c$_9ip=8|KD-L25d8o}!uwn4Q+y(7p8?+S&NDa3!CYgUQAU zfX-U{;~n0F3N`GMNFk1oN@l31wzg)VPL7}jirI8|uR zqVUxz8@8_%hwFEMz0=TVM z%tQA70Ok`{VkAhwk{z_AT&iFM0E*UR&lZA19_;Y3=@EON<6=<%%`#N=MmZmJq%u+n znPrS0T2Rd9RBqD(T@gawgMn$zt=9a;psoV^pq@Tc!5?o!qB@oo@L?_GC(U-d9{AjQ zLG4-4)~KY`Z*jXGeR+yDFcRwbUHunRqO~?O!c#ihJg8J%_{y?T z5g0@Jy`smNXK-g3Xxunvz1qi!i23k;?U&9g(XYQ~;K$5Rb^~m<0{|M}V1oxnP5NAH z$?^aJKmy$&MAl0ACh=n&7QC~#qDO%jAJc0NX~z5)(b20!5d3O%V;_iRo^jT;*6*&Phk~iTqnrbz#XkM!CZ9|r6%;w8 zz&Jan_KG3-+BW7G$X=Dn*BU}RMb%CA1S$$8d`umn(LOwkt+dBzh5{99O}n#2ianSZT)W2} zyf%twhR=2UgB={mpQi0J|!IMdD}V*JRf!rDlk2|q%9Pf zFr1URcUy-mnsec}UGc2rX4K~a>999qZ9o4?7I|!10iuV#kiaFEVWRVl6?=YEIY^$k zZNq~z3pc{v9#2#A%rvw2tqfsk#-YP`DPTo%*XLG^Rll_Enr-JA;cT+l+|isfHCYZ) z3Dcx^L#Im|zItlk$8RcpzzBDXaXWs3>j0=)<||MH(&Wgzuy_f&NVD6+Zs((j-+ca0 zTc3Pg$N21IKBmQni2j#T86qW%y*44|_&PQH(kY7dR`wXk*<*J<1^tin-|q^zEq&VU z32u211+!CBHTkO9(jG1|f~m%;W1Jwx()f+l<G%UtnQ2Gg~WikAKo7Uk4# z%y;_5yvy;VACYEvb@LhkqjG`v*qw8J3Je7qEbCu=gaP8tlil&>{2PgbG7*3tvrp$V zw>S!lZM;6?&uD#@90HH#xSOsZp+@R7)6KIZonYyq5c~S6|&iSyr;e`8SIY4IdpZF zG|C%})RDTNk}_~P>UtRW&pnD(nGP?a8$gV3YdsBZkd;;+2gtdTw8gHWm!D5Pglx^U z^TKmFHP+9&r~-x-+r}xQ8oI8iplC3dUc{kjjF((Mt{o*Kvcd6(vUAN{UkRIzDC}dM|Qa zs91BBD?5-yD$YFrxX0|z9y=MXB`qrVjR@LaQbv?~ImsIIKP@~N#i7Gfmg$ZpzUEor zy2xo4OKdaEg?9>>)-pelxg2&USu4GFuvF@qEw^=3#}Wiy5>{TJzh?7yw~M1;YEye> zYz~yVYBXGyiA@nn8>GFg4hk#_~ypWwMLLoy~hy-ml0M>=wYg^PkJEpKTHqzbOc=_%7 zNL+<$?o!w@P)u$G>mh5z4{8|X}49b0SzgT(s!=Arzl$v zn(70}2+#s!T0`(Z7~rcAw~xnlnrvUxbiPN6gc_8{6U>_2JH(9?TE`xL;xpa=cEVHq z95SZjo0-D?W%|Xz`aVNxy*vHwlCz?kKA?Ic@~Mc-|4SSG)c=>!)LASp9w409K=pRi zjXIMY1WOYS%ctq!h-7*VY&t;TmUe3rGuSHkRHLsGnFS)fZIYDBL7^qdQv3 zb_uv|>``tl%}1FQo(8`Hsjo*MN3}kOD}X>5{g&*m?uqF9!EA3P&ABgp@-W&fkE7?} zk`?BoY2f9~1y9DrolxC!%KiQ4rv#&OZ1J9<^F75Z%R+bDlW>6ILg8>>A-O4LT8Cnv5qDF3dxp%CoLEbiK@;YOV4Q(|AET7_me`<@@IS8%Smh%I4CC56mey7 z%koNOx8bJ7LZfTOdwpqVSKU3IG%pd~ejAxxzkh4V@`+m2+s@~;YR#o+IBU{{20@{) zesJx*F)&pOeuF2`Vck#S(>9^GMkvaPozdL-n zBg4dIEI3yV+0qlSrxp+z;7SIsdbn;r%7zM#4J^Y~6atUsd zHJc;%t(4*cXDvUu_w1$qG6ygayEbCBxeT3)QKZXMlp|W7nipqHv4$w~{h5(lE}|s+TlkmNWJTcKp}mo01Q1((7z1)pXR08oV6Zn8kkv7 z_P57Kbz~rjB88*Omm@n8mTO>i9r)(CdD2uX;TI#V@_Q0Yo;kKd5DInPbS1nqX!*lV|$5<608~BeJ$w#+iP`4qKn+I9GtbM`80$B(bbI2H(DX&e~y8jqU{F98B%=xr=z)j6gOXLl~atPCFPO{Z~6(5hXA6a zeSQ!LIjUU8wdzjdE|NcyT2@{PTTEL(r6;|-nQ1)%o^;QC4MFb2XEh83RLD+%7Z8u* zhF%kS!g)#&T|d)V+Ox`kL|o5mMDe^4QT{^+YbXPg3oUXLWl<7Vd0jua&}c?dcp{p9 z{f>M#E6mm^&OUenTh>(lGCAUB+-fR{b^2G$R1*3lVX;P4ym^CEc1^$8mK9eJG6ni?E>&=n9pmb-I18lve8pK7{f*=*U{!Df3#a1MDI0J%8=OiGtC)+}@oBP^L?l*Z)yuVN{qWT&QbEQBarBUGHiRC3S6VD7ZbYQ-5;ce^mMA3d z^FadJV1`1)uiVaR$(n?EqXrbs$^C?5W%umB39`uIx#qdp+9jqW>i&ddzPXtulq?Bb zeD<0y2L~rNklu*q7Y3&LA@)dq+_%q=wL(--#d^}5>JsBrMzQSIGR0-#Ez+qGf@BM7 ziq)%sB)Nl>nf;j`q(~H918a4&2v1)+FrB; zd#i~4glRU*kv!*@>1z4$lrY0aqrW~cZS6mU09=X%sU!PVZ=igrAaW7F#|uqgOFkjV z##3nkk_TtQ21-y|5bv14q7)@qwA@nYH);5IaNM#)Wm~cDRV#~O#!z1fBp!lmbg|H{ z9EzJ8I~`*4J}ddS1vrq9OLSO}j}#U90^%s4@wZGTCMy(%1?rA|r7nv_h&}I+!zn+> zPlxP%lcW=@P1rN6wHrS@!3zdNO~Iwzfpe#gy0Fx`X61CluevF-gfWbdP>XxU?tdWm zqCb+!6DxjPovL(+MN2S5yl|8=nA!F990S}TE%ZM_2lVUzG#SHR|8lDT=LQfj9sXB_ z@qgco4k3Ta57f$u}47Go4 z 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 literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-land-hdpi-screen.png b/resources/android/splash/drawable-land-hdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..48daaa6b2c7df5cd5d5ec5b97a00e26d3f1f8360 GIT binary patch literal 53480 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 Bb3Fh6 literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-land-ldpi-screen.png b/resources/android/splash/drawable-land-ldpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..696e737ce0f6481463370c287c94790e6f1b8fb4 GIT binary patch literal 17880 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 literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-land-xhdpi-screen.png b/resources/android/splash/drawable-land-xhdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..1d4ee09f867fb4c3c335a6fe4bb3322dbcbf9ce1 GIT binary patch literal 89822 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 FE)`RqPITyR70jtk}= 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 literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-land-xxhdpi-screen.png b/resources/android/splash/drawable-land-xxhdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..e9cf99c3aaa384579759a74b86a8ba128b7c1b40 GIT binary patch literal 115611 zcmeEu_dnI|AGeYeNrQ~6vPlRDS;>~{?I3&ay(^TAoQ$lH6$b|y83!plJ9}l1LnoWV z;lAF-=X?JR_Yb$n!{a*VIPYt|#`E=jy)JLnROQJ?Xh{eN2*?x_o@x*fT$CapAZ)sH z5q#qKx^fgW7p$e9NfQv1#gZPI5rOyT+%@E%5R~-Lt%5g9<_a3m2nhVx2na%66A)m* zM`)L92lOmFuvV z0FM(WK9$z;8DF3BPGj{o#+>f&8)~zA|Lyo1+AUIQk;nw6xDcPi^yWo_5mMxH$oY#+ z_J3Y-d@P|Z(cfg}$~2W?y;pkgw*JH3^_-qSjiLRcqiogPonJlcJ07B*YxSQVr=+KE zNEmynrmM|(2TCxy|7c^_IS(d)|KYecfg$_f8-h`X3rzoelj(9v>VL1LX0L_(?{!G? z9fEWJdlM!@@PE4^i6FS}zt1VIp1btF*Bo@`ul?_}+N1wJz<+!3|Hu|K2RTC%3i-Tc zeTd7OxqSt^$&@-fdIyH(_=}8kk)OXFNHe!g?JO53Trq>rH6;2>21;G06?-}aTL%c3 z6&GR{4E)t2+#lQ=e6Uz}y!G<;s=}RoZm9F&SOG}m2yV}(X_d5V6-J(-O$PXKYKnR? zj+e%RrVR>)w07Vlohq0_)E|wpz~wGRv4Hv;uOsntW8E?NuZ+02ik}ziL&5c4SeA;p zR!4V+#_?vO?$%gvl5=$q)BA$horcXT`E)Qi|5kBcMSbRTI8jqTMyL;4Ge}JGix=l~{{b zwpDOU zvu6}e1KU1T+_m6tCg((Luq1K`9p?JBoNnDYtjXp&?XAu!F1-Y78v(&%lAc@mw)Wof z!Ow`HlMV0OPfQN!ZPh4dYeuwVwOG;`fV*B@U2 zFMKc2&K>x$wj)uTjxD)#4$zcBjLxLd#UOp=ROoOlTcZY!)X`MbwQ|ttSU%NEm-MOr z_46uc%n?c(>eB7?*$Uno-4%Gi=DqK@c7i+YGC8Vv#8%roxKck8L4p@ z;%t(V6Gw^D`wlh}C@roIagU7J;G+nXBWCZ20TS0fYqLgS&=N>prRMe=w+*=_2UmXR zzDw&I z_S+R6Pe~U1>*$3`x|NQMcjmw9ElzO2Wb}0K_9#D8J0zYd`SY23aoK8krm9n{KuhO1 zgYiQ~>XhDl=*Ud}oJqb+uR@RVZk%9_o~}(_>fv=+uE3F4?tlT^j^3g>Dwmr*uD&7D zIyuSEbXhddRb?mB9L^r;w8tGmLYv8PCMG#UH(kAPlFrcq?uvW$?8YQrsih!9wdn=>wrxZk^RL>f0i8Hv|bS~&tXZVxt&Cl`W~)_=1S+2v*XF1 zZSe!9-qu$7JDD(-&+(xDSA}7bYf~JKuVjhuLF@iVKWIwQJdI4R^)w+QRLBMRXf#;-{zmXqac56sI!+cjc>OTHCek zwq7%WN1N2nd_s6)(r1N}l{+n`2UHI#v18#!|eRH#9wFbidgVny`M-M%(!W7U)~ywEt~HdDI7?iaty<^as8_ zX9BViONK>3%1v;Q4*yl?CBgrPZ2u3S+O*Ocy#3mFB?RAwOa9nT)}A3SR0QEJ(J+oyh87W$F_n;+|+ zb0?@K(oZzHw59!pt*td!eI_i{^XJNXv0QKwsHjvHUfDDIqFBsxl1l~?m|0OL^^tp8 z=TQzOfzKpQqgEq7@f-IuPBwn2DH)uh(;KFLSLPMZv+=sru_*2ZJI_y5^SB{$Bf&h~ z4Wzv{tKMMm>2bnMcuuhR_<-c&$={6Pr8#n@T4Yf-V$8wPC@ApaO~P#`n3x1jbY@p` zTwj$c>cgNBe=t{%@=SoL418x!Tqtl$&rlMVs~`PZE{lK7@45Xwhs(U2f*RbLB*p!= z?^6$Ldue+rGQ;B;Qisz-n%bLd^Pg$&R1`$Qs*ol7)2PhGU?2U#T&b*Q88_*m-Q~D} zS5*qQ(CSO4E?-=Reg4ibdP*8a<7LZeb(dS*s8B^im@lTXk#=qI=t)9xKlx;UN>&`( zU1jBa4sYT7qLYd{+G1RO`<0qp`xwvZsa+dQ`6EnSGNi2P2e$#&RtA^d7ge27mAkG zIraEbKtA1=vs#{DzDb?>#UlD@tQl(bBfhcB|=0(7L(qtP>v6uoDx(k<>+s-O0sivRRL8>Zhk6(wt&?QvaXb6_x^ z8(YK8w!^b5^jq~f#nA3tEF0+>G?aPm=Y8Yg`mG-+mDNuEg2Ohsch~0Ra>yluBIINc zi$C+tAOovLfcH%tQ9}ugm>MUg=NTnA#V@N&rG-hQSyrDVMccDf*s=b2Ov;j)gHqfN zp_%r7AUH4!JJ?JedCtA2&EVJ~eq+odyxZI^D`+{~RtOJ=)tJtDeSPoPh8@=EiHira zr#?3_!)3#B{zKJ`EqKrZoS(+AXXucy&7bq0qS?n2UjY`y#{EKG2j@SB(5fUyR2A3A zL}!|3Xp%kl+E}9%f+rCd^xqWN09(@Z2k#e}ngrl4*oAH)y-kF3^Hp;b7_9|X0#E~q zhA`e~%|Uc8WB;q}r@3YZB71P)KiZ`aYs_sgeU6S`0?4+qn^g1S>$u;p8X|nyCi8sl z%fIp}>qS2leO|3M_%h=^S+S>cp7qyxa1>1;{~Jzj%?~+K8)VR%R>H9tq|7a;dW!?~ z@&w_n1w?qjZ7$q;c9a!_D=itvU*M^dteW-;J&p%ffpudT@d>Zi97>fLHzyf6+r>67 z2Kmsq@gDSNznqb@iN06eK86|c;6$3N&c>1=jrRDGzM@-_{97}>Q>mW9Y5Vw+{Xj|t zw>-1BYk5)0?egoldX#g^EeJcr96QTV^bMMnm|O#!ole~DvoBft8SrO6>XBpGL!{m# z;oQFf6q1^~GNTVUCz2nu1sgf&*3Me5qMXrvXD8{=RN}2xta( z;*-+QhuK8Ktz^UHffi9Q9%&7y&FasdhQcN2yT<5J=@+Fi4PHw0NwM-bL9cq`c)h$* zBqc{|P}blYYz(wkf>?l*E405lL-O-j$wVRzOKS5`#ay#Nv3<>iNV1alR4|tGu!e^7 zl5i={{lII&dQax3LdevG;oGpczxU@`Ins%57_5qclhl}_yxLg?#nVMk2!ITPgj%rh zh~-0@N9v`U;IkVD3)QXl!M&W)j+Xc03s< zbjlxR>sUGBr5zesFI-b-WK=(14c6RR4Nh2NMl-%(kW-S_#@G_Ik4?+n`b_ujdB?Mi_{%cIjfe0! z8hXj2e>u+wB1w^v33j0!vR#~mM{aOfeSTiKP$cof31k%>;8l$Jk$&GlW~$g+$5&ew z_a|<@nf8)69b$xA6dw<~Y;K$S^2hc0hs0aM!Xc9ehr{Kyj5zLOB_Uj$5bwv^oNq1V z*cY4{^*f4%6)Rh@uc+;FS^joS)iA)|3F@N=)6Oo}n;$*qA-~~Yk~;8=a2Je{(FeUx1sy zz-efdPlI^wC=4Xfq^fPTJV$J^V?HELa<)u){*6sAfyLhtzP5p6;q)5t=~&y)RZ-9| z3D3xg;n!Htz1`YXYgdsIb34-<^5ZgRaWi2qy51{E2Ib)VtS4W$$NW{4B4LD%yLt8e zjRGU}ZKDvHo*`hW7H*Uow_l`o~QxG#pcG@zhuIPm%lT0gd*gl*; z5_a%x?PT>xILKe|p1{MbgZa~p;~8Apy7~P$)WTXti}p38;zdCRez`n;F4=zU4{}cW zW(i3I5L8W&vPPQ8Si>Ldj*9ZGF|tr5iDQLZrol6P|waNme^02=;`7in+V7 zQ8~*Sg=>WS_rE0P++m@C7`rXIQoCj_6~6cvyhAbw=gAp09zK#SI-Z@Ev38~lf(m!u z#ML?$@aO$WVOQwR?Y6zMXe4^X90j;23tICB%<~U+V3OT+PKLd?tYQqON@9l>b z9G7>8x!K|mrs-a$twk%mXPNp+fv|Yygj|x$<%^f}QkaeI)pnV++)~~?MCS0xMT(U# z8!`E}mf=DJ0q0@tP78@m}cs8 z7JqW{9j3o~U&b~yE%_~2{U$5oQLk;ct@qvc-m0^@jS5!R!ru^Qfhe>&KR9~*FHQrI z9DbLu^zS`ngf0^d9F-*gZK7o2XBZ_4~E6S%p3X^xlUw!UeAwQujr8g`Q+HezOsDyc~a2 z>4+Rvj^lR=YNC4O?=JLfhan+&fyxrlp-XPO7dko!%?JyoG*&HVN>*f%i6(R*zO2@N z>H)-;aKSWp7Dd;WvlScEWHPK3Xj*oA+z2B~$AYmk-&{Pp0$PGFOBS9MSZoGI{=4rY zFvAT$WFK|l!K`KAf{W(7da1_s2c-@iVB1tMqMR2lAE7J(DVrgg2Pyi_)<{<`9sR+- z`A6C1Lbc8!iJDGxd79;@hsJfCp{?2H(tUy4g*@Tz)Q4o9goSV5#riHBCB!O$dLV&3 zj7Xwrw<$sIB$4y%TLn{?-5JfNWX!)JjUBz(mA6p?5vVx5kK8H;v#i=h{Zq0kvzxJC4S0Zn^CJ1xBftKaP3!V(6a0(3x0M8@q8 zJu*Jqj$c6>80j9+a#Bl_RZ;I!f5Rd`da$1XHInzV7n*{I!0vEXe86! zE3B9W>sYRDdvCc;+j%(xrn?rFt#X{$$>d1dmAMR=*;fNi6p24C3+W251u{g*$??wU zj+Ci>{!-ctL5C}}XIh~&;!o7NQdzxCBM^MTS9>O=F0TqW(<4~+)7m}A$l*ub^T!dNLN^RhrrysM)2fTW;7u-<_ky~}Q8hESA?a0EePK73oAeif?)X4S z^I?8=S%S=dIsjdCvZ?lUli_-=k&jukgu`!qE@bE}@6#cYTtM$e%<#VP)Tu^>yx@qckvoBV>z%vx zw{y(Cyf-gsm}}YH?}GW%e5R_`a8vzmp25|~XSm{}YyHhT-pBT{#jd}wioJ=DQF2Y3 z@R;Hv)v_4&Z)!~8>f;RvZS;Bna6N=(@Rp{C(Mkf#@?hywcXjs{ zI_es;E0Q^|x@On7nUEen^Z5;Sn9EXooZkb~bL zwT2enPPB|#3pJ+Mb8xHug=o1_8%VY?&<|NRz=4?NP>jk;~{bfS>bxZl3 z?Y~*LphDTX**31wxRkdeVwf~T+jj}_J-`n8egB(cC3-(;TM2Z`XY>dG8mSo~xs(l2 zacgT?lg8@2pUP%eM^pzl9srX#3^6XKAvNRsu9DF(rt&;qRpsHi4DxCZjN3iV3`%)9 z)U}^VBe6-pe;JrT5*^r_3>}&qGe-ZV(CS@`KL)18$``ra@SWqra&CY7n!7uF;IV?T zoGqfDzD!Q3enfUxfp^q+5cn3p*qale4?aP>r|TQP!HH^N7+`I7e<`vZb zxQ*|Y&ypORxV5*MQz|Gmu$C6lzr9Z4P2dzXU$=0+X{T^@RgEFqzy&qUY90^DkH=x* zdHd8SD=p@)ji8BXDjy^KSR47Rql4hahm-$i&G zc>n3WNl*OXVHLTp!OB;g88lZAvA_D{5O5swqMMy+7`RZ%n}OM}$==w7dM)x|rxZuD z0(-wDo5uRKujRyxIYDg_5Yv*VoHT=)3jzv8JcWm4Qk=8njO*s_O&$j3Bl#A;k<}59+l>0>30_C@p%_o3_ZZ3wl;Y0Rfhw>1 zJ?bmn%4a{8q#v@5%c#5d9&Iml<;C9a>HL_ynm&C$PACN<>X|m8nb!#nrK7Hj&ExWv zd-TpfP*B*V6hQ<{C=K`S1ts}0{NqNns#lssuMH&Ci?;2TjF*c?~C z`kQ8}?YlBz~oibek~{JZ+-aObfz0}p6BC}uVqS~)*lv$1l9HA3$Vh<^YctlUP{5cImV*Z zx7JL>IvmmY#Y+L$$r{Hjgk-RbZEgx1Z&BP0jHf#Dz)iMJgDBLxngpmjB3L;C+&f|0 z8e_D$IY3=+2^~GYT`xWYEyJo3`5=uasob=1J_k9i-tUi0g}77N%f&A+lqnu;5&grj zuZ?XOdA;Qnpu;sq5ydiPMx@yde`EoCXok^Y?Yq_IrjL`dSE@!t zyKNtFdxD|*Oz?Jb)Jtx4=(w&+8q@hNpd(Uz+NUcj1%()ikk!GJr}+T;jauAtMXjaP zj-&K>yk7B?Jmf-Lipz=FhLQ>xl#>$uvgeodG`CSdbrIg7Cy3KDTePW|>O}bBN=JOR z*Wspen@13jR+sM+2%tD{7 z3fIh^PZaBB4C>kHCRU$+2Nwcx=XO4qA7)q6uj5n7()=t*QQCeXv7BaZ=1l6=rLiA; z*Y#z?&#iz#MuW~w{wt5T+6lw!-Sd8x+qW54#BG#@S4_G4M=-^!NhK*->#@3l3)&Wg zVY^VO0L1CLQ?WGtSygD|cO^kC5-9R%*JUGQu2Ez4N?bkGLdx5 zyDE&Eg`w;U8^yleQ>?kNz82a&QwkCG6byJPS(T6g$QREaK8jSoWmu<|*OUUy2hMGD zz11~UDG66{?l{?NxMiN7w1MbQcB3u&H*fJa30Bs~hS(|lHMm(x`GmRKBOQX=BD^(p zY-Ec48495DcGj~q{<>3m3^D|y8zKg2s>?ytQ?-5l{+LfA9vxiw51Nbl2WG1V#Y$3s zlg%$CjIqDsA{A?8M(i62=jzNQ9DKj((esmgs!=?FX~yjNr)p?V!v5R*Br@3^bVNUk zq56G3q~LloS`@Y0c^TyvY~1?g8c+854?46^j)eTNm%&EP=$*vv0R@}gx6C|&R#nAK z)Qhf3>HD(52Eey7S#SCEKy@uU-98qiGgvOZ0gX99S_5%!Ywa@Kti7=mL24hc_es%D zBT0>j=2*4QXNx7hn5v}iQrHr)eP!v-v&f)Hz8gpt197>(G{>NXJINWBJHf?W(msFV z3;*gKt~=B+p{S$d#@4O%{DC`|`M4os2C?F|9P~07=siXBpM-EGNxzPdSF3J@$xeLN zPD?5r{!&pMdpM@c3&LSYMfPj#{2>eZ;*2({dZ0A1eQ)1yXMxj#PYJ;kglUjXD2nSE zY;{};0K6X`{r?Whf~$TrS61BEO_%l+sNycZdJkg0}wH_hY*Hv0J&? zkJz540?Zfk^1r^7>UEg~YuzeXIMavTv%?0SS}bZ$`V#fzv!8dacL=cj=YO3hx3~eE zmbZ~m0pRbI-|{XfzTbwi+VA8Z#*FvmOG9BA-$LZU7$j{Xmhn0a>&S3y)iy1BOV~qf zr8|a$%N~RQyAbb3=J-jJ)iHT}^EhT(p5j&o!JSQ8mwkYuR@B7Q)%tJ{cI(P~SPhxP? zAz%L|JZ+&9ioBP7x{AMw_9bA${K!f!7cchumWyjj$ z=$v>kM_&!5(By|tjuId){D?c%Q^&BPHJfsa-8J_$(Q((v zaI-dO)I0JJge54__>EYO&T09%T3c2Q^LCPXJE9gwASVa2y;Omq`+|-%B$^A)LehY* zmR`ggucm8!O3Q(I%tB8LM_Wz@FRK_3Z2?y=?yajWV4R;B;{7sC@P=Co5D5Z>vj^1v z!7Xy^uIu7P?iHWE{EYSuMVV@|vLD*k8OhZgy5ht4r?hOND0^ zd6J&n1Pf`^WjdBR>96ehLu5vX(OJn<_@${ht@dGE#870zEAV*}tt%Ef+bidIJ7}4g z%&ETa4%wBgh(Wz|`KO5AP7H}|gQ97tTtc0M7SH_dYW<}9so=L!6CLCXg;noK&kpOo0t@a}u>d^M zn8#Qo2MF9k@e`yzF9)yRNyz;+lR6-*3L934 zm{9Hh*>%h1E(uR5_*%&P*`$Dldh(nEdC_)Ark{(k=cg~{`~G~ZaV#>q3g~N2rX^n} z=f881JfsnwnQ1YkhqP$yQmyJ+Uf9JsmLZw!R4Xwo%Abmoy1=lH;Exs@w%gVpGq^!& zto?GXvJoEXJqc~;?X&325u~fLoZPE4QY&S!wNpaTVLGnYb=z1Iiuxt#?AAi9?jc@; z6R>Y9AtXU0E6M0&TWCQ^C3x)mLvI?|%(VYBJ32|LN^W1+9CiAMNO9G4?Q#40WaNbA zU`)C8$WgQLvkV{Gd*#@qA3XFntRyNy+^$v40LV-FyD0AVQMfgta@^iGx?Bexu27w= z3(-Uk;4X-lSaV+$Z0F3^$9Nc-A(&ragw)GxJ+ll)x!!#6&A4dfTaanS4xic5(Bq@;PyuysLm|SVT8$)Q5}qP;DvsEe{@@qR37D$!5?{KJmZM~$&un2+R?HT@(F@KsjDB8Dl7Ev&C-JK|0|T|LRGvNJmT` zvttrsdC<;jHyo1f|BTiI*Cud&yVb;ryBTfcfT3TU+fixD{YnzqV1v$u^J9BbW7Ytd zLgAm$)i!_63qU#SmWJ*OHkny;K$U{B0+kd`CY1y#0C1zZ=72Dv3-@Bq;`#du3=uMU zmW8U?QX$ZkIeblFy?;q;E}NZHRF z(b=d9D`{91kQZbW1KR3y&D$zE00V?XJnxoLr><3!CI6{!QF?C`#0_u={-@=bLBx)| z^oc}_m1E|oMnqwk{9T?_RgwD4AWe~saHh9O)84%=9WWBqIZD@-2X9&F3^-4J%_L5F zEB6GE^GEhEK5MhF9J}CF5~J=%huZED340j$7gFH~)?n*2Xsr65{-9{Zxh_x#_$WSW zp2+e$8-t6PeF9QC?yy3GZ0~82{L{dZ`t#YL$(P|_jPiiG+4}>B6eisg(Zl3$d@;AJ za0Ha{SU!^=3~y2xWKHdI1Vc!bh2f^b2n1Icksj(h02c^Hy!+jnL)ztxdhsOV(EwKf zrF5&}xbfAUPj$nKHF47$FzRR5-Kz83u#U0Go7W=k?z>lI zXkHQTL%+cy+L(wOth@IS5{RqblYOt>f|1(ExuihTM+MX9pdE4_y~sW23j6-Pc&rtc z!bOBl_ov#e?WOAn28~m&4e?^DnR_a)op!39RPxq~{Id3|>sLN}rKGm4n%_xrr>)Jo zo-1t}6El*N^aMAHQx+Ws$is?*0fLJQ@AgBi^m4?%$Y;50mOTes@%LOuW{LM{>OtYHXWo#SAmZZkmNq7|!$xWGY z;@(qGXCIE*1`B~gg2nn??F7|Ztx>XhBTG&`3{Vnlfe>#au+7v3^EuVi54kymzmmr2 zQY#ey>{?hI!17qJc&6(z6*xps|2s7I+s!9OXX%vRxFFJqqP#Pv=9OKsl?9@iWq0}A z$WzgrFxUbAz2eRs56PsPfR)br^hh7RZOa5#J~`Ni@b#!FUjJ8aGZ$PRH>%X>ynwQc zU{{IXjl_9&drbCK{@7A_6@f~SB7b-jh1HDM)ig=bFSuAHH}T*H>mIC1I3B0hwmRkA ziw?^O(91}%MNdvozI)6dW7t6rz%C$dhRNnZ4OOiCG+-6ofJDjcT?2c{M7$-$N)9F< z)1pk`Pr9nuqaz>9fhoUTDKDF zw>k~IXdl*IKdSk!Oh1ZJ#BR`LgV+v89OSSyyL^42R9RJ*?nM3u+{czh&~JNjp8H4Z zHp^deCq{|izcVB&ii{VfHm^x|gK7L1bgz(Na_vk#CSK^C`g|!^UN7R>?9@(>H66(6 zMvm%^fNar_Qh;;fcb5*U&+-0<^;U&Om!qPSgA+AjRqdVZq^RO6jKT;*i}YP_O9p=X z7TVQi%*VlCI>*(oU+Fgx7Yp^6%>}i1kg8TJmHq{0pAg(zI{^TGH2uTZzt@g1@(_u^a~FFTJT>;&)qd(9-{S&tEd5`j8Jt z0dg$t{qEj6p4~Qzu07+e#lv2(tUJeG6sgl|AHlr9GasU2isrG*Lk9_sVS^R*ng9WM@XJ={81^zt` z$k!&?DHH`7P>}YYDLB}0perdxJa*5-q~(-9BWCUONRLu+vL@DJ7I(JR2H9aa-PKIF z%?om(0@(lQb!F z>1WGqJe3Sw{dOZm=hZ@-F1G$)(nwyoyGpyfq7g`t)G2q8u5*5{dVlOO@qfvI}I2T~~PFo>u0#>M9;hZc2M_a*8C zLoj_l;G{h8T!ki_8pTZ6u0~6i`)<%c&*Ib3_A^42&=l-5MG%oQ4vQcvM zx5G$B*K$?5Y86}Hp+XM2tutj+bo|s*rrf-cRu6|k`U7;K+B#BT{O8OR}3j8tH~AXpH#d)`ULzjcduemube24B0KfY@!&P z*s+E5lz~Grkrwesp>uKr#26DTfz2AE7MNL+%b6kn>ybXQ})!cvM&4S%thojdJmRwq4fc*mZY7*COg_^-UCdO)*`QjCHYkHzEFF!mt7c z*ICct#9Daq;YhD0=KY*C4YZ$TOT0WG2h*)Tr%K@CaQuj~p&AS)A+v+n5-OQ)jC|FJH zwN+4(sd&uz0Jd7za7_$Cy`YwAZ3*=hx+NuZ7VOth?uTccZW6u&u#Un&;97BMebOfh z<9=sj$y~3wAyV9c-cI845S* zo6kK`FhUltc31b~4egXU3PA z4$2O%fPw~4Xo1?B3?J_ySFuzRJ)T_g{%iajDg{Gbkpy&@RL_}F+fPfP&FZIrXB^mO z9s6a-(1ZSUu5NaPW8Yt;%$Y{B2vG9|SgNeq&OX#xjsbZsFk;wYl5Ilw2Z^3Fwe|&w=X8$z zZ4jkIXs#yV4uxS`kg=Oy)C)fOqrt01ot8UVs(ZOS|HjIz*oiWY%TL6L=E~(jm`OpK zE$K6P)mT_ZV@`e0obt6ZwT>k5PPCkI7CvB?e$bN;geUghSSv?msf_Gdr8?lSN0E@1@ z4+6cJO5s)6H1j7cCF(p>KOpI`T~8pWoBzb2% zy9BTNF>ZKyrw#Reh5Vtp;@t~0ruql2-!^sxlA_T-t-oy4r(LxEWF|)s|B@>qE{x1V&R#?h9ncQifJ1t3+`p8kJ;XQe*4=ppjtr%)I z@-iflwbKZP?xu7f%jfyP?E+vg^1hcBT6&*E1av%bAX6Yod{`4B;q{G`7b(5ocXP+U z2bdFV7&rS)41%4)pKLO7-HeLbR%8=!$bMav^L|4jyF2`JrHQ)9qq(no8!P&TAo%pGy2r*O?E5m9E49j*yz2o=ly|N<<8i5A zDQS;JExBcCRU>3K8hvr`4Yt9?0)Thwm%wl1N0+eL$l=e`>r+Q_ic=es-+<_1s zjD<)W&=q_Hsn_=Q3Y6u1#r0nq^6fZ$$kdkZ4ib4t;DXEc2@OTACwuhm0MI%0NV{JP zIJY2Q)#$#$>(rj&G6UP07SV|}@}=Z>rwu`N4J7eUQNN@jwBOb*J-lh5X!fz#odtDt;OGkVz7E{Azh?QPKYbq?`c6)}Y5>IVt4oJ5t=Up#*3z{m z<;^kvN#@4lw5x=%Q(1vSQZNlBfzr0Lcn0?@e$i1?D92w>{p0}HgpluYq)<`OmHMB` zyG<*k+w_6G%Q0W(>u+F$+LfzA6_@!Q@djduvazq)Fnu@Kxq<5GSP7c?0~FK(>rsYE zNg4xXXoD2gK-xMQ z5Ps!C*kW}4&hqog0zcCoH36%K?GMY?aCYo4e}J!ChjJPgC&Tx2Ufz89N;*OOSyYa2 zkgZ&!|IEuZGyYGKpm%DgrSMqs_BI3Xn&PE;?MK6M@b@1T;1-tKiO|RUB z$)5&U+-|5PC`-_@SY*9bBperKq2ia}l|BMU;aKAbd8fX!UvdQF%O8Y2s+yaYXxP}( z5Bzt+3V75tH$JdYnFM&Zrp5t<0Ep`bxIOcHPjzuE)5tP4p4Hc5Y*0Lpx%zNdZ2vx} zOVcL3Cvf|rwAbl)7@$6YOFG@G$;OTjdQlZVXa;a71~oFz-syMzR6jKCWM0qEBn@NZEuu&BIp(W* zeE2!zB%NR*N!Y-1W6=_j$vL0htaa1U$T`@$PIbm}P(3;e#=p zx+*Iz{&wtIsuZ$wvApAq=tnr<`>}rjtuvsgMOvh!Q_*Vhs*lza$J!n=dha&{ zt>zcmbqA9hyw4Jg8unkR2X6dLk#PG`us`$l%i$=v0>@mTRB!Ei#3JqNb2zK|8I;=kdwV=RRE4xA4x7WE9i(>B3IR=KX}R>U z0Db;*3HR7MrO<%y*Zt{RrL+p!34ogBDe%q;wm7^rO} zRH=>|?c`;lD@o5kav%dt`ne=@y7o5m#$p=g^O(8!p&(UF5N}a9DjYbl%KO8+OI>ZG zV&=14G();22+36wQz5h%E{VxTQZeLKAh5H*w z3d)VDjrp@iLCq+|gG>4-7e;?1DER3?xh>^)g;8=?hdG#ewI{p*Z#NX>Za*4*H^JBb0`KIHtc9zB8ZX2 zDG{pu3_j4FMvy>rxdQ49p*r1N5l`SO-XrvAfl^qRHqf-rkey zSAL}lHi9aM&~S@=pmKb#zYu_?No_?GIkhOoSRbq?H_*HLukR`d zs#p}st8Y$$3gx7wI;apGl(NKlz$+Z%g+N-C_7-O`M~5;4{3@F;w{)A)NQWXIB{tjb zs?a;T{`P(+B`IF!Hyj>wALntE;!=a`l~vJ+m&g_q6Pk2A+68YkrUZR9F?x#Xjs{w0Ry%FTp_x_cA} zeA{J%84{&AN=TKtUPhzgXYTYv0P_?yzqTu-F@vjj)gPYY#5`}_x++ZN>QD_kjlByo*kjpjs zipcxvPor4bXXnhScbM#u*uob<&yIcs&?>eYw%DeM-}fstXUMwv!-N@Ye!**M9hmJ= z&icuv?qp1I^^638&k@1_gv~!(! z@p1c09&m!DdS?*si)`zPsaU@-(k`OK09)Xj{%GG^jGIUGWGXy!t)h0C`$2dWMCMTY z{r8V4R`N@pFDo8@$0@rFsFBM_-pm&C@ewSWIZ*N+4?_Pu3g&6Ny;{2e2LDtD3x3*C zQ`2f2l6bK-M1E8tcG0wS86F;BBQ<2+v^A_IpRCI?SqWo|`3E5@nO{!FY@iMKKH>?h z>k5_dIR*AlS)g3*mr7I9$|GcxLZfHzTSw%hAV@cU;oVWlr=g9~pfzOy5|#0Rx3U%s z+M-`zfHK)f+WE^a0+&J{g?I0NE&#!0oN8p@F1{jX{YZ3+ZBxTEr%$0V5c6_6NQ|%- zbQv;q*5wBe)JO@8^^LCRO_n{_xmW#hH%q93K$M0>6L$GcY`BlhLdbz2ErbBb1Hq#( z2R){}Jf~_`xWhIhkY>_C&LM#pP=$BcGY6S{_JOb5F8Ya***%mQGod{I-6uo9N zvWyK{6-D+boO%`&j|5>$qoUTb;>`bufbadggqQKA>=i#G$bB^i+2}t%PKwx}0@obE zv-kbG_#8mFnm+IYUOUDaVxOC+WfP?!T=s|_zxRKxq$PERs?PztIL8mU{;;KkV8SXm z8YdtqcPc(OTph$#eEjBK8zVHB&Bt@l9E(EH-Nw|hML{b|=Acvy*r~$n2EYSaP+xi3 zJ>qFQ)E2P569_JDfW+I@jag`aOD~=w5G(N7G&*WPpVV<#=#~NQ?|dGB2L{QFQsB`) zEWW%%fTeQ<_ML8+htwD(n1-)GAq9awJ^@XT#+vOxjeW9SS$$)rwIDL+cz|EKD2w*O z?WF*}0L6jR274GFHF6D?#GpG7>DHsr9+k>fG(pqu0pXcXEg=8V|A)P=eu(P(q9p`D z5EZ0L1w^DlT0%M`q=%O7?nXsKx>Z^l28IS{MOtd;972SlYZ%&h#?SZt4eyu7526Bx zd(S;*pS{;!YhB@>rA53Tt8Zm!W1(_o7hOdu{5Lhp40v&Fy0(L3Auu;grFu6tVczaOOFX@x}?L{`vnBE_dvF>>dQCr(jT z(Ht*&H4YNZ*U3=~r>1QVY9S$&CE)wI{bhzQi{Fvq-zqaBN`by&KQQ=^+2*XS3OJHu zHU3Uj8EMhE0=lD_m%(dNT$nEQ1U{O`x3s0)aeh^o>Oj<+-a z0Rjv{CaKI_i|o%hLMT-y`=2`ad57>%!sZ2F81n&;tHvhk{D5MPB(s5kkqm2&c|!-A z&Rz^)fs0dPfWs}M?9Mwm1MBrY}hl_ zn4tkfIF9vXCGlXcWa~eMNf2l&75pqo@ihjys8IIU2%|DiHcj1VR~zAwnfVDX5jNJ+XO8?&B4bi2N! z*vAw5DF*v01y8IV&CJ9~c)CLV?uD@^f!<~cZeGP|GG>(jG1MR21PnS-VWpdfky$l0 zr8c|88(!;zYNu^Ua~!V&3gQy<%zi0Td99o4Ve*QQvynth|I7fA^qwih5%Ywv{_~&v z{jv}2E9Q^T(KhAc>_*R*0F&G)d3P&%+{+|aK>Mv@O_E_EMu!pQ^9$3s0)MS*CIxug zQ!obB)ql*X-x_A{&9Jp;_G)=>Gz)E)BmKn6{7;592@zW@mQ-Kbkkvyv^=N%6r8{+` zS6d0G7~m9xO;b=&TWA+dkb|M(#r`c=saUJ>WM~55ZLv6bu4>Bx=J`ELH^LazYP@G< zNtMxtJ){yTS@q*_I_ls=%o@}4Ki_s#$jcqIwVX(IQY*s%HV-2Hi}lz`UM*J`3ge=E z4#3g?f{*E{gYa-|{{-nv^f<4UkNJY1flZ9M|Bn|m3w9X(E!JRYtH|JWQZ_;>000~O%(dq;13hakz(XU2EO_^KQkdg3I!BHv zc%nXg_quPsZhB&2psF-%6t*A$17`qVcX5g^AS)S2MPbIxA^2}r-&D0u1n;p-U91~z zC;P(mc3g@nsKO^Vdbp{@cAS1nM3KSA@R*XCPaqX~6Av@LeOUu?lJg=NPK;T`sjHR` zhqn$PI0|1`!o$`lGo~3Z>$=12A4-DtUdk4Jch#2l)ymlNMp~R~wX&fthQK-%o`GNq3^Rf>6xTYyuc?rOgVp6I;m7BAXBz2_Wtsg%roBa;Z zVYphv1OqI?xBpIbsz)!l2@+aT$wGdtw5L2{3;;}0x#1az&PqWq4JWJGRCKE6pneG= zJ>(6Dh}X-@g%~NTuP+3^MFpcHPmovWiF;~bPjcj9LiGP7vpw`GEqpbps8ThhxuVxr zwAR8^5z*w_!m-!-GCQKkW^O;Fph7}??$rd1PQVUyJ}+azbp;ctiT|TQVX;=q-?G%j z!NpK6>pnFa)pdY8Ufx#EI;=6+g$jIQs1Zi!(Ae? ziTTRXf1)0&jD)o0cmd3}Qaw0pdWV_ce;;OK{{>adKmNZP<%5570{-~_hMgGTR29#PxGuxicxmx3L7#Wb-N^7t^DZGiRyGoC=RobZPN4%1cN&a=61+J$wrw z5W$}aDSu-YXzyHXq$$HS_R$bZy`2MZqD~=T#$BEKR z7Zgvq_BXylO( z#u7$0zBQNLiUCnIRo`LFAMtnn4i~c3hg*?!0>sAqA9yu|4lq|kDe%Y-R&$FdBMk_j zhTWkUL=r7%p@YlR69Fb9)XC;w400^0IBIgt&u3Ll)jRiqr5qvAAwc-H*Ww^iexnNW z+wVtWlxzOTwx(#flx2DKFa^+1VMMpP`rD+K(%=}wL^j)KaWqx6au~8d^~10-#m7d6 z7X*u}SMEcqa=?v-0dh4N3`3I`v_(QC*ew|e0kSN#AX@hKi(T2h{{|w%4D^Ib37nw7 znWx5ETkqPLv$|dnL+JQ6XY*`KRlAzQ7T^lZ@`-358EUmv=X7%W){Q=&K%5Nt3<9;I zAIvM^?HW>55)0GtD?5wr~_KK_vGPxEZqnJ}8d^zAl=s(DpO~s@z2=wwOH?TjGC#o6?8LCb3ZFk41r=KfN*;)KF=Cq!NdS*&b zVucPz{0>^|t@10~5nj0dl=4^1Eu@OLztMF57$=_4d?o^+ZG$6j@=fOU()aeFXwxMsvt1NnPJBs<4o0GK9-+C- zspxGtFZPfVb{IWtyNRL!O7yjEYw*T9NtdpGAp^7m@QVu9#em8&9i>}Wc5!FhXXI3Q z!@~_I4gOaGJafVG*)8H*ZuP@xg@6jl*_}135dOI<;v8O> zXij|b?AV~VW>_zaXqT{QFJV?;Ll=fI5 zJd;P4ueOK=TSRGCv8P1Oz>_WH6s*&V_WxHl$ z4tInQUf{9LRA`AQxv-ufb;ctlgF_T19S0l|UNuP?H`FV`>Yg*`YO+jc?I5-<%=3Cy zOMqxn|*$n(bcuFJW z^AaW$Z3Sq)keP5-%gq8mI(LxV2y=FuEG#;xZ^NgeWLet;T?!^(VdaZ^cT|BlNPr{Y zz=Lb0z~eh)eQqKT51ev%==KHKn6mz&s6jnfDWc@&V{xvA)i-gvdp@xBR+OjSZ1%33 z{#BslL94)3%U#EnfGy-n!%j;RZD4yj)Zc0L=}grhmbxU*biH5Lw5 zBA{>z+y*u~sY%CI4P#>7dhL6Kln434dA(WZMv81rASeM8Oq=d#hjZ7X|v0%_! zqwRW*m#!xE@8sj0l67}+%W9fMPk(obvLivs-|5s)phxY~>WR`3{ zdjy8T1Hvb5U08(MauzIJHhtQ6WsflyU34g1t-UV>c=n>>YWE>|o2B7PH9_;y@T94# zk*xhjXi5qor-qlsQnTCXb(IEcM)6tXgF2+DLhC`^bO6Yx&ABO;95nmj=Zk6$gqm zV+l>5#m$Lal(rV&p^1x*<}G?|0`zF!80IojYxqad3}SG6>|aT~W!qy1DyG^bE;Glq zFV^+b?k~jQL)AKgO#`;WD+j%Qu!8*9bXnJlwpbCAAeO5Mj4$@j(8nPi!nKKF7Uvj?-bazzH$@sxU+)I5w?9e}1Oa+WKI zv6o>C?A|^a9h@5XY18Ed*zUC0WZs+0TZ~*xx+44p(~i9?AGIEocen-t;j>dpb1YF zCq#0dj@aH9`wdC=#**w-CtaYQu|G28sLPnbDCW_|!cA=G7xfDvL1qvj3b7tjPc87Q z@)9}lU#|EPdTpNW*W+-sO7t zt@R#E;^YCgWCf;Cg<7p14RV)gJ#+^O_$}rp*k`V$px}zU;a~NjFy~57Er*C;n-T$1 zk|;MQK8f_yHhEDRRbm$wT>kXbb#ykhpNM_YWIu>$VVldgOSvF$*!>ThAsTUO^Hvb&lVgSK;gpw7C&%qhYw=LSfY-{E2kSw-<|*6OH0=TA>C{U=*sOp3m6GK&U;=E*n&U!Dbh16!Eo zNiZ!sOL9_iT~|ijulj3`YJSh`qJ1UHUc={#BTqePVjO zw?H54L|auAN+L?cIW!OP{5(7+@x)(4~oClupn@fYZ0y zdq_4~U#A(0vcQ=*O9 zrq>Ay*aot2`k)QKo);J!mEP8!-E``<*ki`5uoBG&>q2K|ZSRMPAN^vC-{+rrzrVY)7M-I79%QWjIE}FBZq9)KfmeE}HvQ5SJ zkbwK(4{Y<8A`H&=I|rJqCU{dLsGnek27+2S6sKRUc#f;JfAnGy8Qu=5-VuST!R1m_ z7X|0Us4uz~P$^xuc1aY}Ew#W1Ln+A$5Jf8bNB?BVX1OAIp+;WmK~91elZ`nw_RZCD zSHPqc!>$q!P|#@)oXXgR#13!XGKST1N~``!&h2VCQ7Dq^R{tj1`qxmr$P7FSj92Rb zdI|+vU0Zi{4aYloEC-1My7R9Zj8BLrt4wD+EJT!GUl$auv`@Cu%wd2lAs0~U-?w<) zZ?0JX8Pc4T^7^OEw*^*?H<`yZGcT$0j;Glmd25RkMd_R;$R9}dlPSI3fkDywmV6sE zJ-`OSq2Fps@e}q-D@LC>A6^ADL9i3m&iuF3{VTwF!B|mH?ovucw#HMtf-&9?#{o?vKh^Ts+DuC89REbHY^ObdS2E{fZ58`Zi) zMOdEIT=R8(_vPF1c3)cvqu4y~L|s!YcI_)|%MkqQ(P<#T4ZViOUp2pK(rAUzY|ITg zY@}S+pZ6}OV*03U&k!>jSeD7UpUR2vnf5qY!tU{B*0#dsOCMFQ7N+=uX7D!v$Rpdn zfW4aGYU*@+<&D}CTOMX*3@BqDDq5r~TntPdOf)tcRchg4j5+?XAOI-%sCUXw8#YBA zIBla=JcmJp7Etmrlzsqs1A=|SvCSP0B+vt<>~t>zT5%T!ZNRIqRWlo_QiL4VYL%F3=|(*U$Yq z4nG@$7?poH5k&*8g+~ixKme}IHl(@iXFw2Y=wlnI<(@HuNJ2NRiwBmn zCzbnz&CY1|G#;IG_s?v61DTF$C=Oa#zUJb{c z1W+XOo+04eI~A`GfcGDyBO1xUt5uMh?|ud!!TR|gizi%d(vus{D$XrA{xPuf=0oR~ zR1cL!7)p$bxae}*_LzvaQ*6cn`|0P^n@yKo!dZjCRyss_(aFbUQ!h9BlB_s;XwzA$ zbZ2H|MfH7xQb-|qXai?nE@UPTrhWl@k)re1zd26ci6B*A-ti?#n*+idD{wHa^8 z5Fe*CAM>l|*z9-0*+aXhe>`X~R^Uy6%y77%IO3db?r-p(b^V`ax*~pZOa_Lb0?tB6 z)EfPpO<~kF7b-P7M$u!RU+y*eYr1?33@o4-KfB%@-bAbi8c-j!fE~Se&erOxu2XI@ zu`XX%GW;JCjOd0(yD-svg;r)lgQ72;L?Mx;SI{!Zp*@W|9#Y z4LT_Zx9i^i=asL0)v>Xjivj>r3PHEUY@jy($GD`tmM#Q16MhWp!OXgddc8izFvIU_ z#&zsY%a}X!cAd&MXK4OZrqEa6BAJL`UGEg@l>(%DPJ@v|E`S~DCci1xFqHpQVoqVNLkq`VMr{SWg|) zZ~D{}i+2WpmNXBc=YWAlT=Zh#S!3{aBCo1!&)d+Q;uHO-ZNGaEz>9hcSq~SR3Fl^E zzv_^)@bA${YN}+AcyzjfZo@CjG6f*lvBOk;?zp>4#jEy)dsrikHy&Vxw)Lrf5sczR zrUaVSG?zvNOfVYyNnaf!m1iA-%l3-t2GpSK&OSPnQ+ZCe3F{5&HEIB*8?ex{M0n=v zg$2gE43sl)EGFq_EIHZQynR&L{dbZpsM#~`1|DC$E{Q0dnzcRp@fNza0KAZaE#fHP0*bckqHg350pXpAJDlA z9H2$+L-YDs<`CYA^}PW=;()OZVSgdRfc8NJ^aBREX^XuyY!;ztn28El1*UbF17g~H zrf8 zMv=On=c=V#rjtRH<72LJEXZoESq$Ln12|U|>`fz};Hr+SaS@a$5V{d0?&PG#>fnb4 zgfHcESo!99w)nC7=hEV~nAg+t#Iqi}%|Coi1;*7)MGFr$wkhPUD0HZu!YkvV-j{X8 zWrNYU7YxN-bE%kUZ_hq{XO;cXd=KLwgKTEtuRfg3EV>d|s8>POw*{ISOZp-8n|4Gm zRxPARuE-$;YarP?XQYg-&}MK#%hcZw@ESJHGNcH`n5zI1xo4-Z-P)DldPI85q#hFP zW-_)Wg`pV_&%QDy3^;6SpV^Y?qq*8($@8DNZc4pH2OKTcFb>!wLMoAZ)k=DA4U7VbD^!ndv-nrs|zIPf*Sv^h%9VTFC9i)PPHWPXEryyU1#J>45HfmUNNhU@@vB zuJINyQz^GkhE2-80k&7{#xEj12vITRUJ25Mi`JC-Fby8pDWH*~j1MN7B zScEazcnGI!gz9PpZ0D1qj})H?aj;}CZ`8YGe>Zg)SIL@e$TKECHt9qMr`1wjG~c)E z=?8O#g9et;+cytZ9s!h6Ks%1IWtq%M1;o9M#OhqgZ%(*YpG4$ z!9Uy+o91c488~jT96TZ3lyFi1`M5$+ymKM>_VbW)PdS&(aNrksI&hN9KqVmUF&T8l z=!7tgoT~BB_MFgXyD~OxWSn`_pQW4w21<5Z%dCHabWobDkfn)6za^`0pE6jp0))*K zSx7nmubVuHq)OoA@RQPgltwm{W}gC8-izR37@OLuSUc}W(HBTrIWW}G{CE;X@4N8r zcF>$(45vfis`>$N8oT>b<^1GG0q{S!kY>AeH>6tYt@4(a#1S>Ra=EUC^XtwYDi2Kbq>pvSbsqFq_}%rNEaa$$(}EY8XgwY< zJn^rZ80IcJ_Hg0k!5I5_P1sf$)Z<_cVP5@n>v5S{@pLWXT3%&*xb{O^8_e@_<4()v zpCum;L-6@^D#MTC!A()wHJk7$X1rUuAB7PruO#}OkEJ2d(WWt&;0wRC%<~U&-v49JiQMk%GU>w$KPwT&P5v+ z^qOqKkOSxml9+Rq}rI?3R#`M~wi2 zd&4H)^zFQJi{T~#@5inx9Mj({>eQ@j%dn)kP$ji`PbckZ7m({2@9FSqjvKx(ZoQj! zpd4q#UP210kaUlo7-YC4qOz=>Z#zhgBB`cpg;g!N4pc_KuP|XItKN32ike8l;mh~R z&2+)7Tg%(_rvP>UCTb8s;0ABbU_iD0u=(5Y-L#E*FW?Wc&!YRvSkO%2L<7`(6KJFm zGekr~m60|qh9ktknD)eAt9mnO~7c=M&dM_}&`NDA{lMBzk z6EBY)d*Awo=**7g#i$oNFrzpnpXdjRh4$_I(I<*F-#(FrIOoM_2{xYHri|XW>5>Jx zu&5;DmbIC^Ok#u$`Xl-zXj_1Zafnw=NkD4T)0;(iK9|Go;e*ptYtxy2?E&SFO&gmF zfvnc$JV4F;Mwg6=jr3~Gc@L-o(81F2k{wd1Ze!@Q`C6_nOccGsGt@n4qz%;$4 z@)(ryt-JHJ)%G`dhOsXl+&9G7Nfk+AW#+1|*m!UlGSvg!6d}PObG+sPIPSk-lBcG_}NCB$A9_n@M1`W zlDm;j+dgeVq0zx-t6K z^FQM3HK$YQ=kYboObYeMdkOx*J`{oTJ}t!Q{4f1*Sjbr%_|2YlC72TrXi{+P`c&~c zOwCT%-SNs!E!s}i5jjfP>JZqma-W}|9K7_#$`p8pC>JG zxNBJ80{rT1q;O=wr4No2oy4ZF5z*ENzBh^uj+l&Fyx`Lftk3a&bG>rTkb&6pERc)| z$mR~6I%LTD3|*;fiMuMm(vsK-ppJUYZ1q~EyZfw_q=H^;^@l`}L--WR&DkLJdvj{q z!K#JT@hp@*>>knJa)o&)Wnoz*mM`h21DXDLi`v2f`u8bzv|D@>y7^F%;pa*)AHt7A z?aspC#(0b+f^B2BZ#h}coZ{%GRPEEI`#XFmTo4Xfty?9E6z{^~ei<-rd|XvTWfmeL zCGp_f^PQ1Nk|KsEU{YK4)akWTcZIQv%^DqX*+uo^cQ5TTIuvs>Q`bT^JkjC;w=Q7GI}Q z8kyT=ojO_iUUlmv4X2T{xGnv=84r~jLpQcL4;Ary#bcFjk1>Yp?5U!r6ZiN!D$R`7 zvy@NX;W)q9u%jRK2gAjc_hs&xK|A$J~ny_ zhpU%weaCAByuwxDjvlZYMkAk=zV_73kw{BM(P%48j;qI|?1zijD0;XzzN@=ZeZ%h` z49+ikBcgS*NTU@5Ux-s>*iNNrV{6Ze$?kIBmarg4>;+3X0gF9pp&Oc|+cxCvxQQVn zrLI}9{XCdfF)|=7&288g4;(7O280h^VAJcqwJeq>@_wg!fkPJj!O4#?>~Ik!_B+Ec zyUMLACyL15*ogPjn{uvrUiFT&YO6nAhptaYN;wvvEqNET#|)?XFt9J1lB89N?>*d8 z5#Bt9zhEZI>S&}~nSk7p6gKz)fza+5Bz$L``optr(3h>H6QEnj8EET8@i$=Iapk4w zTd?di&Z%yGzcCBvkLMuyaV0AtWSJp&lZo-q4nvcXII1Pf$M5yibrbR!vLX zF*v~IYyS14C#A_(%e2}$l!|-V>P&R)MmC5kQ$iF@>>lZCUo%=`FVn>@N(S`hOtDf7uYl|@ubpG%(7b&uHaYrm7#>6J}n<|Yrj}lh~S5RbO@a*RIA3CX}xCK}t&8%?>J?y8g9yeXjLg(s;>uJ-h z_IG6D=wR=QYBLHjQ999r?g9SW@2-WpUr~t^?GyOnN4Pii4c_Hde_1)tX)n4k=k2%re1doFdhx6< zD9m(jdM;&Fi^QhUSvaQW@e0e*yZ(G?&PskAEUZv0CD|9+u1Q5tbfqEeiU{!bNkiyl zcZjGIN#0-Y?+@s7igS~Kw^r92-xK-Mw+QdlT?PteDdAbFl02?M3`0W>jb*=iEBclWS3?^B*RkhR(XVLxC8U%RG z)P-14`9pUWrrxe$wKsd+g8lOCg)m33t)38E!Or87<%Y>%>p_K+N_p-zuzzIdFlR3N_0>J*K~hL18nWisdKw^O&$3jwewAlyiYWLriN}T5Yx^4%{!^TZrX`AKJ3mZh164II882 zN3-eWCs7(L%zl0#+MulLufzzov*c_GX@clHbcK>8CVZXIFMf8yz2)Qf0;Y9gtVtEh zy*s%2*FWf%g~^AELHjOgN(ZdT_xz(~y;aoWo{zuneuH01!g{{n)M4H=U)Kz|jFAq7 z(LY&|V#`PPOjpv%^HI5p1iG!*$7k4bj63-M9DTlyOVZ;|BXMnxemON;C8AJgWe_9a zkXK$l5`aF~oNrCyJdCLEPcYSOkQ+*f7JEfN*htYSmS(f$J~_&O_#h~{%Z+!MsmFRS zC?hvbT=(*G_g34&ssN0UWS0LcNgiwhbd!1WGaND(J!n~4uHDfbZ2|coo)xvaJY4rb za_fb>kX!s~tJ_q*GtdZ=sh~F z$8r5ItG0Y|`ahzpRu94+TkSyD;)P9aGi4jr-cL?7+oYiD&_h%1N6ZzyB4Me1I#);= z(3#;t_&Y><)o$g*AaNlmqG zr?F{cVp3C6{}@xD4EcWZ$XF{(GO5M5ip2{)^QSmNR`tc zK(n;KE}FzVay65MJ~*}{2g~%+B>tgXy&SD$1-0_SPCpfg#n$>HEP%Dbyb%$s04Q>0n=m6 zfy|Hdmmo>&R1~>|-S50nMY$K9E+mijG z7X;znox(+Ve-Jf%Z^_w+s^2OaIqf&v)J7Z2F%GNgh}lP($fSD+a&3Ct%lP^_Z^2fl z3fBpyp^3ef&A`4I*=KJqLyiSip3_gSTP76Qqp7fI*+1tdjn-j{_aHvpxqNr~udYm_ za;JI^`rSKMd33)QHIWN_VFuJ$SP}$n##Y|9J*;IL4m`HrQMwo5Ttk67uA+RnPOsKq z9UZP(uv{K}$8p!?yZL2^grMN3>E7qAQRV6C)G_IeZ?p5OOWO=Lm!&UWQvNZUG|dPt z4VI{-?v!NYSTYk))Fx9xpM8}mdfZ9wr52SNfS&v0Hi6FAl7~lH>4y1-_BGrgKd@=G zj@J~JO@;5bX}D_gx5ewHSM8@hoaGi(eLS^J$g(dKV0|#391+a=Sv$WCw#|L>6yEk6 zC$hImc<1XLlirBif4W1Wu z`E+e9ahIOHOH)%$Qo>-fUm&{v%O?N(bb*_>hXD-bO)!tNg{53m0Z!z`p zvCo?d6&{1z2U7uuo|o?qQ?SajYr85NsFs=|qKp%0aeHTGOTASRt86WQ7zW~r5H_8V zq{uuMe5JHVph0o;ftFF@>s#SO>0zbO5VD-;taN#}F@!P$n|sLjG-`o=skG5={wkHv zlQKJ~{?mhkC(NN`_+xd@WVO-ZHT9Re`&UdX$DVdD0+taA-si3@(Ke#QX0~(|p_8*9 z`ObaLE3ge7`FB@$9)W+)o|vWNp4ME#V*Ar5q1%m>)SdbQvbiyjrbs(-I(e4#1&sGI z@fbrIgyQ<%3Gi{qC*n;J7wkJ5*H~1&TFRl!1}7Ps9+orp=hF!u0}X7cT&ARpp18R6 zXN4l9(Y&Lp;!U>gc2Y|ya_?k@?ytWVV`0#XFGo##n&!-MGj~Bj)(sW6c}Wo!`vU>l zKRA`e6SPsO$fZ+^v?!evaQ$w&l@p%@0zR_cpzApu|gS z)OT*GU{BiY#8yb|82!ddE%M!_0uEN(f1YCvZn?N@cEOxCkc#y&VPBJ-$e(p!J7%Kx zO&ipG3gpMlM-mS8h#MoLsJFfa_*Z`fXTT#5Qf3Rq$E2V#evzH&$T)(y*j;`^l8kfg z?e;e*anpA}QnwpZ=cMMCB>b5-u^DP@xrZHTGWVm>VGwD^>bWU1j=vYt&3-!l#i)lb z?c7lC=A^abHYc8IUKTsE_%L(9eZ^#HUT%l*-#N^J>vS1;8BUob&^AP>bR_q7mfWIC zQ2RtcBe#_~vbS+njF-0RhAT2O{gm$f+i5n*eGT$zU9BSa9h>CvlOzik097b&*P7*s zuYE4D|IPm|@f{+L#{CK6$dD9OXbST8du}ZK%=*eEqMoK&MAwjXs0$s(0~;S_<~u1Q z`$bde_^=WgYP#-F7X}XVd7@DZURNw`)gA*GfukvNAU1l&34u(UsiU-qkvmtlAfchLZCM3IUIWA zhMJGlkqO*$C1k6+d)W4qjEo$!CT4k{x2@U7C@N@PPJA^|Ctr=M$cs5l6^hg)}g4Jy%DW(7m z%oLS8Mv*B-hD>KG2s{@d(P~|H`o$6u?gUkJ-Lu7GTQs(byjJ=+QD1AtYO z)2jrzcnpONZ1E{qBl+nv2gvPklt>EIUSpk5%DnV@R5jLPP0YmRut+l&+X5Xczu@ec z4jkp$@kGE^J-e!YV$F*ibZaF|;AJv~-8iR@_2E=!nv=78%n3Umwwnl{=@hkOlAd6JKAa z${K?#))gyUy!NKt2By{AHvGkJ&)RT_`qc6++xuvRiy1xQG_b)jc(uWNJUU{&5((AgfRbQxelp zLJqMbw32k5^XtfUiyjQ!*|8mh(5<7H=WtOi&xMS;mX#}+AtDBXZd)88Qi=UqR-E`m zypZ=$lgp;OgHUgR@F(G4S2^xR@!ppSd%G4-_aIX=D2G1bIs8dE{Yz?8MzW7rp__6PHRP+143uytmv)AAbsgM+$nLt>L}?m%ztr*p?x)IPEom=iAc zo);0h=`hxJLKI}$;scE?jqi1zOxd39=3R--dR;%{ub-l}YqqUNZ3WH|Ghq*2lDnAC zGDw3`5z&xuj@OH|jE~u;p~Sh2rb%1VX1Q~oQwO9ZX)?#tC=OD|8(A69mDy#_9_o7} zHoj9IIZU!X%QwA!6DL}&s!;4BLsB*&?D%1Mu0Ao9@`QTZC+iIl z0GtuqoDQf&RI+X5JYw!Hdsr%MZZ#|4{WT53c@UrPYL}O^j%tZ}=8};4a5Tkyde!6u zPvM}Tg}_X;+URPP_@0Hr_o5HyKg&&MKDqn1c|8f=N*=2r>k}g}YoS@$9pw`d9XGEN z=?rrZ)w2;dDy)7-;o&Q;kcMh*%o*-t=Qq(SkPwwq851$CY-BBE`tgKmOP>XL^|xTh z#|OX75Ou#}(~I3Y@I|#ZtE&?MA%}_^adTgk9BxNY4?6+NQbzs*JGQXs+fe0CDW&V) zThTYwd;K6m3sSHv@vfZub?;W;f9@?EZ#m| ztPyp3-BIOQOE)Q2FuCRW5l2N-;^xNZ5-MfK^xK=bvuj;uY}C+&F02MDfp6c{kUqlx zJN|>8wNRgXF{xsv#m5|4u=A;v;k}50ocsN;C@)Scf>tXz{Iomyq~tXcMkH=iReV?- zWcfAQgy(ZitK`4%zvfXsSb%N4*V50bUWyvpvd?hDwP&x5{?XbqaN0Um$g`s&+!Aw; z=+RT6)t~!wLWa$VH~vTbK$WP|a$+#09!X&(m&NO!bxXwrf0>8kG(;rp*MkDBLa+rb zs_^eV#Tl@l;Z&;BZ|VDttzY=tFEMr%pzTkwvKqToBI2dq^9NcRtM{nA5LfeIhK*H23F8pj3EQ znya}rPM9*K^F{`5Y0sGDhpD4^2YzCE1-(S9h#L@Qy5CsH{CNL)-qqmj`cMhhZx+Lv zZzlq|9)>}?$i(KJVG1tP91Qz@aRC3;pSb?h%-c6^g=xS|i(_(AJCs)x$F|m`*g6t! ziEO2=c)bhTUCx_e{_5n#(XEEGd58f9n0qY$3(y3(n_s$$;>CM6D|wmoaEL|e8p`{= zTlW#q4Xf!b6GjsGXNpkMh`zN5Ve9A$isHuU8;{zV5xEJbejgnB$6^a(E)p}goudiL zq3v^q9hp6fhpbk0$V#OrW4Tq-pk>sPTrovT_W3ijy{4FCte(te1N|6P`Mciw58ITQ zKh`=zlZ+ApPD+3kV@+93B(d$D@3+2gn;bJIy2W%?s$W8YrLytkev6eK{#0DP!|I4q zNL1KQqA`Za!X1&W*gEK9GPj1)ha0Bje&Z1?CRyKiB0fHeILxPznfmj5NWVuw>X_;` zZWtT)OYIM76=wzXw{z`fVmy^_%H}|1tQI~1FLA)ZB~ka(ZEfFW#}hUp6l;rP4d>;% zbw`x$GuOMHY0{A;4ObXwC1#Sk;+}qhSGs(; zbd#+wVKV+c{8cu#yZ*IVk&ZISe zLL#n8-jgyKWp=S#Irj|Rxk^a~(Bnyh=iuwnQ=f;UZu#G?+qyy>BD8$XpzwqvCMDxo zGVGf&512Khb2+T$x;>1Gbts?ij#F8BycfD9VUm8}x}YfP#=9@#Bx}6r0DZb2(k>CB zXWf!IbO%ddU5(TxjUf)S??^2lpn! zrWNwsiT5(?2>%axbNNJq23|95`xuvh(LzRz+pFxitgL0MgNo4xdsOd|BfX}?U!c56 z$%pZImb}-4Evsz(Nco=e<)4;#A;t*&+%uv{e^YJZ`6Cq! z;WlfE%f~@`v|4Kb2^gb#-oiexej9_R(9z)554H`FH-<>GR%D4GqC} z6~<|n3wqL#c`21U7o50Fk8CIu7SoDLgMxAjMQg@dSh)DJ0292A_nJjs@G0#7kifXi)@P$=nJ3jsJ-uy#!~LF6g#otDr)A zXA-%Co@vm4*{!m%$*(blnswY>xBR6%qy7(fZ~a&0*0%i;(xrfeG=g*s(hX8l(w)*B z(j6k*N~eHycZoDinu&CGcgh~Db-&NP-)H{^`={k+F=5U*#&wM`&g1wV=LHOn`zti0 zldWX*l{C^+lZ2UHONlUykP00MF4rb;GcSK>h2{Q!dXi=|vHXpynieS9gzEhq(EQd- z5D2YSQZSWyAh*rSZaRH^Qy8+lH7ttg;=M1rWFsL%ZqU=Wi~Qem8l^|o!eixBGlw^I z&%C+bmv_Yzs)}HnzjOXW0Y$+zl>5Udef2_n>gBcu-g_RL_wy#umcwpqa-;MJY!h68 zmxRD?o|~ab4#<-<63F53_bWd%qj5^0Zdz+#3WCdzVb4z*;CU(Ic)ceVOyx-+CKmGE z3FSHU%Wdbl&S}5l7}`16!dIW*QSyte?EK#M&8ikKc@)zF^~2F zY;<87QDVH@!r#CkH1O^@OmR@EyOs{%A}xW;G&qjxI!nU9OXOq@uo!9e>@tbb-B0Cr zxq+$Js1Tq*HrcwcIERXEl(^Y8%{sIuZT_`Sba4WEJB#bc>QWnfSZTGMHU!Jtryv_q zDo3;mrETsI^qivPh8_E!ez}C-5i@ww?;`M}^2TM_*ZDEUZoO&cty(_QHI2J9f>gU; zn9eIvcZ@w1yt*t@X+fa9OQB>OH+n0|x@8i!{^aXKg%9{2_`J=9=8l}n zjoI>;5b5|v>@7nD`3x0y>w6`Ha$wsY&=>dA0J z1hJsBp(9G>H`OlLY;g*mhQ*{s=&em#o(OBOVuyB4invFaBVM_{8OxMAkUbc)ope8< z?#X9!n5S|)UDWUeo7w?S{seCb@iX+niGpdorG7L7Gb$2$wdtPT>Gh`B47Fg&W|#Za zB-5Bp>oM=6kOYL$CO`A>HVfT7VB0?)Ap~-_LzTvAO6MkMD`SF6x`DB`mTwUqm7euc z1xoe%9VXuK4SvtbhPQhH+@GYgTnBy^JZWXgV#-TybSYfPl6Kx@$Md(7zqk_(26k@R z5;b*3_lAnJ4RW@pdG1KixD=Qp<6DIK>5H~&Cvu5{7U;71 z$&ECD{ zg<6nHaO6%^SoMB=oghq0#S@1=@J6-veUdU=RUM;=bmz*?=?-aYoc98&4HK^R6;b+l1h2auZ%ZOC zG})D19JR+o))eC^*$)LrnUL0%SvP}eL(`>&-%uAhsMk04%D)Mn#vt(f`CK>ldT18C zi{8VFZuG@2{sqtZBhGHSQYoq?pDV}0@q^1+)c`RP$j8uTK)9 zbRRxwewpzwQFeWA%VY&?efg_HE=1EJFR~_<;BS3MbVZA#F*+fBh=Dk~4W4?L)(V-M5hJa4}bgDn5EGtw98dhu;z!W=tVm0ZW@{ zP#o-3M=oI8$S(1HXd#>J9JO+4vC(`rRWY2*ae>{&Z#q@el3W#;){Xzt7Qc)b!H!UF zMSy{Ws<^^HKmNk{*XyDH($uxTm8fr8ASM+xB0rZl!8K#TgqZyKutHY5zo&}p2U~kR z;S_cueYhwMVr|c5`rKN_Cz=9oC+j-`Mb$rKsg4WrEqqEg$uMQaQijIU@+$oNbfRzq znD5_YtG=oY|piPa7JTOi>4HUYO2C2S9FU&a)spVoyWsN!`;-5WC?#D^%b~ApCR0?j*KwC z2cQh3bNF8e^W@r_qDQO24I!RjYb>Cih7HjuTiI~M(1s>-jgCF2 zk?`q&yJim<+kJsUzCH^1z?^OHn}!?poO1N7?y?QEkG}IXGm7yL>m<)AO~{ zr{gxY${_@6dN$t-O*8CMjkwJWM|H65x+1M7)nVnfXG|{r^N;Z4-*)S3bu0V=qSu4e z22LUGdl+W4&*!-IIS_;38fgbXO%z#a1?sW&H&U&OC>fBwGw;e>9IxyvnoI zj|+z$B1&P3GLFb9V*K1{JuD^t-I5MHb-J}DpyIG2l3s%VwCGQ|{yW>`#nal?m5oPD zTsZM_okqZXRSDto70@(4h{6F5Y>_vir%ZGu?@Jie z(vB(t70yqTToHwj!@%P8*~ROfvhzK_0maH7zoSGG3HZvwr`sSsM8~y|m^;RcM>CUJ zP@b+#OOY2ewGy0nbq#D`{Bxd}kEbill;5&b?ImCAR=0KRI-l-G%HHXkFfO{FQ1!qF zB{TpF8RO5P)cHR1t%-0nk79s!GW|0MxNU(>LfR~F)2rnxGV+oEU}_56Fk^d{pgjKh z#pf_ySUtnRe|s4hh1ZTwYSVhcgefG^rc52h@o;kYolAbQQ~%xBU0(j10)GFWF(iB= zwSjEigvX3`-YYJL$0r1KDvn z_O&DINJX5F>d|7U4ZqW|K6E&~SK%C=`LPFk&ex9`Y*h^t7zA^C?1n(58?RjxtESI_ z2M<)EPI%))tr}Mvjx3jvc*l|)6CX;w9x)VR+M9-oksY0BDesekPF&_gr;~f5O#f$fC=w4AmO(m6ms-J3)GZM|!cHS5deMG7Crokqd;)kVpen3I{_n9{l*4_eA1X ziEzZFL6tq4vrfE6HH&wo#O2FjVW{J2hBfqxC=!%3#7GiH^-f27Txqa4dS3|j4f+m- z`WO0;)J*M{PEMsAe75UAtpWu1tqb0;9t4<0_Jm(aq)05oDzTd-3>T<1u-sN0Ue266 zj`91Z>(@y$s>oW1{?4z3#rq(6cigWv^FggJli*}|ApZ;aaxF3FCr$y}lNcTn_^74u z9U7bwCGcH@iZ7^|Kg%naS(W~c=(Lw^4+o48{@aSV2t%vIUIq?QV63eaHQ}mkeW9L( zUZ{6{VF1)g4oP{)w{wJPjdY=r?T1s)vZCRE6#>R&Pq5GmUT<^{=shM7m(~JedL*z1 z7^DXY%sz<~FXuR(_ZQgi+H*_OG9R+XPBvXy$29obECcwJd>OX*KEJEh3KVxpx@G zqdRiV+5yBU$(N08u2rurTA&U;Q1VARl|CzjKLUtDKsn)`^M>m&+*U)e3LIP^otG`4 zDxu-v*%tw%$;t#m#&Fnt;jp$JT#apB2RdE|3-`^jRPevw0RWNEMd zgQrS&`>6V(s+Wr|EMYiBO#kbEoxh<`97}O&P`EC0>fe>9K>i~=`q}vwppQM#(Mh96 z$7Rwsb!cY7Y%w#jR}O=xa;tyyxVs9VTgT(YQ#^l4r02NT(7e2Cu$U)A5Yl-cRZ@Y? zK|O}!O^#WUZa9i68Ot303La9Z*BjGyQpwp*EXa$NjV-fJcU!sk#zi~c1<&timKSlI1*>ABmp8Tm0C*GnkaE=Yk#&||`YrXjLVOdcok6R2v*`+-FCh`K; zOiJ^GP}<*&+O5Cq)_8Znpy+1jq8{A_sP$#s-Wb{D=2yVbDUs5&kqC5}%V96(Q0B~KK-eJ4&YUSNC97i+G z%q5U@ZFQRZ_1({r0?(;cRvNN5Vz=Kd;cYwY9+TH@hwHUZhsbnS!*7B3rR0hNlfqxO z+d#>9JOY9!2sqB#E;^vckG>}d3W zBHBuy(AVkaq2=M|D2h$@#JN015j$VrRn^~>y`dt^6{_TVUn`C+)5mCXufI*BbfPg? zJ5f$5(`i>g%U--ULL=~*Z@aLgDu(u1)!Er}PDSaAQ@psAfK2lQK9ntAsT9FZ6op?< zNrWz;65-?A%H{?kfH{vP%&eG;CMrpJ$d=$!+4dRYbOK2y&a z-rrT<#jG;M8h;?V(Mvh8uOMbo`XyYeUgOW*?-nYf#j^8iciKY+?jRbQWhf?)yQoqT zZYHMo&vL13Exdax2GC34Wuc6TXi&Vd5;<=oPrDccJYlyc z__4(lW>8hPG%6i-x4A9G&8-Dafw3jp^{XC!Vug1RW%w9}K1IUyWD~KEyO;uWT}D5J zA~bs8*UE$jgAE;dKi%?$CRTg~eNe`_8;p;)G0U`R2|{`(Z!TA*D)aT$hG7lSkHz1#EV%ajdhAu@h2&&ArZI`E*VKrTP*{xctkDeMRwO%* zw%u+eyg$tTihONBudyT|5UV4KB;~!Rxxd7O7~xK#_feBvT5ras-3hPjvBCT~U>yT# zsD2tQG)`XQd`5rBEysWOBOE7Ef!jADS{146K&CAghbNt$F&veQpxZAbYyAh$HDp#v_%4#V5FC}K zi%({tP?J4!@_92Syj8*5Phu^+Yu$oEQi_P7NgcZ;6P}wx^<<*g&DE+AMsQM<}1iQ}Y zNXoUukvgJ(r!JVKtvyHeVW|pJRm5seUmn~%4_FC=s zSdIOwIHGiP>0~mq0o_EIgnkzK%exzdfbgJl<*mf?eGYR=5~4?=`S^RDHBK18-h~=V7MT*}Fn|B)pmHHoW<{ z_56w0eq_Wn0PCEI{_b^AH9&$oDrKZN@$nkN%mXI?J^w&b_R&V_Gj|upYYR}i@X#S_ z)_TdseFW|`KqOVfoJ%t9B$52P2${+30aMEZK+rn8#&i?<+PXVnQG)TTaQ8AJkRogU zX!+ef8(`Vf(=NH4-`T?{Uv+FdIfRH#pD%f|$Ujq#Bc3}n^4t2sKi|NpJJEWC>#f=9 z-qEeE&lORAz_JW6rk1;T3rFls2E9W-3KVZ;{x0l25>rSdGJ)5{)5;7vs09wr8cnYZ z&?hzt-xP5L{)RU;ZLu@0o6gAdT>dh6@~Fq^2hg7aJV6{81E^ z+tyy*_h@1s`0LKFJk=!7WX!caB(&?XSnM}bK8AZ%;Zx~hqHz1HwUSeN-u!r%fpf!bz(!66GD8xGP>cfX zbnSNH2SD@t);Wbld#?dvdyoBQ>~wky zJzrcxidz)IF}s65q^SICi`tvn$Lgd0s!=x#Wv;6gt#KM@y!^;S+FVXPJt;B6TJrQ2 z`GmiV0zP4D-ct7k7>i{o6rSdX2$FDWhW?+uT{zf@iiFN4=SU>-5`0%laMqyb8lm4S zpyU!9cdBaY2&MG^7W>}1B!UEith!B@ErAv->}#C3jDs4->^UF0=AdYMSLGXjf*-;Ked7X_Blj%CrV$e=Q~Y;%*%T-5 zfuaQvF7Qb~6(=I!KknQ`Fl!F8sE-;`y@ruP6&62#Kak+B1Z^5Gh>vr=>A#+-dGsrL z>^b8Y6-=!q2+={yjvpZap1zZ+AZE6obTv}{ebhkM=63MIb7tmjS1h|-YoGK}-jCFg; z5MXpTzy0#{aKWBv`^KTBJgy@opxG_ULAuDl{H6>c%WP@`9hm4{7+n_pyh@z{xu*LJ z2z^LT3jH5zL=&bc(p1B~T89IBaOmw@&JlEMqv3??x*KP$ZVB;fiS}3?+%KbVe^`c@ zyvm5^25;K6fi5~Q+w=)WEsv>WWb~p9tdH&jm}wzqA-|!`w^x^962M@$9=c#oe4Rz4 z>5{0Z++(JbI>`g{{8jaL$moszUv2kXE|aox|NcFFaldVj0wN!Vz&xyB>F7-8iWDTv zVa`^^pq@74`#fYNlPyeVUOL!E04i8^!KOFihV|8EOPfAu((J*H7EVHo_3Yty(a9&E z9`B{6_)1~w;~ub!Io{S^NpHH6&cN=rb&9T5gkE6Fjqj5B6vqJ&mIXv!CgvYuTb}XX zc$C@m^Ee6+9^eqQ_*lmL#hr4NM9Rbe5ky^PBJ?i#D$REAYw7ftqh3qkiiM%$>9fWa z6)rwGV&5<9&#L5lA0}SZLoxF0@3JZBMSuPBT1$=!`JhaTZOIr)jF##I;eQ>FAROH_ zYURMFpxux+(iu6(P9ROIo{NDHI$&5brkPVVmrjM+_~#D@DdhqSeMCXsVZpv>4c`@U z*_)xd;d9Nr>xmiD>%_O!5)(fc;7qavbWp%)fbc0T!62z(^DQiYNdMk;1u;((MZPele{j& zi^4yxn{9dMvk{8)g>MM4;0Wy?n-GB^AflF9_`?p|S-6NQQjt;Ct)t%4&_7kEdgT)@ zZwLp%Vo9d`!JrqSW93tM=`L`bW$28{v+Pb!10w9*9~VBPiLn!)G`yUcIt6 zPnTE#vF8hzHkU%bcNbVLrfILPIub3=$h70TfP+!-eoE)nnW&r_92lQQD?`=UUrBle zo92^C2O$n>cJcZPnZ0u4F}mbLqI^_*2k(R-nU7m7uyP(0^t&dQ1unyc;aN^aKKK z;K+Q<^Xp$+7hOy$izORD*VmH`fej};8a7dQHL$p95r5ZJ=Xpiz?ZUHdsb1WhycU@AZe%(B6L7@qRQ<JK0q|3jhnDoQoBWCzW ztZk++ltBTj0rLaizkMmWmrVby3Rz9i@td{0ZogVWA}f5QLd`)4r);pzpy#(^@w^oQ zaK{gW+#tdgDa+ad1G_F;&$}ak^o}2Cksp{$SWPEB$L9nJJuOLPW9;K-lbG??eX}LT zC?%4Nl8|6EZ=0d(?XT7EANEkf0EC@IzaD^@SvF-BZ?i~4b-eJJdcKN3mG-03L?Pr` zr4;=MqUu#yVO1m*Z6ISe;rthWz4IH@+%B$LMxcx@gF_^sBZFNCn;Aw3ZkcmN0N4z~ zO`UmY(;t$Hcbgiw533A!XEVHOxlp!0Pp9SMvj7K=e{dZ{W4|s{M5$k)w>VTEql6{S z9|l55Jt_~5TW-4>h-JV6UgS#rXC<2Jtq`YbccqL5-?Y(Kk6tpzd>*xwQ633nkEPPN zbj^?CBILP^4?;jgMkJ1kkYG9S-;dLY++92SsLC$*{yh4%W;(ie-( z4(K*A14$ZS2Vz#PVaZ?GFi9YmFIE=5e4A40$}vnkuhf2ddhpDq&j)024?@H3@o424 zL=cxn3eG4;hqs`6T8}{(51Cih9a>gtL=ZnwTDFyNarq{RD->rIPlJ*OzUV~DKST>g z5Fh{PJBhUnC8FdI? z%D=XP^j=1H&vT74w;T=eXL(NMl!uKT+N;q$X1b4UidFh20RgC*#(8lqm<7ONJ^zSBZoyV{YcT5T?O#0_W=%e9Z^;8LQs++AMVkkv%emCw#&d z7Bu|HQA0jVM~3=5UlK)Db!m?=M^h}+R+9%bYe9*Bp;_(XZV$#*Rd184 zs=+q_olP^piqZV>QWJlKGmEV_uyYo=yH5JL9kw&g()e2Xk%Wua_efE7K)Vc*m|hAiE5{%$&w5} zzoN0NFT9e4yG|8w-=~Y~$|6FXlC1G>nerKHF#AmcpA|6Q5_~2bkk{*q4|jh8(R33H zaQRc2+spKmMR!otd>hLw0p&z!=^GG^qg9ATSe2DqBl2py-bO+_i(Te1&M(@4ZGLpQ zz7-)+?BK}Lg>vdU%0n%n?fYOr>M1K?V|Rpzez9kiZB}b*y(7xQf%ljApjZfiuX{*e zWltl$s4} zHK$SGUuyqN?vgkT>K!)^9fC*6?Y#J`ZfZTx8W$CTSb*KB;rr3OD6-(mUN5Z$+)Cc63kV8JifK#5tdzBDhh$Ov@QfnvU6l?Qe1yp7t(5AUfUU#8 zth2ly(HTDcDceC%8bb0uaF2@}26&L~cRgh3#*CfLKWEGLgo(sof`wJ@5>}JRXwO3aRV-AnMEF$g0Ual4?Y4B zke%l1xr&kcSOG6xiEYR2P*X-3t`R2H)K}!@Jk#u67tpN0qbh}#;R8`W*9I}rE-0VN z9>v6DeK}slq3WN;IR85gbAPbN-{zY)Q-vw)6s-%1scd?EQ>(IF_Du9w^2L54PFT{J zyJODRr6t~AX$8OByYJ-Ez2?7gfCyk%9elKgy$*BN``~`RQ}%t<`_h@scK0$wdDZtQ zty3KfS1P9}{gNT@+;4CtjX6Vp$_z7$0QKH?&g^(zYee)R10G$PdOM@t#605xs+Dxk=I@Q*pDG;+oL zi6FLQ*7xWNR|#pFw}?X_81UGfSUMP9JG$D$r>3Eq@-Eko)0YjlT>v~8ini4;3-v6@ z>9#mRd%X*G=pY4S-F4q_zR5H`h#}%rE5+9mv{jY+2`%yj3J*}nUhi^w9C(VZDtsPZ zwL(Iz4S*hS=?1JnQ^DM<&H+if`&6hxtq`<;4|sE9R8!mDH?x z!3r3A+4zz!@v4*@XcvsPx>9&mHtgvHSVkp^g*{ezzY^lt;-$`H%b6`rCqo*5_4&L< z1u9O;xnM@6f5hU9G*UasCzL?rdE9EOltYLdoS0%Rx-^AGQ~k3ZKVg_m-KD?{x&c%v z`oJ?VMxb>>-dtpcH4eKX%!r(-70VF`^cf86x?_tAt$+~xGvTD_3Cg&SIm~9~rD78E z?lnO=L*e<5Pkmf{)l8~bJbfKNi%s6P*|t-2<;C-zixevH=msBDYDQv7{{p~6qAqwZ5ABnW_8q2BV=KOc+^A%pKpJ% zjU}B3+#tWvQYLAA(k}>!{B^Vl84p^dwM!T{6O*dac>@{AknfXiCctJ?9n0yXMFDfp zR}czIkQKqilEmpPesbsT`LkV5(CdS3+cEC9#kJEV zZgT0^i?rK~Q_s-w>uOyNG)ZeTI7kX=0U zR^uItCQC#sN(bVTW+%R_f|1_&2J%6>VLnGt(B~8-7Aq*OJ??s_iL|7jD!IiN#ufjb zXIy_Fh%Rts;^z;!-d@;R8~1@MBMD zy`yKxO2M#fB#lXl*oAlwhe+LqzXhdo|JCqg`mq6>pT_#%(z%pcLLZNk z2;YnGXQb(clQ~nhpu=(YNI6sx{Y0;K|+t_gpK)rH_k&{{Y6mNv~UHBZ7i?ry$jEJF7?dOLH^T%oo?DaTJzcU zL+QsE)$=WWt1h!`%rb7%Hr)_#O;4vxGkhRlXo3Y$BP9qsjv4R zsLy;SHBjLrnT@{J5&#rdp|sDY_Yc|b60qvAhzovYFZlGw#+g(^sfzB?UTdTu@=xoS zMeEETt;PxBN6V=gu&FWp5ZKnJ^+~se*DQV9)h8*nVT+5p9tWF=Lxu3E8WZ|x#1x1A zzPRD+Tl!mMhxe=KGhBNs!2E8CSUAy;k+ym4_{r$wRTJbzo||q}rPt6#be8nHz6aKX zy9@M0sQ@)N4RqspY^qV~w{`CPXxOS7r#Rbl&|n5g%)o=;Qd)7!IuvfWazg<3!fn!a zQ#}FrB{4SKK5AOWa_G3H`X`W^?2bZL3^$apM6o(xtUKD(&+ZW(xijbd{SFK7IK3;O zbE1g3`B_q3onkWKmDDEl)P`KQ{AktpV8vAhSI866>*FHEQbyoxb@em8(hO_{B!nMb zJ{dtifjGtqAGl+I7WCAR1HgZ^cZ|YTC*tSQ^+gT`?MlZd7w`!4o-GkFv^b^Sskw*G zxe-W-oqcONb&jT*QDNI!SfVo{6Ia3^wZ9YOuV$(b(Rq}!jr;_Vr4db$@lzpKnq=nh{1TTB=o7nOsKjUTh{b)*x_g6H`#4% zWa)*=ps9zOYZGc{rG#|J6S?(YPOLxrwicSc>oNQMb$Y&s`$^F6_iAPi!}dQfs}k}m z8oK?C$mop5aa8zg1`noK7QmADy`SFpl{BLDt)18$9TSp*hrSd3+f+PcLZJM>) zP>1ceK_}Qd>P4Tk6)^RcCVe08g(w^|JXLNJIcQ_j075cPDz1dLyv<@x%G`l~7?H(Q zvJ{-G*|qa{K~48_spZQq34V4ZFgY8?hc5|%V(kQh4hu>g6ai}-286ABoNI!>nG+mw z@)A_Q(>?UxFPL$Ql@D7Pe`Zfsb@GLEB!67j_a$83D?ET#r;BM^h?PeZG=ldr|o%Hjt1`T3=K1vnh$NC2+p~9^3jWw zic#yW2Tch114$|yW3Y0oN^hGZ>r|o^K3=ZWY92bA36n z^OzL}t{4g$ZmZD#sXJm&{0F)OZe`5lZSj{_k?P0ea*3!+3}zjoM@c3PF$9iri4Rj} z+Q_TnL3@Q0K;3P$z&g@S3|?3<;PN>*g~bQ5^n0SUZ{iSnF1sc>E+i9tISo-$CRi1s zEr5OCUo`^J^wp6@Qs-^S%N<u!|au!EixymOSsY;MY{U@L2QbR&eK7aW7KTt_e_ z#dvh;t>j(rB@tVc{}%x^7epB#E)DM2TOCvHJ!e#?lp=T*z7 zAotNDhpvK=;QIlJjP$bA*b~%@^q)p0GXAeLUlzuh9LOr-1^C!W+LeW^J6?B^vr_<#DIH% zoeqMx#?T+d+mel~?26X#s(s~ns##BAUxrR=Qh=k`ulxt*qyk2eH+eZ= zN-j3vKx27<`^*n`IKnc(F#t!D671EBmQc`=X`-#LKiTkwgpkDt2ha*IpdLNHlES!C ze?4u24fv(~9Wj+|`#03IGUvdl0Jm*YBXNeteQj1c9Y9ob*VSW@M=dbp$vR zxjPC}|KE8mtV$RTdDuq!bR9wXlw_kBadm!r8#OX5J*tSyB=5g+H~02bbm6zwr_lyI zW9RBxk#Va^9j}T+r=n2B+!1^LA}Wv#%LwJy0`!pZFL^Y+*Tqy45K}LGTlZ2Gkyt_V z|6OV6mmUmbtXhloMu+@%j|*NW)o>o|Bpv9a-YpRzitv;K%!hV1@*oj8ayjA!4)QG_ z4T4m}^Z#^FtkonN`Jm3Wf&xsFlJ2psQ4WQ14-^lUAtX4^JjCethCRX5q{i2aat^~* zMWbK%$U(nBtPHtOZyxOL*^Y{yYJEte{hkizf6{K#M*rkm@p*08zu2qds@nZt9)DLl z?Dr%xx6m(Fm|V?CN;CG*PHbIhX3l=EJl^!j<=U`*;xue}Knisz)0Wr9n_@-wr#2@M zGI8nXU%ta&K)_YD;{rz?Fnc7X%Qd_8#kZ}w%f_A=x2>S$1jq{n@(09AJAq3R(QQ}_ zxn-n6SOZQFXmsF;@7={{xB9XSN&5fAZ{@O@-Bn& zVYc<-DE$g1YL<_frcku6Rzc5z)5kp+jO5Xkn&w;pprnY46|jlNJYsnIvf$7FjXHtOw!7 z)vT%KF)}JRfa4EgK(Fhg-x3=9V7R51Gg#M-g?MXHL)74oEDJo}W8J+wjf zKE9GbQn^3k5#5i)4~2!F!jT0Vcc+O_wR~g(g;-cqDnd=__7mM4sZ^LqXzqySt+%+; zPZV64f%B7~5<$wOPYDpb50hFta{2rr@5*AjXv~PE+*yfA7cfpHS z;FCo(;HjB0K7F|Fb!^+LCQNvQJCI4X9|EwjVVaqjp=+xCU_}6FVnY3#!pm?kas!7t zDv1MkF;BQ!BsgaUGHK1H_6Ki_ja_Dco#OU~VK%nZ*;@4)nnVmUbnUIk_~pK2XD2I1 zB`!z&c41m-UQ;^#sQj|;GWhq;h{Tzg_UGttZM*$Wab^93%6pWA7!0K~G&#iC2?@Y#p8yH|mh=@>l3phtn)PZzFrd;1>Nb$bn_v|A4UtOr%N z2|ze0R+ zG1~J+F)hzE#Hz$!?vgsZ-P|bclY!cnryErF?#YtbK4ipcz5cm~zfT zK=6`NeOk=FsRY3yDhjG`NnS$2`X?>TyfImLmz429YZsBmkqlO2xM5o3Ecbgp z*ATO}Z+u;hq=-I#0Z!yFM&emk%PR{(%WV?21@p&$aDmpdX%e0(ydM$Ywvl7RcuJ7;q zs$9-^Y}p>Bw?H5youqhf(>^5Qi_v}rTY@NR)hIN{M{o=x?gLlO@{b7eKg68#V4Y)5 zt%dBJdYg6V|s8X>{?*Sp2X={f3!`ml|qv&6G z;c0vbHVv#X0WYiznS5B4J4jxcT-|a=f8f9T^YqDRlJg5$%$}Cbe_s1v|FKv8_fr1< z{LGB_UwQq1|Hewhzv|&X8vK9%FwNm#rtyEjNeIWkp!*AF4w z|F%~7zyI%3{yy{{OXq)o2LtXk)_>YC{O>=6{{NFNaoKO{_dnyk&8}Scm(Q4{Ir#q_ zw2Jlr8hiUUodgDarH`bDe$Q!|^Z)BrdH?;Y9~}gWrJ}@(BAVo9*a8I4Zw(lx11_-O z49%-V{%7R72*dwt$j#uC;cQVmL_W4!_HL%Y}&^kp{W69C;EXdE2*&UmT6B~+yD9Hf3yFAE9XCy7W0W1 zXUS>(T~kNHDl4@gthVM0RvUTQN9*`#uxsH^WCh;Iy59#!EkGPnq8%uqqP=V5tiESL zLE=u$R0q1pf$8;{GJZ~d_viryq(O`?JJ|m;NwD_z+L2$W=gvl}%ANTN=wf<&axVtSG8wIPQhd8-e5mCyWNP?72>+ zj;g&ayEKLAd$L{P@bu4F4~@w%;-OCMSr|Ve*|f|{a%T(LaX$O}$$9i(%qLZU(Q1nq zepp}%pQI|3!F;Y;oxih$Mvh!)2UgZB+sC>MU@qoX~@a!Jkkbb*-Arej)Tv6N(zS% z#sR+Qg<frALuIq&52md3Z~2XXwr?WiY`S^b9ao38>GsWs?x^NeS`cFw)~WQt0;D&)9km0mnpbQFuK zF&yxq(&ztJ@<-RTMIHL!e{rr9y&Ba^pvWxJGyTlq+(@@{5~KNcz7D>D&d-VU9fpaM zL4=6fzySBKR$BP`=vsEX3Y8xZ$ZB)2PP%=LFC0DKXg4X)s$*`xH?rKP1#WowJ11>Y zCI0X&l@P?M)kdT4! zHoTt8;z^9mm<~5{On(s%9W?S=xI}rjb4ZV|D{7U7ALAy4S%JTddlYOcc$W;p3TrHl zBN&Y`{PC-z#bDBU10zaa(Ke9F@9?{wtHTV=f}h>XyW`r$k1F#|Q9Ng-42 zUc9c2$azka>YR(pA%3R*PH3y6dash(L@Jz9%El^&-BIAQ@GCQID&K2xT?|+GJBM7p zUV?8y*bJ)Vf)op;K&B(_N_)^@i1CLUC}a`(b{zVYE9>-!2(c&%7aB8ooVwUGwW4P` z>t%g54=AheF@6&;1|EH7 zVEfaFMrw^;E)qUiv+uh!ClDU4o8^Y{5^glcpg5C@0mR<$bpMK z6=3qT$v$U0Ko8({@3fvqLUJuL)1MJCogS(@TDvfZm2{BpX?g@xo3E8|bk6y-ysn^k z{^J97+TUhJ96IjPw%Gl(xkGGGW5wJ_G+er;m{DJt(Q`0>yx{kE_sfhd8~>`|iy$3^ z1o9T>rsZ-|>!)r((oavl%#Ez?0r$6c$Aw`W(8+O3NoX<5e(K{H3UPdO0Mpb_4rW za!;j7=GD;+>96FBuZKiyF?tBoNwUi=NAUw}6s#kt%1&O2RJFtc5z80&6ql{AY#s#P z(le}Bt@p!C12yqt`r+!}?^3i4+7ARiNTz&iTp>OdxE8uc{GD-NQW*Y~)^xyrGjG}J zJh>BUr{|_Cjl#_wuth3iKSE+M6wO}o(*>bt*=u=Xc}pKLLDngfb>JHw{{uPL4AO+A zBj9~rS|4cI3!M(GKYIad(2PvhjNi$D^}Zaz#b-y|U)jM{Eiz#p#z{HBfwczRtLxM8 z88ZSAu~LZpSex7{<62Ity7mbBEvx5ui+*X`@*#BIEt1wmL$2HR#nb+F+(=%7)XRI2 zobB}v{a5hOQ7tYXg&V(saidtAL3J=^A><#V?jz4>rPoSsWR8&uEZ0HW!uLV2HuyGe ztK!UG4+Digoj}%eM_eg`QeYj1q-6v#CMQ%E&{_X+^;1E$Hh4BY8@X&|lkHBZC4V98 z93rxw;!Ga3A9^+7D~9;Hp_SP-+Md`E?gzU8eAio+Ej{!$2ad@1DnhCsa2yQq?~lA| zGb-85Fsf5l#vl4v0!sxLJbZ}K@|KBLmr1{nl#jOeV#Zc-9q$x0+NBknyR!FGgX^^O z#qmb5p{^$yA(m-)1WBvew#&)D#B)CV(3yH1M@u;#+K0y8(HG}Y@QZxNZJz{YLWV0K zzBn@jwQu#%4pf~T$rJtgJ)VPc7HO$`>FCJlqhDjgItZ(S&j>}kOTy~%nBY8Ez#=M# ze+Td2Mt1M}*NXkNUWX;P(R=KwOfD*-1HNmS0UBV}NZ{4QbAHvpQ)kmxS`oS44y zbo}E(xd`bW1*nbsW+n38c=3wQdNM`$4bPQqQa|Ndque?&HmnE z(P5_&Ec)!p3XH+?(5o>4vk|T@W3Pn`5y#Iqul%(QqQs(NOp80-rD5!)p>>Y5!PqZc z5=Z`X0!#b!p97}60s(m|{qOA7i{vXR+Sf>4(Uf`ue^xgX;O0Zp_@kD??#QD^-WW^F zqc!oma<`;K5X^po?ry}z=0(o5SGN{U6w>OV^i@8O0n#HrSbkX2QiYK3lA_-d?)PQU z_e6{A|B***Z7AHNZA7P|n^k+L=W05M-1_DHSkM8P{eO6R%dn{W?|YaAX{5VEx}`)~ zTIp`2yPKgyX^>Ls?(PohlJ4#XVHjW-_#f}@?|EKvUA&l?bIv}Wz1G@m?>%GkE-zqg zWcM0mMp37SVqC9EDoSVc489k_-mC3LqiRRpR#cWyQl1&>vY6ku$iuYgLOn(-(W0>` zrkPrqc^>O>kUI0n0)kAMJdW;QW5tzQNSx>+m{km`)(KVm=inqVqtqx!Ox(8LlC0eF z5MeigSKYQ^*6q-+xw6@~l6oE$Wq8EpYbQpAn9`1=FM^tU0Gh*-Q4{)|zEcEfo!y)X zgUIz=skP0f)cxoz8dVp@P7g;;N!|kaVKeDw@mYu@)pjD{Kg?TEOufLM-Pd&tGbvw~ z_BA*nGr(-?oagB~q>{Q?S_dA`V!e6`A?G2TT*yaXLK9mG(^9lzwKy-C7LJ5$>8m4p zjZ3pzF7rl&!PX>{*~3z+TR0l}f=h|XPxMReh~6jgz;Rns-AZ~l?}X|L-Oa3zL7Ydg z%ojwJb1-D@kPQPCs==K;jcu(x(bhDQ2cJCUoqeiQb#ZRyNs=|NlZ1mwC1l8=M%kf; zSx8ZBL~dO}t*g^B^DdiKSZ}ZUS%T2bU5J3xLL(XGNcI#mHmtfoB)FX-g+GtpcSsFf zf(Y27SLdls#gE{LnkWO#pgCw9E*fb**ma}O z+3|sE>1XUT$SUS8Ce)9nm{D&tZ8e-*u6jj_NNvxg1S)m46~Dddhsq@~J@`R`wv&Yh zBVj0BTq$mkU*4P>@!}pw%jZ%1OT98SBaaFSNUh>2FsJIt?X4@jgl!B3L zguMce-^MF$FJYn~&_Fog1@6ULvlS8(Pq_=-m1V9kQ*~7_Tm2Ug&+*;zy9lm4O#vL& zK?<+x+;LrRkio5A$^0DQiG{0iWVkk|%Aj8K(&3Yao9zD)vU{)BxH}#j8%iiuAeUnxr9f7qK z^D~Wz7!4VVcVRakBX$EJ`A|VrS{fkfogA6Abl+Ycg}2pCHA(%&Q$oLShmazMBAp&H zm<2Ds3C?9uqrv;&P8@<7fF>lW7o8q)I_Xeue}R^)3ioC?aZ(M*Q}_pb47};rt!3F^ zw4@O=EeVQ@V0g6VZcJzqq`cK$b5o*uEYC--P!3V_ARoYw8{UN5| z+v&)*wGyFXAk<`awc<6!Op_EP6DVn%|I|9|{o;10C^x(-yR~^u_!Z>T^YFV`)lxA7 z|08;h2FlJ6{JmH!CGcTM+)JJ(gM#Y|dgNp$OxDGi&2Taiyt9tTD4A*a$qscLqv9>sAl3Uu~+-W zcx!&Bzq2Ukv{&CgqzfI|aF|bXaimrTu+t93_rCNl;&uIHvtZ8ja4evgTx2&XeP=Rc z5oEG0lIK#UARVTx`mO_7x{1`i<(gz-!?mRFipvq+u`P??kH1i)siEYj#Za3Mz@S5B z+z;N2Pkvn(<4WJv`#$qgaDG|SQD3#Qi{c@+t@EjU{qeP2AL<*K=<4)r2^IbC%wae$1RGvmpUmE0X0YE$5B7ePQ~hiD z>DGt!jrFCH)xo9kc~#n=UmB8%)~N-=v!xmK{yscS_T$>D0e7dD-YZ_zTjwQgolTSI zrX~{9AqnRx$kxkM_KDfd1?-#4N`Awql;;m-dmrnQKbha$;Fy`jgyOL0*M4=mQ=ql3 z)`qP6@L7M9CEcR5l+@#rG2Vcfi#S$t53*KW}C16^Up0hBR zv;!v)jrZRGi+8w{fk@K3BO|+LUQSZ0g9Wx0+h$YTOU(3T94*U&{E~mhxJg2WE*Oqe zgz8>n!Eo_*OQZcyh6e`G1_vc`Vv#d=b%&2%{R6)V*{Tt8<1nS0H9n#Zk6D8GjVC%M z-Gr3aPpdCf&t6@aLVOZ&u@_q_BRa(T<3bv4wXE(~F zVqn(kLc-^+)+o*tEfXIoR;(@=bed7^|aAibP{ z^VIUzj!;aDdkV)CO_zNNmU%8tC5HZTahae#^qKSGaTcmq_+jz7a4~OJQYkk7u~94% zGP}wg`gVRR!Qn%^y={BIpv_uZcuuQ)Ask*`Hw4?;_{GhYh|xpzpChN&IqHAr3KKz) z4XH?(82#zWg^O6O@-nU?I@|Y3#m3*1Q%!guV7PmUh_`*4lViEbaLssKPwuN^JFdQ8 zws(CsedViCkBzHezv$8qbMbSdyEr?AnoE)Iq9ttSsAWNC73d_G5c?BhKnlqlEHk8k zoxf9}rB0r5&2`_qxGm;NEM2|g`JK1qn(M@3vwG6OE5AuVdot0JLftfIYdafZz#ocy z-pDq_sw@CzY};(CwJR1`VRmyC00?EFwQgsC2Ub#Fg{x!DL$R6%QTlE|uSz4~zz3mh zz05_(>F%-isU7Vk4O{8Lr~AHLG^(d*|7HIDCtN4{a7bf!5QT{354u?F*aH_r+RBF& zU(5qCb@C}rq)NguN$16G8t<#gyXwsrZfA8|{p?7{IcL(RSdJ=I@)+0Ha|^be_hn46 z{;C46`N`oaQG2HX&|c!I{{*Bc$X5G+;%G`PUp3OrUf+bcW4n5iJvVow)!u-u`&|Qk zx4B;-zR%u>)+0Pya7$8Lu_f9hwP=U3Yp%HwH2 zzF_w5LZ(|Ar$x{;S-)I#=~N@rvld1)&R%5vX&L)rlhkL|81GSMwDyjRR~k%PH2AA- zQQWUjax!Z0FvQm40<2T{?gKT_Nx;O2OH+Df2saHH-Ul!oGO$Pa)aNSyAb48TfWvbu zD3@*KUZg5>a(E?6h|!HU1<<1ruext6atyw1#@o7;-WB-lt|f#ove_^dw#hapDI~kc z^kn-{ml)Q^-W<)g)(L@QWKZ9D-#WHsH=`?=*k5%0(czUxcO}rls?%GOyr21w8+kXM zfqrdQU~15zAhJ8t^iQ}N6p<0uwk+NT!8n1S#I&F}g)!MW*#taKdl=;1vF{^UE>naM zXNN%619L9lrlkK*ogwIvGx^VtcKcDX)0uy`Y#bU>K!z^@s*EpW_^fu^R!ei>?QA$a z-H(anhD@ zLLLfLv)uYOItKc4itqKi&=-nsnB2tChkv{pHjAXOvdXhdIJ$hK0w`QfRZBqExC}+c zJnws3)kK=ssP^t?0Ot?4ATF<@A8Q7GibDs*RUo;F5R8cOBI{-Zvk}pPaCVL)hHXj5 z&ruP$1E0g;cyzyNXG;O6I*)D6M5}f;&gK%jpDSiXv)D#Y>7d@^CuY=-P?@2vX+IM~ zSHh($*Qoc6Y*9+=`?Q4_-35h6ZU!~>oTMzeQsg=q@o04k|9_zL9rEZnSgAvND^vfvH1A~!}~t`l4ZE=}_^~93FML zg%UJ)fzL__mmuVe>K7`V%^rjPb;;d+lFDz-y?QVrJ$!X{%0c-DX2y&U4aD2CIDK7U zvj%~MLEqky5<>VaUa``505kad@3wna22%4m(jh&;4TFQ??UD3bBThD#_*K%w(<$h! z`p({+Q^U=(mAtbEVv39dRF!9(E~P=Yq1bFrTDZ;p2Qpn`(GH3)malh)0|-Iq9~Vhx zCO>ROzJyi>SL%G``;L%pOG#i!i^GxNQk1v2{C9q<%)28)5WDn|sgs2;a?y?P&B|vZ zd%I5Y>NHw1`px{C$xj?LMv^p{;Y;24+ivlF0f(|j&&7L_=B46b_niwXTL&(%L62)E z*hOuUNq2nlrMp1Lq7!t^HYfy3dmtU|hw2kwFWl6)Vol^;N_>ig=l$O3gIljYC;O{_ zx|jVY`KFy==xCkZ)Uu>&jAT$@J(vxS;rtDN=rEnDQw4KFRjmKNTJ#D?&PfR_M<|f+ zTjPvGju8Cq?oV86J}TY^SAmT9r`PVWsAM=)FCt?oGsms!8>5583tXG7+-vbKWI8NT z)Hwb*T%pdZifB}=(G;|*$X^@7mT%wmrDaES+QKr#P$3%XW6+Dqk1h+Wp`Wq~ zgkZ7fw_^DZFEb-?eh9w0_8Ymn_-M`}CjsM_r1Re6XtByR_F`$U*eWGgfI+)(TyEiX znwlGF%k<#IP7QRl*O9s&{CS>i5uF-84OWfp;tpX;Pzhspefj)3Kt?H!w&fDLv1pci zw-3G>ou3O6dVU${(YtTH<)I#=9V`e)mg+ck{uioq1-W?{G^LoogV)VJ-pZnyS5l};7Tf~G)E+nH@mVhVWJr!!51)%++UD`=?`>&vFn zSH$)cXcZO37(y8#5(Gs3#Wo`jzmbEa_{P$$X5(67N!vg+Vod{O20}9wuUa&RFP8t4 zO*Iaa!H$V>$eJ?nufY6DL8rna#vG8d@35KyT?*vxNGmtWC>HBHh5dEW7^xw+@mGZM z`Mrz1Aocybis-5wvQKIVDX)JgB5JTb$7-Lt2{?8B;iLEfAvtUA3cbU~6qzY|`~9b~ z-A%Z&=w0gy-@w6KCLZ2v_Y7OLfqC|yi=w*av$UPIr=4qcCfzWY#*(Nk^lJqm*1e_m zbdmzpjxw>Cnt1L>Yr`;8J6Uz*>^5rY`ET&Q$2D$6FiJM1)NC|A8OhtGM4??gb65}! zikKY<5z*csV3>CA%Upfd?{Nk34K-tGG1I6;n$<-I#s^*LIiez$3sEg7Y)X8>Hw9}uz>=x_U(f|q3Ccr2Vo0)9u$s+Vtr|kRlV$q< zog5MW-^n30JWPMXiV;}7JB=l8+}|wy;n7L!45y%R@uV4hOCRcf+F+bsR{>RWbVh8!zm zYgC!L=wo>eM_Zob8KLRtrmuy(4IB&hK_18YwyG_)*!db{K)D0kGonwFb)!W}l6Wd1-63{^dj_03t2IBO(iYwd`Cd>PlMD zXZjyctm>S_o)l{~T-8Ai-x3Zy2J{3kJFylX(t4qf#tHd6quj+Yu=m9jj)|!XHPq>coC{U@CFDNe|6p!y1KY$0gLgx|AE>3 zFQNL5eKvoGp+EeZkArY5k8gSvM}w6Bwk7~)x372Q#u4%|(JgU5T7RuN6o&|u!2T}L zM$Ks1scDh#&Ffh(Oq6Eh(|Mmcnpl=KCh}kPE;@wVBpSnS`Uk&HEdy=&l?V~2k=A^| zws%H)s$dT?E}@?a?rl4o0K??bR(>rw{d@BF z%fvk|cbgIiR{4}s3VCw&e&2X77VR@mt>ZE{_dkxCn;L@oujWsgXVzSfvS!4P{MMIy z=ADYs{%RD}Lp2l`n~~Te>zaL0<#xX5iyMnoq}Z8e`q6d(lXWpWRTryM5#D>^0#)NH z_B6OFyF&-&B?gA2Vf3p+!o3XZq#1J)7Q5v6!|vDN#KybB=lwZ+q zNa2hLOlpgKG8i<$-Y{r8DW&E1hVvccxWaRp@z@{L89PA4qgw;(b?_3E%qQ1uK9~wR zy}%hVx}790nPx&eKDojCZvhGl@aA%btt;?S9oEdL9gl%z^D_$Xr74sl~ z-xKpVpx+ld^1$5?L-95aBXu+gD>le!2^0GB*T{1DkZ6M{gyP@u@kPgtQE*klSsaFq`#pp^AP z4>lz`{*L=Ui05=M##2h&?|gUO@FOpP}3ERvhFoL zZ|d|kO*V}|P=cN9oABoSPloJdcRb@(>`6bTa%tB|Kivk0uTp-cD3Raww*1)}S&zbn zzE=_(Dp|>Mm_f&;d5lJb#(jNzwJYrelV?Dd6g-Y>q=-??Q@mB^37dGsDM2v*wmSe6#M%Nu`_A13VP zzatuzr)%n#L=kr!s%Cg4c=>=-Vdq%nb5jm(Rd<_se!y#wiop!gklc%iDF4)QHTh|jR8hyA~MP~ zNwS{SV4rO<{jw-yKRA*|!FFqpJI&7=Y#*;je+`il5|+MEVVN_>I2;dU@!!0XMu#g+ z*0Va~Vq<&J9WOU)IEp$gYy0@F7%0>&)I01va!3j`2T)8xMWrEj)$hHO%OPgd!7RzV$Ms9%@t6x*8G;x}Wb z=G{NMD!UzR%&tg76T-Vem-OCSLjanatv9&=7u&kb9W2(-0Q1cR>y$+hrO)jsO0-Nm zAKw4dx?&dFPGH-gf9|n9H zO+9bX00Tu$l>r`aWf{}SnLDa3jeFcxiWN;&3;a``fO_ysYQQ@ouS{;Gh+?(c#-Xx zX88;J-z)eU0YmjwVsq0buXC1Zb9jI$*gywB6Hf2eu6 zIYQ70@6lrXa_>H}S{UChM*azt0!TXGnprYaQ7rjur@$d^qdOhkt?1`ct0PrZF{ z-k|;4ybdXT6E&#!;g6L~_1}(1-wX)lA3nYG@LSl?t}W3h95c~Qz2Ge^uh4$F>6_VR zE7@C+W^5%}no0LD+0x}bO{{5h#U4T}r3t31ZwAG+3$>ckEl|@T zr|Dr9NCLpS{uOtskWjz8OJQ3vOn}JUMdSFlX>BqE1TY2lzdxi4n-UEfMpTs04O=ye zfG7tdLz*_>$aT59i8N<7C@xlH+=x;(JS- zCHvXos(vbZLGXYA7oitlEHvZCn_a{FY4PLB8;f$2%s^(HCR9K&lk5L*68_U|#;a?4 zz2KY@f13rJ_u4@V1@}@vuy{~Hk_h7#;k;#fvphLyBS5g(KRt$wB}tc@U6&P+%gX$g zX*}Ufi=^bs6;R}Pvf_>qipsKJT?lgOs;O$6(5alLJT#8yCS4dfqUCufBfZ9ptugk` z5K>t{zrz2eNsqh<@kjPsdf%-nfs(Qnny0=o0Nf!^p!%P`4Z|PGk0-rHGX`NV6l!yt zI6Ljf%ruJ7byd^1Q@3JVv=S#uwCa5Qp|2M`?sOvCCIv zX;>lYu7;jUz@ztK*@kO1f@!>LXTLIfP;YVVQ(RNH?IY6zw%r&5nz8o>(a<0l!12)L zm}f4Y7YB%tX0oMBo_p^t`C3V!D_#h#RBd-VF%d3@wE!lFB+n4J!P>k6)mW4d%bjZK z$A2SpTM&l(_gOMHLxCJuw1C4S!W0xjT=%lVKVl?JRwh+rKz*-!h@iYdy=cSZzi@(F z+SI`9s3x2%NIEspC9rdtP{6I>Qpjf;AkiQ9ODXM=`P}a~RzE1ci>q5T&r{4~RbA#)c@x zKLBdNi(;BNoVaFWud>!vaC^Oeu*EtX@)@#(+l{=+jz20@*2^1jVU0o|U6v_C+a9{+k zJAxVUpsWnS$^*tLQ$tU_`)Flxdl2^UM*>#ux|A=g(IwBYmk?;}R50+uuCv~H^T#>h zCb$W5oc?f;t408TL`bFHVjBqS#=_w}PVbfLNuWjzLNm<`Z$kZSqvT2L5Y#7WXa+m* zzbwfAKWdtxBqyK5Dn=~F@_LP~EfLeAvT>v^mHnIK7>&7KN`dBYmt-ZQO5RE{c=h3dH)_G|-QOcUx=4s5#Tw#i5^HcvP+K_Nc|if1AJ*YD zGP@9}u^0cDzL<>f>WWSoy>lpf!6C5bF2y`r&=qc;6E^j8Jc>fN2y;zo@4+3K+1yQS zzpUU(+swvtrN_Zu@qOZClGK}O@3&5QFC0mz$Fqe=DE&JQEyjqnw`>@IfRiNAC{!*p zwp_sL?AStB5g2sl3s7Y9=r4Jo0RX7t5A|wQ#4(q#k}r6CT#$T^F(N)AUNN#&alisR zZ{PqfdPLwu^u6g|Sq)K7(%;R&T8f$%=a)tHWB0poKDl@`n)T(Fjb??(b)0?pdOBjKb%GID z=&hDhjxV0+pG1it+%l6tXuhUVB_jBr>zW`+VJu3`=n%mz7fZsy1;NRGl+XYyG3-Us z7QQKpZuCi&3)qYc0y!D|s!%>5r28IcL($mUBhh0$jFZPC>Bgy5_BxZ>`;)#|b$krL zS(1Bc?LQlu%(FkODA4?oAREEXi>Hdwai-GY~kt_ZW*Ej5vfC6eQX5XB{ zPa>p!o?h`fsOpz%B3)M|Rhtn?DBYKGOblnUTiziU_ka|sJtZLA$~jHR@>U3 z!xr>GI5^kzC3a)zQov5)kt{R%&Vx0ce`~7&P;-2!n)Ykc`l#=do)gZqZ9q`%Giet@M}+U`p4O#FqfA3+;AWzjP$~Wt8?D- zN-GVQR2VSB31InHjLtkPMU$;cphuo@Ca#ZGn3EkCv1R?n`AV5k;=VV z5J2Pa$lyW9B(YIKNgA~yq}lSj?dV)O-D~)$cFsxv>Ys(6nDBo-o?;A^o$kNg0akbs z-)HfQ=q59ipUBRdJBvAnX75RZVi47s=$+Skb)uOB8Tu0^RBZz*;<_V&8m5}LeR8M- zVNb-bBD(HioMY{tI+1Jaa;}f}GwL-QU3DI-#Cg-hVvHwE+az>IJe@U854dLn#u&?I zxH~aX`dX|v7HJKMN!&HTw1EFpJcc^omnIdt<@iW$PT>ayB4CyD&0UN@;LE!D@Ue@D zRhQ?WsK@v5G(v5YzF3A;{;dF3(;ZvX)u#;R!Uk~hAl?U0rze9jc#HQMtbp|?s!Nw6 zxR93xqwv^|sPf$T)U9SQz&>CwG0FF}x)~lw1+PhpzGku&tvBCmC_XY7?cxRRzKH!= zsdmMRJcBxBA*4bcVL-lI2YmTk2%9)2ry8QGHI|%6U_r2$I1t*;jXjL!-uX*|Y+PP7 zLVS%M&tv^}Q!A|^E#?lEzgkGO&gUQS+jM)4Kc~rHF7anEi4_>lD`{_m*`>G>*ttHT zGjo?a2$K*YrLhuv{$aC5gZNl%0SQ0(XeQ4=l6jIH%mmCjHM)Msj9Wz#mFvCza+T_o z0<2h?&w;Cs4r^a9KPi-Pe?QF^ay3Y5K<_6?gaQ>Ol%i3vlw*g;O=n2~Cud2(eqg`PiYm#Pn3`9sJd6*ljykkh?tDrQDir@_jEYYw z$=@l7ph+6;szP`N;i?e;w43m_=alz2(G8F8lk_1vBb)7aZ)eGKe|8V-kCkcXe$kPh zz{!vBN<9on+B2nLVC0>QqV}<#!Go^%=99jl*^o&$l=vi$pwViyM?1-fd+M_(+QO{z z>kQMDD~o&v6HRs@W{W3nqR~MYb->$6{H)wn$)hl3Pz?9a{V8*D(~WVuQ*Nykki~NY zAi(W+ga5hSw;OV3{c;kj6+JU@FG*(VhUK=@WhCtdR=MNmFdbE?9jZ+KghgH8WCwmQ z3N&o)hit#xXPt$`}z9to3f(A`h z%%oE17~!=}V;eHKn*CnVN%tDqu}KH7L$UoGA{9p+T@5o`PT>81)%757Q&{>11A-n_ z-3bSM^jch$y|FS2If55Qfd`C}uK>XR`;>DsZGT2rCh|^gL2a#Ve&AqsIpQakM!Te9 z<^Xmahb1{Lvl{yFx9L>upQ)sZH=>+9YvX+byX5gxfwgU?D;nVj-v-LohCk|k&HB`~cdGe65Him>+>Z_ot{zf&Tm zmzmWBeNw*Z6#rfQ`Mk!mwF~7iTNGED$0+u5yh}{^PhqzV*Yj~Vy~LVH9HS!i(n}RWVZ$7^U ztRmv?DMfG;cBWp^x>5b9@31b*6#b7uv*l{BGohR8dhson^h11|30|CgS5Vwt&`oh0W)@M(ckG~%(J^9E$( zE8p7awlrx`#euo5NmW7CA?{3hQ>yqp%mysbt$@ulBxJVvxknB`Lu)kQ+|uB`*?Y@lkNqTo4C8&FRaUL={B@RM;e1-akL6u>LB{^O(0T`98aA1el3G zNDkuSao7{sq87Gu##2dNjZ0w!in6FR?AMM6(cYcE`SD%I6>u@(keJ3 z(-H5OGB_b&2)mIV8v}k}R(7yWEfHnR5xhbpZ_AbvMqfY}0TwvvYO!kcOIe^cb)-tm{jiPY%Uwyg(@od>D}F9q z`MXxiowL4f8iXIR;Ou4ze;A|5Xr&=)r7 zukeUS9F?Rqb7*MRjsTX^_vaMihwS@m4ob97lF4Hu<2AJ)k(f71#x){mDxG6Sjv@&i z(iMolv|l;C(EX0n&OgO|C1J*h^mGZM*BK25FZ?>(U<{){w0GY>Q^$178|be z2@}l!I0euDaSDzwTAjDibC)k8KVYt^QuB-@8gy9FuXC8dEqP0DoynEUXrdh<4KQvo zNo4}dUN;du6e6CGNKU}XZ}*Fb&BJ9&vndRypAVNisZ9rBMMyE1I!dg0AyWI_AUiwy zc1L~O4MGFr^5gv)y}7yFyDxT;N-UvUBT!SrTT4yn`cH|^g$U;IizW$fQ-u@=HHKGi z{7Jw2&fI5PSo?h%(TjMvZ5`5QJ(b+_IA}Mn@{HEV^Jm%hN!QJ~@}sE7=%Kw;EnQUX z>(@`tNK<0iLY{0!2j%#;9|&&#aki(m=!41D)SRDLUsKyu9lodV0B+kLkLwh)Y`^3T zl8Fei!6QMq3A;7EnX_T^e&2=P8P(Q|M5r@1Ng?T8AK(ux@u=1m!wbwXaujR20&2S8 z%L@O@$|kwAc`CZmYApg9C$+0(RK{D3k?s;QtS=D${f?Ls!GzcL&IPbf1Vt7%zB`#8 zPu#wok(hHUN8~HzOG6{|vSk&%!rIB)ABch8ST*>aSnXZj@i3%%%9`!{M9QaT`P}>*?AEe8I_))=Dwh1+zY{-9| z*LCaL)4RR#H-PdmH>0Uh^eZE?02*a-ZC0Q@bDIvN-AnQUzRl6&fHT~^GXjg}M*MLa zNx)7ywfXDtU1Y=4wi?mUn%hj)SVS5W(aArd=gnDHDliGiA5`uGapleiHGN zIuBv{W~#4sp(0>{dALM zqn7N)#VbF+KXFC>7;qzEWQ-9Pz15rD^B(Gdg;5$utXSCdh)Nqz8Iz^H8j+D1BG`em z;FBhWiH=ITyB+Nb(A3bi$>M) zola4ofY`}FJfSv1TM+yAb0*NbqAoFEOX~K{Q?FC!6})Hz#lrrgB#K998fanyO{+4} z3rc({Lo34no~3~+8fcUQG*OK-pz;G2y9nEJ@7>}7)Nz@sdk~9lSMQ(PTX1MG6;k&e z3(sp=5(JCEPSc_a}D^G!#&p9kJf@WH^ywtDB&_;K$low z@r9F(yMgmXcntq7i&;33kx5M(gF9R(i0cfQ=u<&sk$4xrnJ2s-g%F6j^y&;Q*M@b9 zY?%lw=@=L)n}be0lCH@H9vsq5lQ z>qOr?%yl*)KN7F&kwW@(aD*fro>Yk4EOiep}I`TXZC;Q=22VWM&ZPRYo)s4 zBR}DxR#OYUTnZ2KmZxWi69)Vl(YUCP-z4ue`Sn;3yKE`RqJK8iPxL)Tp6JpaV-kK4 zt@#y2BS3!dK_w8nSN-SjTHDT!=?O^Km&1@xL5*yl!I=*e@2Lp>!a zmgec8p&3a2=S8g%=UnOEMFfitP0>oz8-dFmq7Y&cIuhH5B@kz((~u4y1weW1jD$8)@cn@C4*QN zj90yQdgLx~!mGi6c@8)duP`{ZA;26JtckygwrBbQ8+AZ4ltdYKlgb1$-b}rb8#lD% zp;W8qF*4zCAQ0mc)mZlaHgp=KLYn;dh!zmB5e`Aks&^z-(?eLGpjBtld)=C>fP1fX zs!Ui(0iP-d9boWp`Nf%YI{bMSWEG4#3zSk!jA5QDoF7R*So{@mVJ(Uy+4gfL+Qowr44UUdInw4LS z1Ng&4$?}PSZ8{oXv%Ewg^R6Aiqpm=UV8{~q#p<%Ve_!qby78jEE^@pV8cIQg!N$+Y zkLrr(_LhNLuIP;dKeOR-s`RhK#j%m47azp6mV~vVF4mI4Rl<*hUOSd{MNb*CoyDE; zv0B5MZ{xoUe#LG&9dvxQ7$s~Jg{l_DuW|BhDEKyhpFDGzt#uk7*bX`Lk*BM-XdkzTtn0EiN1zwB zCQNR01P2@2%&l{>@GXbCaa1aH(|qSvW7Vp0C}usmfJ&?-8R`w&`eUlFc&I&UmZ5u| zrGADYxmTuqqZ=@O3~LbFlqXNY>WFOKs64t5VDjHTt(y-;tYQ}na$Ix4XgXKpYOj2` zomfjq?>QE=L+r(M`TSDf_;L9CuLpqn>V!Y?nQJ6D@@Ae`V|Bh|In zXZIG__~yOe)O7bD{^HxLMvH;rv5g$Dv-QgEap5m#5{qH43Lc{rGY_Cam-@>hA3z7S zjoHg)t5FIU0?GD=-p~dW*oADYCh!Es{MO=q*C8{F5Rt&V7#C)w$b#c~dAe0w_eoQz zL6#xZ$|g6H#SZqs{rq%)`Uf@M){N!l&r9xAlOMEti#N%>Y;VMAjQ=Ea@gsxR1}v(j zicmoTU)ssHSivb^YB1;%^uC40{IM^QEyesO1k`>94pb(3`b_~NS?hxYuo+qEaTHem zqE;@6lG~BU^-m)wEo)IxXWP%W--3T>Yq%n!1~5pPn3tI;D2pXc6vX@5tDpDMLwbJh z_g7adl#jupKan?D$)ac*an`%VpVc1nqeRxd;~9Y&t9Y-oi)gPiIqsK3{}>MQ%M(zv z=vlfBVp(F6yoncs3~>bBk#Fu(t?cTYld&7}@_g1p9GuMdI9_1UB<}HfR25)#1&P8g zJi~MI^e+>C{8-h&oNc>xICfKJ2HgRc^m7J=+N2?BHE%oZ6*RNtEMdN<`};t}FX7eR zl}V`GXKJ)q6vIak5_Sp%@du1yF?!w5&3a#C zm=;OF%W*575~I*BeSo9w#xJQFz2tSK8Xcx2S- zV@&Y}(vtuh-r)OYqlz;CQICJP-rmjxoh-DmJZ}i#A<8sb0UIhh?w(jfbFRN>ESSbqOVFvp){pR`wPH*I9$ zE_0nG%FNqrxD9S*PXBqF5lQ1vOcZtD-I&A~SoU)G@SbQLlAb%zyKa|M9U!y)*{fAF z0c@w9sq%M@o&!$M9&Afuc_?1hso%`H6j%s^)e2PPIpB7D*Y^3OTjN1QjJ6))3K3@g zJZE&Y8{dxO$j(08^ix+wX!UR(8QghPKmWzjR_iUxh?bpU`QRL{;GQG*H>e113nAAv z@ry?9WG8x6`#`1hQI}HP4gSWH0t1eJ?Ud8Fy}rxYh3@=MdywV`@rxX~RJg$UzS{Z& zzg4gnehR_HGfSf=Om^l(Et?=^S)r_DzABiAqC?BlSCP@sW@^qRQ7`bXa2*dz=iNCl z%xBFNl1`(@zG7Pjp2jH!CvG0yLbJ-n^mz1}+AmiGCt-xI;Cdi*2sCg(Y3%I{G{1^K zStABfG_y+V(|mtcCvLrsNtho_ic`AoJ2XncS?4K*ip(!p#v0CBW%l5Yi;;yKvd)h? zZnjTj-TNV=r`q`Dp{B>RRw<&8~EDn6f6t{$m;2y ztb2+LpGP}eUN%=+R>8~s`pv`ZhK^%ceZS<^X{^n{>T~-`!Pr}-x3}C76jEhowySm7 zBMEGQvVvZ$lwY;!&p$pms5H}znO zS>!on#wuIoaZR12b3c-x^Uu4^SV`7Nhrj^nTfjyd2v79(Cbk#vi?|;8L;2 znyu!)Q!?HaijHGczID>i<0iaDQ@y8!0DAI5rIOJ;%z5{Cf@8J@o~tOIdQCxmq$7A~ z*j|oH*Y`D{6F@-{h#SJ{$EM%NV;!23f&2@ zPzgy$Mb64$au}76^O+pBg}b^Hkz>dqXJ(Vb95#jy-oIi*QH?(x%Bn$1N=Q@teu0WRTxUptpsmJ__hgIA~ti> z5oRK4?WUc0t+(N4QojnlKR&258*y*$BURElG9H0c*H$U599_x}UV3zoJqS|_rTjc^ zja;-oC}XBo#-T)6Mg0oW;B(vWF<(X~P1O>G4D-3K9c8%?LP)u=a6d8()Y(W6G%zqx zwv(I|j!V?_em?EwVDUJc8ra>AoA7gf}H^JDI>Y+8YUMEgP* z1zu^>$M3oj@AY{=PFUNf=IIv$^u;V_^hnH9CN^AN&fb{Bx{GbCc(^2U;+eRqDsQY@ zZC>Jhy!k>v%*F2Iqcil+pZDcREdUlSu+>uIHmMk^5Xhuqj#%wwND+W1NE5}z^BCo z>^LXrjj3^d*qI;Be_=zZ8FNvhX)!Z!raf0?WM9BQ> zCI#rhB;mZ=v$jl1lXB!QnATY*RknD^9r@C``2a?ZdE>ig3T-NX9?V@DYB|OCqU=f? z0LH_?JMF*a<&$H+h9@Isp=GBzAJnoEgN^s=-(v!%k zG({O}uOS%W;=LzQh&+M2$!VVE!`bih7ShE7B1=EN!j=6(6s$mwwiR6J1&4?7Anoi% zK|d7@_)wx5n&6pL7TX?fhs3;o2SNhyjaUh&(9KOq*w zKK;Ju;H6_t=`jm7Kxap06OdOVY)q}%E~u#W4Skh;uUA@IwTx@J&^os@BAU%%x(U~S zL%R`p&aYSX>CRA&S>-w8MbPeyENGWfPNHO2s`wZB&$Wu4`&KJ@5qPDUr)PimI_SK# zbL5oY(inW%+KWZBL@#=1@Ou~+_6V|a<<+qG<)o-dU%Fmr@@j}#04y1FamKd->L=bC zkuOx18UVHEkr3}oH&umNq_PfG^24zlXP^UmS7#Y?af9QZEFV|mW}<~4?ICFmGyNR< zR?C5<0-2a(rHl+cRz=R;{1if+MOQh&$t7Jkx)-S_^$>ypVwnFjUnDmT#V0wbUYhbf-0TU=0a^?X-G9sLocd*& z-WOOseD$laLH>4Q&d?2odT5gwKa5g32yI}X=kzpM>5GGutMl~9Ik6_C);Y~@Z1`oW zlnKKx3*mpPzZ>Sd?#X}P;W3D8_0n{9tTJi~AtP#(TYp}UX!}|lJwP$#&r2N`?M=;T z2X+f0Ntts``aQLFvm22HGS0ST1j=U~faoVyGB%tY8-NQqt}p3PC`bK>@)}a6R?-pB zIbU9*xt?mpr(3#8?Mo_t*byy#{lMGe3i(}I`>>tEA>)6^{uHIwyCJ|Le{Hl_M& zwn%W}5h|`7E^Y0x9jiLt3MfImYf+5o@&WV!nl{C|2*)XA-(MSQ~ z$3QgrADubL{zRb8T?*S5573s3nE6fKrlM5wuY^~UdAdsK=x@4T)YOis_MSOVrWf9FVfW%NmgqKR|PyNfExqjx%I`;M(nA(&I|X5*jUFZo4u zwSUI^7eG(a^ZfHZNZ*-N{SGp_^~twuY?*s2BnDu9AdM7X?Ys;L&=E9BvLh7Vts5s0 z67Lpo{V2)Kx&O&8YjvXta7`0(GaP7t-dPhQXStTHE!sZ;oXA z4@K+6bs*~~lP|0D!rdL_!kR8bag%-ZO7CXA(v9j9R|Xi_=qpCV(pPa?WTamXEA6}3 z&3vHaIlrcDFLfE0zBV7|U7eoHSE3OiQQYW^eC?0Fh~&T*3(GnXE=#Xr*cZ1jS4- z<9_D3{w@{5d1=~>?3+M&i2JD_vd7OR^|SEzSHk?ScV3C!Dv?Urif_|vd)U4ydr~QP zgmj9QCD|lN;(C;JCoAvn6nwYs<{U7n%btI<%=wmZ0s_f9dnR~hW^0x5x(G`yToz+E zOWivnmmO>f)AtxN)TK*Uk3Rjy{8KRp=3}-qPhip2Xer2+!sEn?t0}s_UHxHw?y`<)d38SN zK1XpC?mux$JOK8>$uO5?sIEPR%D|)cje0B7aEe(k53G#Y0tnP{H9u*Uh1UKiC_o|{D?k7 zJ-JUnO`mYH!4Ez2WxB%PtxJsm*8JU!7}}U>7??aWA10(llCS61bqby{$W&d~070(j zz+T)gt^=sCX~A|l_9@oy_c2w$=`(le`zHCPt`-l8%V?ZdHSAlk5BI2_whedJ2Av_Q zxhH`Bxd@s>t(yS4Kydst1#Kl?x@3jzu!{I3XF;N5UOlyQGjHpCkbj~REs)rz%wH>r zFnG=JUi#QJsXZ{5U6d;I$LqRN1W0^Fm92ZDuRUj3D?@K%VDO<`vfIi!5B2MSm|e3a$w+EVq4py-UzX!rhDtIPt$(L>%w@SQRdWasb~pQFh$l|E_lN`_L6 z^AwrG(Qe1LMKRN(K1ch-&udXsx7X?7%}i6?sMpt8(|}zALmuA?~AK6-FvG<_e7t7 z%JIs%F+G_7&0h0>mBX(&QMwW~Rjmw9Ky7&i`ZrG@Z~qLhQ6l4dWe7+5gqyQB$mdww zimq}St&RFxh`1Hz`D$DsXzASd5yhR~#xuX0X)YOLUaX8@T-V+fCr6CiMhQ(CDt&ZB z>7FQPr_~&LOZFNytUpFyIjcU}OR4)gJo!gcO^}44a{H1XP$;BH-C%mHaae9{Gi_c| zzeVho1bJc+p6;)Hr04(MH|_JvbSSMs2T zF1dRBKF2JlcfwwBHY(Xve>+W8V=5>56BknGQ4gN}^pn5Dk4*HiYbvOWs55C7FVs-po9eI4 zs~SFLvlCnw8lcI&aQYI2Gt|m%tLTOfl?RFL*BYktQ3Pk~ep=jM@pXOqm^DSSFmG>2 zY%+b*=5#P@hwTbA1k!9Uc@vrWOX9&>i_rZEv>}b(sP;?g5Quf)4`ss$oB~4EZQ8Fs z$qu-#%8lfm1~b|UTu`jFNyvxc6~BLu<-W%ZcWVo50>6bF&=(MR(J68i&?OTy)SgdU z7PyrpiTCb4y2e+`J$sL;4*xZJ8f_1+mYOkroL%W)*hD5q{!8NqzAybVJ10yi%?h{d zfv!36kF}d&&ut*35p`AF2Pwf|r*q%8pGFUq^^YeiGx(8!nGpTDeZ!0JqW;Q) zH}2FXjpi92Tw2%9^ab00MiJhYdD#69(XW~4hFbw*lI_ax`YZV9H5yausBcT?ZI2;X z29UI006n2PN<5X4X?_wz_=5DvJbo`%-+uyM@hK>?jFJ&>Z^eQU%qGeRE_Qizcah^U zd;O_zqe93uPXNV+OKs4IedOfOph^DyjLAW;hnC>w$TM{ooqQRVKB9X4eHPwwRLo` z4#bNo^E#4SY;7aQ^db$;Vy`jwR~DCKQX~KM1B-u#cmfaqd>qZ4rN#9I`S{)Ye3FnM zZ|{2U4~gHwyD`Ur()Ek17%iwUw@|h+pTcn{bD&01+RPq z+n9~AnMHL7#oC4+I5*7@{gjy?%g5Oeu5A=o9CRZl`gjF>U3a{q&zFqcu-c7tgfpE` z#@oHAPA!?`HKB}G=_GbzgN^Jo-aYF$(tbG5rhGKdOufzBBE?!_j4+gA(0-Tmp@36| zxXpSiyYeA~ukPg?wbmAVlLA&zQ<|!GE!E!yCPnmj_3S5zB&|(g?Xq)%+GAz-;3ci$ z!g-Bl44}HBFTc=gzg60_o6Z4c^IRjt?Dm7JNvD?2(zeQx3y}&@x%TYe8EN)pI$JqV*i49W{1|_+fWO_oq;bV zr{4%}H?RDV#|`TqJ4pcBl;+Z{KZU(Av(Z?a$qkSF`J)cxOexyxrzaKU#jwWqI8Ypk z>pt`$-ERUihE1-#jPk#u8Q3=W{>jRKDH~@p;8_r;&W(02Tz4x)f;B59puXp$7t;}- zdBJ;fY^?8(T4y@|47JjB8l&A8!w<{eTdxn9&ol)>axNBe49=@JmEEZtJyFodalQUy z$1$RR$EP|Yn}}K~v%k>F(-Y!~qlHt|dOIw^?RU^Y8MD8E?6xB!57=%$1E6+}j;m+* z4?C3Qa~CLPe|bGN^@w^S3JWiIfA(n&SQ*OaO1eb9`B?)6uK*Vl{epi{B9!9kJ7qbE z{_}vy7T|zTbwvUIiO?S_3ikV>wI$s=e6Dr1H`P2H-*xIYES+^o;=3=obgfrPk`$f{ z2prgbJ1z*J#Gn`BLj{9i%2z4IF_Y>-#}IabuRz@Z@m~p)qGcAjW-UkR*j~vagLBV?wtuqm!(5Mm5!y7@^d< z;BN?+MS!MDVBakWDL~%2QXc}4EZ2L%R1!*I>@j=MDf^t=H_9@G8(4f zYwZ)vv<&n8!*ea0DIV->Yr{E^Yt1O&fPqgojkO>dPO5+Wbp``oDA+~-zEV-DFs=gd zgn?y$;bs)<^+wQe9;<1s3_GI{K43vV!z5|~0+-GI$Xsf$d-Z?}y#01iupFXuulnjc zC3|N&d))is(eog>*NG)kbvNY!S<={B6VR%qi^W9b6F~1{$hq!Rhs!@*y!0FgsxLh? z^9XjFL$X7`&wt76`-J))46gZ-XwkbmwbzGcUye0h?@U(hj77{;&#}Co?sRarpOn+@ z3_Bc>nB6=m)Sb`B8@jIJqVT#7f8BrW`c%Zd5l9UUvaD%V`{$YFsK7ahTivNQ^CApr zF_7`np>tmHR{CX3Lbv-+L6D#n3~v&Bx4w0zw9eem*`p8qVv>B0`*ZWPKirP5=`N@~ z2dN2a!ENTl8?%JF2NFrpAl~5ht z-(hP+)f+Mn4>R;2s%rK9&eu}Xi*bjK{Hy_ym zkTR#j4i!7&-#Uc2KG8Er1|5AT-S?vlYm4J3?0sr$;GLCs-R{Y{#LA{|Zxk;EVL9FU z>AVf1r{CZ16SS$pJvUA|n#59nYMAzm9*boom~=KMibl+k(Jf-G+}(3}R)0on4bQZt ze(m+Ex6S~Jh9&9`z}wfC&5p%lAyyUD;?9a z2~}&uVIuy`kWQRn-mzQ7E{cTJDD}2)P&mtx)wr_zR}03f4cz@3pP4o$5`gVK_SSN< zeE%v|4Y$0#3MM=QcC~gOC(@(q;~?C095Ze-t-Fp<>T%rHc`^&(1{htS8==V0QvO+l zdVPfS2!-74OTkH?aQ7Dk?LoS%qER`k3(%h*tB1Et!}T9%{dr!wWmiLEo}OkuTlkQ? zFQTA9Q`A=6$>gsF;&B)F8$j|_hOP^h-UWJ!37F$&`Z&(e`IcUKbQNCGa&S)-cT$;; zzlpxg<_?zcOq&Z-IUQ|wyWG?^#!s>ZCKl{TwV;1?M@3O6J49{J{=`Ewzq5&DKLCuL z4a|*$WVH-A)?ZOf$*}+id`jiS6W17nmGu+p`ML{w^$z51Vx2Y6Xg|H*NaIMz14%`@ zz=oehfSK4<0op`;5ukrI{yj0dfEe%DnlxjI$+qr*<*h%=4ulTn4G zW2ra+fqO?68?9upC$q=)32YB~5BW-MXlPbj-geS-SN-D^e9^doNSb{VuUMuokfI}W zzb5$*Cb-Zu{w1Nq3#&q1FtHo;DTqI_?=%7(@1GlKMV@pon0s@`sbxROY_sl-D9Ytl zgev<|FvzM);Yk-XpT0`oV3xzWAEo3A_DQ*npZX-V#rfFXW&CK+px8y5t(Dv8!SfBz zH8q(=yXGzr`3wetr*!>$R8>rY^Re(-s-OXDV~c_2&Z`AY`U4!Cg&ME$E%_xm{AZkK z_&KI&ttbrlTM%erC*R=Jkt9sa7MJ zYx$pcXZ$I!Cz=z_jO+E@EyXxDaAO*;TzC-CpE`vEKY)az4`Y(CVS=?~&O!0%5^4T$ z%o}6Hph4mx0#Cjw0?+fWv{t;kGXjS=Lr_RFteCL z<8ob;uuUbZ#|S?o2@9pOo%z!b!pVJZO&@r>=tCv+6cyT~t!rpivVR*Dhq>T`phkWlchszLZazNkr)P zf$3=bZil9#p+qZ;UnU5ZJZ<}0q9@$qrGP-;!~fAoaTDb?R=mcAf8Qu*Nf;v8Mr-{( zMk+6(tR;yPUD_ot3+iFW0)vHa?;?iF1Dxs%CRswSb@eYaD+vAjvY=p~5j44r()pL? zqCfilLH`#?|$vf|6hbJg#dk5{D%lW=L6CK{1KJw^zt*^Doy&Fekx z{YZx%zI9@UlCi%}ICjFhzPLx$4!Be|IWu>!JkHgGnop3Lb~K_Y2frAz z^F&u&i+$l=sH2v$jA$}e^0uUI;|P?Ly|4RX!sM}f+2Cr;Got)FG(Cj4kMkywha`KP ztO~%OS)ERCG6K)z{HM zeS#C?N;BvPOTI%Dc2~nEhVsc~kvI%{gq_47P)j>-#Y=NK&&WO48gdWKwOZ3PeRFKd zdE19)J?k`4&YI5=7T5`RefliWJ4<=`d|*`sj|xYyJ#^(GFgm2X?hJf z*!PG)Vira=g5g#``WDd2X>+vq-OS(^d^9r8EBKmz~o zxOZ)jm;B%3=G;+%egFH*i`xPR{`Y6eBS6ja|BnCO@LwzaH#Gi>hnxQk2>+qRe^B{f ze)uno{zo1D<4gaW6aFKK|B=N1NaBAa@jsIIUp@W5IpP055n&_(yVt!PeAWJcYnsTk zgY$qr1~tWm^1Raoon!Bgd+k1I0-;$yJ-OF7w$Dg8g zqHrN5+2Jwia!B_eCY&8@#f2If0h`R$oS_@}%dk7cq3 znp50XxVODYFh#JbyD%M|LVJ?JQX;FV*$y=xrji|W;#OybJQ|{3b7JThHfBBdk45s> z*4&qV2=4nv?yGb}^2t*|6z03NbJFoHG_$%bLN&h(>JosNK9)1cRr{60w_M{^p`c;x zsvYva-P71%#&aC6XecOaoG!c@C8qW>sC}Glcp?hUb)nk}JRkW}VBhoorpWQSFK`U^ zRlN1XgL)Uff=%m&`nWfbo*IKarI%-K!3CVjT^%P4yJ$`ybgwPmA8ZLIzOnpkT8k>9 zEG%75-flEIh$jX^AEmT*g96B>?fRy-&Tf=G`88^oDBHG`UR;9S-p95eP8dq1=l zN%v{LtF7n17O>5lHG5C00Y64$qECwp+TAKPotPlu?~UEBXh6uvCT6DD-nDm=pOD_n z%y6u<^F>#NS8L;f*<}o)_Wo$b7VULiG^}P)nDU|fnvUK=VTkWt8owA;>#7vNpadT?jnK(;4+bOY&vr(yVEA-6)J3;e zB#Fw+7;Z>jx?tTBjlU4znERW~?0lV>k?9ETGIsk&mBSCeI4u75Zk3S7m*-9ILPIr1 zZhdHk-`1?#t&_yoFW1x#Y;>YLlvTPaZ@FDPemcp}XyNRzxzaGoyLnERHBQNPkFcsP z2O|>j-XE$YPvZBpb)lE{tDkUsI>YnQ4sRFkmWxPg#+|1j{BE3xO&mneXrwB0k9YB(r^BT-9NNH>8=si`@T-|9NA4?7cGg%#`v`6I}S8e$5p$&@L>9M5?6I2 z(z#0>Fwq5Gl9<4=-+u$*tkC0MGMT8Hiz^mHACari4kDx5n4Kpw$G;yuHVJo;Lu0%! z)sq2;N_Sev&-=UTHYV`x(bxH|7EwnY{vLvI2QNc3?pxpZ5n|IK{7$XFZ~2WU<@(h> zSCBeg(*-^+8|LAypGv;1#v<*dP}vvv{(P|UQJcPAZIxn{TSnBX)5DqP!%~g-(6P|S zAD7J*4*r7+M|}+V5U@;&?nc+2Rywtof5)0|5=voK(e=rz+9{6~4*I|z^Z%(bI1ADV zJo~L_o+xSo<%G5^`S70ax}%L5)4KUoV0E1HocJuTt(6~E&E*f!N)pir6JB>??Ihsc z?(D*T+Cs!tuG)zX7{`NRg9K$>mG?#Q8ofQg-FoXM+_h{gH^RSxDfynb#iR|5I7K9` z^d_WQ`-F%UmZo}`#VQmRGJMCU9Hnc@fu}>H9p18LOsl)I9A78e(n4Z((1A<7hU|X3 z439rMVSaU~RgVgh3$vaR;x}-%$?~W2yyUMtScR5lQ&tu-U8)pw{@tHp&L>nGjS?f? zuDo6!9oG9b)GfFq#o5U=LUkS;W6f?NZQULfQp-#+QAH(Ap32i&$5-kcD`**k%bwo| zxP0&P*Ga~#;afKCu+Ye{eTHPUfLs--T?k&xPbU0~OLaE~S==WlY!LH_GToCp+uW9k za8&^3fP`}{3eg@~L`0vH%kwUAw5VQmN^q%AyiPP{GJ~trlFmy_so(Zg;`%I>c}19O z*8deCxjVc4)4MwP!vj0@rM8hKFZo8(^N`Cjdky5DuSx~JZQ0(YNxcasNmyzAl?Pl| zzRG9>W~53WVOc7y6oi__&aLVUvp14WM1!lql>;5;a|D( za&`9E!yBWqwZ?NPjMn-A+aXi~^OtoscSvim;mR}JG$atU7q78MZ{xRhjqA7kk^f-) z>q@BQy_iT$H3WZ8xJ%B$@Jr1E{ww8~+(<%HQ3%qu;5xbr2#p-B%qsCOrxj-q-dTGX zQhyAhZ#Np2CQp+MnWTOyoUrxLlw(%+f*XHTX(cW>-4;;8kE z`1{~+F1e~3>;_%_=AMysYAx3g6M?D%hE5AyG%R4Ax^$ZJlVF6RiVLi5+yv|kk*_DU zZsL$xJ4O^kEWnFAHYmnq7hhF%;cXRf(uM;sRink5=RTgf- zcQ;I=PY$u|nB&%F0E+o4jk{h;fs=88Wgmg&uw7X%d~zO29=y!kc9)Q&5fhAx?jCni zW)qrvE(}|(77Wj=1fzzcYh|dLp4GFpKIU4M3(?7!M<<6gw9MzX#Iu?P(pmMw$THhEmw^}%WF=flb9Q2VMD>{X^{GMrtLy0g>M~O=tI%hM_2fFTidkFcp<)A!~sA&y)H``cW#$D8GBDGqM zOYFVazV$g(2IA{=WBS=!!4|?;(_lJFLYv#~QLO;BQfp%3Lo9fUBl6NtVS+zKr`?vu z6xyKO@9Fu7U%NYGktDqk4C?z~nb3{;6l$eZV)P^`sLjvQ0zjG^l_VL|o5b9|TWc2S z@9fR*aFA|&GzV_+n$qj8TgB}$fu>DEi)46Bz9V$k{I(*c=X?CES~P%Pp(fnU;KwYc zwHdo0fFkbVIN@ei+x4Zh{tHhdg!jZjU;A^!;)|%qm8HoA&UU0DF3>sQMrwjo2R5X! zh(XpZBYG%L+e^tjS$2>9CiDZ9rSl5@EXJ;z+Vhf8&)Ny{eFCzY#Q|=jZ$$i5v`?|V zH3tU`2(O6>m!Gg7(qMip?gLIPpC)wc<-jF2o2ZY4pR@nrUhncCiM9RM3?3Y82al>l zeVxX2x(=~xplD+_>>sj9(l|xb^K?{Yeud;=eYGG8Jw6M6i&q+-h6yVx`ZDIekQm{6 z$^M9j{gE*I9j^hhe(Uh~klr(+O%)yMhh_QA*}Ga68LYPux9d0TCRjG|N#17K!b7 zm$M6Tb9`;1+c-5U+uBfMm0#t9%h=i(q!CnGb_03ii;R}NXk&i$CiiG`84rA=EFH02 zq4bP!v-P(MbZlfJ&xruD@J|4R?uC@AQhz)P#8r+Z-Kk%=l*`k9qc+dHQGH@clmnH9$M)usx@*L1SFRa2N%EmgZ?KjV}Mhqs*>Xn*eAOgB=S;q4lpnBUNdCK)G< zzXxRTGJ8KH<%FzWIS}^&f5c6#KD$~s?hr{#E0?AXWl2@6#jEfA7kqs@4#u6T^M-mH zP*e0m>HXsKDiQ!Uw~T&8_~5T;rRU%+5d4-etpU-N zOS2ITssekzD(etQ95;3*x;CN93R+`sX_;qCj%%)UUkPx+Q2#h!go(L0y5RP1FA({x z(bsz0pX>4=2^xQji5EJVh$3yB`X14DGx&P*TSQ@BmnLMH8qIr|tXp3wyqJ5Nxa3(} zqtK|^Q$lWp5?vpJfwE0Ko~^mbH|D4ab2{=5@s@Fi2EveqZ;%t?8{ZLaj7FRK3s;Ro z7A}b%D8HRt_>S5Rj9yGn-R_M0d=#m1Iwv-mEUq=?dHzI2Bx~XxKx_c$6XR{XlZP%i z7c<)U)*|)C!pBN)>bFKX>xUEm36Ch<+*rC*me!@jXj#U&ybAN<5B1eL)pCJgjhdui zw#ZVgb`6!~CR`Y%)gL42IgM~L9XV=ukF#pi5F+M^LUV=3Imcjnr5>|q zTR`YpYs_5xvoag=oSW}>bu>V{G9+1#99;QhLSF}XVhy)fEp{FV{+(0c_?GqB^xB$d zJNzhFe{obbtbJ6s)o~z`w80xTe)LxO->bPJQQw}Ks9=MrdeEMvF?XPTnW|!3Gz2v@ z>~_8=bE(D>THn;-)68nOk_~B(QSn=}jap-qWVluJRhuiApkA6&%KZ8Tw7=&1#{}bA z8uUq0iBy?sm3wCb&W%4oBf7m&k#Y=jo_tKs)-~)}XVVh4c1tSld0GJq(S1dXwDl?QJ z$jhU8Fi*%_E0zPPXgzGAqZP1k)$F1%!X5yb-7WC(y!z)UUT=sQt+UY|_b>gE-nf#U zPBZ?|@o|!kC~NYF1yuzCO5gcC<9m3x!iN3muDtEpdAhC~EFW#HlrmfI>6}qL__>U; zFi{2Lf6Lf4={ zZ4EM9pks16c|Y$v?hpx!u7YoWZPg2_nmtk^P6^QSRaS9!J1LBlh4FKuoNZVvtFjV=fp2|a<<~Dhye&Hq&^id`!z<>L#cv2{C zLE&TKi!z9@o?0%nYZFvUsl@-YQ6q3rASM7Sxl+GRfb0$)jo%#D>UgNXyKf<<#~3M7 zf8PcK(QxnVo{!mpY}7HE|yE1YNu#kGi;Z4R_-YKH6#DBTr_v zh+}Kx)_ntOQlI?z0m9v84uPGh-%VhOOe#A$Nwd4Nx3oJO^h#L==9_Bua^Qnfe8qK-FS$9k(%`+QP4;SRM&3Xts8u@vq zmwqL<9Ad@tB)m(r!nb1dVSyFcn%_6SQWV}6Ea_8Q@Xfjsp>4y)qACci2Z$5U zAD@tfh~51VNebYf_wv-RmP~}{o@!y*?GcSG+82gJ+xDbvzA|ttv#QO5a`j zBCM})t{5KrV5#@Jf$z=!ED;uniP#gb;?~8N zk}qn$(tEHCC)*`86#s=f6!(6$bB=Q{$&7ye00CZZ7R&8N3Ez`_HU&Nu1_jH?o!oHn z%uT?-aFq$ZDMkQ4@?C&Eopw2d#x|m)yN)fi`PZqN1*GTY{=1)6<$w6J{KSAcHqw|T z&VSe{SyBX>qefrOL)3I;h}*X+VM5gsOJKsCR>)M_0juN3r2Bw-)#B& zlk%*%9;2J658n$mqlRn0V=X{h!>u*Pw+@%QrNm7a4=R5UUoEiJHcJlr+t2asSibsA z!THx;aKUDV{MEJNG^C*_`uo4}=8eJ*6XM4&Li7f_-r2fy3rJ{EjxKI>-eDmA935QJg2^oyFGI%7*Euw^^ z#||;n!|ZJ1HiB6J{yAef$EobL_8!e&bMa!8VTixs>y%Txwb>vQ@k1UiPx+_6O>bFH z7qja!-J&}Y|HkN8x7ca5jRteLgIEBn7!ZA;ccK$$K*F{QS#Hi^Jaf|<$w@A1wB&+GZTYcdC?9gozvOVL)h z?OnATyk!}5@)qkW1)#ZKY)Zr1rINg4v5Xhw8iD6;UJ3jmAeqSTcA9dO9P4jxL%Q03?CP6ZgU%XxvwSaaoED0lH9tE z!9u*O0x`KJ->-qsj>tVVmn?hnY3bR3(q$XMxbjiBEX1Um zveI?)J-^9E(TuZ)Uz&ZMdc71Wd+}oaE@$#S4eOxy+v`)^YVIgH)b zYZ+CsBl^uSa8rLeQR(oerZ$>N394X+{qm_T0iRAz+>hkx9jQ0i`Z6ZZ8`a2*CAA9f z_)yZA*Wi)cXK#C#wg)dX0FBCY{&Pw3fUk01>V!)`<$%81jZ6Nn3dJ|!N=^%xs!?Y7 znkJ*`QLC`cYU&CsY&bV!oC$Z;Extr07k|idVV~i*O*Yk3a}!~H$w=EnNxNhp&#?K> z$dY~AFu$}7*G-t~U!c8`9KPOBLdklH&fyQjox)XP&i)T=%@X4tF|PB`xMGCXTPdX^ z;9XmS9Rr9CJ_R*5*ciG`FmEgEPt>dL&5VD5x`5*}*?%}@YpvT`eMb+X<1k^abPqul z&Z&tHXJ=MZA zF%lopl3$1p)V%=-@16|ZYWnM>^l4c?yk%40BvRmVD%b{rP%s5#6Jos-S2{p03r2e; z7i559Y>XAF)n&7-)X}f&*}tT(t_up`JC>o*iqoBK18-ZlV+9NRFUYK)eY-(9K~2yL z!=U!0n-EV5XLSYRQmyD+rfJXR6?!}@L1qjpBhlRo@HeL`@jXVPyCGHYo_@qDjeo#e z5LQ=#kEi|o<>QjF8A3^*m257bKL6UrKHyh?i+Zuj!b4!qB7RhsYL~a3S!4(%`{`v% zJ1gJlOI^aoh>s()j_KTIoM_S$$z>?F%MSAg&pOy(o#*yWRA4El=AD`J`>YJ?!7K?x z={3ByFXXvP{McQw>0M#f++p8>j!!Go{xT$XMg~eVobT{9n(S gG~Z)0?2EK`xhK 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

IpTCtCPBp9} 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

`wo#C>$=%>!2QZ1WcJ$AY?8tM(w3WsDa@R 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

|5O5Y82#nu`MA_KS)26@tFRdst4 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

^H9W5Y=wLf>Er>XFuZdqv*XQY! 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 literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-port-hdpi-screen.png b/resources/android/splash/drawable-port-hdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..68b3e0c0a8c3007b16201254aa8f7470b1201f28 GIT binary patch literal 53674 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 literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-port-ldpi-screen.png b/resources/android/splash/drawable-port-ldpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..32929825929da65561fe0e36d805e997f3e1f038 GIT binary patch literal 18010 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 literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-port-mdpi-screen.png b/resources/android/splash/drawable-port-mdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..562092646a429450991795f6a0277a98abc65f25 GIT binary patch literal 29430 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 literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-port-xhdpi-screen.png b/resources/android/splash/drawable-port-xhdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..67dee84f56126f8eed379040b342d79400547130 GIT binary patch literal 89718 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 literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-port-xxhdpi-screen.png b/resources/android/splash/drawable-port-xxhdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..7da6176c2565b29453823fb39fb406681d5ba749 GIT binary patch literal 113804 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 literal 0 HcmV?d00001 diff --git a/scss/ionic.app.scss b/scss/ionic.app.scss new file mode 100644 index 0000000..9eb2f78 --- /dev/null +++ b/scss/ionic.app.scss @@ -0,0 +1,23 @@ +/* +To customize the look and feel of Ionic, you can override the variables +in ionic's _variables.scss file. + +For example, you might change some of the default colors: + +$light: #fff !default; +$stable: #f8f8f8 !default; +$positive: #387ef5 !default; +$calm: #11c1f3 !default; +$balanced: #33cd5f !default; +$energized: #ffc900 !default; +$assertive: #ef473a !default; +$royal: #886aea !default; +$dark: #444 !default; +*/ + +// The path for our ionicons font files, relative to the built CSS in www/css +$ionicons-font-path: "../lib/ionic/fonts" !default; + +// Include all of Ionic +@import "www/lib/ionic/scss/ionic"; + diff --git a/www/css/style.css b/www/css/style.css new file mode 100644 index 0000000..ac4eac2 --- /dev/null +++ b/www/css/style.css @@ -0,0 +1,15 @@ +table { + width: 100%; + margin-bottom: 10px; +} + +table > tbody > tr > td { + padding: 8px; + line-height: 1.4; + vertical-align: top; + border-top: 1px solid #ddd; +} + +table > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} diff --git a/www/img/ionic.png b/www/img/ionic.png new file mode 100644 index 0000000000000000000000000000000000000000..21c7f375997e6443b05e5fd50815271da1e2c3ec GIT binary patch literal 4757 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 V)A2w7aX)_)nHgO`RT#L({STJyPAvcc literal 0 HcmV?d00001 diff --git a/www/index.html b/www/index.html new file mode 100644 index 0000000..49d0515 --- /dev/null +++ b/www/index.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Voltar + + + + diff --git a/www/js/app.js b/www/js/app.js new file mode 100644 index 0000000..ae68226 --- /dev/null +++ b/www/js/app.js @@ -0,0 +1,23 @@ +// Ionic Starter App + +// angular.module is a global place for creating, registering and retrieving Angular modules +// 'starter' is the name of this angular module example (also set in a attribute in index.html) +// the 2nd parameter is an array of 'requires' +angular.module('calculoImcApp', ['ionic', 'app.routes']) +.run(function($ionicPlatform) { + $ionicPlatform.ready(function() { + if(window.cordova && window.cordova.plugins.Keyboard) { + // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard + // for form inputs) + cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); + + // Don't remove this line unless you know what you are doing. It stops the viewport + // from snapping when text inputs are focused. Ionic handles this internally for + // a much nicer keyboard experience. + cordova.plugins.Keyboard.disableScroll(true); + } + if(window.StatusBar) { + StatusBar.styleDefault(); + } + }); +}) diff --git a/www/js/app.routes.js b/www/js/app.routes.js new file mode 100644 index 0000000..155937f --- /dev/null +++ b/www/js/app.routes.js @@ -0,0 +1,16 @@ +angular.module('app.routes', []) + +.config(function($stateProvider, $urlRouterProvider) { + $stateProvider + .state('calculo', { + url: '/', + templateUrl: 'templates/calculo.html', + controller: 'calculoController' + }) + .state('resultado', { + url: '/resultado', + templateUrl: 'templates/resultado.html', + controller: 'resultadoController' + }) + $urlRouterProvider.otherwise('/') +}); diff --git a/www/js/controllers/calculoController.js b/www/js/controllers/calculoController.js new file mode 100644 index 0000000..bbcc773 --- /dev/null +++ b/www/js/controllers/calculoController.js @@ -0,0 +1,22 @@ +angular.module('calculoImcApp') +.controller('calculoController', function($scope, $rootScope, $ionicPopup, $location, calculoImc) { + $scope.dados = { }; + + //ng-submit="createTask(task)" + + + $scope.calcular = function (dados) { + if (!dados.peso) { + $ionicPopup.alert({ title: 'Erro', template: 'O peso é obrigatório' }); + } else if (!dados.altura) { + $ionicPopup.alert({ title: 'Erro', template: 'A altura é obrigatória' }); + } else { + var imc = calculoImc.calcular(dados.peso, dados.altura); + var faixa = calculoImc.getFaixa(imc); + + $rootScope.imc = imc; + $rootScope.faixa = faixa; + $location.path('/resultado'); + } + } +}); diff --git a/www/js/controllers/resultadoController.js b/www/js/controllers/resultadoController.js new file mode 100644 index 0000000..707696d --- /dev/null +++ b/www/js/controllers/resultadoController.js @@ -0,0 +1,4 @@ +angular.module('calculoImcApp') +.controller('resultadoController', function () { + +}); diff --git a/www/js/services/calculoImc.js b/www/js/services/calculoImc.js new file mode 100644 index 0000000..0224468 --- /dev/null +++ b/www/js/services/calculoImc.js @@ -0,0 +1,29 @@ +angular.module('calculoImcApp') +.service('calculoImc', function() { + this.calcular = function (peso, altura) { + //peso / (altura x altura) + var imc = peso / (altura * altura); + return imc; + }; + + this.getFaixa = function (imc) { + var faixa = ""; + if (imc < 17) { + faixa = "Muito abaixo do peso"; + } else if (imc >= 17 && imc <= 18.49) { + faixa = "Abaixo do peso"; + } else if (imc >= 18.5 && imc <= 24.99) { + faixa = "Peso normal"; + } else if (imc >= 25 && imc <= 29.99) { + faixa = "Acima do peso"; + } else if (imc >= 30 && imc <= 34.99) { + faixa = "Obesidade I"; + } else if (imc >= 35 && imc <= 39.99) { + faixa = "Obesidade II (severa)"; + } else if (imc > 40) { + faixa = "Obesidade III (mórbida)"; + } + + return faixa; + }; +}); diff --git a/www/lib/ionic/css/ionic.css b/www/lib/ionic/css/ionic.css new file mode 100644 index 0000000..9a4be17 --- /dev/null +++ b/www/lib/ionic/css/ionic.css @@ -0,0 +1,9729 @@ +@charset "UTF-8"; +/*! + * Copyright 2015 Drifty Co. + * http://drifty.com/ + * + * Ionic, v1.2.4 + * A powerful HTML5 mobile app framework. + * http://ionicframework.com/ + * + * By @maxlynch, @benjsperry, @adamdbradley <3 + * + * Licensed under the MIT license. Please see LICENSE for more information. + * + */ +/*! + Ionicons, v2.0.1 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. +*/ +@font-face { + font-family: "Ionicons"; + src: url("../fonts/ionicons.eot?v=2.0.1"); + src: url("../fonts/ionicons.eot?v=2.0.1#iefix") format("embedded-opentype"), url("../fonts/ionicons.ttf?v=2.0.1") format("truetype"), url("../fonts/ionicons.woff?v=2.0.1") format("woff"), url("../fonts/ionicons.woff") format("woff"), url("../fonts/ionicons.svg?v=2.0.1#Ionicons") format("svg"); + font-weight: normal; + font-style: normal; } + +.ion, .ionicons, +.ion-alert:before, +.ion-alert-circled:before, +.ion-android-add:before, +.ion-android-add-circle:before, +.ion-android-alarm-clock:before, +.ion-android-alert:before, +.ion-android-apps:before, +.ion-android-archive:before, +.ion-android-arrow-back:before, +.ion-android-arrow-down:before, +.ion-android-arrow-dropdown:before, +.ion-android-arrow-dropdown-circle:before, +.ion-android-arrow-dropleft:before, +.ion-android-arrow-dropleft-circle:before, +.ion-android-arrow-dropright:before, +.ion-android-arrow-dropright-circle:before, +.ion-android-arrow-dropup:before, +.ion-android-arrow-dropup-circle:before, +.ion-android-arrow-forward:before, +.ion-android-arrow-up:before, +.ion-android-attach:before, +.ion-android-bar:before, +.ion-android-bicycle:before, +.ion-android-boat:before, +.ion-android-bookmark:before, +.ion-android-bulb:before, +.ion-android-bus:before, +.ion-android-calendar:before, +.ion-android-call:before, +.ion-android-camera:before, +.ion-android-cancel:before, +.ion-android-car:before, +.ion-android-cart:before, +.ion-android-chat:before, +.ion-android-checkbox:before, +.ion-android-checkbox-blank:before, +.ion-android-checkbox-outline:before, +.ion-android-checkbox-outline-blank:before, +.ion-android-checkmark-circle:before, +.ion-android-clipboard:before, +.ion-android-close:before, +.ion-android-cloud:before, +.ion-android-cloud-circle:before, +.ion-android-cloud-done:before, +.ion-android-cloud-outline:before, +.ion-android-color-palette:before, +.ion-android-compass:before, +.ion-android-contact:before, +.ion-android-contacts:before, +.ion-android-contract:before, +.ion-android-create:before, +.ion-android-delete:before, +.ion-android-desktop:before, +.ion-android-document:before, +.ion-android-done:before, +.ion-android-done-all:before, +.ion-android-download:before, +.ion-android-drafts:before, +.ion-android-exit:before, +.ion-android-expand:before, +.ion-android-favorite:before, +.ion-android-favorite-outline:before, +.ion-android-film:before, +.ion-android-folder:before, +.ion-android-folder-open:before, +.ion-android-funnel:before, +.ion-android-globe:before, +.ion-android-hand:before, +.ion-android-hangout:before, +.ion-android-happy:before, +.ion-android-home:before, +.ion-android-image:before, +.ion-android-laptop:before, +.ion-android-list:before, +.ion-android-locate:before, +.ion-android-lock:before, +.ion-android-mail:before, +.ion-android-map:before, +.ion-android-menu:before, +.ion-android-microphone:before, +.ion-android-microphone-off:before, +.ion-android-more-horizontal:before, +.ion-android-more-vertical:before, +.ion-android-navigate:before, +.ion-android-notifications:before, +.ion-android-notifications-none:before, +.ion-android-notifications-off:before, +.ion-android-open:before, +.ion-android-options:before, +.ion-android-people:before, +.ion-android-person:before, +.ion-android-person-add:before, +.ion-android-phone-landscape:before, +.ion-android-phone-portrait:before, +.ion-android-pin:before, +.ion-android-plane:before, +.ion-android-playstore:before, +.ion-android-print:before, +.ion-android-radio-button-off:before, +.ion-android-radio-button-on:before, +.ion-android-refresh:before, +.ion-android-remove:before, +.ion-android-remove-circle:before, +.ion-android-restaurant:before, +.ion-android-sad:before, +.ion-android-search:before, +.ion-android-send:before, +.ion-android-settings:before, +.ion-android-share:before, +.ion-android-share-alt:before, +.ion-android-star:before, +.ion-android-star-half:before, +.ion-android-star-outline:before, +.ion-android-stopwatch:before, +.ion-android-subway:before, +.ion-android-sunny:before, +.ion-android-sync:before, +.ion-android-textsms:before, +.ion-android-time:before, +.ion-android-train:before, +.ion-android-unlock:before, +.ion-android-upload:before, +.ion-android-volume-down:before, +.ion-android-volume-mute:before, +.ion-android-volume-off:before, +.ion-android-volume-up:before, +.ion-android-walk:before, +.ion-android-warning:before, +.ion-android-watch:before, +.ion-android-wifi:before, +.ion-aperture:before, +.ion-archive:before, +.ion-arrow-down-a:before, +.ion-arrow-down-b:before, +.ion-arrow-down-c:before, +.ion-arrow-expand:before, +.ion-arrow-graph-down-left:before, +.ion-arrow-graph-down-right:before, +.ion-arrow-graph-up-left:before, +.ion-arrow-graph-up-right:before, +.ion-arrow-left-a:before, +.ion-arrow-left-b:before, +.ion-arrow-left-c:before, +.ion-arrow-move:before, +.ion-arrow-resize:before, +.ion-arrow-return-left:before, +.ion-arrow-return-right:before, +.ion-arrow-right-a:before, +.ion-arrow-right-b:before, +.ion-arrow-right-c:before, +.ion-arrow-shrink:before, +.ion-arrow-swap:before, +.ion-arrow-up-a:before, +.ion-arrow-up-b:before, +.ion-arrow-up-c:before, +.ion-asterisk:before, +.ion-at:before, +.ion-backspace:before, +.ion-backspace-outline:before, +.ion-bag:before, +.ion-battery-charging:before, +.ion-battery-empty:before, +.ion-battery-full:before, +.ion-battery-half:before, +.ion-battery-low:before, +.ion-beaker:before, +.ion-beer:before, +.ion-bluetooth:before, +.ion-bonfire:before, +.ion-bookmark:before, +.ion-bowtie:before, +.ion-briefcase:before, +.ion-bug:before, +.ion-calculator:before, +.ion-calendar:before, +.ion-camera:before, +.ion-card:before, +.ion-cash:before, +.ion-chatbox:before, +.ion-chatbox-working:before, +.ion-chatboxes:before, +.ion-chatbubble:before, +.ion-chatbubble-working:before, +.ion-chatbubbles:before, +.ion-checkmark:before, +.ion-checkmark-circled:before, +.ion-checkmark-round:before, +.ion-chevron-down:before, +.ion-chevron-left:before, +.ion-chevron-right:before, +.ion-chevron-up:before, +.ion-clipboard:before, +.ion-clock:before, +.ion-close:before, +.ion-close-circled:before, +.ion-close-round:before, +.ion-closed-captioning:before, +.ion-cloud:before, +.ion-code:before, +.ion-code-download:before, +.ion-code-working:before, +.ion-coffee:before, +.ion-compass:before, +.ion-compose:before, +.ion-connection-bars:before, +.ion-contrast:before, +.ion-crop:before, +.ion-cube:before, +.ion-disc:before, +.ion-document:before, +.ion-document-text:before, +.ion-drag:before, +.ion-earth:before, +.ion-easel:before, +.ion-edit:before, +.ion-egg:before, +.ion-eject:before, +.ion-email:before, +.ion-email-unread:before, +.ion-erlenmeyer-flask:before, +.ion-erlenmeyer-flask-bubbles:before, +.ion-eye:before, +.ion-eye-disabled:before, +.ion-female:before, +.ion-filing:before, +.ion-film-marker:before, +.ion-fireball:before, +.ion-flag:before, +.ion-flame:before, +.ion-flash:before, +.ion-flash-off:before, +.ion-folder:before, +.ion-fork:before, +.ion-fork-repo:before, +.ion-forward:before, +.ion-funnel:before, +.ion-gear-a:before, +.ion-gear-b:before, +.ion-grid:before, +.ion-hammer:before, +.ion-happy:before, +.ion-happy-outline:before, +.ion-headphone:before, +.ion-heart:before, +.ion-heart-broken:before, +.ion-help:before, +.ion-help-buoy:before, +.ion-help-circled:before, +.ion-home:before, +.ion-icecream:before, +.ion-image:before, +.ion-images:before, +.ion-information:before, +.ion-information-circled:before, +.ion-ionic:before, +.ion-ios-alarm:before, +.ion-ios-alarm-outline:before, +.ion-ios-albums:before, +.ion-ios-albums-outline:before, +.ion-ios-americanfootball:before, +.ion-ios-americanfootball-outline:before, +.ion-ios-analytics:before, +.ion-ios-analytics-outline:before, +.ion-ios-arrow-back:before, +.ion-ios-arrow-down:before, +.ion-ios-arrow-forward:before, +.ion-ios-arrow-left:before, +.ion-ios-arrow-right:before, +.ion-ios-arrow-thin-down:before, +.ion-ios-arrow-thin-left:before, +.ion-ios-arrow-thin-right:before, +.ion-ios-arrow-thin-up:before, +.ion-ios-arrow-up:before, +.ion-ios-at:before, +.ion-ios-at-outline:before, +.ion-ios-barcode:before, +.ion-ios-barcode-outline:before, +.ion-ios-baseball:before, +.ion-ios-baseball-outline:before, +.ion-ios-basketball:before, +.ion-ios-basketball-outline:before, +.ion-ios-bell:before, +.ion-ios-bell-outline:before, +.ion-ios-body:before, +.ion-ios-body-outline:before, +.ion-ios-bolt:before, +.ion-ios-bolt-outline:before, +.ion-ios-book:before, +.ion-ios-book-outline:before, +.ion-ios-bookmarks:before, +.ion-ios-bookmarks-outline:before, +.ion-ios-box:before, +.ion-ios-box-outline:before, +.ion-ios-briefcase:before, +.ion-ios-briefcase-outline:before, +.ion-ios-browsers:before, +.ion-ios-browsers-outline:before, +.ion-ios-calculator:before, +.ion-ios-calculator-outline:before, +.ion-ios-calendar:before, +.ion-ios-calendar-outline:before, +.ion-ios-camera:before, +.ion-ios-camera-outline:before, +.ion-ios-cart:before, +.ion-ios-cart-outline:before, +.ion-ios-chatboxes:before, +.ion-ios-chatboxes-outline:before, +.ion-ios-chatbubble:before, +.ion-ios-chatbubble-outline:before, +.ion-ios-checkmark:before, +.ion-ios-checkmark-empty:before, +.ion-ios-checkmark-outline:before, +.ion-ios-circle-filled:before, +.ion-ios-circle-outline:before, +.ion-ios-clock:before, +.ion-ios-clock-outline:before, +.ion-ios-close:before, +.ion-ios-close-empty:before, +.ion-ios-close-outline:before, +.ion-ios-cloud:before, +.ion-ios-cloud-download:before, +.ion-ios-cloud-download-outline:before, +.ion-ios-cloud-outline:before, +.ion-ios-cloud-upload:before, +.ion-ios-cloud-upload-outline:before, +.ion-ios-cloudy:before, +.ion-ios-cloudy-night:before, +.ion-ios-cloudy-night-outline:before, +.ion-ios-cloudy-outline:before, +.ion-ios-cog:before, +.ion-ios-cog-outline:before, +.ion-ios-color-filter:before, +.ion-ios-color-filter-outline:before, +.ion-ios-color-wand:before, +.ion-ios-color-wand-outline:before, +.ion-ios-compose:before, +.ion-ios-compose-outline:before, +.ion-ios-contact:before, +.ion-ios-contact-outline:before, +.ion-ios-copy:before, +.ion-ios-copy-outline:before, +.ion-ios-crop:before, +.ion-ios-crop-strong:before, +.ion-ios-download:before, +.ion-ios-download-outline:before, +.ion-ios-drag:before, +.ion-ios-email:before, +.ion-ios-email-outline:before, +.ion-ios-eye:before, +.ion-ios-eye-outline:before, +.ion-ios-fastforward:before, +.ion-ios-fastforward-outline:before, +.ion-ios-filing:before, +.ion-ios-filing-outline:before, +.ion-ios-film:before, +.ion-ios-film-outline:before, +.ion-ios-flag:before, +.ion-ios-flag-outline:before, +.ion-ios-flame:before, +.ion-ios-flame-outline:before, +.ion-ios-flask:before, +.ion-ios-flask-outline:before, +.ion-ios-flower:before, +.ion-ios-flower-outline:before, +.ion-ios-folder:before, +.ion-ios-folder-outline:before, +.ion-ios-football:before, +.ion-ios-football-outline:before, +.ion-ios-game-controller-a:before, +.ion-ios-game-controller-a-outline:before, +.ion-ios-game-controller-b:before, +.ion-ios-game-controller-b-outline:before, +.ion-ios-gear:before, +.ion-ios-gear-outline:before, +.ion-ios-glasses:before, +.ion-ios-glasses-outline:before, +.ion-ios-grid-view:before, +.ion-ios-grid-view-outline:before, +.ion-ios-heart:before, +.ion-ios-heart-outline:before, +.ion-ios-help:before, +.ion-ios-help-empty:before, +.ion-ios-help-outline:before, +.ion-ios-home:before, +.ion-ios-home-outline:before, +.ion-ios-infinite:before, +.ion-ios-infinite-outline:before, +.ion-ios-information:before, +.ion-ios-information-empty:before, +.ion-ios-information-outline:before, +.ion-ios-ionic-outline:before, +.ion-ios-keypad:before, +.ion-ios-keypad-outline:before, +.ion-ios-lightbulb:before, +.ion-ios-lightbulb-outline:before, +.ion-ios-list:before, +.ion-ios-list-outline:before, +.ion-ios-location:before, +.ion-ios-location-outline:before, +.ion-ios-locked:before, +.ion-ios-locked-outline:before, +.ion-ios-loop:before, +.ion-ios-loop-strong:before, +.ion-ios-medical:before, +.ion-ios-medical-outline:before, +.ion-ios-medkit:before, +.ion-ios-medkit-outline:before, +.ion-ios-mic:before, +.ion-ios-mic-off:before, +.ion-ios-mic-outline:before, +.ion-ios-minus:before, +.ion-ios-minus-empty:before, +.ion-ios-minus-outline:before, +.ion-ios-monitor:before, +.ion-ios-monitor-outline:before, +.ion-ios-moon:before, +.ion-ios-moon-outline:before, +.ion-ios-more:before, +.ion-ios-more-outline:before, +.ion-ios-musical-note:before, +.ion-ios-musical-notes:before, +.ion-ios-navigate:before, +.ion-ios-navigate-outline:before, +.ion-ios-nutrition:before, +.ion-ios-nutrition-outline:before, +.ion-ios-paper:before, +.ion-ios-paper-outline:before, +.ion-ios-paperplane:before, +.ion-ios-paperplane-outline:before, +.ion-ios-partlysunny:before, +.ion-ios-partlysunny-outline:before, +.ion-ios-pause:before, +.ion-ios-pause-outline:before, +.ion-ios-paw:before, +.ion-ios-paw-outline:before, +.ion-ios-people:before, +.ion-ios-people-outline:before, +.ion-ios-person:before, +.ion-ios-person-outline:before, +.ion-ios-personadd:before, +.ion-ios-personadd-outline:before, +.ion-ios-photos:before, +.ion-ios-photos-outline:before, +.ion-ios-pie:before, +.ion-ios-pie-outline:before, +.ion-ios-pint:before, +.ion-ios-pint-outline:before, +.ion-ios-play:before, +.ion-ios-play-outline:before, +.ion-ios-plus:before, +.ion-ios-plus-empty:before, +.ion-ios-plus-outline:before, +.ion-ios-pricetag:before, +.ion-ios-pricetag-outline:before, +.ion-ios-pricetags:before, +.ion-ios-pricetags-outline:before, +.ion-ios-printer:before, +.ion-ios-printer-outline:before, +.ion-ios-pulse:before, +.ion-ios-pulse-strong:before, +.ion-ios-rainy:before, +.ion-ios-rainy-outline:before, +.ion-ios-recording:before, +.ion-ios-recording-outline:before, +.ion-ios-redo:before, +.ion-ios-redo-outline:before, +.ion-ios-refresh:before, +.ion-ios-refresh-empty:before, +.ion-ios-refresh-outline:before, +.ion-ios-reload:before, +.ion-ios-reverse-camera:before, +.ion-ios-reverse-camera-outline:before, +.ion-ios-rewind:before, +.ion-ios-rewind-outline:before, +.ion-ios-rose:before, +.ion-ios-rose-outline:before, +.ion-ios-search:before, +.ion-ios-search-strong:before, +.ion-ios-settings:before, +.ion-ios-settings-strong:before, +.ion-ios-shuffle:before, +.ion-ios-shuffle-strong:before, +.ion-ios-skipbackward:before, +.ion-ios-skipbackward-outline:before, +.ion-ios-skipforward:before, +.ion-ios-skipforward-outline:before, +.ion-ios-snowy:before, +.ion-ios-speedometer:before, +.ion-ios-speedometer-outline:before, +.ion-ios-star:before, +.ion-ios-star-half:before, +.ion-ios-star-outline:before, +.ion-ios-stopwatch:before, +.ion-ios-stopwatch-outline:before, +.ion-ios-sunny:before, +.ion-ios-sunny-outline:before, +.ion-ios-telephone:before, +.ion-ios-telephone-outline:before, +.ion-ios-tennisball:before, +.ion-ios-tennisball-outline:before, +.ion-ios-thunderstorm:before, +.ion-ios-thunderstorm-outline:before, +.ion-ios-time:before, +.ion-ios-time-outline:before, +.ion-ios-timer:before, +.ion-ios-timer-outline:before, +.ion-ios-toggle:before, +.ion-ios-toggle-outline:before, +.ion-ios-trash:before, +.ion-ios-trash-outline:before, +.ion-ios-undo:before, +.ion-ios-undo-outline:before, +.ion-ios-unlocked:before, +.ion-ios-unlocked-outline:before, +.ion-ios-upload:before, +.ion-ios-upload-outline:before, +.ion-ios-videocam:before, +.ion-ios-videocam-outline:before, +.ion-ios-volume-high:before, +.ion-ios-volume-low:before, +.ion-ios-wineglass:before, +.ion-ios-wineglass-outline:before, +.ion-ios-world:before, +.ion-ios-world-outline:before, +.ion-ipad:before, +.ion-iphone:before, +.ion-ipod:before, +.ion-jet:before, +.ion-key:before, +.ion-knife:before, +.ion-laptop:before, +.ion-leaf:before, +.ion-levels:before, +.ion-lightbulb:before, +.ion-link:before, +.ion-load-a:before, +.ion-load-b:before, +.ion-load-c:before, +.ion-load-d:before, +.ion-location:before, +.ion-lock-combination:before, +.ion-locked:before, +.ion-log-in:before, +.ion-log-out:before, +.ion-loop:before, +.ion-magnet:before, +.ion-male:before, +.ion-man:before, +.ion-map:before, +.ion-medkit:before, +.ion-merge:before, +.ion-mic-a:before, +.ion-mic-b:before, +.ion-mic-c:before, +.ion-minus:before, +.ion-minus-circled:before, +.ion-minus-round:before, +.ion-model-s:before, +.ion-monitor:before, +.ion-more:before, +.ion-mouse:before, +.ion-music-note:before, +.ion-navicon:before, +.ion-navicon-round:before, +.ion-navigate:before, +.ion-network:before, +.ion-no-smoking:before, +.ion-nuclear:before, +.ion-outlet:before, +.ion-paintbrush:before, +.ion-paintbucket:before, +.ion-paper-airplane:before, +.ion-paperclip:before, +.ion-pause:before, +.ion-person:before, +.ion-person-add:before, +.ion-person-stalker:before, +.ion-pie-graph:before, +.ion-pin:before, +.ion-pinpoint:before, +.ion-pizza:before, +.ion-plane:before, +.ion-planet:before, +.ion-play:before, +.ion-playstation:before, +.ion-plus:before, +.ion-plus-circled:before, +.ion-plus-round:before, +.ion-podium:before, +.ion-pound:before, +.ion-power:before, +.ion-pricetag:before, +.ion-pricetags:before, +.ion-printer:before, +.ion-pull-request:before, +.ion-qr-scanner:before, +.ion-quote:before, +.ion-radio-waves:before, +.ion-record:before, +.ion-refresh:before, +.ion-reply:before, +.ion-reply-all:before, +.ion-ribbon-a:before, +.ion-ribbon-b:before, +.ion-sad:before, +.ion-sad-outline:before, +.ion-scissors:before, +.ion-search:before, +.ion-settings:before, +.ion-share:before, +.ion-shuffle:before, +.ion-skip-backward:before, +.ion-skip-forward:before, +.ion-social-android:before, +.ion-social-android-outline:before, +.ion-social-angular:before, +.ion-social-angular-outline:before, +.ion-social-apple:before, +.ion-social-apple-outline:before, +.ion-social-bitcoin:before, +.ion-social-bitcoin-outline:before, +.ion-social-buffer:before, +.ion-social-buffer-outline:before, +.ion-social-chrome:before, +.ion-social-chrome-outline:before, +.ion-social-codepen:before, +.ion-social-codepen-outline:before, +.ion-social-css3:before, +.ion-social-css3-outline:before, +.ion-social-designernews:before, +.ion-social-designernews-outline:before, +.ion-social-dribbble:before, +.ion-social-dribbble-outline:before, +.ion-social-dropbox:before, +.ion-social-dropbox-outline:before, +.ion-social-euro:before, +.ion-social-euro-outline:before, +.ion-social-facebook:before, +.ion-social-facebook-outline:before, +.ion-social-foursquare:before, +.ion-social-foursquare-outline:before, +.ion-social-freebsd-devil:before, +.ion-social-github:before, +.ion-social-github-outline:before, +.ion-social-google:before, +.ion-social-google-outline:before, +.ion-social-googleplus:before, +.ion-social-googleplus-outline:before, +.ion-social-hackernews:before, +.ion-social-hackernews-outline:before, +.ion-social-html5:before, +.ion-social-html5-outline:before, +.ion-social-instagram:before, +.ion-social-instagram-outline:before, +.ion-social-javascript:before, +.ion-social-javascript-outline:before, +.ion-social-linkedin:before, +.ion-social-linkedin-outline:before, +.ion-social-markdown:before, +.ion-social-nodejs:before, +.ion-social-octocat:before, +.ion-social-pinterest:before, +.ion-social-pinterest-outline:before, +.ion-social-python:before, +.ion-social-reddit:before, +.ion-social-reddit-outline:before, +.ion-social-rss:before, +.ion-social-rss-outline:before, +.ion-social-sass:before, +.ion-social-skype:before, +.ion-social-skype-outline:before, +.ion-social-snapchat:before, +.ion-social-snapchat-outline:before, +.ion-social-tumblr:before, +.ion-social-tumblr-outline:before, +.ion-social-tux:before, +.ion-social-twitch:before, +.ion-social-twitch-outline:before, +.ion-social-twitter:before, +.ion-social-twitter-outline:before, +.ion-social-usd:before, +.ion-social-usd-outline:before, +.ion-social-vimeo:before, +.ion-social-vimeo-outline:before, +.ion-social-whatsapp:before, +.ion-social-whatsapp-outline:before, +.ion-social-windows:before, +.ion-social-windows-outline:before, +.ion-social-wordpress:before, +.ion-social-wordpress-outline:before, +.ion-social-yahoo:before, +.ion-social-yahoo-outline:before, +.ion-social-yen:before, +.ion-social-yen-outline:before, +.ion-social-youtube:before, +.ion-social-youtube-outline:before, +.ion-soup-can:before, +.ion-soup-can-outline:before, +.ion-speakerphone:before, +.ion-speedometer:before, +.ion-spoon:before, +.ion-star:before, +.ion-stats-bars:before, +.ion-steam:before, +.ion-stop:before, +.ion-thermometer:before, +.ion-thumbsdown:before, +.ion-thumbsup:before, +.ion-toggle:before, +.ion-toggle-filled:before, +.ion-transgender:before, +.ion-trash-a:before, +.ion-trash-b:before, +.ion-trophy:before, +.ion-tshirt:before, +.ion-tshirt-outline:before, +.ion-umbrella:before, +.ion-university:before, +.ion-unlocked:before, +.ion-upload:before, +.ion-usb:before, +.ion-videocamera:before, +.ion-volume-high:before, +.ion-volume-low:before, +.ion-volume-medium:before, +.ion-volume-mute:before, +.ion-wand:before, +.ion-waterdrop:before, +.ion-wifi:before, +.ion-wineglass:before, +.ion-woman:before, +.ion-wrench:before, +.ion-xbox:before { + display: inline-block; + font-family: "Ionicons"; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + text-rendering: auto; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.ion-alert:before { + content: ""; } + +.ion-alert-circled:before { + content: ""; } + +.ion-android-add:before { + content: ""; } + +.ion-android-add-circle:before { + content: ""; } + +.ion-android-alarm-clock:before { + content: ""; } + +.ion-android-alert:before { + content: ""; } + +.ion-android-apps:before { + content: ""; } + +.ion-android-archive:before { + content: ""; } + +.ion-android-arrow-back:before { + content: ""; } + +.ion-android-arrow-down:before { + content: ""; } + +.ion-android-arrow-dropdown:before { + content: ""; } + +.ion-android-arrow-dropdown-circle:before { + content: ""; } + +.ion-android-arrow-dropleft:before { + content: ""; } + +.ion-android-arrow-dropleft-circle:before { + content: ""; } + +.ion-android-arrow-dropright:before { + content: ""; } + +.ion-android-arrow-dropright-circle:before { + content: ""; } + +.ion-android-arrow-dropup:before { + content: ""; } + +.ion-android-arrow-dropup-circle:before { + content: ""; } + +.ion-android-arrow-forward:before { + content: ""; } + +.ion-android-arrow-up:before { + content: ""; } + +.ion-android-attach:before { + content: ""; } + +.ion-android-bar:before { + content: ""; } + +.ion-android-bicycle:before { + content: ""; } + +.ion-android-boat:before { + content: ""; } + +.ion-android-bookmark:before { + content: ""; } + +.ion-android-bulb:before { + content: ""; } + +.ion-android-bus:before { + content: ""; } + +.ion-android-calendar:before { + content: ""; } + +.ion-android-call:before { + content: ""; } + +.ion-android-camera:before { + content: ""; } + +.ion-android-cancel:before { + content: ""; } + +.ion-android-car:before { + content: ""; } + +.ion-android-cart:before { + content: ""; } + +.ion-android-chat:before { + content: ""; } + +.ion-android-checkbox:before { + content: ""; } + +.ion-android-checkbox-blank:before { + content: ""; } + +.ion-android-checkbox-outline:before { + content: ""; } + +.ion-android-checkbox-outline-blank:before { + content: ""; } + +.ion-android-checkmark-circle:before { + content: ""; } + +.ion-android-clipboard:before { + content: ""; } + +.ion-android-close:before { + content: ""; } + +.ion-android-cloud:before { + content: ""; } + +.ion-android-cloud-circle:before { + content: ""; } + +.ion-android-cloud-done:before { + content: ""; } + +.ion-android-cloud-outline:before { + content: ""; } + +.ion-android-color-palette:before { + content: ""; } + +.ion-android-compass:before { + content: ""; } + +.ion-android-contact:before { + content: ""; } + +.ion-android-contacts:before { + content: ""; } + +.ion-android-contract:before { + content: ""; } + +.ion-android-create:before { + content: ""; } + +.ion-android-delete:before { + content: ""; } + +.ion-android-desktop:before { + content: ""; } + +.ion-android-document:before { + content: ""; } + +.ion-android-done:before { + content: ""; } + +.ion-android-done-all:before { + content: ""; } + +.ion-android-download:before { + content: ""; } + +.ion-android-drafts:before { + content: ""; } + +.ion-android-exit:before { + content: ""; } + +.ion-android-expand:before { + content: ""; } + +.ion-android-favorite:before { + content: ""; } + +.ion-android-favorite-outline:before { + content: ""; } + +.ion-android-film:before { + content: ""; } + +.ion-android-folder:before { + content: ""; } + +.ion-android-folder-open:before { + content: ""; } + +.ion-android-funnel:before { + content: ""; } + +.ion-android-globe:before { + content: ""; } + +.ion-android-hand:before { + content: ""; } + +.ion-android-hangout:before { + content: ""; } + +.ion-android-happy:before { + content: ""; } + +.ion-android-home:before { + content: ""; } + +.ion-android-image:before { + content: ""; } + +.ion-android-laptop:before { + content: ""; } + +.ion-android-list:before { + content: ""; } + +.ion-android-locate:before { + content: ""; } + +.ion-android-lock:before { + content: ""; } + +.ion-android-mail:before { + content: ""; } + +.ion-android-map:before { + content: ""; } + +.ion-android-menu:before { + content: ""; } + +.ion-android-microphone:before { + content: ""; } + +.ion-android-microphone-off:before { + content: ""; } + +.ion-android-more-horizontal:before { + content: ""; } + +.ion-android-more-vertical:before { + content: ""; } + +.ion-android-navigate:before { + content: ""; } + +.ion-android-notifications:before { + content: ""; } + +.ion-android-notifications-none:before { + content: ""; } + +.ion-android-notifications-off:before { + content: ""; } + +.ion-android-open:before { + content: ""; } + +.ion-android-options:before { + content: ""; } + +.ion-android-people:before { + content: ""; } + +.ion-android-person:before { + content: ""; } + +.ion-android-person-add:before { + content: ""; } + +.ion-android-phone-landscape:before { + content: ""; } + +.ion-android-phone-portrait:before { + content: ""; } + +.ion-android-pin:before { + content: ""; } + +.ion-android-plane:before { + content: ""; } + +.ion-android-playstore:before { + content: ""; } + +.ion-android-print:before { + content: ""; } + +.ion-android-radio-button-off:before { + content: ""; } + +.ion-android-radio-button-on:before { + content: ""; } + +.ion-android-refresh:before { + content: ""; } + +.ion-android-remove:before { + content: ""; } + +.ion-android-remove-circle:before { + content: ""; } + +.ion-android-restaurant:before { + content: ""; } + +.ion-android-sad:before { + content: ""; } + +.ion-android-search:before { + content: ""; } + +.ion-android-send:before { + content: ""; } + +.ion-android-settings:before { + content: ""; } + +.ion-android-share:before { + content: ""; } + +.ion-android-share-alt:before { + content: ""; } + +.ion-android-star:before { + content: ""; } + +.ion-android-star-half:before { + content: ""; } + +.ion-android-star-outline:before { + content: ""; } + +.ion-android-stopwatch:before { + content: ""; } + +.ion-android-subway:before { + content: ""; } + +.ion-android-sunny:before { + content: ""; } + +.ion-android-sync:before { + content: ""; } + +.ion-android-textsms:before { + content: ""; } + +.ion-android-time:before { + content: ""; } + +.ion-android-train:before { + content: ""; } + +.ion-android-unlock:before { + content: ""; } + +.ion-android-upload:before { + content: ""; } + +.ion-android-volume-down:before { + content: ""; } + +.ion-android-volume-mute:before { + content: ""; } + +.ion-android-volume-off:before { + content: ""; } + +.ion-android-volume-up:before { + content: ""; } + +.ion-android-walk:before { + content: ""; } + +.ion-android-warning:before { + content: ""; } + +.ion-android-watch:before { + content: ""; } + +.ion-android-wifi:before { + content: ""; } + +.ion-aperture:before { + content: ""; } + +.ion-archive:before { + content: ""; } + +.ion-arrow-down-a:before { + content: ""; } + +.ion-arrow-down-b:before { + content: ""; } + +.ion-arrow-down-c:before { + content: ""; } + +.ion-arrow-expand:before { + content: ""; } + +.ion-arrow-graph-down-left:before { + content: ""; } + +.ion-arrow-graph-down-right:before { + content: ""; } + +.ion-arrow-graph-up-left:before { + content: ""; } + +.ion-arrow-graph-up-right:before { + content: ""; } + +.ion-arrow-left-a:before { + content: ""; } + +.ion-arrow-left-b:before { + content: ""; } + +.ion-arrow-left-c:before { + content: ""; } + +.ion-arrow-move:before { + content: ""; } + +.ion-arrow-resize:before { + content: ""; } + +.ion-arrow-return-left:before { + content: ""; } + +.ion-arrow-return-right:before { + content: ""; } + +.ion-arrow-right-a:before { + content: ""; } + +.ion-arrow-right-b:before { + content: ""; } + +.ion-arrow-right-c:before { + content: ""; } + +.ion-arrow-shrink:before { + content: ""; } + +.ion-arrow-swap:before { + content: ""; } + +.ion-arrow-up-a:before { + content: ""; } + +.ion-arrow-up-b:before { + content: ""; } + +.ion-arrow-up-c:before { + content: ""; } + +.ion-asterisk:before { + content: ""; } + +.ion-at:before { + content: ""; } + +.ion-backspace:before { + content: ""; } + +.ion-backspace-outline:before { + content: ""; } + +.ion-bag:before { + content: ""; } + +.ion-battery-charging:before { + content: ""; } + +.ion-battery-empty:before { + content: ""; } + +.ion-battery-full:before { + content: ""; } + +.ion-battery-half:before { + content: ""; } + +.ion-battery-low:before { + content: ""; } + +.ion-beaker:before { + content: ""; } + +.ion-beer:before { + content: ""; } + +.ion-bluetooth:before { + content: ""; } + +.ion-bonfire:before { + content: ""; } + +.ion-bookmark:before { + content: ""; } + +.ion-bowtie:before { + content: ""; } + +.ion-briefcase:before { + content: ""; } + +.ion-bug:before { + content: ""; } + +.ion-calculator:before { + content: ""; } + +.ion-calendar:before { + content: ""; } + +.ion-camera:before { + content: ""; } + +.ion-card:before { + content: ""; } + +.ion-cash:before { + content: ""; } + +.ion-chatbox:before { + content: ""; } + +.ion-chatbox-working:before { + content: ""; } + +.ion-chatboxes:before { + content: ""; } + +.ion-chatbubble:before { + content: ""; } + +.ion-chatbubble-working:before { + content: ""; } + +.ion-chatbubbles:before { + content: ""; } + +.ion-checkmark:before { + content: ""; } + +.ion-checkmark-circled:before { + content: ""; } + +.ion-checkmark-round:before { + content: ""; } + +.ion-chevron-down:before { + content: ""; } + +.ion-chevron-left:before { + content: ""; } + +.ion-chevron-right:before { + content: ""; } + +.ion-chevron-up:before { + content: ""; } + +.ion-clipboard:before { + content: ""; } + +.ion-clock:before { + content: ""; } + +.ion-close:before { + content: ""; } + +.ion-close-circled:before { + content: ""; } + +.ion-close-round:before { + content: ""; } + +.ion-closed-captioning:before { + content: ""; } + +.ion-cloud:before { + content: ""; } + +.ion-code:before { + content: ""; } + +.ion-code-download:before { + content: ""; } + +.ion-code-working:before { + content: ""; } + +.ion-coffee:before { + content: ""; } + +.ion-compass:before { + content: ""; } + +.ion-compose:before { + content: ""; } + +.ion-connection-bars:before { + content: ""; } + +.ion-contrast:before { + content: ""; } + +.ion-crop:before { + content: ""; } + +.ion-cube:before { + content: ""; } + +.ion-disc:before { + content: ""; } + +.ion-document:before { + content: ""; } + +.ion-document-text:before { + content: ""; } + +.ion-drag:before { + content: ""; } + +.ion-earth:before { + content: ""; } + +.ion-easel:before { + content: ""; } + +.ion-edit:before { + content: ""; } + +.ion-egg:before { + content: ""; } + +.ion-eject:before { + content: ""; } + +.ion-email:before { + content: ""; } + +.ion-email-unread:before { + content: ""; } + +.ion-erlenmeyer-flask:before { + content: ""; } + +.ion-erlenmeyer-flask-bubbles:before { + content: ""; } + +.ion-eye:before { + content: ""; } + +.ion-eye-disabled:before { + content: ""; } + +.ion-female:before { + content: ""; } + +.ion-filing:before { + content: ""; } + +.ion-film-marker:before { + content: ""; } + +.ion-fireball:before { + content: ""; } + +.ion-flag:before { + content: ""; } + +.ion-flame:before { + content: ""; } + +.ion-flash:before { + content: ""; } + +.ion-flash-off:before { + content: ""; } + +.ion-folder:before { + content: ""; } + +.ion-fork:before { + content: ""; } + +.ion-fork-repo:before { + content: ""; } + +.ion-forward:before { + content: ""; } + +.ion-funnel:before { + content: ""; } + +.ion-gear-a:before { + content: ""; } + +.ion-gear-b:before { + content: ""; } + +.ion-grid:before { + content: ""; } + +.ion-hammer:before { + content: ""; } + +.ion-happy:before { + content: ""; } + +.ion-happy-outline:before { + content: ""; } + +.ion-headphone:before { + content: ""; } + +.ion-heart:before { + content: ""; } + +.ion-heart-broken:before { + content: ""; } + +.ion-help:before { + content: ""; } + +.ion-help-buoy:before { + content: ""; } + +.ion-help-circled:before { + content: ""; } + +.ion-home:before { + content: ""; } + +.ion-icecream:before { + content: ""; } + +.ion-image:before { + content: ""; } + +.ion-images:before { + content: ""; } + +.ion-information:before { + content: ""; } + +.ion-information-circled:before { + content: ""; } + +.ion-ionic:before { + content: ""; } + +.ion-ios-alarm:before { + content: ""; } + +.ion-ios-alarm-outline:before { + content: ""; } + +.ion-ios-albums:before { + content: ""; } + +.ion-ios-albums-outline:before { + content: ""; } + +.ion-ios-americanfootball:before { + content: ""; } + +.ion-ios-americanfootball-outline:before { + content: ""; } + +.ion-ios-analytics:before { + content: ""; } + +.ion-ios-analytics-outline:before { + content: ""; } + +.ion-ios-arrow-back:before { + content: ""; } + +.ion-ios-arrow-down:before { + content: ""; } + +.ion-ios-arrow-forward:before { + content: ""; } + +.ion-ios-arrow-left:before { + content: ""; } + +.ion-ios-arrow-right:before { + content: ""; } + +.ion-ios-arrow-thin-down:before { + content: ""; } + +.ion-ios-arrow-thin-left:before { + content: ""; } + +.ion-ios-arrow-thin-right:before { + content: ""; } + +.ion-ios-arrow-thin-up:before { + content: ""; } + +.ion-ios-arrow-up:before { + content: ""; } + +.ion-ios-at:before { + content: ""; } + +.ion-ios-at-outline:before { + content: ""; } + +.ion-ios-barcode:before { + content: ""; } + +.ion-ios-barcode-outline:before { + content: ""; } + +.ion-ios-baseball:before { + content: ""; } + +.ion-ios-baseball-outline:before { + content: ""; } + +.ion-ios-basketball:before { + content: ""; } + +.ion-ios-basketball-outline:before { + content: ""; } + +.ion-ios-bell:before { + content: ""; } + +.ion-ios-bell-outline:before { + content: ""; } + +.ion-ios-body:before { + content: ""; } + +.ion-ios-body-outline:before { + content: ""; } + +.ion-ios-bolt:before { + content: ""; } + +.ion-ios-bolt-outline:before { + content: ""; } + +.ion-ios-book:before { + content: ""; } + +.ion-ios-book-outline:before { + content: ""; } + +.ion-ios-bookmarks:before { + content: ""; } + +.ion-ios-bookmarks-outline:before { + content: ""; } + +.ion-ios-box:before { + content: ""; } + +.ion-ios-box-outline:before { + content: ""; } + +.ion-ios-briefcase:before { + content: ""; } + +.ion-ios-briefcase-outline:before { + content: ""; } + +.ion-ios-browsers:before { + content: ""; } + +.ion-ios-browsers-outline:before { + content: ""; } + +.ion-ios-calculator:before { + content: ""; } + +.ion-ios-calculator-outline:before { + content: ""; } + +.ion-ios-calendar:before { + content: ""; } + +.ion-ios-calendar-outline:before { + content: ""; } + +.ion-ios-camera:before { + content: ""; } + +.ion-ios-camera-outline:before { + content: ""; } + +.ion-ios-cart:before { + content: ""; } + +.ion-ios-cart-outline:before { + content: ""; } + +.ion-ios-chatboxes:before { + content: ""; } + +.ion-ios-chatboxes-outline:before { + content: ""; } + +.ion-ios-chatbubble:before { + content: ""; } + +.ion-ios-chatbubble-outline:before { + content: ""; } + +.ion-ios-checkmark:before { + content: ""; } + +.ion-ios-checkmark-empty:before { + content: ""; } + +.ion-ios-checkmark-outline:before { + content: ""; } + +.ion-ios-circle-filled:before { + content: ""; } + +.ion-ios-circle-outline:before { + content: ""; } + +.ion-ios-clock:before { + content: ""; } + +.ion-ios-clock-outline:before { + content: ""; } + +.ion-ios-close:before { + content: ""; } + +.ion-ios-close-empty:before { + content: ""; } + +.ion-ios-close-outline:before { + content: ""; } + +.ion-ios-cloud:before { + content: ""; } + +.ion-ios-cloud-download:before { + content: ""; } + +.ion-ios-cloud-download-outline:before { + content: ""; } + +.ion-ios-cloud-outline:before { + content: ""; } + +.ion-ios-cloud-upload:before { + content: ""; } + +.ion-ios-cloud-upload-outline:before { + content: ""; } + +.ion-ios-cloudy:before { + content: ""; } + +.ion-ios-cloudy-night:before { + content: ""; } + +.ion-ios-cloudy-night-outline:before { + content: ""; } + +.ion-ios-cloudy-outline:before { + content: ""; } + +.ion-ios-cog:before { + content: ""; } + +.ion-ios-cog-outline:before { + content: ""; } + +.ion-ios-color-filter:before { + content: ""; } + +.ion-ios-color-filter-outline:before { + content: ""; } + +.ion-ios-color-wand:before { + content: ""; } + +.ion-ios-color-wand-outline:before { + content: ""; } + +.ion-ios-compose:before { + content: ""; } + +.ion-ios-compose-outline:before { + content: ""; } + +.ion-ios-contact:before { + content: ""; } + +.ion-ios-contact-outline:before { + content: ""; } + +.ion-ios-copy:before { + content: ""; } + +.ion-ios-copy-outline:before { + content: ""; } + +.ion-ios-crop:before { + content: ""; } + +.ion-ios-crop-strong:before { + content: ""; } + +.ion-ios-download:before { + content: ""; } + +.ion-ios-download-outline:before { + content: ""; } + +.ion-ios-drag:before { + content: ""; } + +.ion-ios-email:before { + content: ""; } + +.ion-ios-email-outline:before { + content: ""; } + +.ion-ios-eye:before { + content: ""; } + +.ion-ios-eye-outline:before { + content: ""; } + +.ion-ios-fastforward:before { + content: ""; } + +.ion-ios-fastforward-outline:before { + content: ""; } + +.ion-ios-filing:before { + content: ""; } + +.ion-ios-filing-outline:before { + content: ""; } + +.ion-ios-film:before { + content: ""; } + +.ion-ios-film-outline:before { + content: ""; } + +.ion-ios-flag:before { + content: ""; } + +.ion-ios-flag-outline:before { + content: ""; } + +.ion-ios-flame:before { + content: ""; } + +.ion-ios-flame-outline:before { + content: ""; } + +.ion-ios-flask:before { + content: ""; } + +.ion-ios-flask-outline:before { + content: ""; } + +.ion-ios-flower:before { + content: ""; } + +.ion-ios-flower-outline:before { + content: ""; } + +.ion-ios-folder:before { + content: ""; } + +.ion-ios-folder-outline:before { + content: ""; } + +.ion-ios-football:before { + content: ""; } + +.ion-ios-football-outline:before { + content: ""; } + +.ion-ios-game-controller-a:before { + content: ""; } + +.ion-ios-game-controller-a-outline:before { + content: ""; } + +.ion-ios-game-controller-b:before { + content: ""; } + +.ion-ios-game-controller-b-outline:before { + content: ""; } + +.ion-ios-gear:before { + content: ""; } + +.ion-ios-gear-outline:before { + content: ""; } + +.ion-ios-glasses:before { + content: ""; } + +.ion-ios-glasses-outline:before { + content: ""; } + +.ion-ios-grid-view:before { + content: ""; } + +.ion-ios-grid-view-outline:before { + content: ""; } + +.ion-ios-heart:before { + content: ""; } + +.ion-ios-heart-outline:before { + content: ""; } + +.ion-ios-help:before { + content: ""; } + +.ion-ios-help-empty:before { + content: ""; } + +.ion-ios-help-outline:before { + content: ""; } + +.ion-ios-home:before { + content: ""; } + +.ion-ios-home-outline:before { + content: ""; } + +.ion-ios-infinite:before { + content: ""; } + +.ion-ios-infinite-outline:before { + content: ""; } + +.ion-ios-information:before { + content: ""; } + +.ion-ios-information-empty:before { + content: ""; } + +.ion-ios-information-outline:before { + content: ""; } + +.ion-ios-ionic-outline:before { + content: ""; } + +.ion-ios-keypad:before { + content: ""; } + +.ion-ios-keypad-outline:before { + content: ""; } + +.ion-ios-lightbulb:before { + content: ""; } + +.ion-ios-lightbulb-outline:before { + content: ""; } + +.ion-ios-list:before { + content: ""; } + +.ion-ios-list-outline:before { + content: ""; } + +.ion-ios-location:before { + content: ""; } + +.ion-ios-location-outline:before { + content: ""; } + +.ion-ios-locked:before { + content: ""; } + +.ion-ios-locked-outline:before { + content: ""; } + +.ion-ios-loop:before { + content: ""; } + +.ion-ios-loop-strong:before { + content: ""; } + +.ion-ios-medical:before { + content: ""; } + +.ion-ios-medical-outline:before { + content: ""; } + +.ion-ios-medkit:before { + content: ""; } + +.ion-ios-medkit-outline:before { + content: ""; } + +.ion-ios-mic:before { + content: ""; } + +.ion-ios-mic-off:before { + content: ""; } + +.ion-ios-mic-outline:before { + content: ""; } + +.ion-ios-minus:before { + content: ""; } + +.ion-ios-minus-empty:before { + content: ""; } + +.ion-ios-minus-outline:before { + content: ""; } + +.ion-ios-monitor:before { + content: ""; } + +.ion-ios-monitor-outline:before { + content: ""; } + +.ion-ios-moon:before { + content: ""; } + +.ion-ios-moon-outline:before { + content: ""; } + +.ion-ios-more:before { + content: ""; } + +.ion-ios-more-outline:before { + content: ""; } + +.ion-ios-musical-note:before { + content: ""; } + +.ion-ios-musical-notes:before { + content: ""; } + +.ion-ios-navigate:before { + content: ""; } + +.ion-ios-navigate-outline:before { + content: ""; } + +.ion-ios-nutrition:before { + content: ""; } + +.ion-ios-nutrition-outline:before { + content: ""; } + +.ion-ios-paper:before { + content: ""; } + +.ion-ios-paper-outline:before { + content: ""; } + +.ion-ios-paperplane:before { + content: ""; } + +.ion-ios-paperplane-outline:before { + content: ""; } + +.ion-ios-partlysunny:before { + content: ""; } + +.ion-ios-partlysunny-outline:before { + content: ""; } + +.ion-ios-pause:before { + content: ""; } + +.ion-ios-pause-outline:before { + content: ""; } + +.ion-ios-paw:before { + content: ""; } + +.ion-ios-paw-outline:before { + content: ""; } + +.ion-ios-people:before { + content: ""; } + +.ion-ios-people-outline:before { + content: ""; } + +.ion-ios-person:before { + content: ""; } + +.ion-ios-person-outline:before { + content: ""; } + +.ion-ios-personadd:before { + content: ""; } + +.ion-ios-personadd-outline:before { + content: ""; } + +.ion-ios-photos:before { + content: ""; } + +.ion-ios-photos-outline:before { + content: ""; } + +.ion-ios-pie:before { + content: ""; } + +.ion-ios-pie-outline:before { + content: ""; } + +.ion-ios-pint:before { + content: ""; } + +.ion-ios-pint-outline:before { + content: ""; } + +.ion-ios-play:before { + content: ""; } + +.ion-ios-play-outline:before { + content: ""; } + +.ion-ios-plus:before { + content: ""; } + +.ion-ios-plus-empty:before { + content: ""; } + +.ion-ios-plus-outline:before { + content: ""; } + +.ion-ios-pricetag:before { + content: ""; } + +.ion-ios-pricetag-outline:before { + content: ""; } + +.ion-ios-pricetags:before { + content: ""; } + +.ion-ios-pricetags-outline:before { + content: ""; } + +.ion-ios-printer:before { + content: ""; } + +.ion-ios-printer-outline:before { + content: ""; } + +.ion-ios-pulse:before { + content: ""; } + +.ion-ios-pulse-strong:before { + content: ""; } + +.ion-ios-rainy:before { + content: ""; } + +.ion-ios-rainy-outline:before { + content: ""; } + +.ion-ios-recording:before { + content: ""; } + +.ion-ios-recording-outline:before { + content: ""; } + +.ion-ios-redo:before { + content: ""; } + +.ion-ios-redo-outline:before { + content: ""; } + +.ion-ios-refresh:before { + content: ""; } + +.ion-ios-refresh-empty:before { + content: ""; } + +.ion-ios-refresh-outline:before { + content: ""; } + +.ion-ios-reload:before { + content: ""; } + +.ion-ios-reverse-camera:before { + content: ""; } + +.ion-ios-reverse-camera-outline:before { + content: ""; } + +.ion-ios-rewind:before { + content: ""; } + +.ion-ios-rewind-outline:before { + content: ""; } + +.ion-ios-rose:before { + content: ""; } + +.ion-ios-rose-outline:before { + content: ""; } + +.ion-ios-search:before { + content: ""; } + +.ion-ios-search-strong:before { + content: ""; } + +.ion-ios-settings:before { + content: ""; } + +.ion-ios-settings-strong:before { + content: ""; } + +.ion-ios-shuffle:before { + content: ""; } + +.ion-ios-shuffle-strong:before { + content: ""; } + +.ion-ios-skipbackward:before { + content: ""; } + +.ion-ios-skipbackward-outline:before { + content: ""; } + +.ion-ios-skipforward:before { + content: ""; } + +.ion-ios-skipforward-outline:before { + content: ""; } + +.ion-ios-snowy:before { + content: ""; } + +.ion-ios-speedometer:before { + content: ""; } + +.ion-ios-speedometer-outline:before { + content: ""; } + +.ion-ios-star:before { + content: ""; } + +.ion-ios-star-half:before { + content: ""; } + +.ion-ios-star-outline:before { + content: ""; } + +.ion-ios-stopwatch:before { + content: ""; } + +.ion-ios-stopwatch-outline:before { + content: ""; } + +.ion-ios-sunny:before { + content: ""; } + +.ion-ios-sunny-outline:before { + content: ""; } + +.ion-ios-telephone:before { + content: ""; } + +.ion-ios-telephone-outline:before { + content: ""; } + +.ion-ios-tennisball:before { + content: ""; } + +.ion-ios-tennisball-outline:before { + content: ""; } + +.ion-ios-thunderstorm:before { + content: ""; } + +.ion-ios-thunderstorm-outline:before { + content: ""; } + +.ion-ios-time:before { + content: ""; } + +.ion-ios-time-outline:before { + content: ""; } + +.ion-ios-timer:before { + content: ""; } + +.ion-ios-timer-outline:before { + content: ""; } + +.ion-ios-toggle:before { + content: ""; } + +.ion-ios-toggle-outline:before { + content: ""; } + +.ion-ios-trash:before { + content: ""; } + +.ion-ios-trash-outline:before { + content: ""; } + +.ion-ios-undo:before { + content: ""; } + +.ion-ios-undo-outline:before { + content: ""; } + +.ion-ios-unlocked:before { + content: ""; } + +.ion-ios-unlocked-outline:before { + content: ""; } + +.ion-ios-upload:before { + content: ""; } + +.ion-ios-upload-outline:before { + content: ""; } + +.ion-ios-videocam:before { + content: ""; } + +.ion-ios-videocam-outline:before { + content: ""; } + +.ion-ios-volume-high:before { + content: ""; } + +.ion-ios-volume-low:before { + content: ""; } + +.ion-ios-wineglass:before { + content: ""; } + +.ion-ios-wineglass-outline:before { + content: ""; } + +.ion-ios-world:before { + content: ""; } + +.ion-ios-world-outline:before { + content: ""; } + +.ion-ipad:before { + content: ""; } + +.ion-iphone:before { + content: ""; } + +.ion-ipod:before { + content: ""; } + +.ion-jet:before { + content: ""; } + +.ion-key:before { + content: ""; } + +.ion-knife:before { + content: ""; } + +.ion-laptop:before { + content: ""; } + +.ion-leaf:before { + content: ""; } + +.ion-levels:before { + content: ""; } + +.ion-lightbulb:before { + content: ""; } + +.ion-link:before { + content: ""; } + +.ion-load-a:before { + content: ""; } + +.ion-load-b:before { + content: ""; } + +.ion-load-c:before { + content: ""; } + +.ion-load-d:before { + content: ""; } + +.ion-location:before { + content: ""; } + +.ion-lock-combination:before { + content: ""; } + +.ion-locked:before { + content: ""; } + +.ion-log-in:before { + content: ""; } + +.ion-log-out:before { + content: ""; } + +.ion-loop:before { + content: ""; } + +.ion-magnet:before { + content: ""; } + +.ion-male:before { + content: ""; } + +.ion-man:before { + content: ""; } + +.ion-map:before { + content: ""; } + +.ion-medkit:before { + content: ""; } + +.ion-merge:before { + content: ""; } + +.ion-mic-a:before { + content: ""; } + +.ion-mic-b:before { + content: ""; } + +.ion-mic-c:before { + content: ""; } + +.ion-minus:before { + content: ""; } + +.ion-minus-circled:before { + content: ""; } + +.ion-minus-round:before { + content: ""; } + +.ion-model-s:before { + content: ""; } + +.ion-monitor:before { + content: ""; } + +.ion-more:before { + content: ""; } + +.ion-mouse:before { + content: ""; } + +.ion-music-note:before { + content: ""; } + +.ion-navicon:before { + content: ""; } + +.ion-navicon-round:before { + content: ""; } + +.ion-navigate:before { + content: ""; } + +.ion-network:before { + content: ""; } + +.ion-no-smoking:before { + content: ""; } + +.ion-nuclear:before { + content: ""; } + +.ion-outlet:before { + content: ""; } + +.ion-paintbrush:before { + content: ""; } + +.ion-paintbucket:before { + content: ""; } + +.ion-paper-airplane:before { + content: ""; } + +.ion-paperclip:before { + content: ""; } + +.ion-pause:before { + content: ""; } + +.ion-person:before { + content: ""; } + +.ion-person-add:before { + content: ""; } + +.ion-person-stalker:before { + content: ""; } + +.ion-pie-graph:before { + content: ""; } + +.ion-pin:before { + content: ""; } + +.ion-pinpoint:before { + content: ""; } + +.ion-pizza:before { + content: ""; } + +.ion-plane:before { + content: ""; } + +.ion-planet:before { + content: ""; } + +.ion-play:before { + content: ""; } + +.ion-playstation:before { + content: ""; } + +.ion-plus:before { + content: ""; } + +.ion-plus-circled:before { + content: ""; } + +.ion-plus-round:before { + content: ""; } + +.ion-podium:before { + content: ""; } + +.ion-pound:before { + content: ""; } + +.ion-power:before { + content: ""; } + +.ion-pricetag:before { + content: ""; } + +.ion-pricetags:before { + content: ""; } + +.ion-printer:before { + content: ""; } + +.ion-pull-request:before { + content: ""; } + +.ion-qr-scanner:before { + content: ""; } + +.ion-quote:before { + content: ""; } + +.ion-radio-waves:before { + content: ""; } + +.ion-record:before { + content: ""; } + +.ion-refresh:before { + content: ""; } + +.ion-reply:before { + content: ""; } + +.ion-reply-all:before { + content: ""; } + +.ion-ribbon-a:before { + content: ""; } + +.ion-ribbon-b:before { + content: ""; } + +.ion-sad:before { + content: ""; } + +.ion-sad-outline:before { + content: ""; } + +.ion-scissors:before { + content: ""; } + +.ion-search:before { + content: ""; } + +.ion-settings:before { + content: ""; } + +.ion-share:before { + content: ""; } + +.ion-shuffle:before { + content: ""; } + +.ion-skip-backward:before { + content: ""; } + +.ion-skip-forward:before { + content: ""; } + +.ion-social-android:before { + content: ""; } + +.ion-social-android-outline:before { + content: ""; } + +.ion-social-angular:before { + content: ""; } + +.ion-social-angular-outline:before { + content: ""; } + +.ion-social-apple:before { + content: ""; } + +.ion-social-apple-outline:before { + content: ""; } + +.ion-social-bitcoin:before { + content: ""; } + +.ion-social-bitcoin-outline:before { + content: ""; } + +.ion-social-buffer:before { + content: ""; } + +.ion-social-buffer-outline:before { + content: ""; } + +.ion-social-chrome:before { + content: ""; } + +.ion-social-chrome-outline:before { + content: ""; } + +.ion-social-codepen:before { + content: ""; } + +.ion-social-codepen-outline:before { + content: ""; } + +.ion-social-css3:before { + content: ""; } + +.ion-social-css3-outline:before { + content: ""; } + +.ion-social-designernews:before { + content: ""; } + +.ion-social-designernews-outline:before { + content: ""; } + +.ion-social-dribbble:before { + content: ""; } + +.ion-social-dribbble-outline:before { + content: ""; } + +.ion-social-dropbox:before { + content: ""; } + +.ion-social-dropbox-outline:before { + content: ""; } + +.ion-social-euro:before { + content: ""; } + +.ion-social-euro-outline:before { + content: ""; } + +.ion-social-facebook:before { + content: ""; } + +.ion-social-facebook-outline:before { + content: ""; } + +.ion-social-foursquare:before { + content: ""; } + +.ion-social-foursquare-outline:before { + content: ""; } + +.ion-social-freebsd-devil:before { + content: ""; } + +.ion-social-github:before { + content: ""; } + +.ion-social-github-outline:before { + content: ""; } + +.ion-social-google:before { + content: ""; } + +.ion-social-google-outline:before { + content: ""; } + +.ion-social-googleplus:before { + content: ""; } + +.ion-social-googleplus-outline:before { + content: ""; } + +.ion-social-hackernews:before { + content: ""; } + +.ion-social-hackernews-outline:before { + content: ""; } + +.ion-social-html5:before { + content: ""; } + +.ion-social-html5-outline:before { + content: ""; } + +.ion-social-instagram:before { + content: ""; } + +.ion-social-instagram-outline:before { + content: ""; } + +.ion-social-javascript:before { + content: ""; } + +.ion-social-javascript-outline:before { + content: ""; } + +.ion-social-linkedin:before { + content: ""; } + +.ion-social-linkedin-outline:before { + content: ""; } + +.ion-social-markdown:before { + content: ""; } + +.ion-social-nodejs:before { + content: ""; } + +.ion-social-octocat:before { + content: ""; } + +.ion-social-pinterest:before { + content: ""; } + +.ion-social-pinterest-outline:before { + content: ""; } + +.ion-social-python:before { + content: ""; } + +.ion-social-reddit:before { + content: ""; } + +.ion-social-reddit-outline:before { + content: ""; } + +.ion-social-rss:before { + content: ""; } + +.ion-social-rss-outline:before { + content: ""; } + +.ion-social-sass:before { + content: ""; } + +.ion-social-skype:before { + content: ""; } + +.ion-social-skype-outline:before { + content: ""; } + +.ion-social-snapchat:before { + content: ""; } + +.ion-social-snapchat-outline:before { + content: ""; } + +.ion-social-tumblr:before { + content: ""; } + +.ion-social-tumblr-outline:before { + content: ""; } + +.ion-social-tux:before { + content: ""; } + +.ion-social-twitch:before { + content: ""; } + +.ion-social-twitch-outline:before { + content: ""; } + +.ion-social-twitter:before { + content: ""; } + +.ion-social-twitter-outline:before { + content: ""; } + +.ion-social-usd:before { + content: ""; } + +.ion-social-usd-outline:before { + content: ""; } + +.ion-social-vimeo:before { + content: ""; } + +.ion-social-vimeo-outline:before { + content: ""; } + +.ion-social-whatsapp:before { + content: ""; } + +.ion-social-whatsapp-outline:before { + content: ""; } + +.ion-social-windows:before { + content: ""; } + +.ion-social-windows-outline:before { + content: ""; } + +.ion-social-wordpress:before { + content: ""; } + +.ion-social-wordpress-outline:before { + content: ""; } + +.ion-social-yahoo:before { + content: ""; } + +.ion-social-yahoo-outline:before { + content: ""; } + +.ion-social-yen:before { + content: ""; } + +.ion-social-yen-outline:before { + content: ""; } + +.ion-social-youtube:before { + content: ""; } + +.ion-social-youtube-outline:before { + content: ""; } + +.ion-soup-can:before { + content: ""; } + +.ion-soup-can-outline:before { + content: ""; } + +.ion-speakerphone:before { + content: ""; } + +.ion-speedometer:before { + content: ""; } + +.ion-spoon:before { + content: ""; } + +.ion-star:before { + content: ""; } + +.ion-stats-bars:before { + content: ""; } + +.ion-steam:before { + content: ""; } + +.ion-stop:before { + content: ""; } + +.ion-thermometer:before { + content: ""; } + +.ion-thumbsdown:before { + content: ""; } + +.ion-thumbsup:before { + content: ""; } + +.ion-toggle:before { + content: ""; } + +.ion-toggle-filled:before { + content: ""; } + +.ion-transgender:before { + content: ""; } + +.ion-trash-a:before { + content: ""; } + +.ion-trash-b:before { + content: ""; } + +.ion-trophy:before { + content: ""; } + +.ion-tshirt:before { + content: ""; } + +.ion-tshirt-outline:before { + content: ""; } + +.ion-umbrella:before { + content: ""; } + +.ion-university:before { + content: ""; } + +.ion-unlocked:before { + content: ""; } + +.ion-upload:before { + content: ""; } + +.ion-usb:before { + content: ""; } + +.ion-videocamera:before { + content: ""; } + +.ion-volume-high:before { + content: ""; } + +.ion-volume-low:before { + content: ""; } + +.ion-volume-medium:before { + content: ""; } + +.ion-volume-mute:before { + content: ""; } + +.ion-wand:before { + content: ""; } + +.ion-waterdrop:before { + content: ""; } + +.ion-wifi:before { + content: ""; } + +.ion-wineglass:before { + content: ""; } + +.ion-woman:before { + content: ""; } + +.ion-wrench:before { + content: ""; } + +.ion-xbox:before { + content: ""; } + +/** + * Resets + * -------------------------------------------------- + * Adapted from normalize.css and some reset.css. We don't care even one + * bit about old IE, so we don't need any hacks for that in here. + * + * There are probably other things we could remove here, as well. + * + * normalize.css v2.1.2 | MIT License | git.io/normalize + + * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/) + * http://cssreset.com + */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, i, u, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, fieldset, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + vertical-align: baseline; + font: inherit; + font-size: 100%; } + +ol, ul { + list-style: none; } + +blockquote, q { + quotes: none; } + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; } + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ +audio:not([controls]) { + display: none; + height: 0; } + +/** + * Hide the `template` element in IE, Safari, and Firefox < 22. + */ +[hidden], +template { + display: none; } + +script { + display: none !important; } + +/* ========================================================================== + Base + ========================================================================== */ +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ +html { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + font-family: sans-serif; + /* 1 */ + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ } + +/** + * Remove default margin. + */ +body { + margin: 0; + line-height: 1; } + +/** + * Remove default outlines. + */ +a, +button, +:focus, +a:focus, +button:focus, +a:active, +a:hover { + outline: 0; } + +/* * + * Remove tap highlight color + */ +a { + -webkit-user-drag: none; + -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; } + a[href]:hover { + cursor: pointer; } + +/* ========================================================================== + Typography + ========================================================================== */ +/** + * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. + */ +b, +strong { + font-weight: bold; } + +/** + * Address styling not present in Safari 5 and Chrome. + */ +dfn { + font-style: italic; } + +/** + * Address differences between Firefox and other browsers. + */ +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; } + +/** + * Correct font family set oddly in Safari 5 and Chrome. + */ +code, +kbd, +pre, +samp { + font-size: 1em; + font-family: monospace, serif; } + +/** + * Improve readability of pre-formatted text in all browsers. + */ +pre { + white-space: pre-wrap; } + +/** + * Set consistent quote types. + */ +q { + quotes: "\201C" "\201D" "\2018" "\2019"; } + +/** + * Address inconsistent and variable font size in all browsers. + */ +small { + font-size: 80%; } + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ +sub, +sup { + position: relative; + vertical-align: baseline; + font-size: 75%; + line-height: 0; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +/** + * Define consistent border, margin, and padding. + */ +fieldset { + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; + border: 1px solid #c0c0c0; } + +/** + * 1. Correct `color` not being inherited in IE 8/9. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ +legend { + padding: 0; + /* 2 */ + border: 0; + /* 1 */ } + +/** + * 1. Correct font family not being inherited in all browsers. + * 2. Correct font size not being inherited in all browsers. + * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. + * 4. Remove any default :focus styles + * 5. Make sure webkit font smoothing is being inherited + * 6. Remove default gradient in Android Firefox / FirefoxOS + */ +button, +input, +select, +textarea { + margin: 0; + /* 3 */ + font-size: 100%; + /* 2 */ + font-family: inherit; + /* 1 */ + outline-offset: 0; + /* 4 */ + outline-style: none; + /* 4 */ + outline-width: 0; + /* 4 */ + -webkit-font-smoothing: inherit; + /* 5 */ + background-image: none; + /* 6 */ } + +/** + * Address Firefox 4+ setting `line-height` on `input` using `importnt` in + * the UA stylesheet. + */ +button, +input { + line-height: normal; } + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + */ +button, +select { + text-transform: none; } + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + /* 3 */ + -webkit-appearance: button; + /* 2 */ } + +/** + * Re-set default cursor for disabled elements. + */ +button[disabled], +html input[disabled] { + cursor: default; } + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ +input[type="search"] { + -webkit-box-sizing: content-box; + /* 2 */ + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; + /* 1 */ } + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +/** + * Remove inner padding and border in Firefox 4+. + */ +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; } + +/** + * 1. Remove default vertical scrollbar in IE 8/9. + * 2. Improve readability and alignment in all browsers. + */ +textarea { + overflow: auto; + /* 1 */ + vertical-align: top; + /* 2 */ } + +img { + -webkit-user-drag: none; } + +/* ========================================================================== + Tables + ========================================================================== */ +/** + * Remove most spacing between table cells. + */ +table { + border-spacing: 0; + border-collapse: collapse; } + +/** + * Scaffolding + * -------------------------------------------------- + */ +*, +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +html { + overflow: hidden; + -ms-touch-action: pan-y; + touch-action: pan-y; } + +body, +.ionic-body { + -webkit-touch-callout: none; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; + text-size-adjust: none; + -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: hidden; + margin: 0; + padding: 0; + color: #000; + word-wrap: break-word; + font-size: 14px; + font-family: -apple-system; + font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif; + line-height: 20px; + text-rendering: optimizeLegibility; + -webkit-backface-visibility: hidden; + -webkit-user-drag: none; + -ms-content-zooming: none; } + +body.grade-b, +body.grade-c { + text-rendering: auto; } + +.content { + position: relative; } + +.scroll-content { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: hidden; + margin-top: -1px; + padding-top: 1px; + margin-bottom: -1px; + width: auto; + height: auto; } + +.menu .scroll-content.scroll-content-false { + z-index: 11; } + +.scroll-view { + position: relative; + display: block; + overflow: hidden; + margin-top: -1px; } + .scroll-view.overflow-scroll { + position: relative; } + .scroll-view.scroll-x { + overflow-x: scroll; + overflow-y: hidden; } + .scroll-view.scroll-y { + overflow-x: hidden; + overflow-y: scroll; } + .scroll-view.scroll-xy { + overflow-x: scroll; + overflow-y: scroll; } + +/** + * Scroll is the scroll view component available for complex and custom + * scroll view functionality. + */ +.scroll { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-touch-callout: none; + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; + text-size-adjust: none; + -webkit-transform-origin: left top; + transform-origin: left top; } + +/** + * Set ms-viewport to prevent MS "page squish" and allow fluid scrolling + * https://msdn.microsoft.com/en-us/library/ie/hh869615(v=vs.85).aspx + */ +@-ms-viewport { + width: device-width; } + +.scroll-bar { + position: absolute; + z-index: 9999; } + +.ng-animate .scroll-bar { + visibility: hidden; } + +.scroll-bar-h { + right: 2px; + bottom: 3px; + left: 2px; + height: 3px; } + .scroll-bar-h .scroll-bar-indicator { + height: 100%; } + +.scroll-bar-v { + top: 2px; + right: 3px; + bottom: 2px; + width: 3px; } + .scroll-bar-v .scroll-bar-indicator { + width: 100%; } + +.scroll-bar-indicator { + position: absolute; + border-radius: 4px; + background: rgba(0, 0, 0, 0.3); + opacity: 1; + -webkit-transition: opacity 0.3s linear; + transition: opacity 0.3s linear; } + .scroll-bar-indicator.scroll-bar-fade-out { + opacity: 0; } + +.platform-android .scroll-bar-indicator { + border-radius: 0; } + +.grade-b .scroll-bar-indicator, +.grade-c .scroll-bar-indicator { + background: #aaa; } + .grade-b .scroll-bar-indicator.scroll-bar-fade-out, + .grade-c .scroll-bar-indicator.scroll-bar-fade-out { + -webkit-transition: none; + transition: none; } + +ion-infinite-scroll { + height: 60px; + width: 100%; + display: block; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: horizontal; + -webkit-flex-direction: row; + -moz-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; } + ion-infinite-scroll .icon { + color: #666666; + font-size: 30px; + color: #666666; } + ion-infinite-scroll:not(.active) .spinner, + ion-infinite-scroll:not(.active) .icon:before { + display: none; } + +.overflow-scroll { + overflow-x: hidden; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + top: 0; + right: 0; + bottom: 0; + left: 0; + position: absolute; } + .overflow-scroll.pane { + overflow-x: hidden; + overflow-y: scroll; } + .overflow-scroll .scroll { + position: static; + height: 100%; + -webkit-transform: translate3d(0, 0, 0); } + .overflow-scroll.keyboard-up:not(.keyboard-up-confirm) { + overflow: hidden; } + +/* If you change these, change platform.scss as well */ +.has-header { + top: 44px; } + +.no-header { + top: 0; } + +.has-subheader { + top: 88px; } + +.has-tabs-top { + top: 93px; } + +.has-header.has-subheader.has-tabs-top { + top: 137px; } + +.has-footer { + bottom: 44px; } + +.has-subfooter { + bottom: 88px; } + +.has-tabs, +.bar-footer.has-tabs { + bottom: 49px; } + .has-tabs.pane, + .bar-footer.has-tabs.pane { + bottom: 49px; + height: auto; } + +.bar-subfooter.has-tabs { + bottom: 93px; } + +.has-footer.has-tabs { + bottom: 93px; } + +.pane { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-transition-duration: 0; + transition-duration: 0; + z-index: 1; } + +.view { + z-index: 1; } + +.pane, +.view { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #fff; + overflow: hidden; } + +.view-container { + position: absolute; + display: block; + width: 100%; + height: 100%; } + +/** + * Typography + * -------------------------------------------------- + */ +p { + margin: 0 0 10px; } + +small { + font-size: 85%; } + +cite { + font-style: normal; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + color: #000; + font-weight: 500; + font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif; + line-height: 1.2; } + h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, + .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small { + font-weight: normal; + line-height: 1; } + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: 20px; + margin-bottom: 10px; } + h1:first-child, .h1:first-child, + h2:first-child, .h2:first-child, + h3:first-child, .h3:first-child { + margin-top: 0; } + h1 + h1, h1 + .h1, + h1 + h2, h1 + .h2, + h1 + h3, h1 + .h3, .h1 + h1, .h1 + .h1, + .h1 + h2, .h1 + .h2, + .h1 + h3, .h1 + .h3, + h2 + h1, + h2 + .h1, + h2 + h2, + h2 + .h2, + h2 + h3, + h2 + .h3, .h2 + h1, .h2 + .h1, + .h2 + h2, .h2 + .h2, + .h2 + h3, .h2 + .h3, + h3 + h1, + h3 + .h1, + h3 + h2, + h3 + .h2, + h3 + h3, + h3 + .h3, .h3 + h1, .h3 + .h1, + .h3 + h2, .h3 + .h2, + .h3 + h3, .h3 + .h3 { + margin-top: 10px; } + +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: 10px; + margin-bottom: 10px; } + +h1, .h1 { + font-size: 36px; } + +h2, .h2 { + font-size: 30px; } + +h3, .h3 { + font-size: 24px; } + +h4, .h4 { + font-size: 18px; } + +h5, .h5 { + font-size: 14px; } + +h6, .h6 { + font-size: 12px; } + +h1 small, .h1 small { + font-size: 24px; } + +h2 small, .h2 small { + font-size: 18px; } + +h3 small, .h3 small, +h4 small, .h4 small { + font-size: 14px; } + +dl { + margin-bottom: 20px; } + +dt, +dd { + line-height: 1.42857; } + +dt { + font-weight: bold; } + +blockquote { + margin: 0 0 20px; + padding: 10px 20px; + border-left: 5px solid gray; } + blockquote p { + font-weight: 300; + font-size: 17.5px; + line-height: 1.25; } + blockquote p:last-child { + margin-bottom: 0; } + blockquote small { + display: block; + line-height: 1.42857; } + blockquote small:before { + content: '\2014 \00A0'; } + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; } + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857; } + +a { + color: #387ef5; } + +a.subdued { + padding-right: 10px; + color: #888; + text-decoration: none; } + a.subdued:hover { + text-decoration: none; } + a.subdued:last-child { + padding-right: 0; } + +/** + * Action Sheets + * -------------------------------------------------- + */ +.action-sheet-backdrop { + -webkit-transition: background-color 150ms ease-in-out; + transition: background-color 150ms ease-in-out; + position: fixed; + top: 0; + left: 0; + z-index: 11; + width: 100%; + height: 100%; + background-color: transparent; } + .action-sheet-backdrop.active { + background-color: rgba(0, 0, 0, 0.4); } + +.action-sheet-wrapper { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + -webkit-transition: all cubic-bezier(0.36, 0.66, 0.04, 1) 500ms; + transition: all cubic-bezier(0.36, 0.66, 0.04, 1) 500ms; + position: absolute; + bottom: 0; + left: 0; + right: 0; + width: 100%; + max-width: 500px; + margin: auto; } + +.action-sheet-up { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +.action-sheet { + margin-left: 8px; + margin-right: 8px; + width: auto; + z-index: 11; + overflow: hidden; } + .action-sheet .button { + display: block; + padding: 1px; + width: 100%; + border-radius: 0; + border-color: #d1d3d6; + background-color: transparent; + color: #007aff; + font-size: 21px; } + .action-sheet .button:hover { + color: #007aff; } + .action-sheet .button.destructive { + color: #ff3b30; } + .action-sheet .button.destructive:hover { + color: #ff3b30; } + .action-sheet .button.active, .action-sheet .button.activated { + box-shadow: none; + border-color: #d1d3d6; + color: #007aff; + background: #e4e5e7; } + +.action-sheet-has-icons .icon { + position: absolute; + left: 16px; } + +.action-sheet-title { + padding: 16px; + color: #8f8f8f; + text-align: center; + font-size: 13px; } + +.action-sheet-group { + margin-bottom: 8px; + border-radius: 4px; + background-color: #fff; + overflow: hidden; } + .action-sheet-group .button { + border-width: 1px 0px 0px 0px; } + .action-sheet-group .button:first-child:last-child { + border-width: 0; } + +.action-sheet-options { + background: #f1f2f3; } + +.action-sheet-cancel .button { + font-weight: 500; } + +.action-sheet-open { + pointer-events: none; } + .action-sheet-open.modal-open .modal { + pointer-events: none; } + .action-sheet-open .action-sheet-backdrop { + pointer-events: auto; } + +.platform-android .action-sheet-backdrop.active { + background-color: rgba(0, 0, 0, 0.2); } + +.platform-android .action-sheet { + margin: 0; } + .platform-android .action-sheet .action-sheet-title, + .platform-android .action-sheet .button { + text-align: left; + border-color: transparent; + font-size: 16px; + color: inherit; } + .platform-android .action-sheet .action-sheet-title { + font-size: 14px; + padding: 16px; + color: #666; } + .platform-android .action-sheet .button.active, + .platform-android .action-sheet .button.activated { + background: #e8e8e8; } + +.platform-android .action-sheet-group { + margin: 0; + border-radius: 0; + background-color: #fafafa; } + +.platform-android .action-sheet-cancel { + display: none; } + +.platform-android .action-sheet-has-icons .button { + padding-left: 56px; } + +.backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 11; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.4); + visibility: hidden; + opacity: 0; + -webkit-transition: 0.1s opacity linear; + transition: 0.1s opacity linear; } + .backdrop.visible { + visibility: visible; } + .backdrop.active { + opacity: 1; } + +/** + * Bar (Headers and Footers) + * -------------------------------------------------- + */ +.bar { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + position: absolute; + right: 0; + left: 0; + z-index: 9; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 5px; + width: 100%; + height: 44px; + border-width: 0; + border-style: solid; + border-top: 1px solid transparent; + border-bottom: 1px solid #ddd; + background-color: white; + /* border-width: 1px will actually create 2 device pixels on retina */ + /* this nifty trick sets an actual 1px border on hi-res displays */ + background-size: 0; } + @media (min--moz-device-pixel-ratio: 1.5), (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi), (min-resolution: 1.5dppx) { + .bar { + border: none; + background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%); + background-position: bottom; + background-size: 100% 1px; + background-repeat: no-repeat; } } + .bar.bar-clear { + border: none; + background: none; + color: #fff; } + .bar.bar-clear .button { + color: #fff; } + .bar.bar-clear .title { + color: #fff; } + .bar.item-input-inset .item-input-wrapper { + margin-top: -1px; } + .bar.item-input-inset .item-input-wrapper input { + padding-left: 8px; + width: 94%; + height: 28px; + background: transparent; } + .bar.bar-light { + border-color: #ddd; + background-color: white; + background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%); + color: #444; } + .bar.bar-light .title { + color: #444; } + .bar.bar-light.bar-footer { + background-image: linear-gradient(180deg, #ddd, #ddd 50%, transparent 50%); } + .bar.bar-stable { + border-color: #b2b2b2; + background-color: #f8f8f8; + background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%); + color: #444; } + .bar.bar-stable .title { + color: #444; } + .bar.bar-stable.bar-footer { + background-image: linear-gradient(180deg, #b2b2b2, #b2b2b2 50%, transparent 50%); } + .bar.bar-positive { + border-color: #0c60ee; + background-color: #387ef5; + background-image: linear-gradient(0deg, #0c60ee, #0c60ee 50%, transparent 50%); + color: #fff; } + .bar.bar-positive .title { + color: #fff; } + .bar.bar-positive.bar-footer { + background-image: linear-gradient(180deg, #0c60ee, #0c60ee 50%, transparent 50%); } + .bar.bar-calm { + border-color: #0a9dc7; + background-color: #11c1f3; + background-image: linear-gradient(0deg, #0a9dc7, #0a9dc7 50%, transparent 50%); + color: #fff; } + .bar.bar-calm .title { + color: #fff; } + .bar.bar-calm.bar-footer { + background-image: linear-gradient(180deg, #0a9dc7, #0a9dc7 50%, transparent 50%); } + .bar.bar-assertive { + border-color: #e42112; + background-color: #ef473a; + background-image: linear-gradient(0deg, #e42112, #e42112 50%, transparent 50%); + color: #fff; } + .bar.bar-assertive .title { + color: #fff; } + .bar.bar-assertive.bar-footer { + background-image: linear-gradient(180deg, #e42112, #e42112 50%, transparent 50%); } + .bar.bar-balanced { + border-color: #28a54c; + background-color: #33cd5f; + background-image: linear-gradient(0deg, #28a54c, #28a54c 50%, transparent 50%); + color: #fff; } + .bar.bar-balanced .title { + color: #fff; } + .bar.bar-balanced.bar-footer { + background-image: linear-gradient(180deg, #28a54c, #0c60ee 50%, transparent 50%); } + .bar.bar-energized { + border-color: #e6b500; + background-color: #ffc900; + background-image: linear-gradient(0deg, #e6b500, #e6b500 50%, transparent 50%); + color: #fff; } + .bar.bar-energized .title { + color: #fff; } + .bar.bar-energized.bar-footer { + background-image: linear-gradient(180deg, #e6b500, #e6b500 50%, transparent 50%); } + .bar.bar-royal { + border-color: #6b46e5; + background-color: #886aea; + background-image: linear-gradient(0deg, #6b46e5, #6b46e5 50%, transparent 50%); + color: #fff; } + .bar.bar-royal .title { + color: #fff; } + .bar.bar-royal.bar-footer { + background-image: linear-gradient(180deg, #6b46e5, #6b46e5 50%, transparent 50%); } + .bar.bar-dark { + border-color: #111; + background-color: #444444; + background-image: linear-gradient(0deg, #111, #111 50%, transparent 50%); + color: #fff; } + .bar.bar-dark .title { + color: #fff; } + .bar.bar-dark.bar-footer { + background-image: linear-gradient(180deg, #111, #111 50%, transparent 50%); } + .bar .title { + display: block; + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 0; + overflow: hidden; + margin: 0 10px; + min-width: 30px; + height: 43px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 17px; + font-weight: 500; + line-height: 44px; } + .bar .title.title-left { + text-align: left; } + .bar .title.title-right { + text-align: right; } + .bar .title a { + color: inherit; } + .bar .button, .bar button { + z-index: 1; + padding: 0 8px; + min-width: initial; + min-height: 31px; + font-weight: 400; + font-size: 13px; + line-height: 32px; } + .bar .button.button-icon:before, + .bar .button .icon:before, .bar .button.icon:before, .bar .button.icon-left:before, .bar .button.icon-right:before, .bar button.button-icon:before, + .bar button .icon:before, .bar button.icon:before, .bar button.icon-left:before, .bar button.icon-right:before { + padding-right: 2px; + padding-left: 2px; + font-size: 20px; + line-height: 32px; } + .bar .button.button-icon, .bar button.button-icon { + font-size: 17px; } + .bar .button.button-icon .icon:before, .bar .button.button-icon:before, .bar .button.button-icon.icon-left:before, .bar .button.button-icon.icon-right:before, .bar button.button-icon .icon:before, .bar button.button-icon:before, .bar button.button-icon.icon-left:before, .bar button.button-icon.icon-right:before { + vertical-align: top; + font-size: 32px; + line-height: 32px; } + .bar .button.button-clear, .bar button.button-clear { + padding-right: 2px; + padding-left: 2px; + font-weight: 300; + font-size: 17px; } + .bar .button.button-clear .icon:before, .bar .button.button-clear.icon:before, .bar .button.button-clear.icon-left:before, .bar .button.button-clear.icon-right:before, .bar button.button-clear .icon:before, .bar button.button-clear.icon:before, .bar button.button-clear.icon-left:before, .bar button.button-clear.icon-right:before { + font-size: 32px; + line-height: 32px; } + .bar .button.back-button, .bar button.back-button { + display: block; + margin-right: 5px; + padding: 0; + white-space: nowrap; + font-weight: 400; } + .bar .button.back-button.active, .bar .button.back-button.activated, .bar button.back-button.active, .bar button.back-button.activated { + opacity: 0.2; } + .bar .button-bar > .button, + .bar .buttons > .button { + min-height: 31px; + line-height: 32px; } + .bar .button-bar + .button, + .bar .button + .button-bar { + margin-left: 5px; } + .bar .buttons, + .bar .buttons.primary-buttons, + .bar .buttons.secondary-buttons { + display: inherit; } + .bar .buttons span { + display: inline-block; } + .bar .buttons-left span { + margin-right: 5px; + display: inherit; } + .bar .buttons-right span { + margin-left: 5px; + display: inherit; } + .bar .title + .button:last-child, + .bar > .button + .button:last-child, + .bar > .button.pull-right, + .bar .buttons.pull-right, + .bar .title + .buttons { + position: absolute; + top: 5px; + right: 5px; + bottom: 5px; } + +.platform-android .nav-bar-has-subheader .bar { + background-image: none; } + +.platform-android .bar .back-button .icon:before { + font-size: 24px; } + +.platform-android .bar .title { + font-size: 19px; + line-height: 44px; } + +.bar-light .button { + border-color: transparent; + background-color: white; + color: #444; } + .bar-light .button:hover { + color: #444; + text-decoration: none; } + .bar-light .button.active, .bar-light .button.activated { + background-color: #fafafa; } + .bar-light .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #444; + font-size: 17px; } + .bar-light .button.button-icon { + border-color: transparent; + background: none; } + +.bar-stable .button { + border-color: transparent; + background-color: #f8f8f8; + color: #444; } + .bar-stable .button:hover { + color: #444; + text-decoration: none; } + .bar-stable .button.active, .bar-stable .button.activated { + background-color: #e5e5e5; } + .bar-stable .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #444; + font-size: 17px; } + .bar-stable .button.button-icon { + border-color: transparent; + background: none; } + +.bar-positive .button { + border-color: transparent; + background-color: #387ef5; + color: #fff; } + .bar-positive .button:hover { + color: #fff; + text-decoration: none; } + .bar-positive .button.active, .bar-positive .button.activated { + background-color: #0c60ee; } + .bar-positive .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-positive .button.button-icon { + border-color: transparent; + background: none; } + +.bar-calm .button { + border-color: transparent; + background-color: #11c1f3; + color: #fff; } + .bar-calm .button:hover { + color: #fff; + text-decoration: none; } + .bar-calm .button.active, .bar-calm .button.activated { + background-color: #0a9dc7; } + .bar-calm .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-calm .button.button-icon { + border-color: transparent; + background: none; } + +.bar-assertive .button { + border-color: transparent; + background-color: #ef473a; + color: #fff; } + .bar-assertive .button:hover { + color: #fff; + text-decoration: none; } + .bar-assertive .button.active, .bar-assertive .button.activated { + background-color: #e42112; } + .bar-assertive .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-assertive .button.button-icon { + border-color: transparent; + background: none; } + +.bar-balanced .button { + border-color: transparent; + background-color: #33cd5f; + color: #fff; } + .bar-balanced .button:hover { + color: #fff; + text-decoration: none; } + .bar-balanced .button.active, .bar-balanced .button.activated { + background-color: #28a54c; } + .bar-balanced .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-balanced .button.button-icon { + border-color: transparent; + background: none; } + +.bar-energized .button { + border-color: transparent; + background-color: #ffc900; + color: #fff; } + .bar-energized .button:hover { + color: #fff; + text-decoration: none; } + .bar-energized .button.active, .bar-energized .button.activated { + background-color: #e6b500; } + .bar-energized .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-energized .button.button-icon { + border-color: transparent; + background: none; } + +.bar-royal .button { + border-color: transparent; + background-color: #886aea; + color: #fff; } + .bar-royal .button:hover { + color: #fff; + text-decoration: none; } + .bar-royal .button.active, .bar-royal .button.activated { + background-color: #6b46e5; } + .bar-royal .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-royal .button.button-icon { + border-color: transparent; + background: none; } + +.bar-dark .button { + border-color: transparent; + background-color: #444444; + color: #fff; } + .bar-dark .button:hover { + color: #fff; + text-decoration: none; } + .bar-dark .button.active, .bar-dark .button.activated { + background-color: #262626; } + .bar-dark .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-dark .button.button-icon { + border-color: transparent; + background: none; } + +.bar-header { + top: 0; + border-top-width: 0; + border-bottom-width: 1px; } + .bar-header.has-tabs-top { + border-bottom-width: 0px; + background-image: none; } + +.tabs-top .bar-header { + border-bottom-width: 0px; + background-image: none; } + +.bar-footer { + bottom: 0; + border-top-width: 1px; + border-bottom-width: 0; + background-position: top; + height: 44px; } + .bar-footer.item-input-inset { + position: absolute; } + +.bar-tabs { + padding: 0; } + +.bar-subheader { + top: 44px; + display: block; + height: 44px; } + +.bar-subfooter { + bottom: 44px; + display: block; + height: 44px; } + +.nav-bar-block { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 9; } + +.bar .back-button.hide, +.bar .buttons .hide { + display: none; } + +.nav-bar-tabs-top .bar { + background-image: none; } + +/** + * Tabs + * -------------------------------------------------- + * A navigation bar with any number of tab items supported. + */ +.tabs { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: horizontal; + -webkit-flex-direction: horizontal; + -moz-flex-direction: horizontal; + -ms-flex-direction: horizontal; + flex-direction: horizontal; + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + border-color: #b2b2b2; + background-color: #f8f8f8; + background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%); + color: #444; + position: absolute; + bottom: 0; + z-index: 5; + width: 100%; + height: 49px; + border-style: solid; + border-top-width: 1px; + background-size: 0; + line-height: 49px; } + .tabs .tab-item .badge { + background-color: #444; + color: #f8f8f8; } + @media (min--moz-device-pixel-ratio: 1.5), (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi), (min-resolution: 1.5dppx) { + .tabs { + padding-top: 2px; + border-top: none !important; + border-bottom: none; + background-position: top; + background-size: 100% 1px; + background-repeat: no-repeat; } } + +/* Allow parent element of tabs to define color, or just the tab itself */ +.tabs-light > .tabs, +.tabs.tabs-light { + border-color: #ddd; + background-color: #fff; + background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%); + color: #444; } + .tabs-light > .tabs .tab-item .badge, + .tabs.tabs-light .tab-item .badge { + background-color: #444; + color: #fff; } + +.tabs-stable > .tabs, +.tabs.tabs-stable { + border-color: #b2b2b2; + background-color: #f8f8f8; + background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%); + color: #444; } + .tabs-stable > .tabs .tab-item .badge, + .tabs.tabs-stable .tab-item .badge { + background-color: #444; + color: #f8f8f8; } + +.tabs-positive > .tabs, +.tabs.tabs-positive { + border-color: #0c60ee; + background-color: #387ef5; + background-image: linear-gradient(0deg, #0c60ee, #0c60ee 50%, transparent 50%); + color: #fff; } + .tabs-positive > .tabs .tab-item .badge, + .tabs.tabs-positive .tab-item .badge { + background-color: #fff; + color: #387ef5; } + +.tabs-calm > .tabs, +.tabs.tabs-calm { + border-color: #0a9dc7; + background-color: #11c1f3; + background-image: linear-gradient(0deg, #0a9dc7, #0a9dc7 50%, transparent 50%); + color: #fff; } + .tabs-calm > .tabs .tab-item .badge, + .tabs.tabs-calm .tab-item .badge { + background-color: #fff; + color: #11c1f3; } + +.tabs-assertive > .tabs, +.tabs.tabs-assertive { + border-color: #e42112; + background-color: #ef473a; + background-image: linear-gradient(0deg, #e42112, #e42112 50%, transparent 50%); + color: #fff; } + .tabs-assertive > .tabs .tab-item .badge, + .tabs.tabs-assertive .tab-item .badge { + background-color: #fff; + color: #ef473a; } + +.tabs-balanced > .tabs, +.tabs.tabs-balanced { + border-color: #28a54c; + background-color: #33cd5f; + background-image: linear-gradient(0deg, #28a54c, #28a54c 50%, transparent 50%); + color: #fff; } + .tabs-balanced > .tabs .tab-item .badge, + .tabs.tabs-balanced .tab-item .badge { + background-color: #fff; + color: #33cd5f; } + +.tabs-energized > .tabs, +.tabs.tabs-energized { + border-color: #e6b500; + background-color: #ffc900; + background-image: linear-gradient(0deg, #e6b500, #e6b500 50%, transparent 50%); + color: #fff; } + .tabs-energized > .tabs .tab-item .badge, + .tabs.tabs-energized .tab-item .badge { + background-color: #fff; + color: #ffc900; } + +.tabs-royal > .tabs, +.tabs.tabs-royal { + border-color: #6b46e5; + background-color: #886aea; + background-image: linear-gradient(0deg, #6b46e5, #6b46e5 50%, transparent 50%); + color: #fff; } + .tabs-royal > .tabs .tab-item .badge, + .tabs.tabs-royal .tab-item .badge { + background-color: #fff; + color: #886aea; } + +.tabs-dark > .tabs, +.tabs.tabs-dark { + border-color: #111; + background-color: #444; + background-image: linear-gradient(0deg, #111, #111 50%, transparent 50%); + color: #fff; } + .tabs-dark > .tabs .tab-item .badge, + .tabs.tabs-dark .tab-item .badge { + background-color: #fff; + color: #444; } + +.tabs-striped .tabs { + background-color: white; + background-image: none; + border: none; + border-bottom: 1px solid #ddd; + padding-top: 2px; } + +.tabs-striped .tab-item.tab-item-active, .tabs-striped .tab-item.active, .tabs-striped .tab-item.activated { + margin-top: -2px; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #444; } + .tabs-striped .tab-item.tab-item-active .badge, .tabs-striped .tab-item.active .badge, .tabs-striped .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-light .tabs { + background-color: #fff; } + +.tabs-striped.tabs-light .tab-item { + color: rgba(68, 68, 68, 0.4); + opacity: 1; } + .tabs-striped.tabs-light .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-light .tab-item.tab-item-active, .tabs-striped.tabs-light .tab-item.active, .tabs-striped.tabs-light .tab-item.activated { + margin-top: -2px; + color: #444; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #444; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-stable .tabs { + background-color: #f8f8f8; } + +.tabs-striped.tabs-stable .tab-item { + color: rgba(68, 68, 68, 0.4); + opacity: 1; } + .tabs-striped.tabs-stable .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-stable .tab-item.tab-item-active, .tabs-striped.tabs-stable .tab-item.active, .tabs-striped.tabs-stable .tab-item.activated { + margin-top: -2px; + color: #444; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #444; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-positive .tabs { + background-color: #387ef5; } + +.tabs-striped.tabs-positive .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-positive .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-positive .tab-item.tab-item-active, .tabs-striped.tabs-positive .tab-item.active, .tabs-striped.tabs-positive .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-calm .tabs { + background-color: #11c1f3; } + +.tabs-striped.tabs-calm .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-calm .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-calm .tab-item.tab-item-active, .tabs-striped.tabs-calm .tab-item.active, .tabs-striped.tabs-calm .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-assertive .tabs { + background-color: #ef473a; } + +.tabs-striped.tabs-assertive .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-assertive .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-assertive .tab-item.tab-item-active, .tabs-striped.tabs-assertive .tab-item.active, .tabs-striped.tabs-assertive .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-balanced .tabs { + background-color: #33cd5f; } + +.tabs-striped.tabs-balanced .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-balanced .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-balanced .tab-item.tab-item-active, .tabs-striped.tabs-balanced .tab-item.active, .tabs-striped.tabs-balanced .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-energized .tabs { + background-color: #ffc900; } + +.tabs-striped.tabs-energized .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-energized .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-energized .tab-item.tab-item-active, .tabs-striped.tabs-energized .tab-item.active, .tabs-striped.tabs-energized .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-royal .tabs { + background-color: #886aea; } + +.tabs-striped.tabs-royal .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-royal .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-royal .tab-item.tab-item-active, .tabs-striped.tabs-royal .tab-item.active, .tabs-striped.tabs-royal .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-dark .tabs { + background-color: #444; } + +.tabs-striped.tabs-dark .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-dark .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-dark .tab-item.tab-item-active, .tabs-striped.tabs-dark .tab-item.active, .tabs-striped.tabs-dark .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-background-light .tabs { + background-color: #fff; + background-image: none; } + +.tabs-striped.tabs-background-stable .tabs { + background-color: #f8f8f8; + background-image: none; } + +.tabs-striped.tabs-background-positive .tabs { + background-color: #387ef5; + background-image: none; } + +.tabs-striped.tabs-background-calm .tabs { + background-color: #11c1f3; + background-image: none; } + +.tabs-striped.tabs-background-assertive .tabs { + background-color: #ef473a; + background-image: none; } + +.tabs-striped.tabs-background-balanced .tabs { + background-color: #33cd5f; + background-image: none; } + +.tabs-striped.tabs-background-energized .tabs { + background-color: #ffc900; + background-image: none; } + +.tabs-striped.tabs-background-royal .tabs { + background-color: #886aea; + background-image: none; } + +.tabs-striped.tabs-background-dark .tabs { + background-color: #444; + background-image: none; } + +.tabs-striped.tabs-color-light .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-light .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-light .tab-item.tab-item-active, .tabs-striped.tabs-color-light .tab-item.active, .tabs-striped.tabs-color-light .tab-item.activated { + margin-top: -2px; + color: #fff; + border: 0 solid #fff; + border-top-width: 2px; } + .tabs-striped.tabs-color-light .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-light .tab-item.active .badge, .tabs-striped.tabs-color-light .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-stable .tab-item { + color: rgba(248, 248, 248, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-stable .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-stable .tab-item.tab-item-active, .tabs-striped.tabs-color-stable .tab-item.active, .tabs-striped.tabs-color-stable .tab-item.activated { + margin-top: -2px; + color: #f8f8f8; + border: 0 solid #f8f8f8; + border-top-width: 2px; } + .tabs-striped.tabs-color-stable .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-stable .tab-item.active .badge, .tabs-striped.tabs-color-stable .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-positive .tab-item { + color: rgba(56, 126, 245, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-positive .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-positive .tab-item.tab-item-active, .tabs-striped.tabs-color-positive .tab-item.active, .tabs-striped.tabs-color-positive .tab-item.activated { + margin-top: -2px; + color: #387ef5; + border: 0 solid #387ef5; + border-top-width: 2px; } + .tabs-striped.tabs-color-positive .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-positive .tab-item.active .badge, .tabs-striped.tabs-color-positive .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-calm .tab-item { + color: rgba(17, 193, 243, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-calm .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-calm .tab-item.tab-item-active, .tabs-striped.tabs-color-calm .tab-item.active, .tabs-striped.tabs-color-calm .tab-item.activated { + margin-top: -2px; + color: #11c1f3; + border: 0 solid #11c1f3; + border-top-width: 2px; } + .tabs-striped.tabs-color-calm .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-calm .tab-item.active .badge, .tabs-striped.tabs-color-calm .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-assertive .tab-item { + color: rgba(239, 71, 58, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-assertive .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-assertive .tab-item.tab-item-active, .tabs-striped.tabs-color-assertive .tab-item.active, .tabs-striped.tabs-color-assertive .tab-item.activated { + margin-top: -2px; + color: #ef473a; + border: 0 solid #ef473a; + border-top-width: 2px; } + .tabs-striped.tabs-color-assertive .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-assertive .tab-item.active .badge, .tabs-striped.tabs-color-assertive .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-balanced .tab-item { + color: rgba(51, 205, 95, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-balanced .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-balanced .tab-item.tab-item-active, .tabs-striped.tabs-color-balanced .tab-item.active, .tabs-striped.tabs-color-balanced .tab-item.activated { + margin-top: -2px; + color: #33cd5f; + border: 0 solid #33cd5f; + border-top-width: 2px; } + .tabs-striped.tabs-color-balanced .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-balanced .tab-item.active .badge, .tabs-striped.tabs-color-balanced .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-energized .tab-item { + color: rgba(255, 201, 0, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-energized .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-energized .tab-item.tab-item-active, .tabs-striped.tabs-color-energized .tab-item.active, .tabs-striped.tabs-color-energized .tab-item.activated { + margin-top: -2px; + color: #ffc900; + border: 0 solid #ffc900; + border-top-width: 2px; } + .tabs-striped.tabs-color-energized .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-energized .tab-item.active .badge, .tabs-striped.tabs-color-energized .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-royal .tab-item { + color: rgba(136, 106, 234, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-royal .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-royal .tab-item.tab-item-active, .tabs-striped.tabs-color-royal .tab-item.active, .tabs-striped.tabs-color-royal .tab-item.activated { + margin-top: -2px; + color: #886aea; + border: 0 solid #886aea; + border-top-width: 2px; } + .tabs-striped.tabs-color-royal .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-royal .tab-item.active .badge, .tabs-striped.tabs-color-royal .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-dark .tab-item { + color: rgba(68, 68, 68, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-dark .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-dark .tab-item.tab-item-active, .tabs-striped.tabs-color-dark .tab-item.active, .tabs-striped.tabs-color-dark .tab-item.activated { + margin-top: -2px; + color: #444; + border: 0 solid #444; + border-top-width: 2px; } + .tabs-striped.tabs-color-dark .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-dark .tab-item.active .badge, .tabs-striped.tabs-color-dark .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-background-light .tabs, +.tabs-background-light > .tabs { + background-color: #fff; + background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%); + border-color: #ddd; } + +.tabs-background-stable .tabs, +.tabs-background-stable > .tabs { + background-color: #f8f8f8; + background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%); + border-color: #b2b2b2; } + +.tabs-background-positive .tabs, +.tabs-background-positive > .tabs { + background-color: #387ef5; + background-image: linear-gradient(0deg, #0c60ee, #0c60ee 50%, transparent 50%); + border-color: #0c60ee; } + +.tabs-background-calm .tabs, +.tabs-background-calm > .tabs { + background-color: #11c1f3; + background-image: linear-gradient(0deg, #0a9dc7, #0a9dc7 50%, transparent 50%); + border-color: #0a9dc7; } + +.tabs-background-assertive .tabs, +.tabs-background-assertive > .tabs { + background-color: #ef473a; + background-image: linear-gradient(0deg, #e42112, #e42112 50%, transparent 50%); + border-color: #e42112; } + +.tabs-background-balanced .tabs, +.tabs-background-balanced > .tabs { + background-color: #33cd5f; + background-image: linear-gradient(0deg, #28a54c, #28a54c 50%, transparent 50%); + border-color: #28a54c; } + +.tabs-background-energized .tabs, +.tabs-background-energized > .tabs { + background-color: #ffc900; + background-image: linear-gradient(0deg, #e6b500, #e6b500 50%, transparent 50%); + border-color: #e6b500; } + +.tabs-background-royal .tabs, +.tabs-background-royal > .tabs { + background-color: #886aea; + background-image: linear-gradient(0deg, #6b46e5, #6b46e5 50%, transparent 50%); + border-color: #6b46e5; } + +.tabs-background-dark .tabs, +.tabs-background-dark > .tabs { + background-color: #444; + background-image: linear-gradient(0deg, #111, #111 50%, transparent 50%); + border-color: #111; } + +.tabs-color-light .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-color-light .tab-item .badge { + opacity: 0.4; } + .tabs-color-light .tab-item.tab-item-active, .tabs-color-light .tab-item.active, .tabs-color-light .tab-item.activated { + color: #fff; + border: 0 solid #fff; } + .tabs-color-light .tab-item.tab-item-active .badge, .tabs-color-light .tab-item.active .badge, .tabs-color-light .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-stable .tab-item { + color: rgba(248, 248, 248, 0.4); + opacity: 1; } + .tabs-color-stable .tab-item .badge { + opacity: 0.4; } + .tabs-color-stable .tab-item.tab-item-active, .tabs-color-stable .tab-item.active, .tabs-color-stable .tab-item.activated { + color: #f8f8f8; + border: 0 solid #f8f8f8; } + .tabs-color-stable .tab-item.tab-item-active .badge, .tabs-color-stable .tab-item.active .badge, .tabs-color-stable .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-positive .tab-item { + color: rgba(56, 126, 245, 0.4); + opacity: 1; } + .tabs-color-positive .tab-item .badge { + opacity: 0.4; } + .tabs-color-positive .tab-item.tab-item-active, .tabs-color-positive .tab-item.active, .tabs-color-positive .tab-item.activated { + color: #387ef5; + border: 0 solid #387ef5; } + .tabs-color-positive .tab-item.tab-item-active .badge, .tabs-color-positive .tab-item.active .badge, .tabs-color-positive .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-calm .tab-item { + color: rgba(17, 193, 243, 0.4); + opacity: 1; } + .tabs-color-calm .tab-item .badge { + opacity: 0.4; } + .tabs-color-calm .tab-item.tab-item-active, .tabs-color-calm .tab-item.active, .tabs-color-calm .tab-item.activated { + color: #11c1f3; + border: 0 solid #11c1f3; } + .tabs-color-calm .tab-item.tab-item-active .badge, .tabs-color-calm .tab-item.active .badge, .tabs-color-calm .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-assertive .tab-item { + color: rgba(239, 71, 58, 0.4); + opacity: 1; } + .tabs-color-assertive .tab-item .badge { + opacity: 0.4; } + .tabs-color-assertive .tab-item.tab-item-active, .tabs-color-assertive .tab-item.active, .tabs-color-assertive .tab-item.activated { + color: #ef473a; + border: 0 solid #ef473a; } + .tabs-color-assertive .tab-item.tab-item-active .badge, .tabs-color-assertive .tab-item.active .badge, .tabs-color-assertive .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-balanced .tab-item { + color: rgba(51, 205, 95, 0.4); + opacity: 1; } + .tabs-color-balanced .tab-item .badge { + opacity: 0.4; } + .tabs-color-balanced .tab-item.tab-item-active, .tabs-color-balanced .tab-item.active, .tabs-color-balanced .tab-item.activated { + color: #33cd5f; + border: 0 solid #33cd5f; } + .tabs-color-balanced .tab-item.tab-item-active .badge, .tabs-color-balanced .tab-item.active .badge, .tabs-color-balanced .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-energized .tab-item { + color: rgba(255, 201, 0, 0.4); + opacity: 1; } + .tabs-color-energized .tab-item .badge { + opacity: 0.4; } + .tabs-color-energized .tab-item.tab-item-active, .tabs-color-energized .tab-item.active, .tabs-color-energized .tab-item.activated { + color: #ffc900; + border: 0 solid #ffc900; } + .tabs-color-energized .tab-item.tab-item-active .badge, .tabs-color-energized .tab-item.active .badge, .tabs-color-energized .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-royal .tab-item { + color: rgba(136, 106, 234, 0.4); + opacity: 1; } + .tabs-color-royal .tab-item .badge { + opacity: 0.4; } + .tabs-color-royal .tab-item.tab-item-active, .tabs-color-royal .tab-item.active, .tabs-color-royal .tab-item.activated { + color: #886aea; + border: 0 solid #886aea; } + .tabs-color-royal .tab-item.tab-item-active .badge, .tabs-color-royal .tab-item.active .badge, .tabs-color-royal .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-dark .tab-item { + color: rgba(68, 68, 68, 0.4); + opacity: 1; } + .tabs-color-dark .tab-item .badge { + opacity: 0.4; } + .tabs-color-dark .tab-item.tab-item-active, .tabs-color-dark .tab-item.active, .tabs-color-dark .tab-item.activated { + color: #444; + border: 0 solid #444; } + .tabs-color-dark .tab-item.tab-item-active .badge, .tabs-color-dark .tab-item.active .badge, .tabs-color-dark .tab-item.activated .badge { + opacity: 1; } + +ion-tabs.tabs-color-active-light .tab-item { + color: #444; } + ion-tabs.tabs-color-active-light .tab-item.tab-item-active, ion-tabs.tabs-color-active-light .tab-item.active, ion-tabs.tabs-color-active-light .tab-item.activated { + color: #fff; } + +ion-tabs.tabs-color-active-stable .tab-item { + color: #444; } + ion-tabs.tabs-color-active-stable .tab-item.tab-item-active, ion-tabs.tabs-color-active-stable .tab-item.active, ion-tabs.tabs-color-active-stable .tab-item.activated { + color: #f8f8f8; } + +ion-tabs.tabs-color-active-positive .tab-item { + color: #444; } + ion-tabs.tabs-color-active-positive .tab-item.tab-item-active, ion-tabs.tabs-color-active-positive .tab-item.active, ion-tabs.tabs-color-active-positive .tab-item.activated { + color: #387ef5; } + +ion-tabs.tabs-color-active-calm .tab-item { + color: #444; } + ion-tabs.tabs-color-active-calm .tab-item.tab-item-active, ion-tabs.tabs-color-active-calm .tab-item.active, ion-tabs.tabs-color-active-calm .tab-item.activated { + color: #11c1f3; } + +ion-tabs.tabs-color-active-assertive .tab-item { + color: #444; } + ion-tabs.tabs-color-active-assertive .tab-item.tab-item-active, ion-tabs.tabs-color-active-assertive .tab-item.active, ion-tabs.tabs-color-active-assertive .tab-item.activated { + color: #ef473a; } + +ion-tabs.tabs-color-active-balanced .tab-item { + color: #444; } + ion-tabs.tabs-color-active-balanced .tab-item.tab-item-active, ion-tabs.tabs-color-active-balanced .tab-item.active, ion-tabs.tabs-color-active-balanced .tab-item.activated { + color: #33cd5f; } + +ion-tabs.tabs-color-active-energized .tab-item { + color: #444; } + ion-tabs.tabs-color-active-energized .tab-item.tab-item-active, ion-tabs.tabs-color-active-energized .tab-item.active, ion-tabs.tabs-color-active-energized .tab-item.activated { + color: #ffc900; } + +ion-tabs.tabs-color-active-royal .tab-item { + color: #444; } + ion-tabs.tabs-color-active-royal .tab-item.tab-item-active, ion-tabs.tabs-color-active-royal .tab-item.active, ion-tabs.tabs-color-active-royal .tab-item.activated { + color: #886aea; } + +ion-tabs.tabs-color-active-dark .tab-item { + color: #fff; } + ion-tabs.tabs-color-active-dark .tab-item.tab-item-active, ion-tabs.tabs-color-active-dark .tab-item.active, ion-tabs.tabs-color-active-dark .tab-item.activated { + color: #444; } + +.tabs-top.tabs-striped { + padding-bottom: 0; } + .tabs-top.tabs-striped .tab-item { + background: transparent; + -webkit-transition: color .1s ease; + -moz-transition: color .1s ease; + -ms-transition: color .1s ease; + -o-transition: color .1s ease; + transition: color .1s ease; } + .tabs-top.tabs-striped .tab-item.tab-item-active, .tabs-top.tabs-striped .tab-item.active, .tabs-top.tabs-striped .tab-item.activated { + margin-top: 1px; + border-width: 0px 0px 2px 0px !important; + border-style: solid; } + .tabs-top.tabs-striped .tab-item.tab-item-active > .badge, .tabs-top.tabs-striped .tab-item.tab-item-active > i, .tabs-top.tabs-striped .tab-item.active > .badge, .tabs-top.tabs-striped .tab-item.active > i, .tabs-top.tabs-striped .tab-item.activated > .badge, .tabs-top.tabs-striped .tab-item.activated > i { + margin-top: -1px; } + .tabs-top.tabs-striped .tab-item .badge { + -webkit-transition: color .2s ease; + -moz-transition: color .2s ease; + -ms-transition: color .2s ease; + -o-transition: color .2s ease; + transition: color .2s ease; } + .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active .tab-title, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active i, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active .tab-title, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active i, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated .tab-title, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated i { + display: block; + margin-top: -1px; } + .tabs-top.tabs-striped.tabs-icon-left .tab-item { + margin-top: 1px; } + .tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active .tab-title, .tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active i, .tabs-top.tabs-striped.tabs-icon-left .tab-item.active .tab-title, .tabs-top.tabs-striped.tabs-icon-left .tab-item.active i, .tabs-top.tabs-striped.tabs-icon-left .tab-item.activated .tab-title, .tabs-top.tabs-striped.tabs-icon-left .tab-item.activated i { + margin-top: -0.1em; } + +/* Allow parent element to have tabs-top */ +/* If you change this, change platform.scss as well */ +.tabs-top > .tabs, +.tabs.tabs-top { + top: 44px; + padding-top: 0; + background-position: bottom; + border-top-width: 0; + border-bottom-width: 1px; } + .tabs-top > .tabs .tab-item.tab-item-active .badge, .tabs-top > .tabs .tab-item.active .badge, .tabs-top > .tabs .tab-item.activated .badge, + .tabs.tabs-top .tab-item.tab-item-active .badge, + .tabs.tabs-top .tab-item.active .badge, + .tabs.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-top ~ .bar-header { + border-bottom-width: 0; } + +.tab-item { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + display: block; + overflow: hidden; + max-width: 150px; + height: 100%; + color: inherit; + text-align: center; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + font-weight: 400; + font-size: 14px; + font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif; + opacity: 0.7; } + .tab-item:hover { + cursor: pointer; } + .tab-item.tab-hidden { + display: none; } + +.tabs-item-hide > .tabs, +.tabs.tabs-item-hide { + display: none; } + +.tabs-icon-top > .tabs .tab-item, +.tabs-icon-top.tabs .tab-item, +.tabs-icon-bottom > .tabs .tab-item, +.tabs-icon-bottom.tabs .tab-item { + font-size: 10px; + line-height: 14px; } + +.tab-item .icon { + display: block; + margin: 0 auto; + height: 32px; + font-size: 32px; } + +.tabs-icon-left.tabs .tab-item, +.tabs-icon-left > .tabs .tab-item, +.tabs-icon-right.tabs .tab-item, +.tabs-icon-right > .tabs .tab-item { + font-size: 10px; } + .tabs-icon-left.tabs .tab-item .icon, .tabs-icon-left.tabs .tab-item .tab-title, + .tabs-icon-left > .tabs .tab-item .icon, + .tabs-icon-left > .tabs .tab-item .tab-title, + .tabs-icon-right.tabs .tab-item .icon, + .tabs-icon-right.tabs .tab-item .tab-title, + .tabs-icon-right > .tabs .tab-item .icon, + .tabs-icon-right > .tabs .tab-item .tab-title { + display: inline-block; + vertical-align: top; + margin-top: -.1em; } + .tabs-icon-left.tabs .tab-item .icon:before, .tabs-icon-left.tabs .tab-item .tab-title:before, + .tabs-icon-left > .tabs .tab-item .icon:before, + .tabs-icon-left > .tabs .tab-item .tab-title:before, + .tabs-icon-right.tabs .tab-item .icon:before, + .tabs-icon-right.tabs .tab-item .tab-title:before, + .tabs-icon-right > .tabs .tab-item .icon:before, + .tabs-icon-right > .tabs .tab-item .tab-title:before { + font-size: 24px; + line-height: 49px; } + +.tabs-icon-left > .tabs .tab-item .icon, +.tabs-icon-left.tabs .tab-item .icon { + padding-right: 3px; } + +.tabs-icon-right > .tabs .tab-item .icon, +.tabs-icon-right.tabs .tab-item .icon { + padding-left: 3px; } + +.tabs-icon-only > .tabs .icon, +.tabs-icon-only.tabs .icon { + line-height: inherit; } + +.tab-item.has-badge { + position: relative; } + +.tab-item .badge { + position: absolute; + top: 4%; + right: 33%; + right: calc(50% - 26px); + padding: 1px 6px; + height: auto; + font-size: 12px; + line-height: 16px; } + +/* Navigational tab */ +/* Active state for tab */ +.tab-item.tab-item-active, +.tab-item.active, +.tab-item.activated { + opacity: 1; } + .tab-item.tab-item-active.tab-item-light, + .tab-item.active.tab-item-light, + .tab-item.activated.tab-item-light { + color: #fff; } + .tab-item.tab-item-active.tab-item-stable, + .tab-item.active.tab-item-stable, + .tab-item.activated.tab-item-stable { + color: #f8f8f8; } + .tab-item.tab-item-active.tab-item-positive, + .tab-item.active.tab-item-positive, + .tab-item.activated.tab-item-positive { + color: #387ef5; } + .tab-item.tab-item-active.tab-item-calm, + .tab-item.active.tab-item-calm, + .tab-item.activated.tab-item-calm { + color: #11c1f3; } + .tab-item.tab-item-active.tab-item-assertive, + .tab-item.active.tab-item-assertive, + .tab-item.activated.tab-item-assertive { + color: #ef473a; } + .tab-item.tab-item-active.tab-item-balanced, + .tab-item.active.tab-item-balanced, + .tab-item.activated.tab-item-balanced { + color: #33cd5f; } + .tab-item.tab-item-active.tab-item-energized, + .tab-item.active.tab-item-energized, + .tab-item.activated.tab-item-energized { + color: #ffc900; } + .tab-item.tab-item-active.tab-item-royal, + .tab-item.active.tab-item-royal, + .tab-item.activated.tab-item-royal { + color: #886aea; } + .tab-item.tab-item-active.tab-item-dark, + .tab-item.active.tab-item-dark, + .tab-item.activated.tab-item-dark { + color: #444; } + +.item.tabs { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + padding: 0; } + .item.tabs .icon:before { + position: relative; } + +.tab-item.disabled, +.tab-item[disabled] { + opacity: .4; + cursor: default; + pointer-events: none; } + +.nav-bar-tabs-top.hide ~ .view-container .tabs-top .tabs { + top: 0; } + +.pane[hide-nav-bar="true"] .has-tabs-top { + top: 49px; } + +/** + * Menus + * -------------------------------------------------- + * Side panel structure + */ +.menu { + position: absolute; + top: 0; + bottom: 0; + z-index: 0; + overflow: hidden; + min-height: 100%; + max-height: 100%; + width: 275px; + background-color: #fff; } + .menu .scroll-content { + z-index: 10; } + .menu .bar-header { + z-index: 11; } + +.menu-content { + -webkit-transform: none; + transform: none; + box-shadow: -1px 0px 2px rgba(0, 0, 0, 0.2), 1px 0px 2px rgba(0, 0, 0, 0.2); } + +.menu-open .menu-content .pane, +.menu-open .menu-content .scroll-content { + pointer-events: none; } + +.menu-open .menu-content .scroll-content .scroll { + pointer-events: none; } + +.menu-open .menu-content .scroll-content:not(.overflow-scroll) { + overflow: hidden; } + +.grade-b .menu-content, +.grade-c .menu-content { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + right: -1px; + left: -1px; + border-right: 1px solid #ccc; + border-left: 1px solid #ccc; + box-shadow: none; } + +.menu-left { + left: 0; } + +.menu-right { + right: 0; } + +.aside-open.aside-resizing .menu-right { + display: none; } + +.menu-animated { + -webkit-transition: -webkit-transform 200ms ease; + transition: transform 200ms ease; } + +/** + * Modals + * -------------------------------------------------- + * Modals are independent windows that slide in from off-screen. + */ +.modal-backdrop, +.modal-backdrop-bg { + position: fixed; + top: 0; + left: 0; + z-index: 10; + width: 100%; + height: 100%; } + +.modal-backdrop-bg { + pointer-events: none; } + +.modal { + display: block; + position: absolute; + top: 0; + z-index: 10; + overflow: hidden; + min-height: 100%; + width: 100%; + background-color: #fff; } + +@media (min-width: 680px) { + .modal { + top: 20%; + right: 20%; + bottom: 20%; + left: 20%; + min-height: 240px; + width: 60%; } + .modal.ng-leave-active { + bottom: 0; } + .platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader) { + height: 44px; } + .platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader) > * { + margin-top: 0; } + .platform-ios.platform-cordova .modal-wrapper .modal .tabs-top > .tabs, + .platform-ios.platform-cordova .modal-wrapper .modal .tabs.tabs-top { + top: 44px; } + .platform-ios.platform-cordova .modal-wrapper .modal .has-header, + .platform-ios.platform-cordova .modal-wrapper .modal .bar-subheader { + top: 44px; } + .platform-ios.platform-cordova .modal-wrapper .modal .has-subheader { + top: 88px; } + .platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-tabs-top { + top: 93px; } + .platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top { + top: 137px; } + .modal-backdrop-bg { + -webkit-transition: opacity 300ms ease-in-out; + transition: opacity 300ms ease-in-out; + background-color: #000; + opacity: 0; } + .active .modal-backdrop-bg { + opacity: 0.5; } } + +.modal-open { + pointer-events: none; } + .modal-open .modal, + .modal-open .modal-backdrop { + pointer-events: auto; } + .modal-open.loading-active .modal, + .modal-open.loading-active .modal-backdrop { + pointer-events: none; } + +/** + * Popovers + * -------------------------------------------------- + * Popovers are independent views which float over content + */ +.popover-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 10; + width: 100%; + height: 100%; + background-color: transparent; } + .popover-backdrop.active { + background-color: rgba(0, 0, 0, 0.1); } + +.popover { + position: absolute; + top: 25%; + left: 50%; + z-index: 10; + display: block; + margin-top: 12px; + margin-left: -110px; + height: 280px; + width: 220px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); + opacity: 0; } + .popover .item:first-child { + border-top: 0; } + .popover .item:last-child { + border-bottom: 0; } + .popover.popover-bottom { + margin-top: -12px; } + +.popover, +.popover .bar-header { + border-radius: 2px; } + +.popover .scroll-content { + z-index: 1; + margin: 2px 0; } + +.popover .bar-header { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.popover .has-header { + border-top-right-radius: 0; + border-top-left-radius: 0; } + +.popover-arrow { + display: none; } + +.platform-ios .popover { + box-shadow: 0 0 40px rgba(0, 0, 0, 0.08); + border-radius: 10px; } + +.platform-ios .popover .bar-header { + -webkit-border-top-right-radius: 10px; + border-top-right-radius: 10px; + -webkit-border-top-left-radius: 10px; + border-top-left-radius: 10px; } + +.platform-ios .popover .scroll-content { + margin: 8px 0; + border-radius: 10px; } + +.platform-ios .popover .scroll-content.has-header { + margin-top: 0; } + +.platform-ios .popover-arrow { + position: absolute; + display: block; + top: -17px; + width: 30px; + height: 19px; + overflow: hidden; } + .platform-ios .popover-arrow:after { + position: absolute; + top: 12px; + left: 5px; + width: 20px; + height: 20px; + background-color: #fff; + border-radius: 3px; + content: ''; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); } + +.platform-ios .popover-bottom .popover-arrow { + top: auto; + bottom: -10px; } + .platform-ios .popover-bottom .popover-arrow:after { + top: -6px; } + +.platform-android .popover { + margin-top: -32px; + background-color: #fafafa; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35); } + .platform-android .popover .item { + border-color: #fafafa; + background-color: #fafafa; + color: #4d4d4d; } + .platform-android .popover.popover-bottom { + margin-top: 32px; } + +.platform-android .popover-backdrop, +.platform-android .popover-backdrop.active { + background-color: transparent; } + +.popover-open { + pointer-events: none; } + .popover-open .popover, + .popover-open .popover-backdrop { + pointer-events: auto; } + .popover-open.loading-active .popover, + .popover-open.loading-active .popover-backdrop { + pointer-events: none; } + +@media (min-width: 680px) { + .popover { + width: 360px; + margin-left: -180px; } } + +/** + * Popups + * -------------------------------------------------- + */ +.popup-container { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + z-index: 12; + visibility: hidden; } + .popup-container.popup-showing { + visibility: visible; } + .popup-container.popup-hidden .popup { + -webkit-animation-name: scaleOut; + animation-name: scaleOut; + -webkit-animation-duration: 0.1s; + animation-duration: 0.1s; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; } + .popup-container.active .popup { + -webkit-animation-name: superScaleIn; + animation-name: superScaleIn; + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; } + .popup-container .popup { + width: 250px; + max-width: 100%; + max-height: 90%; + border-radius: 0px; + background-color: rgba(255, 255, 255, 0.9); + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: vertical; + -webkit-flex-direction: column; + -moz-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .popup-container input, + .popup-container textarea { + width: 100%; } + +.popup-head { + padding: 15px 10px; + border-bottom: 1px solid #eee; + text-align: center; } + +.popup-title { + margin: 0; + padding: 0; + font-size: 15px; } + +.popup-sub-title { + margin: 5px 0 0 0; + padding: 0; + font-weight: normal; + font-size: 11px; } + +.popup-body { + padding: 10px; + overflow: auto; } + +.popup-buttons { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: horizontal; + -webkit-flex-direction: row; + -moz-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + padding: 10px; + min-height: 65px; } + .popup-buttons .button { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + display: block; + min-height: 45px; + border-radius: 2px; + line-height: 20px; + margin-right: 5px; } + .popup-buttons .button:last-child { + margin-right: 0px; } + +.popup-open { + pointer-events: none; } + .popup-open.modal-open .modal { + pointer-events: none; } + .popup-open .popup-backdrop, .popup-open .popup { + pointer-events: auto; } + +/** + * Loading + * -------------------------------------------------- + */ +.loading-container { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + z-index: 13; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + -webkit-transition: 0.2s opacity linear; + transition: 0.2s opacity linear; + visibility: hidden; + opacity: 0; } + .loading-container:not(.visible) .icon, + .loading-container:not(.visible) .spinner { + display: none; } + .loading-container.visible { + visibility: visible; } + .loading-container.active { + opacity: 1; } + .loading-container .loading { + padding: 20px; + border-radius: 5px; + background-color: rgba(0, 0, 0, 0.7); + color: #fff; + text-align: center; + text-overflow: ellipsis; + font-size: 15px; } + .loading-container .loading h1, .loading-container .loading h2, .loading-container .loading h3, .loading-container .loading h4, .loading-container .loading h5, .loading-container .loading h6 { + color: #fff; } + +/** + * Items + * -------------------------------------------------- + */ +.item { + border-color: #ddd; + background-color: #fff; + color: #444; + position: relative; + z-index: 2; + display: block; + margin: -1px; + padding: 16px; + border-width: 1px; + border-style: solid; + font-size: 16px; } + .item h2 { + margin: 0 0 2px 0; + font-size: 16px; + font-weight: normal; } + .item h3 { + margin: 0 0 4px 0; + font-size: 14px; } + .item h4 { + margin: 0 0 4px 0; + font-size: 12px; } + .item h5, .item h6 { + margin: 0 0 3px 0; + font-size: 10px; } + .item p { + color: #666; + font-size: 14px; + margin-bottom: 2px; } + .item h1:last-child, + .item h2:last-child, + .item h3:last-child, + .item h4:last-child, + .item h5:last-child, + .item h6:last-child, + .item p:last-child { + margin-bottom: 0; } + .item .badge { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + position: absolute; + top: 16px; + right: 32px; } + .item.item-button-right .badge { + right: 67px; } + .item.item-divider .badge { + top: 8px; } + .item .badge + .badge { + margin-right: 5px; } + .item.item-light { + border-color: #ddd; + background-color: #fff; + color: #444; } + .item.item-stable { + border-color: #b2b2b2; + background-color: #f8f8f8; + color: #444; } + .item.item-positive { + border-color: #0c60ee; + background-color: #387ef5; + color: #fff; } + .item.item-calm { + border-color: #0a9dc7; + background-color: #11c1f3; + color: #fff; } + .item.item-assertive { + border-color: #e42112; + background-color: #ef473a; + color: #fff; } + .item.item-balanced { + border-color: #28a54c; + background-color: #33cd5f; + color: #fff; } + .item.item-energized { + border-color: #e6b500; + background-color: #ffc900; + color: #fff; } + .item.item-royal { + border-color: #6b46e5; + background-color: #886aea; + color: #fff; } + .item.item-dark { + border-color: #111; + background-color: #444; + color: #fff; } + .item[ng-click]:hover { + cursor: pointer; } + +.list-borderless .item, +.item-borderless { + border-width: 0; } + +.item.active, +.item.activated, +.item-complex.active .item-content, +.item-complex.activated .item-content, +.item .item-content.active, +.item .item-content.activated { + border-color: #ccc; + background-color: #D9D9D9; } + .item.active.item-complex > .item-content, + .item.activated.item-complex > .item-content, + .item-complex.active .item-content.item-complex > .item-content, + .item-complex.activated .item-content.item-complex > .item-content, + .item .item-content.active.item-complex > .item-content, + .item .item-content.activated.item-complex > .item-content { + border-color: #ccc; + background-color: #D9D9D9; } + .item.active.item-light, + .item.activated.item-light, + .item-complex.active .item-content.item-light, + .item-complex.activated .item-content.item-light, + .item .item-content.active.item-light, + .item .item-content.activated.item-light { + border-color: #ccc; + background-color: #fafafa; } + .item.active.item-light.item-complex > .item-content, + .item.activated.item-light.item-complex > .item-content, + .item-complex.active .item-content.item-light.item-complex > .item-content, + .item-complex.activated .item-content.item-light.item-complex > .item-content, + .item .item-content.active.item-light.item-complex > .item-content, + .item .item-content.activated.item-light.item-complex > .item-content { + border-color: #ccc; + background-color: #fafafa; } + .item.active.item-stable, + .item.activated.item-stable, + .item-complex.active .item-content.item-stable, + .item-complex.activated .item-content.item-stable, + .item .item-content.active.item-stable, + .item .item-content.activated.item-stable { + border-color: #a2a2a2; + background-color: #e5e5e5; } + .item.active.item-stable.item-complex > .item-content, + .item.activated.item-stable.item-complex > .item-content, + .item-complex.active .item-content.item-stable.item-complex > .item-content, + .item-complex.activated .item-content.item-stable.item-complex > .item-content, + .item .item-content.active.item-stable.item-complex > .item-content, + .item .item-content.activated.item-stable.item-complex > .item-content { + border-color: #a2a2a2; + background-color: #e5e5e5; } + .item.active.item-positive, + .item.activated.item-positive, + .item-complex.active .item-content.item-positive, + .item-complex.activated .item-content.item-positive, + .item .item-content.active.item-positive, + .item .item-content.activated.item-positive { + border-color: #0c60ee; + background-color: #0c60ee; } + .item.active.item-positive.item-complex > .item-content, + .item.activated.item-positive.item-complex > .item-content, + .item-complex.active .item-content.item-positive.item-complex > .item-content, + .item-complex.activated .item-content.item-positive.item-complex > .item-content, + .item .item-content.active.item-positive.item-complex > .item-content, + .item .item-content.activated.item-positive.item-complex > .item-content { + border-color: #0c60ee; + background-color: #0c60ee; } + .item.active.item-calm, + .item.activated.item-calm, + .item-complex.active .item-content.item-calm, + .item-complex.activated .item-content.item-calm, + .item .item-content.active.item-calm, + .item .item-content.activated.item-calm { + border-color: #0a9dc7; + background-color: #0a9dc7; } + .item.active.item-calm.item-complex > .item-content, + .item.activated.item-calm.item-complex > .item-content, + .item-complex.active .item-content.item-calm.item-complex > .item-content, + .item-complex.activated .item-content.item-calm.item-complex > .item-content, + .item .item-content.active.item-calm.item-complex > .item-content, + .item .item-content.activated.item-calm.item-complex > .item-content { + border-color: #0a9dc7; + background-color: #0a9dc7; } + .item.active.item-assertive, + .item.activated.item-assertive, + .item-complex.active .item-content.item-assertive, + .item-complex.activated .item-content.item-assertive, + .item .item-content.active.item-assertive, + .item .item-content.activated.item-assertive { + border-color: #e42112; + background-color: #e42112; } + .item.active.item-assertive.item-complex > .item-content, + .item.activated.item-assertive.item-complex > .item-content, + .item-complex.active .item-content.item-assertive.item-complex > .item-content, + .item-complex.activated .item-content.item-assertive.item-complex > .item-content, + .item .item-content.active.item-assertive.item-complex > .item-content, + .item .item-content.activated.item-assertive.item-complex > .item-content { + border-color: #e42112; + background-color: #e42112; } + .item.active.item-balanced, + .item.activated.item-balanced, + .item-complex.active .item-content.item-balanced, + .item-complex.activated .item-content.item-balanced, + .item .item-content.active.item-balanced, + .item .item-content.activated.item-balanced { + border-color: #28a54c; + background-color: #28a54c; } + .item.active.item-balanced.item-complex > .item-content, + .item.activated.item-balanced.item-complex > .item-content, + .item-complex.active .item-content.item-balanced.item-complex > .item-content, + .item-complex.activated .item-content.item-balanced.item-complex > .item-content, + .item .item-content.active.item-balanced.item-complex > .item-content, + .item .item-content.activated.item-balanced.item-complex > .item-content { + border-color: #28a54c; + background-color: #28a54c; } + .item.active.item-energized, + .item.activated.item-energized, + .item-complex.active .item-content.item-energized, + .item-complex.activated .item-content.item-energized, + .item .item-content.active.item-energized, + .item .item-content.activated.item-energized { + border-color: #e6b500; + background-color: #e6b500; } + .item.active.item-energized.item-complex > .item-content, + .item.activated.item-energized.item-complex > .item-content, + .item-complex.active .item-content.item-energized.item-complex > .item-content, + .item-complex.activated .item-content.item-energized.item-complex > .item-content, + .item .item-content.active.item-energized.item-complex > .item-content, + .item .item-content.activated.item-energized.item-complex > .item-content { + border-color: #e6b500; + background-color: #e6b500; } + .item.active.item-royal, + .item.activated.item-royal, + .item-complex.active .item-content.item-royal, + .item-complex.activated .item-content.item-royal, + .item .item-content.active.item-royal, + .item .item-content.activated.item-royal { + border-color: #6b46e5; + background-color: #6b46e5; } + .item.active.item-royal.item-complex > .item-content, + .item.activated.item-royal.item-complex > .item-content, + .item-complex.active .item-content.item-royal.item-complex > .item-content, + .item-complex.activated .item-content.item-royal.item-complex > .item-content, + .item .item-content.active.item-royal.item-complex > .item-content, + .item .item-content.activated.item-royal.item-complex > .item-content { + border-color: #6b46e5; + background-color: #6b46e5; } + .item.active.item-dark, + .item.activated.item-dark, + .item-complex.active .item-content.item-dark, + .item-complex.activated .item-content.item-dark, + .item .item-content.active.item-dark, + .item .item-content.activated.item-dark { + border-color: #000; + background-color: #262626; } + .item.active.item-dark.item-complex > .item-content, + .item.activated.item-dark.item-complex > .item-content, + .item-complex.active .item-content.item-dark.item-complex > .item-content, + .item-complex.activated .item-content.item-dark.item-complex > .item-content, + .item .item-content.active.item-dark.item-complex > .item-content, + .item .item-content.activated.item-dark.item-complex > .item-content { + border-color: #000; + background-color: #262626; } + +.item, +.item h1, +.item h2, +.item h3, +.item h4, +.item h5, +.item h6, +.item p, +.item-content, +.item-content h1, +.item-content h2, +.item-content h3, +.item-content h4, +.item-content h5, +.item-content h6, +.item-content p { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + +a.item { + color: inherit; + text-decoration: none; } + a.item:hover, a.item:focus { + text-decoration: none; } + +/** + * Complex Items + * -------------------------------------------------- + * Adding .item-complex allows the .item to be slidable and + * have options underneath the button, but also requires an + * additional .item-content element inside .item. + * Basically .item-complex removes any default settings which + * .item added, so that .item-content looks them as just .item. + */ +.item-complex, +a.item.item-complex, +button.item.item-complex { + padding: 0; } + +.item-complex .item-content, +.item-radio .item-content { + position: relative; + z-index: 2; + padding: 16px 49px 16px 16px; + border: none; + background-color: #fff; } + +a.item-content { + display: block; + color: inherit; + text-decoration: none; } + +.item-text-wrap .item, +.item-text-wrap .item-content, +.item-text-wrap, +.item-text-wrap h1, +.item-text-wrap h2, +.item-text-wrap h3, +.item-text-wrap h4, +.item-text-wrap h5, +.item-text-wrap h6, +.item-text-wrap p, +.item-complex.item-text-wrap .item-content, +.item-body h1, +.item-body h2, +.item-body h3, +.item-body h4, +.item-body h5, +.item-body h6, +.item-body p { + overflow: visible; + white-space: normal; } + +.item-complex.item-text-wrap, +.item-complex.item-text-wrap h1, +.item-complex.item-text-wrap h2, +.item-complex.item-text-wrap h3, +.item-complex.item-text-wrap h4, +.item-complex.item-text-wrap h5, +.item-complex.item-text-wrap h6, +.item-complex.item-text-wrap p { + overflow: visible; + white-space: normal; } + +.item-complex.item-light > .item-content { + border-color: #ddd; + background-color: #fff; + color: #444; } + .item-complex.item-light > .item-content.active, .item-complex.item-light > .item-content:active { + border-color: #ccc; + background-color: #fafafa; } + .item-complex.item-light > .item-content.active.item-complex > .item-content, .item-complex.item-light > .item-content:active.item-complex > .item-content { + border-color: #ccc; + background-color: #fafafa; } + +.item-complex.item-stable > .item-content { + border-color: #b2b2b2; + background-color: #f8f8f8; + color: #444; } + .item-complex.item-stable > .item-content.active, .item-complex.item-stable > .item-content:active { + border-color: #a2a2a2; + background-color: #e5e5e5; } + .item-complex.item-stable > .item-content.active.item-complex > .item-content, .item-complex.item-stable > .item-content:active.item-complex > .item-content { + border-color: #a2a2a2; + background-color: #e5e5e5; } + +.item-complex.item-positive > .item-content { + border-color: #0c60ee; + background-color: #387ef5; + color: #fff; } + .item-complex.item-positive > .item-content.active, .item-complex.item-positive > .item-content:active { + border-color: #0c60ee; + background-color: #0c60ee; } + .item-complex.item-positive > .item-content.active.item-complex > .item-content, .item-complex.item-positive > .item-content:active.item-complex > .item-content { + border-color: #0c60ee; + background-color: #0c60ee; } + +.item-complex.item-calm > .item-content { + border-color: #0a9dc7; + background-color: #11c1f3; + color: #fff; } + .item-complex.item-calm > .item-content.active, .item-complex.item-calm > .item-content:active { + border-color: #0a9dc7; + background-color: #0a9dc7; } + .item-complex.item-calm > .item-content.active.item-complex > .item-content, .item-complex.item-calm > .item-content:active.item-complex > .item-content { + border-color: #0a9dc7; + background-color: #0a9dc7; } + +.item-complex.item-assertive > .item-content { + border-color: #e42112; + background-color: #ef473a; + color: #fff; } + .item-complex.item-assertive > .item-content.active, .item-complex.item-assertive > .item-content:active { + border-color: #e42112; + background-color: #e42112; } + .item-complex.item-assertive > .item-content.active.item-complex > .item-content, .item-complex.item-assertive > .item-content:active.item-complex > .item-content { + border-color: #e42112; + background-color: #e42112; } + +.item-complex.item-balanced > .item-content { + border-color: #28a54c; + background-color: #33cd5f; + color: #fff; } + .item-complex.item-balanced > .item-content.active, .item-complex.item-balanced > .item-content:active { + border-color: #28a54c; + background-color: #28a54c; } + .item-complex.item-balanced > .item-content.active.item-complex > .item-content, .item-complex.item-balanced > .item-content:active.item-complex > .item-content { + border-color: #28a54c; + background-color: #28a54c; } + +.item-complex.item-energized > .item-content { + border-color: #e6b500; + background-color: #ffc900; + color: #fff; } + .item-complex.item-energized > .item-content.active, .item-complex.item-energized > .item-content:active { + border-color: #e6b500; + background-color: #e6b500; } + .item-complex.item-energized > .item-content.active.item-complex > .item-content, .item-complex.item-energized > .item-content:active.item-complex > .item-content { + border-color: #e6b500; + background-color: #e6b500; } + +.item-complex.item-royal > .item-content { + border-color: #6b46e5; + background-color: #886aea; + color: #fff; } + .item-complex.item-royal > .item-content.active, .item-complex.item-royal > .item-content:active { + border-color: #6b46e5; + background-color: #6b46e5; } + .item-complex.item-royal > .item-content.active.item-complex > .item-content, .item-complex.item-royal > .item-content:active.item-complex > .item-content { + border-color: #6b46e5; + background-color: #6b46e5; } + +.item-complex.item-dark > .item-content { + border-color: #111; + background-color: #444; + color: #fff; } + .item-complex.item-dark > .item-content.active, .item-complex.item-dark > .item-content:active { + border-color: #000; + background-color: #262626; } + .item-complex.item-dark > .item-content.active.item-complex > .item-content, .item-complex.item-dark > .item-content:active.item-complex > .item-content { + border-color: #000; + background-color: #262626; } + +/** + * Item Icons + * -------------------------------------------------- + */ +.item-icon-left .icon, +.item-icon-right .icon { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: absolute; + top: 0; + height: 100%; + font-size: 32px; } + .item-icon-left .icon:before, + .item-icon-right .icon:before { + display: block; + width: 32px; + text-align: center; } + +.item .fill-icon { + min-width: 30px; + min-height: 30px; + font-size: 28px; } + +.item-icon-left { + padding-left: 54px; } + .item-icon-left .icon { + left: 11px; } + +.item-complex.item-icon-left { + padding-left: 0; } + .item-complex.item-icon-left .item-content { + padding-left: 54px; } + +.item-icon-right { + padding-right: 54px; } + .item-icon-right .icon { + right: 11px; } + +.item-complex.item-icon-right { + padding-right: 0; } + .item-complex.item-icon-right .item-content { + padding-right: 54px; } + +.item-icon-left.item-icon-right .icon:first-child { + right: auto; } + +.item-icon-left.item-icon-right .icon:last-child, +.item-icon-left .item-delete .icon { + left: auto; } + +.item-icon-left .icon-accessory, +.item-icon-right .icon-accessory { + color: #ccc; + font-size: 16px; } + +.item-icon-left .icon-accessory { + left: 3px; } + +.item-icon-right .icon-accessory { + right: 3px; } + +/** + * Item Button + * -------------------------------------------------- + * An item button is a child button inside an .item (not the entire .item) + */ +.item-button-left { + padding-left: 72px; } + +.item-button-left > .button, +.item-button-left .item-content > .button { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: absolute; + top: 8px; + left: 11px; + min-width: 34px; + min-height: 34px; + font-size: 18px; + line-height: 32px; } + .item-button-left > .button .icon:before, + .item-button-left .item-content > .button .icon:before { + position: relative; + left: auto; + width: auto; + line-height: 31px; } + .item-button-left > .button > .button, + .item-button-left .item-content > .button > .button { + margin: 0px 2px; + min-height: 34px; + font-size: 18px; + line-height: 32px; } + +.item-button-right, +a.item.item-button-right, +button.item.item-button-right { + padding-right: 80px; } + +.item-button-right > .button, +.item-button-right .item-content > .button, +.item-button-right > .buttons, +.item-button-right .item-content > .buttons { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: absolute; + top: 8px; + right: 16px; + min-width: 34px; + min-height: 34px; + font-size: 18px; + line-height: 32px; } + .item-button-right > .button .icon:before, + .item-button-right .item-content > .button .icon:before, + .item-button-right > .buttons .icon:before, + .item-button-right .item-content > .buttons .icon:before { + position: relative; + left: auto; + width: auto; + line-height: 31px; } + .item-button-right > .button > .button, + .item-button-right .item-content > .button > .button, + .item-button-right > .buttons > .button, + .item-button-right .item-content > .buttons > .button { + margin: 0px 2px; + min-width: 34px; + min-height: 34px; + font-size: 18px; + line-height: 32px; } + +.item-avatar, +.item-avatar .item-content, +.item-avatar-left, +.item-avatar-left .item-content { + padding-left: 72px; + min-height: 72px; } + .item-avatar > img:first-child, + .item-avatar .item-image, + .item-avatar .item-content > img:first-child, + .item-avatar .item-content .item-image, + .item-avatar-left > img:first-child, + .item-avatar-left .item-image, + .item-avatar-left .item-content > img:first-child, + .item-avatar-left .item-content .item-image { + position: absolute; + top: 16px; + left: 16px; + max-width: 40px; + max-height: 40px; + width: 100%; + height: 100%; + border-radius: 50%; } + +.item-avatar-right, +.item-avatar-right .item-content { + padding-right: 72px; + min-height: 72px; } + .item-avatar-right > img:first-child, + .item-avatar-right .item-image, + .item-avatar-right .item-content > img:first-child, + .item-avatar-right .item-content .item-image { + position: absolute; + top: 16px; + right: 16px; + max-width: 40px; + max-height: 40px; + width: 100%; + height: 100%; + border-radius: 50%; } + +.item-thumbnail-left, +.item-thumbnail-left .item-content { + padding-top: 8px; + padding-left: 106px; + min-height: 100px; } + .item-thumbnail-left > img:first-child, + .item-thumbnail-left .item-image, + .item-thumbnail-left .item-content > img:first-child, + .item-thumbnail-left .item-content .item-image { + position: absolute; + top: 10px; + left: 10px; + max-width: 80px; + max-height: 80px; + width: 100%; + height: 100%; } + +.item-avatar.item-complex, +.item-avatar-left.item-complex, +.item-thumbnail-left.item-complex { + padding-top: 0; + padding-left: 0; } + +.item-thumbnail-right, +.item-thumbnail-right .item-content { + padding-top: 8px; + padding-right: 106px; + min-height: 100px; } + .item-thumbnail-right > img:first-child, + .item-thumbnail-right .item-image, + .item-thumbnail-right .item-content > img:first-child, + .item-thumbnail-right .item-content .item-image { + position: absolute; + top: 10px; + right: 10px; + max-width: 80px; + max-height: 80px; + width: 100%; + height: 100%; } + +.item-avatar-right.item-complex, +.item-thumbnail-right.item-complex { + padding-top: 0; + padding-right: 0; } + +.item-image { + padding: 0; + text-align: center; } + .item-image img:first-child, .item-image .list-img { + width: 100%; + vertical-align: middle; } + +.item-body { + overflow: auto; + padding: 16px; + text-overflow: inherit; + white-space: normal; } + .item-body h1, .item-body h2, .item-body h3, .item-body h4, .item-body h5, .item-body h6, .item-body p { + margin-top: 16px; + margin-bottom: 16px; } + +.item-divider { + padding-top: 8px; + padding-bottom: 8px; + min-height: 30px; + background-color: #f5f5f5; + color: #222; + font-weight: 500; } + +.platform-ios .item-divider-platform, +.item-divider-ios { + padding-top: 26px; + text-transform: uppercase; + font-weight: 300; + font-size: 13px; + background-color: #efeff4; + color: #555; } + +.platform-android .item-divider-platform, +.item-divider-android { + font-weight: 300; + font-size: 13px; } + +.item-note { + float: right; + color: #aaa; + font-size: 14px; } + +.item-left-editable .item-content, +.item-right-editable .item-content { + -webkit-transition-duration: 250ms; + transition-duration: 250ms; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-property: -webkit-transform; + -moz-transition-property: -moz-transform; + transition-property: transform; } + +.list-left-editing .item-left-editable .item-content, +.item-left-editing.item-left-editable .item-content { + -webkit-transform: translate3d(50px, 0, 0); + transform: translate3d(50px, 0, 0); } + +.item-remove-animate.ng-leave { + -webkit-transition-duration: 300ms; + transition-duration: 300ms; } + +.item-remove-animate.ng-leave .item-content, .item-remove-animate.ng-leave:last-of-type { + -webkit-transition-duration: 300ms; + transition-duration: 300ms; + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + -webkit-transition-property: all; + transition-property: all; } + +.item-remove-animate.ng-leave.ng-leave-active .item-content { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) !important; + transform: translate3d(-100%, 0, 0) !important; } + +.item-remove-animate.ng-leave.ng-leave-active:last-of-type { + opacity: 0; } + +.item-remove-animate.ng-leave.ng-leave-active ~ ion-item:not(.ng-leave) { + -webkit-transform: translate3d(0, -webkit-calc(-100% + 1px), 0); + transform: translate3d(0, calc(-100% + 1px), 0); + -webkit-transition-duration: 300ms; + transition-duration: 300ms; + -webkit-transition-timing-function: cubic-bezier(0.25, 0.81, 0.24, 1); + transition-timing-function: cubic-bezier(0.25, 0.81, 0.24, 1); + -webkit-transition-property: all; + transition-property: all; } + +.item-left-edit { + -webkit-transition: all ease-in-out 125ms; + transition: all ease-in-out 125ms; + position: absolute; + top: 0; + left: 0; + z-index: 0; + width: 50px; + height: 100%; + line-height: 100%; + display: none; + opacity: 0; + -webkit-transform: translate3d(-21px, 0, 0); + transform: translate3d(-21px, 0, 0); } + .item-left-edit .button { + height: 100%; } + .item-left-edit .button.icon { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: absolute; + top: 0; + height: 100%; } + .item-left-edit.visible { + display: block; } + .item-left-edit.visible.active { + opacity: 1; + -webkit-transform: translate3d(8px, 0, 0); + transform: translate3d(8px, 0, 0); } + +.list-left-editing .item-left-edit { + -webkit-transition-delay: 125ms; + transition-delay: 125ms; } + +.item-delete .button.icon { + color: #ef473a; + font-size: 24px; } + .item-delete .button.icon:hover { + opacity: .7; } + +.item-right-edit { + -webkit-transition: all ease-in-out 250ms; + transition: all ease-in-out 250ms; + position: absolute; + top: 0; + right: 0; + z-index: 3; + width: 75px; + height: 100%; + background: inherit; + padding-left: 20px; + display: block; + opacity: 0; + -webkit-transform: translate3d(75px, 0, 0); + transform: translate3d(75px, 0, 0); } + .item-right-edit .button { + min-width: 50px; + height: 100%; } + .item-right-edit .button.icon { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: absolute; + top: 0; + height: 100%; + font-size: 32px; } + .item-right-edit.visible { + display: block; } + .item-right-edit.visible.active { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +.item-reorder .button.icon { + color: #444; + font-size: 32px; } + +.item-reordering { + position: absolute; + left: 0; + top: 0; + z-index: 9; + width: 100%; + box-shadow: 0px 0px 10px 0px #aaa; } + .item-reordering .item-reorder { + z-index: 9; } + +.item-placeholder { + opacity: 0.7; } + +/** + * The hidden right-side buttons that can be exposed under a list item + * with dragging. + */ +.item-options { + position: absolute; + top: 0; + right: 0; + z-index: 1; + height: 100%; } + .item-options .button { + height: 100%; + border: none; + border-radius: 0; + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: -moz-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; } + .item-options .button:before { + margin: 0 auto; } + +/** + * Lists + * -------------------------------------------------- + */ +.list { + position: relative; + padding-top: 1px; + padding-bottom: 1px; + padding-left: 0; + margin-bottom: 20px; } + +.list:last-child { + margin-bottom: 0px; } + .list:last-child.card { + margin-bottom: 40px; } + +/** + * List Header + * -------------------------------------------------- + */ +.list-header { + margin-top: 20px; + padding: 5px 15px; + background-color: transparent; + color: #222; + font-weight: bold; } + +.card.list .list-item { + padding-right: 1px; + padding-left: 1px; } + +/** + * Cards and Inset Lists + * -------------------------------------------------- + * A card and list-inset are close to the same thing, except a card as a box shadow. + */ +.card, +.list-inset { + overflow: hidden; + margin: 20px 10px; + border-radius: 2px; + background-color: #fff; } + +.card { + padding-top: 1px; + padding-bottom: 1px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); } + .card .item { + border-left: 0; + border-right: 0; } + .card .item:first-child { + border-top: 0; } + .card .item:last-child { + border-bottom: 0; } + +.padding .card, .padding .list-inset { + margin-left: 0; + margin-right: 0; } + +.card .item:first-child, +.list-inset .item:first-child, +.padding > .list .item:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; } + .card .item:first-child .item-content, + .list-inset .item:first-child .item-content, + .padding > .list .item:first-child .item-content { + border-top-left-radius: 2px; + border-top-right-radius: 2px; } + +.card .item:last-child, +.list-inset .item:last-child, +.padding > .list .item:last-child { + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; } + .card .item:last-child .item-content, + .list-inset .item:last-child .item-content, + .padding > .list .item:last-child .item-content { + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; } + +.card .item:last-child, +.list-inset .item:last-child { + margin-bottom: -1px; } + +.card .item, +.list-inset .item, +.padding > .list .item, +.padding-horizontal > .list .item { + margin-right: 0; + margin-left: 0; } + .card .item.item-input input, + .list-inset .item.item-input input, + .padding > .list .item.item-input input, + .padding-horizontal > .list .item.item-input input { + padding-right: 44px; } + +.padding-left > .list .item { + margin-left: 0; } + +.padding-right > .list .item { + margin-right: 0; } + +/** + * Badges + * -------------------------------------------------- + */ +.badge { + background-color: transparent; + color: #AAAAAA; + z-index: 1; + display: inline-block; + padding: 3px 8px; + min-width: 10px; + border-radius: 10px; + vertical-align: baseline; + text-align: center; + white-space: nowrap; + font-weight: bold; + font-size: 14px; + line-height: 16px; } + .badge:empty { + display: none; } + +.tabs .tab-item .badge.badge-light, +.badge.badge-light { + background-color: #fff; + color: #444; } + +.tabs .tab-item .badge.badge-stable, +.badge.badge-stable { + background-color: #f8f8f8; + color: #444; } + +.tabs .tab-item .badge.badge-positive, +.badge.badge-positive { + background-color: #387ef5; + color: #fff; } + +.tabs .tab-item .badge.badge-calm, +.badge.badge-calm { + background-color: #11c1f3; + color: #fff; } + +.tabs .tab-item .badge.badge-assertive, +.badge.badge-assertive { + background-color: #ef473a; + color: #fff; } + +.tabs .tab-item .badge.badge-balanced, +.badge.badge-balanced { + background-color: #33cd5f; + color: #fff; } + +.tabs .tab-item .badge.badge-energized, +.badge.badge-energized { + background-color: #ffc900; + color: #fff; } + +.tabs .tab-item .badge.badge-royal, +.badge.badge-royal { + background-color: #886aea; + color: #fff; } + +.tabs .tab-item .badge.badge-dark, +.badge.badge-dark { + background-color: #444; + color: #fff; } + +.button .badge { + position: relative; + top: -1px; } + +/** + * Slide Box + * -------------------------------------------------- + */ +.slider { + position: relative; + visibility: hidden; + overflow: hidden; } + +.slider-slides { + position: relative; + height: 100%; } + +.slider-slide { + position: relative; + display: block; + float: left; + width: 100%; + height: 100%; + vertical-align: top; } + +.slider-slide-image > img { + width: 100%; } + +.slider-pager { + position: absolute; + bottom: 20px; + z-index: 1; + width: 100%; + height: 15px; + text-align: center; } + .slider-pager .slider-pager-page { + display: inline-block; + margin: 0px 3px; + width: 15px; + color: #000; + text-decoration: none; + opacity: 0.3; } + .slider-pager .slider-pager-page.active { + -webkit-transition: opacity 0.4s ease-in; + transition: opacity 0.4s ease-in; + opacity: 1; } + +.slider-slide.ng-enter, .slider-slide.ng-leave, .slider-slide.ng-animate, +.slider-pager-page.ng-enter, +.slider-pager-page.ng-leave, +.slider-pager-page.ng-animate { + -webkit-transition: none !important; + transition: none !important; } + +.slider-slide.ng-animate, +.slider-pager-page.ng-animate { + -webkit-animation: none 0s; + animation: none 0s; } + +/** + * Swiper 3.2.7 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * + * http://www.idangero.us/swiper/ + * + * Copyright 2015, Vladimir Kharlampidi + * The iDangero.us + * http://www.idangero.us/ + * + * Licensed under MIT + * + * Released on: December 7, 2015 + */ +.swiper-container { + margin: 0 auto; + position: relative; + overflow: hidden; + /* Fix of Webkit flickering */ + z-index: 1; } + +.swiper-container-no-flexbox .swiper-slide { + float: left; } + +.swiper-container-vertical > .swiper-wrapper { + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -ms-flex-direction: column; + -webkit-flex-direction: column; + flex-direction: column; } + +.swiper-wrapper { + position: relative; + width: 100%; + height: 100%; + z-index: 1; + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-transition-property: -webkit-transform; + -moz-transition-property: -moz-transform; + -o-transition-property: -o-transform; + -ms-transition-property: -ms-transform; + transition-property: transform; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; } + +.swiper-container-android .swiper-slide, +.swiper-wrapper { + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate(0px, 0px); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); } + +.swiper-container-multirow > .swiper-wrapper { + -webkit-box-lines: multiple; + -moz-box-lines: multiple; + -ms-flex-wrap: wrap; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; } + +.swiper-container-free-mode > .swiper-wrapper { + -webkit-transition-timing-function: ease-out; + -moz-transition-timing-function: ease-out; + -ms-transition-timing-function: ease-out; + -o-transition-timing-function: ease-out; + transition-timing-function: ease-out; + margin: 0 auto; } + +.swiper-slide { + display: block; + -webkit-flex-shrink: 0; + -ms-flex: 0 0 auto; + flex-shrink: 0; + width: 100%; + height: 100%; + position: relative; } + +/* Auto Height */ +.swiper-container-autoheight, +.swiper-container-autoheight .swiper-slide { + height: auto; } + +.swiper-container-autoheight .swiper-wrapper { + -webkit-box-align: start; + -ms-flex-align: start; + -webkit-align-items: flex-start; + align-items: flex-start; + -webkit-transition-property: -webkit-transform, height; + -moz-transition-property: -moz-transform; + -o-transition-property: -o-transform; + -ms-transition-property: -ms-transform; + transition-property: transform, height; } + +/* a11y */ +.swiper-container .swiper-notification { + position: absolute; + left: 0; + top: 0; + pointer-events: none; + opacity: 0; + z-index: -1000; } + +/* IE10 Windows Phone 8 Fixes */ +.swiper-wp8-horizontal { + -ms-touch-action: pan-y; + touch-action: pan-y; } + +.swiper-wp8-vertical { + -ms-touch-action: pan-x; + touch-action: pan-x; } + +/* Arrows */ +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: 50%; + width: 27px; + height: 44px; + margin-top: -22px; + z-index: 10; + cursor: pointer; + -moz-background-size: 27px 44px; + -webkit-background-size: 27px 44px; + background-size: 27px 44px; + background-position: center; + background-repeat: no-repeat; } + +.swiper-button-prev.swiper-button-disabled, +.swiper-button-next.swiper-button-disabled { + opacity: 0.35; + cursor: auto; + pointer-events: none; } + +.swiper-button-prev, +.swiper-container-rtl .swiper-button-next { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E"); + left: 10px; + right: auto; } + +.swiper-button-prev.swiper-button-black, +.swiper-container-rtl .swiper-button-next.swiper-button-black { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); } + +.swiper-button-prev.swiper-button-white, +.swiper-container-rtl .swiper-button-next.swiper-button-white { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); } + +.swiper-button-next, +.swiper-container-rtl .swiper-button-prev { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E"); + right: 10px; + left: auto; } + +.swiper-button-next.swiper-button-black, +.swiper-container-rtl .swiper-button-prev.swiper-button-black { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); } + +.swiper-button-next.swiper-button-white, +.swiper-container-rtl .swiper-button-prev.swiper-button-white { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); } + +/* Pagination Styles */ +.swiper-pagination { + position: absolute; + text-align: center; + -webkit-transition: 300ms; + -moz-transition: 300ms; + -o-transition: 300ms; + transition: 300ms; + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + z-index: 10; } + +.swiper-pagination.swiper-pagination-hidden { + opacity: 0; } + +.swiper-pagination-bullet { + width: 8px; + height: 8px; + display: inline-block; + border-radius: 100%; + background: #000; + opacity: 0.2; } + +button.swiper-pagination-bullet { + border: none; + margin: 0; + padding: 0; + box-shadow: none; + -moz-appearance: none; + -ms-appearance: none; + -webkit-appearance: none; + appearance: none; } + +.swiper-pagination-clickable .swiper-pagination-bullet { + cursor: pointer; } + +.swiper-pagination-white .swiper-pagination-bullet { + background: #fff; } + +.swiper-pagination-bullet-active { + opacity: 1; } + +.swiper-pagination-white .swiper-pagination-bullet-active { + background: #fff; } + +.swiper-pagination-black .swiper-pagination-bullet-active { + background: #000; } + +.swiper-container-vertical > .swiper-pagination { + right: 10px; + top: 50%; + -webkit-transform: translate3d(0px, -50%, 0); + -moz-transform: translate3d(0px, -50%, 0); + -o-transform: translate(0px, -50%); + -ms-transform: translate3d(0px, -50%, 0); + transform: translate3d(0px, -50%, 0); } + +.swiper-container-vertical > .swiper-pagination .swiper-pagination-bullet { + margin: 5px 0; + display: block; } + +.swiper-container-horizontal > .swiper-pagination { + bottom: 10px; + left: 0; + width: 100%; } + +.swiper-container-horizontal > .swiper-pagination .swiper-pagination-bullet { + margin: 0 5px; } + +/* 3D Container */ +.swiper-container-3d { + -webkit-perspective: 1200px; + -moz-perspective: 1200px; + -o-perspective: 1200px; + perspective: 1200px; } + +.swiper-container-3d .swiper-wrapper, +.swiper-container-3d .swiper-slide, +.swiper-container-3d .swiper-slide-shadow-left, +.swiper-container-3d .swiper-slide-shadow-right, +.swiper-container-3d .swiper-slide-shadow-top, +.swiper-container-3d .swiper-slide-shadow-bottom, +.swiper-container-3d .swiper-cube-shadow { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + transform-style: preserve-3d; } + +.swiper-container-3d .swiper-slide-shadow-left, +.swiper-container-3d .swiper-slide-shadow-right, +.swiper-container-3d .swiper-slide-shadow-top, +.swiper-container-3d .swiper-slide-shadow-bottom { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 10; } + +.swiper-container-3d .swiper-slide-shadow-left { + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(transparent)); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, 0.5), transparent); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(right, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 3.6-15 */ + background-image: -o-linear-gradient(right, rgba(0, 0, 0, 0.5), transparent); + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 16+, IE10, Opera 12.50+ */ } + +.swiper-container-3d .swiper-slide-shadow-right { + background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, 0.5)), to(transparent)); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5), transparent); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 3.6-15 */ + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5), transparent); + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 16+, IE10, Opera 12.50+ */ } + +.swiper-container-3d .swiper-slide-shadow-top { + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(transparent)); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.5), transparent); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(bottom, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 3.6-15 */ + background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5), transparent); + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 16+, IE10, Opera 12.50+ */ } + +.swiper-container-3d .swiper-slide-shadow-bottom { + background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.5)), to(transparent)); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), transparent); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 3.6-15 */ + background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.5), transparent); + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 16+, IE10, Opera 12.50+ */ } + +/* Coverflow */ +.swiper-container-coverflow .swiper-wrapper { + /* Windows 8 IE 10 fix */ + -ms-perspective: 1200px; } + +/* Fade */ +.swiper-container-fade.swiper-container-free-mode .swiper-slide { + -webkit-transition-timing-function: ease-out; + -moz-transition-timing-function: ease-out; + -ms-transition-timing-function: ease-out; + -o-transition-timing-function: ease-out; + transition-timing-function: ease-out; } + +.swiper-container-fade .swiper-slide { + pointer-events: none; } + +.swiper-container-fade .swiper-slide .swiper-slide { + pointer-events: none; } + +.swiper-container-fade .swiper-slide-active, +.swiper-container-fade .swiper-slide-active .swiper-slide-active { + pointer-events: auto; } + +/* Cube */ +.swiper-container-cube { + overflow: visible; } + +.swiper-container-cube .swiper-slide { + pointer-events: none; + visibility: hidden; + -webkit-transform-origin: 0 0; + -moz-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + width: 100%; + height: 100%; + z-index: 1; } + +.swiper-container-cube.swiper-container-rtl .swiper-slide { + -webkit-transform-origin: 100% 0; + -moz-transform-origin: 100% 0; + -ms-transform-origin: 100% 0; + transform-origin: 100% 0; } + +.swiper-container-cube .swiper-slide-active, +.swiper-container-cube .swiper-slide-next, +.swiper-container-cube .swiper-slide-prev, +.swiper-container-cube .swiper-slide-next + .swiper-slide { + pointer-events: auto; + visibility: visible; } + +.swiper-container-cube .swiper-slide-shadow-top, +.swiper-container-cube .swiper-slide-shadow-bottom, +.swiper-container-cube .swiper-slide-shadow-left, +.swiper-container-cube .swiper-slide-shadow-right { + z-index: 0; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; } + +.swiper-container-cube .swiper-cube-shadow { + position: absolute; + left: 0; + bottom: 0px; + width: 100%; + height: 100%; + background: #000; + opacity: 0.6; + -webkit-filter: blur(50px); + filter: blur(50px); + z-index: 0; } + +/* Scrollbar */ +.swiper-scrollbar { + border-radius: 10px; + position: relative; + -ms-touch-action: none; + background: rgba(0, 0, 0, 0.1); } + +.swiper-container-horizontal > .swiper-scrollbar { + position: absolute; + left: 1%; + bottom: 3px; + z-index: 50; + height: 5px; + width: 98%; } + +.swiper-container-vertical > .swiper-scrollbar { + position: absolute; + right: 3px; + top: 1%; + z-index: 50; + width: 5px; + height: 98%; } + +.swiper-scrollbar-drag { + height: 100%; + width: 100%; + position: relative; + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; + left: 0; + top: 0; } + +.swiper-scrollbar-cursor-drag { + cursor: move; } + +/* Preloader */ +.swiper-lazy-preloader { + width: 42px; + height: 42px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -21px; + margin-top: -21px; + z-index: 10; + -webkit-transform-origin: 50%; + -moz-transform-origin: 50%; + transform-origin: 50%; + -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite; + -moz-animation: swiper-preloader-spin 1s steps(12, end) infinite; + animation: swiper-preloader-spin 1s steps(12, end) infinite; } + +.swiper-lazy-preloader:after { + display: block; + content: ""; + width: 100%; + height: 100%; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); + background-position: 50%; + -webkit-background-size: 100%; + background-size: 100%; + background-repeat: no-repeat; } + +.swiper-lazy-preloader-white:after { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); } + +@-webkit-keyframes swiper-preloader-spin { + 100% { + -webkit-transform: rotate(360deg); } } + +@keyframes swiper-preloader-spin { + 100% { + transform: rotate(360deg); } } + +ion-slides { + width: 100%; + height: 100%; + display: block; } + +.slide-zoom { + display: block; + width: 100%; + text-align: center; } + +.swiper-container { + width: 100%; + height: 100%; + padding: 0; + overflow: hidden; } + +.swiper-wrapper { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + padding: 0; } + +.swiper-slide { + width: 100%; + height: 100%; + box-sizing: border-box; + /* Center slide text vertically */ } + .swiper-slide img { + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; } + +.scroll-refresher { + position: absolute; + top: -60px; + right: 0; + left: 0; + overflow: hidden; + margin: auto; + height: 60px; } + .scroll-refresher .ionic-refresher-content { + position: absolute; + bottom: 15px; + left: 0; + width: 100%; + color: #666666; + text-align: center; + font-size: 30px; } + .scroll-refresher .ionic-refresher-content .text-refreshing, + .scroll-refresher .ionic-refresher-content .text-pulling { + font-size: 16px; + line-height: 16px; } + .scroll-refresher .ionic-refresher-content.ionic-refresher-with-text { + bottom: 10px; } + .scroll-refresher .icon-refreshing, + .scroll-refresher .icon-pulling { + width: 100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; } + .scroll-refresher .icon-pulling { + -webkit-animation-name: refresh-spin-back; + animation-name: refresh-spin-back; + -webkit-animation-duration: 200ms; + animation-duration: 200ms; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-fill-mode: none; + animation-fill-mode: none; + -webkit-transform: translate3d(0, 0, 0) rotate(0deg); + transform: translate3d(0, 0, 0) rotate(0deg); } + .scroll-refresher .icon-refreshing, + .scroll-refresher .text-refreshing { + display: none; } + .scroll-refresher .icon-refreshing { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s; } + .scroll-refresher.active .icon-pulling:not(.pulling-rotation-disabled) { + -webkit-animation-name: refresh-spin; + animation-name: refresh-spin; + -webkit-transform: translate3d(0, 0, 0) rotate(-180deg); + transform: translate3d(0, 0, 0) rotate(-180deg); } + .scroll-refresher.active.refreshing { + -webkit-transition: -webkit-transform 0.2s; + transition: -webkit-transform 0.2s; + -webkit-transition: transform 0.2s; + transition: transform 0.2s; + -webkit-transform: scale(1, 1); + transform: scale(1, 1); } + .scroll-refresher.active.refreshing .icon-pulling, + .scroll-refresher.active.refreshing .text-pulling { + display: none; } + .scroll-refresher.active.refreshing .icon-refreshing, + .scroll-refresher.active.refreshing .text-refreshing { + display: block; } + .scroll-refresher.active.refreshing.refreshing-tail { + -webkit-transform: scale(0, 0); + transform: scale(0, 0); } + +.overflow-scroll > .scroll { + -webkit-overflow-scrolling: touch; + width: 100%; } + .overflow-scroll > .scroll.overscroll { + position: fixed; + right: 0; + left: 0; } + +.overflow-scroll.padding > .scroll.overscroll { + padding: 10px; } + +@-webkit-keyframes refresh-spin { + 0% { + -webkit-transform: translate3d(0, 0, 0) rotate(0); } + 100% { + -webkit-transform: translate3d(0, 0, 0) rotate(180deg); } } + +@keyframes refresh-spin { + 0% { + transform: translate3d(0, 0, 0) rotate(0); } + 100% { + transform: translate3d(0, 0, 0) rotate(180deg); } } + +@-webkit-keyframes refresh-spin-back { + 0% { + -webkit-transform: translate3d(0, 0, 0) rotate(180deg); } + 100% { + -webkit-transform: translate3d(0, 0, 0) rotate(0); } } + +@keyframes refresh-spin-back { + 0% { + transform: translate3d(0, 0, 0) rotate(180deg); } + 100% { + transform: translate3d(0, 0, 0) rotate(0); } } + +/** + * Spinners + * -------------------------------------------------- + */ +.spinner { + stroke: #444; + fill: #444; } + .spinner svg { + width: 28px; + height: 28px; } + .spinner.spinner-light { + stroke: #fff; + fill: #fff; } + .spinner.spinner-stable { + stroke: #f8f8f8; + fill: #f8f8f8; } + .spinner.spinner-positive { + stroke: #387ef5; + fill: #387ef5; } + .spinner.spinner-calm { + stroke: #11c1f3; + fill: #11c1f3; } + .spinner.spinner-balanced { + stroke: #33cd5f; + fill: #33cd5f; } + .spinner.spinner-assertive { + stroke: #ef473a; + fill: #ef473a; } + .spinner.spinner-energized { + stroke: #ffc900; + fill: #ffc900; } + .spinner.spinner-royal { + stroke: #886aea; + fill: #886aea; } + .spinner.spinner-dark { + stroke: #444; + fill: #444; } + +.spinner-android { + stroke: #4b8bf4; } + +.spinner-ios, +.spinner-ios-small { + stroke: #69717d; } + +.spinner-spiral .stop1 { + stop-color: #fff; + stop-opacity: 0; } + +.spinner-spiral.spinner-light .stop1 { + stop-color: #444; } + +.spinner-spiral.spinner-light .stop2 { + stop-color: #fff; } + +.spinner-spiral.spinner-stable .stop2 { + stop-color: #f8f8f8; } + +.spinner-spiral.spinner-positive .stop2 { + stop-color: #387ef5; } + +.spinner-spiral.spinner-calm .stop2 { + stop-color: #11c1f3; } + +.spinner-spiral.spinner-balanced .stop2 { + stop-color: #33cd5f; } + +.spinner-spiral.spinner-assertive .stop2 { + stop-color: #ef473a; } + +.spinner-spiral.spinner-energized .stop2 { + stop-color: #ffc900; } + +.spinner-spiral.spinner-royal .stop2 { + stop-color: #886aea; } + +.spinner-spiral.spinner-dark .stop2 { + stop-color: #444; } + +/** + * Forms + * -------------------------------------------------- + */ +form { + margin: 0 0 1.42857; } + +legend { + display: block; + margin-bottom: 1.42857; + padding: 0; + width: 100%; + border: 1px solid #ddd; + color: #444; + font-size: 21px; + line-height: 2.85714; } + legend small { + color: #f8f8f8; + font-size: 1.07143; } + +label, +input, +button, +select, +textarea { + font-weight: normal; + font-size: 14px; + line-height: 1.42857; } + +input, +button, +select, +textarea { + font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif; } + +.item-input { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: relative; + overflow: hidden; + padding: 6px 0 5px 16px; } + .item-input input { + -webkit-border-radius: 0; + border-radius: 0; + -webkit-box-flex: 1; + -webkit-flex: 1 220px; + -moz-box-flex: 1; + -moz-flex: 1 220px; + -ms-flex: 1 220px; + flex: 1 220px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + margin: 0; + padding-right: 24px; + background-color: transparent; } + .item-input .button .icon { + -webkit-box-flex: 0; + -webkit-flex: 0 0 24px; + -moz-box-flex: 0; + -moz-flex: 0 0 24px; + -ms-flex: 0 0 24px; + flex: 0 0 24px; + position: static; + display: inline-block; + height: auto; + text-align: center; + font-size: 16px; } + .item-input .button-bar { + -webkit-border-radius: 0; + border-radius: 0; + -webkit-box-flex: 1; + -webkit-flex: 1 0 220px; + -moz-box-flex: 1; + -moz-flex: 1 0 220px; + -ms-flex: 1 0 220px; + flex: 1 0 220px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } + .item-input .icon { + min-width: 14px; } + +.platform-windowsphone .item-input input { + flex-shrink: 1; } + +.item-input-inset { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: relative; + overflow: hidden; + padding: 10.66667px; } + +.item-input-wrapper { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex: 1 0; + -moz-box-flex: 1; + -moz-flex: 1 0; + -ms-flex: 1 0; + flex: 1 0; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + -webkit-border-radius: 4px; + border-radius: 4px; + padding-right: 8px; + padding-left: 8px; + background: #eee; } + +.item-input-inset .item-input-wrapper input { + padding-left: 4px; + height: 29px; + background: transparent; + line-height: 18px; } + +.item-input-wrapper ~ .button { + margin-left: 10.66667px; } + +.input-label { + display: table; + padding: 7px 10px 7px 0px; + max-width: 200px; + width: 35%; + color: #444; + font-size: 16px; } + +.placeholder-icon { + color: #aaa; } + .placeholder-icon:first-child { + padding-right: 6px; } + .placeholder-icon:last-child { + padding-left: 6px; } + +.item-stacked-label { + display: block; + background-color: transparent; + box-shadow: none; } + .item-stacked-label .input-label, .item-stacked-label .icon { + display: inline-block; + padding: 4px 0 0 0px; + vertical-align: middle; } + +.item-stacked-label input, +.item-stacked-label textarea { + -webkit-border-radius: 2px; + border-radius: 2px; + padding: 4px 8px 3px 0; + border: none; + background-color: #fff; } + +.item-stacked-label input { + overflow: hidden; + height: 46px; } + +.item-select.item-stacked-label select { + position: relative; + padding: 0px; + max-width: 90%; + direction: ltr; + white-space: pre-wrap; + margin: -3px; } + +.item-floating-label { + display: block; + background-color: transparent; + box-shadow: none; } + .item-floating-label .input-label { + position: relative; + padding: 5px 0 0 0; + opacity: 0; + top: 10px; + -webkit-transition: opacity 0.15s ease-in, top 0.2s linear; + transition: opacity 0.15s ease-in, top 0.2s linear; } + .item-floating-label .input-label.has-input { + opacity: 1; + top: 0; + -webkit-transition: opacity 0.15s ease-in, top 0.2s linear; + transition: opacity 0.15s ease-in, top 0.2s linear; } + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"] { + display: block; + padding-top: 2px; + padding-left: 0; + height: 34px; + color: #111; + vertical-align: middle; + font-size: 14px; + line-height: 16px; } + +.platform-ios input[type="datetime-local"], +.platform-ios input[type="date"], +.platform-ios input[type="month"], +.platform-ios input[type="time"], +.platform-ios input[type="week"], +.platform-android input[type="datetime-local"], +.platform-android input[type="date"], +.platform-android input[type="month"], +.platform-android input[type="time"], +.platform-android input[type="week"] { + padding-top: 8px; } + +.item-input input, +.item-input textarea { + width: 100%; } + +textarea { + padding-left: 0; } + textarea::-moz-placeholder { + color: #aaaaaa; } + textarea:-ms-input-placeholder { + color: #aaaaaa; } + textarea::-webkit-input-placeholder { + color: #aaaaaa; + text-indent: -3px; } + +textarea { + height: auto; } + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"] { + border: 0; } + +input[type="radio"], +input[type="checkbox"] { + margin: 0; + line-height: normal; } + +.item-input input[type="file"], +.item-input input[type="image"], +.item-input input[type="submit"], +.item-input input[type="reset"], +.item-input input[type="button"], +.item-input input[type="radio"], +.item-input input[type="checkbox"] { + width: auto; } + +input[type="file"] { + line-height: 34px; } + +.previous-input-focus, +.cloned-text-input + input, +.cloned-text-input + textarea { + position: absolute !important; + left: -9999px; + width: 200px; } + +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #aaaaaa; } + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #aaaaaa; } + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #aaaaaa; + text-indent: 0; } + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly]:not(.cloned-text-input), +textarea[readonly]:not(.cloned-text-input), +select[readonly] { + background-color: #f8f8f8; + cursor: not-allowed; } + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; } + +/** + * Checkbox + * -------------------------------------------------- + */ +.checkbox { + position: relative; + display: inline-block; + padding: 7px 7px; + cursor: pointer; } + .checkbox input:before, + .checkbox .checkbox-icon:before { + border-color: #ddd; } + .checkbox input:checked:before, + .checkbox input:checked + .checkbox-icon:before { + background: #387ef5; + border-color: #387ef5; } + +.checkbox-light input:before, +.checkbox-light .checkbox-icon:before { + border-color: #ddd; } + +.checkbox-light input:checked:before, +.checkbox-light input:checked + .checkbox-icon:before { + background: #ddd; + border-color: #ddd; } + +.checkbox-stable input:before, +.checkbox-stable .checkbox-icon:before { + border-color: #b2b2b2; } + +.checkbox-stable input:checked:before, +.checkbox-stable input:checked + .checkbox-icon:before { + background: #b2b2b2; + border-color: #b2b2b2; } + +.checkbox-positive input:before, +.checkbox-positive .checkbox-icon:before { + border-color: #387ef5; } + +.checkbox-positive input:checked:before, +.checkbox-positive input:checked + .checkbox-icon:before { + background: #387ef5; + border-color: #387ef5; } + +.checkbox-calm input:before, +.checkbox-calm .checkbox-icon:before { + border-color: #11c1f3; } + +.checkbox-calm input:checked:before, +.checkbox-calm input:checked + .checkbox-icon:before { + background: #11c1f3; + border-color: #11c1f3; } + +.checkbox-assertive input:before, +.checkbox-assertive .checkbox-icon:before { + border-color: #ef473a; } + +.checkbox-assertive input:checked:before, +.checkbox-assertive input:checked + .checkbox-icon:before { + background: #ef473a; + border-color: #ef473a; } + +.checkbox-balanced input:before, +.checkbox-balanced .checkbox-icon:before { + border-color: #33cd5f; } + +.checkbox-balanced input:checked:before, +.checkbox-balanced input:checked + .checkbox-icon:before { + background: #33cd5f; + border-color: #33cd5f; } + +.checkbox-energized input:before, +.checkbox-energized .checkbox-icon:before { + border-color: #ffc900; } + +.checkbox-energized input:checked:before, +.checkbox-energized input:checked + .checkbox-icon:before { + background: #ffc900; + border-color: #ffc900; } + +.checkbox-royal input:before, +.checkbox-royal .checkbox-icon:before { + border-color: #886aea; } + +.checkbox-royal input:checked:before, +.checkbox-royal input:checked + .checkbox-icon:before { + background: #886aea; + border-color: #886aea; } + +.checkbox-dark input:before, +.checkbox-dark .checkbox-icon:before { + border-color: #444; } + +.checkbox-dark input:checked:before, +.checkbox-dark input:checked + .checkbox-icon:before { + background: #444; + border-color: #444; } + +.checkbox input:disabled:before, +.checkbox input:disabled + .checkbox-icon:before { + border-color: #ddd; } + +.checkbox input:disabled:checked:before, +.checkbox input:disabled:checked + .checkbox-icon:before { + background: #ddd; } + +.checkbox.checkbox-input-hidden input { + display: none !important; } + +.checkbox input, +.checkbox-icon { + position: relative; + width: 28px; + height: 28px; + display: block; + border: 0; + background: transparent; + cursor: pointer; + -webkit-appearance: none; } + .checkbox input:before, + .checkbox-icon:before { + display: table; + width: 100%; + height: 100%; + border-width: 1px; + border-style: solid; + border-radius: 28px; + background: #fff; + content: ' '; + -webkit-transition: background-color 20ms ease-in-out; + transition: background-color 20ms ease-in-out; } + +.checkbox input:checked:before, +input:checked + .checkbox-icon:before { + border-width: 2px; } + +.checkbox input:after, +.checkbox-icon:after { + -webkit-transition: opacity 0.05s ease-in-out; + transition: opacity 0.05s ease-in-out; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + position: absolute; + top: 33%; + left: 25%; + display: table; + width: 14px; + height: 6px; + border: 1px solid #fff; + border-top: 0; + border-right: 0; + content: ' '; + opacity: 0; } + +.platform-android .checkbox-platform input:before, +.platform-android .checkbox-platform .checkbox-icon:before, +.checkbox-square input:before, +.checkbox-square .checkbox-icon:before { + border-radius: 2px; + width: 72%; + height: 72%; + margin-top: 14%; + margin-left: 14%; + border-width: 2px; } + +.platform-android .checkbox-platform input:after, +.platform-android .checkbox-platform .checkbox-icon:after, +.checkbox-square input:after, +.checkbox-square .checkbox-icon:after { + border-width: 2px; + top: 19%; + left: 25%; + width: 13px; + height: 7px; } + +.platform-android .item-checkbox-right .checkbox-square .checkbox-icon::after { + top: 31%; } + +.grade-c .checkbox input:after, +.grade-c .checkbox-icon:after { + -webkit-transform: rotate(0); + transform: rotate(0); + top: 3px; + left: 4px; + border: none; + color: #fff; + content: '\2713'; + font-weight: bold; + font-size: 20px; } + +.checkbox input:checked:after, +input:checked + .checkbox-icon:after { + opacity: 1; } + +.item-checkbox { + padding-left: 60px; } + .item-checkbox.active { + box-shadow: none; } + +.item-checkbox .checkbox { + position: absolute; + top: 50%; + right: 8px; + left: 8px; + z-index: 3; + margin-top: -21px; } + +.item-checkbox.item-checkbox-right { + padding-right: 60px; + padding-left: 16px; } + +.item-checkbox-right .checkbox input, +.item-checkbox-right .checkbox-icon { + float: right; } + +/** + * Toggle + * -------------------------------------------------- + */ +.item-toggle { + pointer-events: none; } + +.toggle { + position: relative; + display: inline-block; + pointer-events: auto; + margin: -5px; + padding: 5px; } + .toggle input:checked + .track { + border-color: #4cd964; + background-color: #4cd964; } + .toggle.dragging .handle { + background-color: #f2f2f2 !important; } + +.toggle.toggle-light input:checked + .track { + border-color: #ddd; + background-color: #ddd; } + +.toggle.toggle-stable input:checked + .track { + border-color: #b2b2b2; + background-color: #b2b2b2; } + +.toggle.toggle-positive input:checked + .track { + border-color: #387ef5; + background-color: #387ef5; } + +.toggle.toggle-calm input:checked + .track { + border-color: #11c1f3; + background-color: #11c1f3; } + +.toggle.toggle-assertive input:checked + .track { + border-color: #ef473a; + background-color: #ef473a; } + +.toggle.toggle-balanced input:checked + .track { + border-color: #33cd5f; + background-color: #33cd5f; } + +.toggle.toggle-energized input:checked + .track { + border-color: #ffc900; + background-color: #ffc900; } + +.toggle.toggle-royal input:checked + .track { + border-color: #886aea; + background-color: #886aea; } + +.toggle.toggle-dark input:checked + .track { + border-color: #444; + background-color: #444; } + +.toggle input { + display: none; } + +/* the track appearance when the toggle is "off" */ +.toggle .track { + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-duration: 0.3s; + transition-duration: 0.3s; + -webkit-transition-property: background-color, border; + transition-property: background-color, border; + display: inline-block; + box-sizing: border-box; + width: 51px; + height: 31px; + border: solid 2px #e6e6e6; + border-radius: 20px; + background-color: #fff; + content: ' '; + cursor: pointer; + pointer-events: none; } + +/* Fix to avoid background color bleeding */ +/* (occured on (at least) Android 4.2, Asus MeMO Pad HD7 ME173X) */ +.platform-android4_2 .toggle .track { + -webkit-background-clip: padding-box; } + +/* the handle (circle) thats inside the toggle's track area */ +/* also the handle's appearance when it is "off" */ +.toggle .handle { + -webkit-transition: 0.3s cubic-bezier(0, 1.1, 1, 1.1); + transition: 0.3s cubic-bezier(0, 1.1, 1, 1.1); + -webkit-transition-property: background-color, transform; + transition-property: background-color, transform; + position: absolute; + display: block; + width: 27px; + height: 27px; + border-radius: 27px; + background-color: #fff; + top: 7px; + left: 7px; + box-shadow: 0 2px 7px rgba(0, 0, 0, 0.35), 0 1px 1px rgba(0, 0, 0, 0.15); } + .toggle .handle:before { + position: absolute; + top: -4px; + left: -21.5px; + padding: 18.5px 34px; + content: " "; } + +.toggle input:checked + .track .handle { + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + background-color: #fff; } + +.item-toggle.active { + box-shadow: none; } + +.item-toggle, +.item-toggle.item-complex .item-content { + padding-right: 99px; } + +.item-toggle.item-complex { + padding-right: 0; } + +.item-toggle .toggle { + position: absolute; + top: 10px; + right: 16px; + z-index: 3; } + +.toggle input:disabled + .track { + opacity: .6; } + +.toggle-small .track { + border: 0; + width: 34px; + height: 15px; + background: #9e9e9e; } + +.toggle-small input:checked + .track { + background: rgba(0, 150, 137, 0.5); } + +.toggle-small .handle { + top: 2px; + left: 4px; + width: 21px; + height: 21px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25); } + +.toggle-small input:checked + .track .handle { + -webkit-transform: translate3d(16px, 0, 0); + transform: translate3d(16px, 0, 0); + background: #009689; } + +.toggle-small.item-toggle .toggle { + top: 19px; } + +.toggle-small .toggle-light input:checked + .track { + background-color: rgba(221, 221, 221, 0.5); } + +.toggle-small .toggle-light input:checked + .track .handle { + background-color: #ddd; } + +.toggle-small .toggle-stable input:checked + .track { + background-color: rgba(178, 178, 178, 0.5); } + +.toggle-small .toggle-stable input:checked + .track .handle { + background-color: #b2b2b2; } + +.toggle-small .toggle-positive input:checked + .track { + background-color: rgba(56, 126, 245, 0.5); } + +.toggle-small .toggle-positive input:checked + .track .handle { + background-color: #387ef5; } + +.toggle-small .toggle-calm input:checked + .track { + background-color: rgba(17, 193, 243, 0.5); } + +.toggle-small .toggle-calm input:checked + .track .handle { + background-color: #11c1f3; } + +.toggle-small .toggle-assertive input:checked + .track { + background-color: rgba(239, 71, 58, 0.5); } + +.toggle-small .toggle-assertive input:checked + .track .handle { + background-color: #ef473a; } + +.toggle-small .toggle-balanced input:checked + .track { + background-color: rgba(51, 205, 95, 0.5); } + +.toggle-small .toggle-balanced input:checked + .track .handle { + background-color: #33cd5f; } + +.toggle-small .toggle-energized input:checked + .track { + background-color: rgba(255, 201, 0, 0.5); } + +.toggle-small .toggle-energized input:checked + .track .handle { + background-color: #ffc900; } + +.toggle-small .toggle-royal input:checked + .track { + background-color: rgba(136, 106, 234, 0.5); } + +.toggle-small .toggle-royal input:checked + .track .handle { + background-color: #886aea; } + +.toggle-small .toggle-dark input:checked + .track { + background-color: rgba(68, 68, 68, 0.5); } + +.toggle-small .toggle-dark input:checked + .track .handle { + background-color: #444; } + +/** + * Radio Button Inputs + * -------------------------------------------------- + */ +.item-radio { + padding: 0; } + .item-radio:hover { + cursor: pointer; } + +.item-radio .item-content { + /* give some room to the right for the checkmark icon */ + padding-right: 64px; } + +.item-radio .radio-icon { + /* checkmark icon will be hidden by default */ + position: absolute; + top: 0; + right: 0; + z-index: 3; + visibility: hidden; + padding: 14px; + height: 100%; + font-size: 24px; } + +.item-radio input { + /* hide any radio button inputs elements (the ugly circles) */ + position: absolute; + left: -9999px; } + .item-radio input:checked + .radio-content .item-content { + /* style the item content when its checked */ + background: #f7f7f7; } + .item-radio input:checked + .radio-content .radio-icon { + /* show the checkmark icon when its checked */ + visibility: visible; } + +/** + * Range + * -------------------------------------------------- + */ +.range input { + display: inline-block; + overflow: hidden; + margin-top: 5px; + margin-bottom: 5px; + padding-right: 2px; + padding-left: 1px; + width: auto; + height: 43px; + outline: none; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ccc), color-stop(100%, #ccc)); + background: linear-gradient(to right, #ccc 0%, #ccc 100%); + background-position: center; + background-size: 99% 2px; + background-repeat: no-repeat; + -webkit-appearance: none; + /* + &::-ms-track{ + background: transparent; + border-color: transparent; + border-width: 11px 0 16px; + color:transparent; + margin-top:20px; + } + &::-ms-thumb { + width: $range-slider-width; + height: $range-slider-height; + border-radius: $range-slider-border-radius; + background-color: $toggle-handle-off-bg-color; + border-color:$toggle-handle-off-bg-color; + box-shadow: $range-slider-box-shadow; + margin-left:1px; + margin-right:1px; + outline:none; + } + &::-ms-fill-upper { + height: $range-track-height; + background:$range-default-track-bg; + } + */ } + .range input::-moz-focus-outer { + /* hide the focus outline in Firefox */ + border: 0; } + .range input::-webkit-slider-thumb { + position: relative; + width: 28px; + height: 28px; + border-radius: 50%; + background-color: #fff; + box-shadow: 0 0 2px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2); + cursor: pointer; + -webkit-appearance: none; + border: 0; } + .range input::-webkit-slider-thumb:before { + /* what creates the colorful line on the left side of the slider */ + position: absolute; + top: 13px; + left: -2001px; + width: 2000px; + height: 2px; + background: #444; + content: ' '; } + .range input::-webkit-slider-thumb:after { + /* create a larger (but hidden) hit area */ + position: absolute; + top: -15px; + left: -15px; + padding: 30px; + content: ' '; } + .range input::-ms-fill-lower { + height: 2px; + background: #444; } + +.range { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + padding: 2px 11px; } + .range.range-light input::-webkit-slider-thumb:before { + background: #ddd; } + .range.range-light input::-ms-fill-lower { + background: #ddd; } + .range.range-stable input::-webkit-slider-thumb:before { + background: #b2b2b2; } + .range.range-stable input::-ms-fill-lower { + background: #b2b2b2; } + .range.range-positive input::-webkit-slider-thumb:before { + background: #387ef5; } + .range.range-positive input::-ms-fill-lower { + background: #387ef5; } + .range.range-calm input::-webkit-slider-thumb:before { + background: #11c1f3; } + .range.range-calm input::-ms-fill-lower { + background: #11c1f3; } + .range.range-balanced input::-webkit-slider-thumb:before { + background: #33cd5f; } + .range.range-balanced input::-ms-fill-lower { + background: #33cd5f; } + .range.range-assertive input::-webkit-slider-thumb:before { + background: #ef473a; } + .range.range-assertive input::-ms-fill-lower { + background: #ef473a; } + .range.range-energized input::-webkit-slider-thumb:before { + background: #ffc900; } + .range.range-energized input::-ms-fill-lower { + background: #ffc900; } + .range.range-royal input::-webkit-slider-thumb:before { + background: #886aea; } + .range.range-royal input::-ms-fill-lower { + background: #886aea; } + .range.range-dark input::-webkit-slider-thumb:before { + background: #444; } + .range.range-dark input::-ms-fill-lower { + background: #444; } + +.range .icon { + -webkit-box-flex: 0; + -webkit-flex: 0; + -moz-box-flex: 0; + -moz-flex: 0; + -ms-flex: 0; + flex: 0; + display: block; + min-width: 24px; + text-align: center; + font-size: 24px; } + +.range input { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + display: block; + margin-right: 10px; + margin-left: 10px; } + +.range-label { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -moz-box-flex: 0; + -moz-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + display: block; + white-space: nowrap; } + +.range-label:first-child { + padding-left: 5px; } + +.range input + .range-label { + padding-right: 5px; + padding-left: 0; } + +.platform-windowsphone .range input { + height: auto; } + +/** + * Select + * -------------------------------------------------- + */ +.item-select { + position: relative; } + .item-select select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + position: absolute; + top: 0; + bottom: 0; + right: 0; + padding: 0 48px 0 16px; + max-width: 65%; + border: none; + background: #fff; + color: #333; + text-indent: .01px; + text-overflow: ''; + white-space: nowrap; + font-size: 14px; + cursor: pointer; + direction: rtl; } + .item-select select::-ms-expand { + display: none; } + .item-select option { + direction: ltr; } + .item-select:after { + position: absolute; + top: 50%; + right: 16px; + margin-top: -3px; + width: 0; + height: 0; + border-top: 5px solid; + border-right: 5px solid transparent; + border-left: 5px solid transparent; + color: #999; + content: ""; + pointer-events: none; } + .item-select.item-light select { + background: #fff; + color: #444; } + .item-select.item-stable select { + background: #f8f8f8; + color: #444; } + .item-select.item-stable:after, .item-select.item-stable .input-label { + color: #666666; } + .item-select.item-positive select { + background: #387ef5; + color: #fff; } + .item-select.item-positive:after, .item-select.item-positive .input-label { + color: #fff; } + .item-select.item-calm select { + background: #11c1f3; + color: #fff; } + .item-select.item-calm:after, .item-select.item-calm .input-label { + color: #fff; } + .item-select.item-assertive select { + background: #ef473a; + color: #fff; } + .item-select.item-assertive:after, .item-select.item-assertive .input-label { + color: #fff; } + .item-select.item-balanced select { + background: #33cd5f; + color: #fff; } + .item-select.item-balanced:after, .item-select.item-balanced .input-label { + color: #fff; } + .item-select.item-energized select { + background: #ffc900; + color: #fff; } + .item-select.item-energized:after, .item-select.item-energized .input-label { + color: #fff; } + .item-select.item-royal select { + background: #886aea; + color: #fff; } + .item-select.item-royal:after, .item-select.item-royal .input-label { + color: #fff; } + .item-select.item-dark select { + background: #444; + color: #fff; } + .item-select.item-dark:after, .item-select.item-dark .input-label { + color: #fff; } + +select[multiple], select[size] { + height: auto; } + +/** + * Progress + * -------------------------------------------------- + */ +progress { + display: block; + margin: 15px auto; + width: 100%; } + +/** + * Buttons + * -------------------------------------------------- + */ +.button { + border-color: transparent; + background-color: #f8f8f8; + color: #444; + position: relative; + display: inline-block; + margin: 0; + padding: 0 12px; + min-width: 52px; + min-height: 47px; + border-width: 1px; + border-style: solid; + border-radius: 4px; + vertical-align: top; + text-align: center; + text-overflow: ellipsis; + font-size: 16px; + line-height: 42px; + cursor: pointer; } + .button:hover { + color: #444; + text-decoration: none; } + .button.active, .button.activated { + background-color: #e5e5e5; } + .button:after { + position: absolute; + top: -6px; + right: -6px; + bottom: -6px; + left: -6px; + content: ' '; } + .button .icon { + vertical-align: top; + pointer-events: none; } + .button .icon:before, .button.icon:before, .button.icon-left:before, .button.icon-right:before { + display: inline-block; + padding: 0 0 1px 0; + vertical-align: inherit; + font-size: 24px; + line-height: 41px; + pointer-events: none; } + .button.icon-left:before { + float: left; + padding-right: .2em; + padding-left: 0; } + .button.icon-right:before { + float: right; + padding-right: 0; + padding-left: .2em; } + .button.button-block, .button.button-full { + margin-top: 10px; + margin-bottom: 10px; } + .button.button-light { + border-color: transparent; + background-color: #fff; + color: #444; } + .button.button-light:hover { + color: #444; + text-decoration: none; } + .button.button-light.active, .button.button-light.activated { + background-color: #fafafa; } + .button.button-light.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #ddd; } + .button.button-light.button-icon { + border-color: transparent; + background: none; } + .button.button-light.button-outline { + border-color: #ddd; + background: transparent; + color: #ddd; } + .button.button-light.button-outline.active, .button.button-light.button-outline.activated { + background-color: #ddd; + box-shadow: none; + color: #fff; } + .button.button-stable { + border-color: transparent; + background-color: #f8f8f8; + color: #444; } + .button.button-stable:hover { + color: #444; + text-decoration: none; } + .button.button-stable.active, .button.button-stable.activated { + background-color: #e5e5e5; } + .button.button-stable.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #b2b2b2; } + .button.button-stable.button-icon { + border-color: transparent; + background: none; } + .button.button-stable.button-outline { + border-color: #b2b2b2; + background: transparent; + color: #b2b2b2; } + .button.button-stable.button-outline.active, .button.button-stable.button-outline.activated { + background-color: #b2b2b2; + box-shadow: none; + color: #fff; } + .button.button-positive { + border-color: transparent; + background-color: #387ef5; + color: #fff; } + .button.button-positive:hover { + color: #fff; + text-decoration: none; } + .button.button-positive.active, .button.button-positive.activated { + background-color: #0c60ee; } + .button.button-positive.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #387ef5; } + .button.button-positive.button-icon { + border-color: transparent; + background: none; } + .button.button-positive.button-outline { + border-color: #387ef5; + background: transparent; + color: #387ef5; } + .button.button-positive.button-outline.active, .button.button-positive.button-outline.activated { + background-color: #387ef5; + box-shadow: none; + color: #fff; } + .button.button-calm { + border-color: transparent; + background-color: #11c1f3; + color: #fff; } + .button.button-calm:hover { + color: #fff; + text-decoration: none; } + .button.button-calm.active, .button.button-calm.activated { + background-color: #0a9dc7; } + .button.button-calm.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #11c1f3; } + .button.button-calm.button-icon { + border-color: transparent; + background: none; } + .button.button-calm.button-outline { + border-color: #11c1f3; + background: transparent; + color: #11c1f3; } + .button.button-calm.button-outline.active, .button.button-calm.button-outline.activated { + background-color: #11c1f3; + box-shadow: none; + color: #fff; } + .button.button-assertive { + border-color: transparent; + background-color: #ef473a; + color: #fff; } + .button.button-assertive:hover { + color: #fff; + text-decoration: none; } + .button.button-assertive.active, .button.button-assertive.activated { + background-color: #e42112; } + .button.button-assertive.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #ef473a; } + .button.button-assertive.button-icon { + border-color: transparent; + background: none; } + .button.button-assertive.button-outline { + border-color: #ef473a; + background: transparent; + color: #ef473a; } + .button.button-assertive.button-outline.active, .button.button-assertive.button-outline.activated { + background-color: #ef473a; + box-shadow: none; + color: #fff; } + .button.button-balanced { + border-color: transparent; + background-color: #33cd5f; + color: #fff; } + .button.button-balanced:hover { + color: #fff; + text-decoration: none; } + .button.button-balanced.active, .button.button-balanced.activated { + background-color: #28a54c; } + .button.button-balanced.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #33cd5f; } + .button.button-balanced.button-icon { + border-color: transparent; + background: none; } + .button.button-balanced.button-outline { + border-color: #33cd5f; + background: transparent; + color: #33cd5f; } + .button.button-balanced.button-outline.active, .button.button-balanced.button-outline.activated { + background-color: #33cd5f; + box-shadow: none; + color: #fff; } + .button.button-energized { + border-color: transparent; + background-color: #ffc900; + color: #fff; } + .button.button-energized:hover { + color: #fff; + text-decoration: none; } + .button.button-energized.active, .button.button-energized.activated { + background-color: #e6b500; } + .button.button-energized.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #ffc900; } + .button.button-energized.button-icon { + border-color: transparent; + background: none; } + .button.button-energized.button-outline { + border-color: #ffc900; + background: transparent; + color: #ffc900; } + .button.button-energized.button-outline.active, .button.button-energized.button-outline.activated { + background-color: #ffc900; + box-shadow: none; + color: #fff; } + .button.button-royal { + border-color: transparent; + background-color: #886aea; + color: #fff; } + .button.button-royal:hover { + color: #fff; + text-decoration: none; } + .button.button-royal.active, .button.button-royal.activated { + background-color: #6b46e5; } + .button.button-royal.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #886aea; } + .button.button-royal.button-icon { + border-color: transparent; + background: none; } + .button.button-royal.button-outline { + border-color: #886aea; + background: transparent; + color: #886aea; } + .button.button-royal.button-outline.active, .button.button-royal.button-outline.activated { + background-color: #886aea; + box-shadow: none; + color: #fff; } + .button.button-dark { + border-color: transparent; + background-color: #444; + color: #fff; } + .button.button-dark:hover { + color: #fff; + text-decoration: none; } + .button.button-dark.active, .button.button-dark.activated { + background-color: #262626; } + .button.button-dark.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #444; } + .button.button-dark.button-icon { + border-color: transparent; + background: none; } + .button.button-dark.button-outline { + border-color: #444; + background: transparent; + color: #444; } + .button.button-dark.button-outline.active, .button.button-dark.button-outline.activated { + background-color: #444; + box-shadow: none; + color: #fff; } + +.button-small { + padding: 2px 4px 1px; + min-width: 28px; + min-height: 30px; + font-size: 12px; + line-height: 26px; } + .button-small .icon:before, .button-small.icon:before, .button-small.icon-left:before, .button-small.icon-right:before { + font-size: 16px; + line-height: 19px; + margin-top: 3px; } + +.button-large { + padding: 0 16px; + min-width: 68px; + min-height: 59px; + font-size: 20px; + line-height: 53px; } + .button-large .icon:before, .button-large.icon:before, .button-large.icon-left:before, .button-large.icon-right:before { + padding-bottom: 2px; + font-size: 32px; + line-height: 51px; } + +.button-icon { + -webkit-transition: opacity 0.1s; + transition: opacity 0.1s; + padding: 0 6px; + min-width: initial; + border-color: transparent; + background: none; } + .button-icon.button.active, .button-icon.button.activated { + border-color: transparent; + background: none; + box-shadow: none; + opacity: 0.3; } + .button-icon .icon:before, .button-icon.icon:before { + font-size: 32px; } + +.button-clear { + -webkit-transition: opacity 0.1s; + transition: opacity 0.1s; + padding: 0 6px; + max-height: 42px; + border-color: transparent; + background: none; + box-shadow: none; } + .button-clear.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #b2b2b2; } + .button-clear.button-icon { + border-color: transparent; + background: none; } + .button-clear.active, .button-clear.activated { + opacity: 0.3; } + +.button-outline { + -webkit-transition: opacity 0.1s; + transition: opacity 0.1s; + background: none; + box-shadow: none; } + .button-outline.button-outline { + border-color: #b2b2b2; + background: transparent; + color: #b2b2b2; } + .button-outline.button-outline.active, .button-outline.button-outline.activated { + background-color: #b2b2b2; + box-shadow: none; + color: #fff; } + +.padding > .button.button-block:first-child { + margin-top: 0; } + +.button-block { + display: block; + clear: both; } + .button-block:after { + clear: both; } + +.button-full, +.button-full > .button { + display: block; + margin-right: 0; + margin-left: 0; + border-right-width: 0; + border-left-width: 0; + border-radius: 0; } + +button.button-block, +button.button-full, +.button-full > button.button, +input.button.button-block { + width: 100%; } + +a.button { + text-decoration: none; } + a.button .icon:before, a.button.icon:before, a.button.icon-left:before, a.button.icon-right:before { + margin-top: 2px; } + +.button.disabled, +.button[disabled] { + opacity: .4; + cursor: default !important; + pointer-events: none; } + +/** + * Button Bar + * -------------------------------------------------- + */ +.button-bar { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + width: 100%; } + .button-bar.button-bar-inline { + display: block; + width: auto; + *zoom: 1; } + .button-bar.button-bar-inline:before, .button-bar.button-bar-inline:after { + display: table; + content: ""; + line-height: 0; } + .button-bar.button-bar-inline:after { + clear: both; } + .button-bar.button-bar-inline > .button { + width: auto; + display: inline-block; + float: left; } + +.button-bar > .button { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + display: block; + overflow: hidden; + padding: 0 16px; + width: 0; + border-width: 1px 0px 1px 1px; + border-radius: 0; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; } + .button-bar > .button:before, + .button-bar > .button .icon:before { + line-height: 44px; } + .button-bar > .button:first-child { + border-radius: 4px 0px 0px 4px; } + .button-bar > .button:last-child { + border-right-width: 1px; + border-radius: 0px 4px 4px 0px; } + .button-bar > .button:only-child { + border-radius: 4px; } + +.button-bar > .button-small:before, +.button-bar > .button-small .icon:before { + line-height: 28px; } + +/** + * Grid + * -------------------------------------------------- + * Using flexbox for the grid, inspired by Philip Walton: + * http://philipwalton.github.io/solved-by-flexbox/demos/grids/ + * By default each .col within a .row will evenly take up + * available width, and the height of each .col with take + * up the height of the tallest .col in the same .row. + */ +.row { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + padding: 5px; + width: 100%; } + +.row-wrap { + -webkit-flex-wrap: wrap; + -moz-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + +.row-no-padding { + padding: 0; } + .row-no-padding > .col { + padding: 0; } + +.row + .row { + margin-top: -5px; + padding-top: 0; } + +.col { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + display: block; + padding: 5px; + width: 100%; } + +/* Vertically Align Columns */ +/* .row-* vertically aligns every .col in the .row */ +.row-top { + -webkit-box-align: start; + -ms-flex-align: start; + -webkit-align-items: flex-start; + -moz-align-items: flex-start; + align-items: flex-start; } + +.row-bottom { + -webkit-box-align: end; + -ms-flex-align: end; + -webkit-align-items: flex-end; + -moz-align-items: flex-end; + align-items: flex-end; } + +.row-center { + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; } + +.row-stretch { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + -webkit-align-items: stretch; + -moz-align-items: stretch; + align-items: stretch; } + +.row-baseline { + -webkit-box-align: baseline; + -ms-flex-align: baseline; + -webkit-align-items: baseline; + -moz-align-items: baseline; + align-items: baseline; } + +/* .col-* vertically aligns an individual .col */ +.col-top { + -webkit-align-self: flex-start; + -moz-align-self: flex-start; + -ms-flex-item-align: start; + align-self: flex-start; } + +.col-bottom { + -webkit-align-self: flex-end; + -moz-align-self: flex-end; + -ms-flex-item-align: end; + align-self: flex-end; } + +.col-center { + -webkit-align-self: center; + -moz-align-self: center; + -ms-flex-item-align: center; + align-self: center; } + +/* Column Offsets */ +.col-offset-10 { + margin-left: 10%; } + +.col-offset-20 { + margin-left: 20%; } + +.col-offset-25 { + margin-left: 25%; } + +.col-offset-33, .col-offset-34 { + margin-left: 33.3333%; } + +.col-offset-50 { + margin-left: 50%; } + +.col-offset-66, .col-offset-67 { + margin-left: 66.6666%; } + +.col-offset-75 { + margin-left: 75%; } + +.col-offset-80 { + margin-left: 80%; } + +.col-offset-90 { + margin-left: 90%; } + +/* Explicit Column Percent Sizes */ +/* By default each grid column will evenly distribute */ +/* across the grid. However, you can specify individual */ +/* columns to take up a certain size of the available area */ +.col-10 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 10%; + -moz-box-flex: 0; + -moz-flex: 0 0 10%; + -ms-flex: 0 0 10%; + flex: 0 0 10%; + max-width: 10%; } + +.col-20 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 20%; + -moz-box-flex: 0; + -moz-flex: 0 0 20%; + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; } + +.col-25 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 25%; + -moz-box-flex: 0; + -moz-flex: 0 0 25%; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + +.col-33, .col-34 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 33.3333%; + -moz-box-flex: 0; + -moz-flex: 0 0 33.3333%; + -ms-flex: 0 0 33.3333%; + flex: 0 0 33.3333%; + max-width: 33.3333%; } + +.col-40 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 40%; + -moz-box-flex: 0; + -moz-flex: 0 0 40%; + -ms-flex: 0 0 40%; + flex: 0 0 40%; + max-width: 40%; } + +.col-50 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 50%; + -moz-box-flex: 0; + -moz-flex: 0 0 50%; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + +.col-60 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 60%; + -moz-box-flex: 0; + -moz-flex: 0 0 60%; + -ms-flex: 0 0 60%; + flex: 0 0 60%; + max-width: 60%; } + +.col-66, .col-67 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 66.6666%; + -moz-box-flex: 0; + -moz-flex: 0 0 66.6666%; + -ms-flex: 0 0 66.6666%; + flex: 0 0 66.6666%; + max-width: 66.6666%; } + +.col-75 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 75%; + -moz-box-flex: 0; + -moz-flex: 0 0 75%; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + +.col-80 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 80%; + -moz-box-flex: 0; + -moz-flex: 0 0 80%; + -ms-flex: 0 0 80%; + flex: 0 0 80%; + max-width: 80%; } + +.col-90 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 90%; + -moz-box-flex: 0; + -moz-flex: 0 0 90%; + -ms-flex: 0 0 90%; + flex: 0 0 90%; + max-width: 90%; } + +/* Responsive Grid Classes */ +/* Adding a class of responsive-X to a row */ +/* will trigger the flex-direction to */ +/* change to column and add some margin */ +/* to any columns in the row for clearity */ +@media (max-width: 567px) { + .responsive-sm { + -webkit-box-direction: normal; + -moz-box-direction: normal; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .responsive-sm .col, .responsive-sm .col-10, .responsive-sm .col-20, .responsive-sm .col-25, .responsive-sm .col-33, .responsive-sm .col-34, .responsive-sm .col-50, .responsive-sm .col-66, .responsive-sm .col-67, .responsive-sm .col-75, .responsive-sm .col-80, .responsive-sm .col-90 { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + margin-bottom: 15px; + margin-left: 0; + max-width: 100%; + width: 100%; } } + +@media (max-width: 767px) { + .responsive-md { + -webkit-box-direction: normal; + -moz-box-direction: normal; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .responsive-md .col, .responsive-md .col-10, .responsive-md .col-20, .responsive-md .col-25, .responsive-md .col-33, .responsive-md .col-34, .responsive-md .col-50, .responsive-md .col-66, .responsive-md .col-67, .responsive-md .col-75, .responsive-md .col-80, .responsive-md .col-90 { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + margin-bottom: 15px; + margin-left: 0; + max-width: 100%; + width: 100%; } } + +@media (max-width: 1023px) { + .responsive-lg { + -webkit-box-direction: normal; + -moz-box-direction: normal; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .responsive-lg .col, .responsive-lg .col-10, .responsive-lg .col-20, .responsive-lg .col-25, .responsive-lg .col-33, .responsive-lg .col-34, .responsive-lg .col-50, .responsive-lg .col-66, .responsive-lg .col-67, .responsive-lg .col-75, .responsive-lg .col-80, .responsive-lg .col-90 { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + margin-bottom: 15px; + margin-left: 0; + max-width: 100%; + width: 100%; } } + +/** + * Utility Classes + * -------------------------------------------------- + */ +.hide { + display: none; } + +.opacity-hide { + opacity: 0; } + +.grade-b .opacity-hide, +.grade-c .opacity-hide { + opacity: 1; + display: none; } + +.show { + display: block; } + +.opacity-show { + opacity: 1; } + +.invisible { + visibility: hidden; } + +.keyboard-open .hide-on-keyboard-open { + display: none; } + +.keyboard-open .tabs.hide-on-keyboard-open + .pane .has-tabs, +.keyboard-open .bar-footer.hide-on-keyboard-open + .pane .has-footer { + bottom: 0; } + +.inline { + display: inline-block; } + +.disable-pointer-events { + pointer-events: none; } + +.enable-pointer-events { + pointer-events: auto; } + +.disable-user-behavior { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-touch-callout: none; + -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; + -webkit-user-drag: none; + -ms-touch-action: none; + -ms-content-zooming: none; } + +.click-block { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + opacity: 0; + z-index: 99999; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + overflow: hidden; } + +.click-block-hide { + -webkit-transform: translate3d(-9999px, 0, 0); + transform: translate3d(-9999px, 0, 0); } + +.no-resize { + resize: none; } + +.block { + display: block; + clear: both; } + .block:after { + display: block; + visibility: hidden; + clear: both; + height: 0; + content: "."; } + +.full-image { + width: 100%; } + +.clearfix { + *zoom: 1; } + .clearfix:before, .clearfix:after { + display: table; + content: ""; + line-height: 0; } + .clearfix:after { + clear: both; } + +/** + * Content Padding + * -------------------------------------------------- + */ +.padding { + padding: 10px; } + +.padding-top, +.padding-vertical { + padding-top: 10px; } + +.padding-right, +.padding-horizontal { + padding-right: 10px; } + +.padding-bottom, +.padding-vertical { + padding-bottom: 10px; } + +.padding-left, +.padding-horizontal { + padding-left: 10px; } + +/** + * Scrollable iFrames + * -------------------------------------------------- + */ +.iframe-wrapper { + position: fixed; + -webkit-overflow-scrolling: touch; + overflow: scroll; } + .iframe-wrapper iframe { + height: 100%; + width: 100%; } + +/** + * Rounded + * -------------------------------------------------- + */ +.rounded { + border-radius: 4px; } + +/** + * Utility Colors + * -------------------------------------------------- + * Utility colors are added to help set a naming convention. You'll + * notice we purposely do not use words like "red" or "blue", but + * instead have colors which represent an emotion or generic theme. + */ +.light, a.light { + color: #fff; } + +.light-bg { + background-color: #fff; } + +.light-border { + border-color: #ddd; } + +.stable, a.stable { + color: #f8f8f8; } + +.stable-bg { + background-color: #f8f8f8; } + +.stable-border { + border-color: #b2b2b2; } + +.positive, a.positive { + color: #387ef5; } + +.positive-bg { + background-color: #387ef5; } + +.positive-border { + border-color: #0c60ee; } + +.calm, a.calm { + color: #11c1f3; } + +.calm-bg { + background-color: #11c1f3; } + +.calm-border { + border-color: #0a9dc7; } + +.assertive, a.assertive { + color: #ef473a; } + +.assertive-bg { + background-color: #ef473a; } + +.assertive-border { + border-color: #e42112; } + +.balanced, a.balanced { + color: #33cd5f; } + +.balanced-bg { + background-color: #33cd5f; } + +.balanced-border { + border-color: #28a54c; } + +.energized, a.energized { + color: #ffc900; } + +.energized-bg { + background-color: #ffc900; } + +.energized-border { + border-color: #e6b500; } + +.royal, a.royal { + color: #886aea; } + +.royal-bg { + background-color: #886aea; } + +.royal-border { + border-color: #6b46e5; } + +.dark, a.dark { + color: #444; } + +.dark-bg { + background-color: #444; } + +.dark-border { + border-color: #111; } + +[collection-repeat] { + /* Position is set by transforms */ + left: 0 !important; + top: 0 !important; + position: absolute !important; + z-index: 1; } + +.collection-repeat-container { + position: relative; + z-index: 1; } + +.collection-repeat-after-container { + z-index: 0; + display: block; + /* when scrolling horizontally, make sure the after container doesn't take up 100% width */ } + .collection-repeat-after-container.horizontal { + display: inline-block; } + +[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, +.x-ng-cloak, .ng-hide:not(.ng-hide-animate) { + display: none !important; } + +/** + * Platform + * -------------------------------------------------- + * Platform specific tweaks + */ +.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader) { + height: 64px; } + .platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper { + margin-top: 19px !important; } + .platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader) > * { + margin-top: 20px; } + +.platform-ios.platform-cordova:not(.fullscreen) .tabs-top > .tabs, +.platform-ios.platform-cordova:not(.fullscreen) .tabs.tabs-top { + top: 64px; } + +.platform-ios.platform-cordova:not(.fullscreen) .has-header, +.platform-ios.platform-cordova:not(.fullscreen) .bar-subheader { + top: 64px; } + +.platform-ios.platform-cordova:not(.fullscreen) .has-subheader { + top: 108px; } + +.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-tabs-top { + top: 113px; } + +.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-subheader.has-tabs-top { + top: 157px; } + +.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader) { + height: 44px; } + .platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper { + margin-top: -1px; } + .platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader) > * { + margin-top: 0; } + +.platform-ios.platform-cordova .popover .has-header, +.platform-ios.platform-cordova .popover .bar-subheader { + top: 44px; } + +.platform-ios.platform-cordova .popover .has-subheader { + top: 88px; } + +.platform-ios.platform-cordova.status-bar-hide { + margin-bottom: 20px; } + +@media (orientation: landscape) { + .platform-ios.platform-browser.platform-ipad { + position: fixed; } } + +.platform-c:not(.enable-transitions) * { + -webkit-transition: none !important; + transition: none !important; } + +.slide-in-up { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); } + +.slide-in-up.ng-enter, +.slide-in-up > .ng-enter { + -webkit-transition: all cubic-bezier(0.1, 0.7, 0.1, 1) 400ms; + transition: all cubic-bezier(0.1, 0.7, 0.1, 1) 400ms; } + +.slide-in-up.ng-enter-active, +.slide-in-up > .ng-enter-active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +.slide-in-up.ng-leave, +.slide-in-up > .ng-leave { + -webkit-transition: all ease-in-out 250ms; + transition: all ease-in-out 250ms; } + +@-webkit-keyframes scaleOut { + from { + -webkit-transform: scale(1); + opacity: 1; } + to { + -webkit-transform: scale(0.8); + opacity: 0; } } + +@keyframes scaleOut { + from { + transform: scale(1); + opacity: 1; } + to { + transform: scale(0.8); + opacity: 0; } } + +@-webkit-keyframes superScaleIn { + from { + -webkit-transform: scale(1.2); + opacity: 0; } + to { + -webkit-transform: scale(1); + opacity: 1; } } + +@keyframes superScaleIn { + from { + transform: scale(1.2); + opacity: 0; } + to { + transform: scale(1); + opacity: 1; } } + +[nav-view-transition="ios"] [nav-view="entering"], +[nav-view-transition="ios"] [nav-view="leaving"] { + -webkit-transition-duration: 500ms; + transition-duration: 500ms; + -webkit-transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1); + transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1); + -webkit-transition-property: opacity, -webkit-transform, box-shadow; + transition-property: opacity, transform, box-shadow; } + +[nav-view-transition="ios"][nav-view-direction="forward"], [nav-view-transition="ios"][nav-view-direction="back"] { + background-color: #000; } + +[nav-view-transition="ios"] [nav-view="active"], +[nav-view-transition="ios"][nav-view-direction="forward"] [nav-view="entering"], +[nav-view-transition="ios"][nav-view-direction="back"] [nav-view="leaving"] { + z-index: 3; } + +[nav-view-transition="ios"][nav-view-direction="back"] [nav-view="entering"], +[nav-view-transition="ios"][nav-view-direction="forward"] [nav-view="leaving"] { + z-index: 2; } + +[nav-bar-transition="ios"] .title, +[nav-bar-transition="ios"] .buttons, +[nav-bar-transition="ios"] .back-text { + -webkit-transition-duration: 500ms; + transition-duration: 500ms; + -webkit-transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1); + transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1); + -webkit-transition-property: opacity, -webkit-transform; + transition-property: opacity, transform; } + +[nav-bar-transition="ios"] [nav-bar="active"], +[nav-bar-transition="ios"] [nav-bar="entering"] { + z-index: 10; } + [nav-bar-transition="ios"] [nav-bar="active"] .bar, + [nav-bar-transition="ios"] [nav-bar="entering"] .bar { + background: transparent; } + +[nav-bar-transition="ios"] [nav-bar="cached"] { + display: block; } + [nav-bar-transition="ios"] [nav-bar="cached"] .header-item { + display: none; } + +[nav-view-transition="android"] [nav-view="entering"], +[nav-view-transition="android"] [nav-view="leaving"] { + -webkit-transition-duration: 200ms; + transition-duration: 200ms; + -webkit-transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1); + transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1); + -webkit-transition-property: -webkit-transform; + transition-property: transform; } + +[nav-view-transition="android"] [nav-view="active"], +[nav-view-transition="android"][nav-view-direction="forward"] [nav-view="entering"], +[nav-view-transition="android"][nav-view-direction="back"] [nav-view="leaving"] { + z-index: 3; } + +[nav-view-transition="android"][nav-view-direction="back"] [nav-view="entering"], +[nav-view-transition="android"][nav-view-direction="forward"] [nav-view="leaving"] { + z-index: 2; } + +[nav-bar-transition="android"] .title, +[nav-bar-transition="android"] .buttons { + -webkit-transition-duration: 200ms; + transition-duration: 200ms; + -webkit-transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1); + transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1); + -webkit-transition-property: opacity; + transition-property: opacity; } + +[nav-bar-transition="android"] [nav-bar="active"], +[nav-bar-transition="android"] [nav-bar="entering"] { + z-index: 10; } + [nav-bar-transition="android"] [nav-bar="active"] .bar, + [nav-bar-transition="android"] [nav-bar="entering"] .bar { + background: transparent; } + +[nav-bar-transition="android"] [nav-bar="cached"] { + display: block; } + [nav-bar-transition="android"] [nav-bar="cached"] .header-item { + display: none; } + +[nav-swipe="fast"] [nav-view], +[nav-swipe="fast"] .title, +[nav-swipe="fast"] .buttons, +[nav-swipe="fast"] .back-text { + -webkit-transition-duration: 50ms; + transition-duration: 50ms; + -webkit-transition-timing-function: linear; + transition-timing-function: linear; } + +[nav-swipe="slow"] [nav-view], +[nav-swipe="slow"] .title, +[nav-swipe="slow"] .buttons, +[nav-swipe="slow"] .back-text { + -webkit-transition-duration: 160ms; + transition-duration: 160ms; + -webkit-transition-timing-function: linear; + transition-timing-function: linear; } + +[nav-view="cached"], +[nav-bar="cached"] { + display: none; } + +[nav-view="stage"] { + opacity: 0; + -webkit-transition-duration: 0; + transition-duration: 0; } + +[nav-bar="stage"] .title, +[nav-bar="stage"] .buttons, +[nav-bar="stage"] .back-text { + position: absolute; + opacity: 0; + -webkit-transition-duration: 0s; + transition-duration: 0s; } diff --git a/www/lib/ionic/css/ionic.min.css b/www/lib/ionic/css/ionic.min.css new file mode 100644 index 0000000..d72dfc1 --- /dev/null +++ b/www/lib/ionic/css/ionic.min.css @@ -0,0 +1,23 @@ +@charset "UTF-8";/*! + * Copyright 2015 Drifty Co. + * http://drifty.com/ + * + * Ionic, v1.2.4 + * A powerful HTML5 mobile app framework. + * http://ionicframework.com/ + * + * By @maxlynch, @benjsperry, @adamdbradley <3 + * + * Licensed under the MIT license. Please see LICENSE for more information. + * + *//*! + Ionicons, v2.0.1 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. +*/@font-face{font-family:Ionicons;src:url(../fonts/ionicons.eot?v=2.0.1);src:url(../fonts/ionicons.eot?v=2.0.1#iefix) format("embedded-opentype"),url(../fonts/ionicons.ttf?v=2.0.1) format("truetype"),url(../fonts/ionicons.woff?v=2.0.1) format("woff"),url(../fonts/ionicons.woff) format("woff"),url(../fonts/ionicons.svg?v=2.0.1#Ionicons) format("svg");font-weight:400;font-style:normal}.ion,.ion-alert-circled:before,.ion-alert:before,.ion-android-add-circle:before,.ion-android-add:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-cloud:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done-all:before,.ion-android-done:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite-outline:before,.ion-android-favorite:before,.ion-android-film:before,.ion-android-folder-open:before,.ion-android-folder:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone-off:before,.ion-android-microphone:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-notifications:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person-add:before,.ion-android-person:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove-circle:before,.ion-android-remove:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share-alt:before,.ion-android-share:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-star:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace-outline:before,.ion-backspace:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox-working:before,.ion-chatbox:before,.ion-chatboxes:before,.ion-chatbubble-working:before,.ion-chatbubble:before,.ion-chatbubbles:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-checkmark:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close-circled:before,.ion-close-round:before,.ion-close:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code-download:before,.ion-code-working:before,.ion-code:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document-text:before,.ion-document:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email-unread:before,.ion-email:before,.ion-erlenmeyer-flask-bubbles:before,.ion-erlenmeyer-flask:before,.ion-eye-disabled:before,.ion-eye:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash-off:before,.ion-flash:before,.ion-folder:before,.ion-fork-repo:before,.ion-fork:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy-outline:before,.ion-happy:before,.ion-headphone:before,.ion-heart-broken:before,.ion-heart:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-help:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information-circled:before,.ion-information:before,.ion-ionic:before,.ion-ios-alarm-outline:before,.ion-ios-alarm:before,.ion-ios-albums-outline:before,.ion-ios-albums:before,.ion-ios-americanfootball-outline:before,.ion-ios-americanfootball:before,.ion-ios-analytics-outline:before,.ion-ios-analytics:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at-outline:before,.ion-ios-at:before,.ion-ios-barcode-outline:before,.ion-ios-barcode:before,.ion-ios-baseball-outline:before,.ion-ios-baseball:before,.ion-ios-basketball-outline:before,.ion-ios-basketball:before,.ion-ios-bell-outline:before,.ion-ios-bell:before,.ion-ios-body-outline:before,.ion-ios-body:before,.ion-ios-bolt-outline:before,.ion-ios-bolt:before,.ion-ios-book-outline:before,.ion-ios-book:before,.ion-ios-bookmarks-outline:before,.ion-ios-bookmarks:before,.ion-ios-box-outline:before,.ion-ios-box:before,.ion-ios-briefcase-outline:before,.ion-ios-briefcase:before,.ion-ios-browsers-outline:before,.ion-ios-browsers:before,.ion-ios-calculator-outline:before,.ion-ios-calculator:before,.ion-ios-calendar-outline:before,.ion-ios-calendar:before,.ion-ios-camera-outline:before,.ion-ios-camera:before,.ion-ios-cart-outline:before,.ion-ios-cart:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatbubble-outline:before,.ion-ios-chatbubble:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-checkmark:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock-outline:before,.ion-ios-clock:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-close:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-download:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-outline:before,.ion-ios-cloudy:before,.ion-ios-cog-outline:before,.ion-ios-cog:before,.ion-ios-color-filter-outline:before,.ion-ios-color-filter:before,.ion-ios-color-wand-outline:before,.ion-ios-color-wand:before,.ion-ios-compose-outline:before,.ion-ios-compose:before,.ion-ios-contact-outline:before,.ion-ios-contact:before,.ion-ios-copy-outline:before,.ion-ios-copy:before,.ion-ios-crop-strong:before,.ion-ios-crop:before,.ion-ios-download-outline:before,.ion-ios-download:before,.ion-ios-drag:before,.ion-ios-email-outline:before,.ion-ios-email:before,.ion-ios-eye-outline:before,.ion-ios-eye:before,.ion-ios-fastforward-outline:before,.ion-ios-fastforward:before,.ion-ios-filing-outline:before,.ion-ios-filing:before,.ion-ios-film-outline:before,.ion-ios-film:before,.ion-ios-flag-outline:before,.ion-ios-flag:before,.ion-ios-flame-outline:before,.ion-ios-flame:before,.ion-ios-flask-outline:before,.ion-ios-flask:before,.ion-ios-flower-outline:before,.ion-ios-flower:before,.ion-ios-folder-outline:before,.ion-ios-folder:before,.ion-ios-football-outline:before,.ion-ios-football:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-b-outline:before,.ion-ios-game-controller-b:before,.ion-ios-gear-outline:before,.ion-ios-gear:before,.ion-ios-glasses-outline:before,.ion-ios-glasses:before,.ion-ios-grid-view-outline:before,.ion-ios-grid-view:before,.ion-ios-heart-outline:before,.ion-ios-heart:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-help:before,.ion-ios-home-outline:before,.ion-ios-home:before,.ion-ios-infinite-outline:before,.ion-ios-infinite:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-information:before,.ion-ios-ionic-outline:before,.ion-ios-keypad-outline:before,.ion-ios-keypad:before,.ion-ios-lightbulb-outline:before,.ion-ios-lightbulb:before,.ion-ios-list-outline:before,.ion-ios-list:before,.ion-ios-location-outline:before,.ion-ios-location:before,.ion-ios-locked-outline:before,.ion-ios-locked:before,.ion-ios-loop-strong:before,.ion-ios-loop:before,.ion-ios-medical-outline:before,.ion-ios-medical:before,.ion-ios-medkit-outline:before,.ion-ios-medkit:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-mic:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-minus:before,.ion-ios-monitor-outline:before,.ion-ios-monitor:before,.ion-ios-moon-outline:before,.ion-ios-moon:before,.ion-ios-more-outline:before,.ion-ios-more:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate-outline:before,.ion-ios-navigate:before,.ion-ios-nutrition-outline:before,.ion-ios-nutrition:before,.ion-ios-paper-outline:before,.ion-ios-paper:before,.ion-ios-paperplane-outline:before,.ion-ios-paperplane:before,.ion-ios-partlysunny-outline:before,.ion-ios-partlysunny:before,.ion-ios-pause-outline:before,.ion-ios-pause:before,.ion-ios-paw-outline:before,.ion-ios-paw:before,.ion-ios-people-outline:before,.ion-ios-people:before,.ion-ios-person-outline:before,.ion-ios-person:before,.ion-ios-personadd-outline:before,.ion-ios-personadd:before,.ion-ios-photos-outline:before,.ion-ios-photos:before,.ion-ios-pie-outline:before,.ion-ios-pie:before,.ion-ios-pint-outline:before,.ion-ios-pint:before,.ion-ios-play-outline:before,.ion-ios-play:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-plus:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetags-outline:before,.ion-ios-pricetags:before,.ion-ios-printer-outline:before,.ion-ios-printer:before,.ion-ios-pulse-strong:before,.ion-ios-pulse:before,.ion-ios-rainy-outline:before,.ion-ios-rainy:before,.ion-ios-recording-outline:before,.ion-ios-recording:before,.ion-ios-redo-outline:before,.ion-ios-redo:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-refresh:before,.ion-ios-reload:before,.ion-ios-reverse-camera-outline:before,.ion-ios-reverse-camera:before,.ion-ios-rewind-outline:before,.ion-ios-rewind:before,.ion-ios-rose-outline:before,.ion-ios-rose:before,.ion-ios-search-strong:before,.ion-ios-search:before,.ion-ios-settings-strong:before,.ion-ios-settings:before,.ion-ios-shuffle-strong:before,.ion-ios-shuffle:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipbackward:before,.ion-ios-skipforward-outline:before,.ion-ios-skipforward:before,.ion-ios-snowy:before,.ion-ios-speedometer-outline:before,.ion-ios-speedometer:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-star:before,.ion-ios-stopwatch-outline:before,.ion-ios-stopwatch:before,.ion-ios-sunny-outline:before,.ion-ios-sunny:before,.ion-ios-telephone-outline:before,.ion-ios-telephone:before,.ion-ios-tennisball-outline:before,.ion-ios-tennisball:before,.ion-ios-thunderstorm-outline:before,.ion-ios-thunderstorm:before,.ion-ios-time-outline:before,.ion-ios-time:before,.ion-ios-timer-outline:before,.ion-ios-timer:before,.ion-ios-toggle-outline:before,.ion-ios-toggle:before,.ion-ios-trash-outline:before,.ion-ios-trash:before,.ion-ios-undo-outline:before,.ion-ios-undo:before,.ion-ios-unlocked-outline:before,.ion-ios-unlocked:before,.ion-ios-upload-outline:before,.ion-ios-upload:before,.ion-ios-videocam-outline:before,.ion-ios-videocam:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass-outline:before,.ion-ios-wineglass:before,.ion-ios-world-outline:before,.ion-ios-world:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-minus:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon-round:before,.ion-navicon:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person-add:before,.ion-person-stalker:before,.ion-person:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-plus:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply-all:before,.ion-reply:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad-outline:before,.ion-sad:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android-outline:before,.ion-social-android:before,.ion-social-angular-outline:before,.ion-social-angular:before,.ion-social-apple-outline:before,.ion-social-apple:before,.ion-social-bitcoin-outline:before,.ion-social-bitcoin:before,.ion-social-buffer-outline:before,.ion-social-buffer:before,.ion-social-chrome-outline:before,.ion-social-chrome:before,.ion-social-codepen-outline:before,.ion-social-codepen:before,.ion-social-css3-outline:before,.ion-social-css3:before,.ion-social-designernews-outline:before,.ion-social-designernews:before,.ion-social-dribbble-outline:before,.ion-social-dribbble:before,.ion-social-dropbox-outline:before,.ion-social-dropbox:before,.ion-social-euro-outline:before,.ion-social-euro:before,.ion-social-facebook-outline:before,.ion-social-facebook:before,.ion-social-foursquare-outline:before,.ion-social-foursquare:before,.ion-social-freebsd-devil:before,.ion-social-github-outline:before,.ion-social-github:before,.ion-social-google-outline:before,.ion-social-google:before,.ion-social-googleplus-outline:before,.ion-social-googleplus:before,.ion-social-hackernews-outline:before,.ion-social-hackernews:before,.ion-social-html5-outline:before,.ion-social-html5:before,.ion-social-instagram-outline:before,.ion-social-instagram:before,.ion-social-javascript-outline:before,.ion-social-javascript:before,.ion-social-linkedin-outline:before,.ion-social-linkedin:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest-outline:before,.ion-social-pinterest:before,.ion-social-python:before,.ion-social-reddit-outline:before,.ion-social-reddit:before,.ion-social-rss-outline:before,.ion-social-rss:before,.ion-social-sass:before,.ion-social-skype-outline:before,.ion-social-skype:before,.ion-social-snapchat-outline:before,.ion-social-snapchat:before,.ion-social-tumblr-outline:before,.ion-social-tumblr:before,.ion-social-tux:before,.ion-social-twitch-outline:before,.ion-social-twitch:before,.ion-social-twitter-outline:before,.ion-social-twitter:before,.ion-social-usd-outline:before,.ion-social-usd:before,.ion-social-vimeo-outline:before,.ion-social-vimeo:before,.ion-social-whatsapp-outline:before,.ion-social-whatsapp:before,.ion-social-windows-outline:before,.ion-social-windows:before,.ion-social-wordpress-outline:before,.ion-social-wordpress:before,.ion-social-yahoo-outline:before,.ion-social-yahoo:before,.ion-social-yen-outline:before,.ion-social-yen:before,.ion-social-youtube-outline:before,.ion-social-youtube:before,.ion-soup-can-outline:before,.ion-soup-can:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle-filled:before,.ion-toggle:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt-outline:before,.ion-tshirt:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before,.ionicons{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:""}.ion-alert-circled:before{content:""}.ion-android-add:before{content:""}.ion-android-add-circle:before{content:""}.ion-android-alarm-clock:before{content:""}.ion-android-alert:before{content:""}.ion-android-apps:before{content:""}.ion-android-archive:before{content:""}.ion-android-arrow-back:before{content:""}.ion-android-arrow-down:before{content:""}.ion-android-arrow-dropdown:before{content:""}.ion-android-arrow-dropdown-circle:before{content:""}.ion-android-arrow-dropleft:before{content:""}.ion-android-arrow-dropleft-circle:before{content:""}.ion-android-arrow-dropright:before{content:""}.ion-android-arrow-dropright-circle:before{content:""}.ion-android-arrow-dropup:before{content:""}.ion-android-arrow-dropup-circle:before{content:""}.ion-android-arrow-forward:before{content:""}.ion-android-arrow-up:before{content:""}.ion-android-attach:before{content:""}.ion-android-bar:before{content:""}.ion-android-bicycle:before{content:""}.ion-android-boat:before{content:""}.ion-android-bookmark:before{content:""}.ion-android-bulb:before{content:""}.ion-android-bus:before{content:""}.ion-android-calendar:before{content:""}.ion-android-call:before{content:""}.ion-android-camera:before{content:""}.ion-android-cancel:before{content:""}.ion-android-car:before{content:""}.ion-android-cart:before{content:""}.ion-android-chat:before{content:""}.ion-android-checkbox:before{content:""}.ion-android-checkbox-blank:before{content:""}.ion-android-checkbox-outline:before{content:""}.ion-android-checkbox-outline-blank:before{content:""}.ion-android-checkmark-circle:before{content:""}.ion-android-clipboard:before{content:""}.ion-android-close:before{content:""}.ion-android-cloud:before{content:""}.ion-android-cloud-circle:before{content:""}.ion-android-cloud-done:before{content:""}.ion-android-cloud-outline:before{content:""}.ion-android-color-palette:before{content:""}.ion-android-compass:before{content:""}.ion-android-contact:before{content:""}.ion-android-contacts:before{content:""}.ion-android-contract:before{content:""}.ion-android-create:before{content:""}.ion-android-delete:before{content:""}.ion-android-desktop:before{content:""}.ion-android-document:before{content:""}.ion-android-done:before{content:""}.ion-android-done-all:before{content:""}.ion-android-download:before{content:""}.ion-android-drafts:before{content:""}.ion-android-exit:before{content:""}.ion-android-expand:before{content:""}.ion-android-favorite:before{content:""}.ion-android-favorite-outline:before{content:""}.ion-android-film:before{content:""}.ion-android-folder:before{content:""}.ion-android-folder-open:before{content:""}.ion-android-funnel:before{content:""}.ion-android-globe:before{content:""}.ion-android-hand:before{content:""}.ion-android-hangout:before{content:""}.ion-android-happy:before{content:""}.ion-android-home:before{content:""}.ion-android-image:before{content:""}.ion-android-laptop:before{content:""}.ion-android-list:before{content:""}.ion-android-locate:before{content:""}.ion-android-lock:before{content:""}.ion-android-mail:before{content:""}.ion-android-map:before{content:""}.ion-android-menu:before{content:""}.ion-android-microphone:before{content:""}.ion-android-microphone-off:before{content:""}.ion-android-more-horizontal:before{content:""}.ion-android-more-vertical:before{content:""}.ion-android-navigate:before{content:""}.ion-android-notifications:before{content:""}.ion-android-notifications-none:before{content:""}.ion-android-notifications-off:before{content:""}.ion-android-open:before{content:""}.ion-android-options:before{content:""}.ion-android-people:before{content:""}.ion-android-person:before{content:""}.ion-android-person-add:before{content:""}.ion-android-phone-landscape:before{content:""}.ion-android-phone-portrait:before{content:""}.ion-android-pin:before{content:""}.ion-android-plane:before{content:""}.ion-android-playstore:before{content:""}.ion-android-print:before{content:""}.ion-android-radio-button-off:before{content:""}.ion-android-radio-button-on:before{content:""}.ion-android-refresh:before{content:""}.ion-android-remove:before{content:""}.ion-android-remove-circle:before{content:""}.ion-android-restaurant:before{content:""}.ion-android-sad:before{content:""}.ion-android-search:before{content:""}.ion-android-send:before{content:""}.ion-android-settings:before{content:""}.ion-android-share:before{content:""}.ion-android-share-alt:before{content:""}.ion-android-star:before{content:""}.ion-android-star-half:before{content:""}.ion-android-star-outline:before{content:""}.ion-android-stopwatch:before{content:""}.ion-android-subway:before{content:""}.ion-android-sunny:before{content:""}.ion-android-sync:before{content:""}.ion-android-textsms:before{content:""}.ion-android-time:before{content:""}.ion-android-train:before{content:""}.ion-android-unlock:before{content:""}.ion-android-upload:before{content:""}.ion-android-volume-down:before{content:""}.ion-android-volume-mute:before{content:""}.ion-android-volume-off:before{content:""}.ion-android-volume-up:before{content:""}.ion-android-walk:before{content:""}.ion-android-warning:before{content:""}.ion-android-watch:before{content:""}.ion-android-wifi:before{content:""}.ion-aperture:before{content:""}.ion-archive:before{content:""}.ion-arrow-down-a:before{content:""}.ion-arrow-down-b:before{content:""}.ion-arrow-down-c:before{content:""}.ion-arrow-expand:before{content:""}.ion-arrow-graph-down-left:before{content:""}.ion-arrow-graph-down-right:before{content:""}.ion-arrow-graph-up-left:before{content:""}.ion-arrow-graph-up-right:before{content:""}.ion-arrow-left-a:before{content:""}.ion-arrow-left-b:before{content:""}.ion-arrow-left-c:before{content:""}.ion-arrow-move:before{content:""}.ion-arrow-resize:before{content:""}.ion-arrow-return-left:before{content:""}.ion-arrow-return-right:before{content:""}.ion-arrow-right-a:before{content:""}.ion-arrow-right-b:before{content:""}.ion-arrow-right-c:before{content:""}.ion-arrow-shrink:before{content:""}.ion-arrow-swap:before{content:""}.ion-arrow-up-a:before{content:""}.ion-arrow-up-b:before{content:""}.ion-arrow-up-c:before{content:""}.ion-asterisk:before{content:""}.ion-at:before{content:""}.ion-backspace:before{content:""}.ion-backspace-outline:before{content:""}.ion-bag:before{content:""}.ion-battery-charging:before{content:""}.ion-battery-empty:before{content:""}.ion-battery-full:before{content:""}.ion-battery-half:before{content:""}.ion-battery-low:before{content:""}.ion-beaker:before{content:""}.ion-beer:before{content:""}.ion-bluetooth:before{content:""}.ion-bonfire:before{content:""}.ion-bookmark:before{content:""}.ion-bowtie:before{content:""}.ion-briefcase:before{content:""}.ion-bug:before{content:""}.ion-calculator:before{content:""}.ion-calendar:before{content:""}.ion-camera:before{content:""}.ion-card:before{content:""}.ion-cash:before{content:""}.ion-chatbox:before{content:""}.ion-chatbox-working:before{content:""}.ion-chatboxes:before{content:""}.ion-chatbubble:before{content:""}.ion-chatbubble-working:before{content:""}.ion-chatbubbles:before{content:""}.ion-checkmark:before{content:""}.ion-checkmark-circled:before{content:""}.ion-checkmark-round:before{content:""}.ion-chevron-down:before{content:""}.ion-chevron-left:before{content:""}.ion-chevron-right:before{content:""}.ion-chevron-up:before{content:""}.ion-clipboard:before{content:""}.ion-clock:before{content:""}.ion-close:before{content:""}.ion-close-circled:before{content:""}.ion-close-round:before{content:""}.ion-closed-captioning:before{content:""}.ion-cloud:before{content:""}.ion-code:before{content:""}.ion-code-download:before{content:""}.ion-code-working:before{content:""}.ion-coffee:before{content:""}.ion-compass:before{content:""}.ion-compose:before{content:""}.ion-connection-bars:before{content:""}.ion-contrast:before{content:""}.ion-crop:before{content:""}.ion-cube:before{content:""}.ion-disc:before{content:""}.ion-document:before{content:""}.ion-document-text:before{content:""}.ion-drag:before{content:""}.ion-earth:before{content:""}.ion-easel:before{content:""}.ion-edit:before{content:""}.ion-egg:before{content:""}.ion-eject:before{content:""}.ion-email:before{content:""}.ion-email-unread:before{content:""}.ion-erlenmeyer-flask:before{content:""}.ion-erlenmeyer-flask-bubbles:before{content:""}.ion-eye:before{content:""}.ion-eye-disabled:before{content:""}.ion-female:before{content:""}.ion-filing:before{content:""}.ion-film-marker:before{content:""}.ion-fireball:before{content:""}.ion-flag:before{content:""}.ion-flame:before{content:""}.ion-flash:before{content:""}.ion-flash-off:before{content:""}.ion-folder:before{content:""}.ion-fork:before{content:""}.ion-fork-repo:before{content:""}.ion-forward:before{content:""}.ion-funnel:before{content:""}.ion-gear-a:before{content:""}.ion-gear-b:before{content:""}.ion-grid:before{content:""}.ion-hammer:before{content:""}.ion-happy:before{content:""}.ion-happy-outline:before{content:""}.ion-headphone:before{content:""}.ion-heart:before{content:""}.ion-heart-broken:before{content:""}.ion-help:before{content:""}.ion-help-buoy:before{content:""}.ion-help-circled:before{content:""}.ion-home:before{content:""}.ion-icecream:before{content:""}.ion-image:before{content:""}.ion-images:before{content:""}.ion-information:before{content:""}.ion-information-circled:before{content:""}.ion-ionic:before{content:""}.ion-ios-alarm:before{content:""}.ion-ios-alarm-outline:before{content:""}.ion-ios-albums:before{content:""}.ion-ios-albums-outline:before{content:""}.ion-ios-americanfootball:before{content:""}.ion-ios-americanfootball-outline:before{content:""}.ion-ios-analytics:before{content:""}.ion-ios-analytics-outline:before{content:""}.ion-ios-arrow-back:before{content:""}.ion-ios-arrow-down:before{content:""}.ion-ios-arrow-forward:before{content:""}.ion-ios-arrow-left:before{content:""}.ion-ios-arrow-right:before{content:""}.ion-ios-arrow-thin-down:before{content:""}.ion-ios-arrow-thin-left:before{content:""}.ion-ios-arrow-thin-right:before{content:""}.ion-ios-arrow-thin-up:before{content:""}.ion-ios-arrow-up:before{content:""}.ion-ios-at:before{content:""}.ion-ios-at-outline:before{content:""}.ion-ios-barcode:before{content:""}.ion-ios-barcode-outline:before{content:""}.ion-ios-baseball:before{content:""}.ion-ios-baseball-outline:before{content:""}.ion-ios-basketball:before{content:""}.ion-ios-basketball-outline:before{content:""}.ion-ios-bell:before{content:""}.ion-ios-bell-outline:before{content:""}.ion-ios-body:before{content:""}.ion-ios-body-outline:before{content:""}.ion-ios-bolt:before{content:""}.ion-ios-bolt-outline:before{content:""}.ion-ios-book:before{content:""}.ion-ios-book-outline:before{content:""}.ion-ios-bookmarks:before{content:""}.ion-ios-bookmarks-outline:before{content:""}.ion-ios-box:before{content:""}.ion-ios-box-outline:before{content:""}.ion-ios-briefcase:before{content:""}.ion-ios-briefcase-outline:before{content:""}.ion-ios-browsers:before{content:""}.ion-ios-browsers-outline:before{content:""}.ion-ios-calculator:before{content:""}.ion-ios-calculator-outline:before{content:""}.ion-ios-calendar:before{content:""}.ion-ios-calendar-outline:before{content:""}.ion-ios-camera:before{content:""}.ion-ios-camera-outline:before{content:""}.ion-ios-cart:before{content:""}.ion-ios-cart-outline:before{content:""}.ion-ios-chatboxes:before{content:""}.ion-ios-chatboxes-outline:before{content:""}.ion-ios-chatbubble:before{content:""}.ion-ios-chatbubble-outline:before{content:""}.ion-ios-checkmark:before{content:""}.ion-ios-checkmark-empty:before{content:""}.ion-ios-checkmark-outline:before{content:""}.ion-ios-circle-filled:before{content:""}.ion-ios-circle-outline:before{content:""}.ion-ios-clock:before{content:""}.ion-ios-clock-outline:before{content:""}.ion-ios-close:before{content:""}.ion-ios-close-empty:before{content:""}.ion-ios-close-outline:before{content:""}.ion-ios-cloud:before{content:""}.ion-ios-cloud-download:before{content:""}.ion-ios-cloud-download-outline:before{content:""}.ion-ios-cloud-outline:before{content:""}.ion-ios-cloud-upload:before{content:""}.ion-ios-cloud-upload-outline:before{content:""}.ion-ios-cloudy:before{content:""}.ion-ios-cloudy-night:before{content:""}.ion-ios-cloudy-night-outline:before{content:""}.ion-ios-cloudy-outline:before{content:""}.ion-ios-cog:before{content:""}.ion-ios-cog-outline:before{content:""}.ion-ios-color-filter:before{content:""}.ion-ios-color-filter-outline:before{content:""}.ion-ios-color-wand:before{content:""}.ion-ios-color-wand-outline:before{content:""}.ion-ios-compose:before{content:""}.ion-ios-compose-outline:before{content:""}.ion-ios-contact:before{content:""}.ion-ios-contact-outline:before{content:""}.ion-ios-copy:before{content:""}.ion-ios-copy-outline:before{content:""}.ion-ios-crop:before{content:""}.ion-ios-crop-strong:before{content:""}.ion-ios-download:before{content:""}.ion-ios-download-outline:before{content:""}.ion-ios-drag:before{content:""}.ion-ios-email:before{content:""}.ion-ios-email-outline:before{content:""}.ion-ios-eye:before{content:""}.ion-ios-eye-outline:before{content:""}.ion-ios-fastforward:before{content:""}.ion-ios-fastforward-outline:before{content:""}.ion-ios-filing:before{content:""}.ion-ios-filing-outline:before{content:""}.ion-ios-film:before{content:""}.ion-ios-film-outline:before{content:""}.ion-ios-flag:before{content:""}.ion-ios-flag-outline:before{content:""}.ion-ios-flame:before{content:""}.ion-ios-flame-outline:before{content:""}.ion-ios-flask:before{content:""}.ion-ios-flask-outline:before{content:""}.ion-ios-flower:before{content:""}.ion-ios-flower-outline:before{content:""}.ion-ios-folder:before{content:""}.ion-ios-folder-outline:before{content:""}.ion-ios-football:before{content:""}.ion-ios-football-outline:before{content:""}.ion-ios-game-controller-a:before{content:""}.ion-ios-game-controller-a-outline:before{content:""}.ion-ios-game-controller-b:before{content:""}.ion-ios-game-controller-b-outline:before{content:""}.ion-ios-gear:before{content:""}.ion-ios-gear-outline:before{content:""}.ion-ios-glasses:before{content:""}.ion-ios-glasses-outline:before{content:""}.ion-ios-grid-view:before{content:""}.ion-ios-grid-view-outline:before{content:""}.ion-ios-heart:before{content:""}.ion-ios-heart-outline:before{content:""}.ion-ios-help:before{content:""}.ion-ios-help-empty:before{content:""}.ion-ios-help-outline:before{content:""}.ion-ios-home:before{content:""}.ion-ios-home-outline:before{content:""}.ion-ios-infinite:before{content:""}.ion-ios-infinite-outline:before{content:""}.ion-ios-information:before{content:""}.ion-ios-information-empty:before{content:""}.ion-ios-information-outline:before{content:""}.ion-ios-ionic-outline:before{content:""}.ion-ios-keypad:before{content:""}.ion-ios-keypad-outline:before{content:""}.ion-ios-lightbulb:before{content:""}.ion-ios-lightbulb-outline:before{content:""}.ion-ios-list:before{content:""}.ion-ios-list-outline:before{content:""}.ion-ios-location:before{content:""}.ion-ios-location-outline:before{content:""}.ion-ios-locked:before{content:""}.ion-ios-locked-outline:before{content:""}.ion-ios-loop:before{content:""}.ion-ios-loop-strong:before{content:""}.ion-ios-medical:before{content:""}.ion-ios-medical-outline:before{content:""}.ion-ios-medkit:before{content:""}.ion-ios-medkit-outline:before{content:""}.ion-ios-mic:before{content:""}.ion-ios-mic-off:before{content:""}.ion-ios-mic-outline:before{content:""}.ion-ios-minus:before{content:""}.ion-ios-minus-empty:before{content:""}.ion-ios-minus-outline:before{content:""}.ion-ios-monitor:before{content:""}.ion-ios-monitor-outline:before{content:""}.ion-ios-moon:before{content:""}.ion-ios-moon-outline:before{content:""}.ion-ios-more:before{content:""}.ion-ios-more-outline:before{content:""}.ion-ios-musical-note:before{content:""}.ion-ios-musical-notes:before{content:""}.ion-ios-navigate:before{content:""}.ion-ios-navigate-outline:before{content:""}.ion-ios-nutrition:before{content:""}.ion-ios-nutrition-outline:before{content:""}.ion-ios-paper:before{content:""}.ion-ios-paper-outline:before{content:""}.ion-ios-paperplane:before{content:""}.ion-ios-paperplane-outline:before{content:""}.ion-ios-partlysunny:before{content:""}.ion-ios-partlysunny-outline:before{content:""}.ion-ios-pause:before{content:""}.ion-ios-pause-outline:before{content:""}.ion-ios-paw:before{content:""}.ion-ios-paw-outline:before{content:""}.ion-ios-people:before{content:""}.ion-ios-people-outline:before{content:""}.ion-ios-person:before{content:""}.ion-ios-person-outline:before{content:""}.ion-ios-personadd:before{content:""}.ion-ios-personadd-outline:before{content:""}.ion-ios-photos:before{content:""}.ion-ios-photos-outline:before{content:""}.ion-ios-pie:before{content:""}.ion-ios-pie-outline:before{content:""}.ion-ios-pint:before{content:""}.ion-ios-pint-outline:before{content:""}.ion-ios-play:before{content:""}.ion-ios-play-outline:before{content:""}.ion-ios-plus:before{content:""}.ion-ios-plus-empty:before{content:""}.ion-ios-plus-outline:before{content:""}.ion-ios-pricetag:before{content:""}.ion-ios-pricetag-outline:before{content:""}.ion-ios-pricetags:before{content:""}.ion-ios-pricetags-outline:before{content:""}.ion-ios-printer:before{content:""}.ion-ios-printer-outline:before{content:""}.ion-ios-pulse:before{content:""}.ion-ios-pulse-strong:before{content:""}.ion-ios-rainy:before{content:""}.ion-ios-rainy-outline:before{content:""}.ion-ios-recording:before{content:""}.ion-ios-recording-outline:before{content:""}.ion-ios-redo:before{content:""}.ion-ios-redo-outline:before{content:""}.ion-ios-refresh:before{content:""}.ion-ios-refresh-empty:before{content:""}.ion-ios-refresh-outline:before{content:""}.ion-ios-reload:before{content:""}.ion-ios-reverse-camera:before{content:""}.ion-ios-reverse-camera-outline:before{content:""}.ion-ios-rewind:before{content:""}.ion-ios-rewind-outline:before{content:""}.ion-ios-rose:before{content:""}.ion-ios-rose-outline:before{content:""}.ion-ios-search:before{content:""}.ion-ios-search-strong:before{content:""}.ion-ios-settings:before{content:""}.ion-ios-settings-strong:before{content:""}.ion-ios-shuffle:before{content:""}.ion-ios-shuffle-strong:before{content:""}.ion-ios-skipbackward:before{content:""}.ion-ios-skipbackward-outline:before{content:""}.ion-ios-skipforward:before{content:""}.ion-ios-skipforward-outline:before{content:""}.ion-ios-snowy:before{content:""}.ion-ios-speedometer:before{content:""}.ion-ios-speedometer-outline:before{content:""}.ion-ios-star:before{content:""}.ion-ios-star-half:before{content:""}.ion-ios-star-outline:before{content:""}.ion-ios-stopwatch:before{content:""}.ion-ios-stopwatch-outline:before{content:""}.ion-ios-sunny:before{content:""}.ion-ios-sunny-outline:before{content:""}.ion-ios-telephone:before{content:""}.ion-ios-telephone-outline:before{content:""}.ion-ios-tennisball:before{content:""}.ion-ios-tennisball-outline:before{content:""}.ion-ios-thunderstorm:before{content:""}.ion-ios-thunderstorm-outline:before{content:""}.ion-ios-time:before{content:""}.ion-ios-time-outline:before{content:""}.ion-ios-timer:before{content:""}.ion-ios-timer-outline:before{content:""}.ion-ios-toggle:before{content:""}.ion-ios-toggle-outline:before{content:""}.ion-ios-trash:before{content:""}.ion-ios-trash-outline:before{content:""}.ion-ios-undo:before{content:""}.ion-ios-undo-outline:before{content:""}.ion-ios-unlocked:before{content:""}.ion-ios-unlocked-outline:before{content:""}.ion-ios-upload:before{content:""}.ion-ios-upload-outline:before{content:""}.ion-ios-videocam:before{content:""}.ion-ios-videocam-outline:before{content:""}.ion-ios-volume-high:before{content:""}.ion-ios-volume-low:before{content:""}.ion-ios-wineglass:before{content:""}.ion-ios-wineglass-outline:before{content:""}.ion-ios-world:before{content:""}.ion-ios-world-outline:before{content:""}.ion-ipad:before{content:""}.ion-iphone:before{content:""}.ion-ipod:before{content:""}.ion-jet:before{content:""}.ion-key:before{content:""}.ion-knife:before{content:""}.ion-laptop:before{content:""}.ion-leaf:before{content:""}.ion-levels:before{content:""}.ion-lightbulb:before{content:""}.ion-link:before{content:""}.ion-load-a:before{content:""}.ion-load-b:before{content:""}.ion-load-c:before{content:""}.ion-load-d:before{content:""}.ion-location:before{content:""}.ion-lock-combination:before{content:""}.ion-locked:before{content:""}.ion-log-in:before{content:""}.ion-log-out:before{content:""}.ion-loop:before{content:""}.ion-magnet:before{content:""}.ion-male:before{content:""}.ion-man:before{content:""}.ion-map:before{content:""}.ion-medkit:before{content:""}.ion-merge:before{content:""}.ion-mic-a:before{content:""}.ion-mic-b:before{content:""}.ion-mic-c:before{content:""}.ion-minus:before{content:""}.ion-minus-circled:before{content:""}.ion-minus-round:before{content:""}.ion-model-s:before{content:""}.ion-monitor:before{content:""}.ion-more:before{content:""}.ion-mouse:before{content:""}.ion-music-note:before{content:""}.ion-navicon:before{content:""}.ion-navicon-round:before{content:""}.ion-navigate:before{content:""}.ion-network:before{content:""}.ion-no-smoking:before{content:""}.ion-nuclear:before{content:""}.ion-outlet:before{content:""}.ion-paintbrush:before{content:""}.ion-paintbucket:before{content:""}.ion-paper-airplane:before{content:""}.ion-paperclip:before{content:""}.ion-pause:before{content:""}.ion-person:before{content:""}.ion-person-add:before{content:""}.ion-person-stalker:before{content:""}.ion-pie-graph:before{content:""}.ion-pin:before{content:""}.ion-pinpoint:before{content:""}.ion-pizza:before{content:""}.ion-plane:before{content:""}.ion-planet:before{content:""}.ion-play:before{content:""}.ion-playstation:before{content:""}.ion-plus:before{content:""}.ion-plus-circled:before{content:""}.ion-plus-round:before{content:""}.ion-podium:before{content:""}.ion-pound:before{content:""}.ion-power:before{content:""}.ion-pricetag:before{content:""}.ion-pricetags:before{content:""}.ion-printer:before{content:""}.ion-pull-request:before{content:""}.ion-qr-scanner:before{content:""}.ion-quote:before{content:""}.ion-radio-waves:before{content:""}.ion-record:before{content:""}.ion-refresh:before{content:""}.ion-reply:before{content:""}.ion-reply-all:before{content:""}.ion-ribbon-a:before{content:""}.ion-ribbon-b:before{content:""}.ion-sad:before{content:""}.ion-sad-outline:before{content:""}.ion-scissors:before{content:""}.ion-search:before{content:""}.ion-settings:before{content:""}.ion-share:before{content:""}.ion-shuffle:before{content:""}.ion-skip-backward:before{content:""}.ion-skip-forward:before{content:""}.ion-social-android:before{content:""}.ion-social-android-outline:before{content:""}.ion-social-angular:before{content:""}.ion-social-angular-outline:before{content:""}.ion-social-apple:before{content:""}.ion-social-apple-outline:before{content:""}.ion-social-bitcoin:before{content:""}.ion-social-bitcoin-outline:before{content:""}.ion-social-buffer:before{content:""}.ion-social-buffer-outline:before{content:""}.ion-social-chrome:before{content:""}.ion-social-chrome-outline:before{content:""}.ion-social-codepen:before{content:""}.ion-social-codepen-outline:before{content:""}.ion-social-css3:before{content:""}.ion-social-css3-outline:before{content:""}.ion-social-designernews:before{content:""}.ion-social-designernews-outline:before{content:""}.ion-social-dribbble:before{content:""}.ion-social-dribbble-outline:before{content:""}.ion-social-dropbox:before{content:""}.ion-social-dropbox-outline:before{content:""}.ion-social-euro:before{content:""}.ion-social-euro-outline:before{content:""}.ion-social-facebook:before{content:""}.ion-social-facebook-outline:before{content:""}.ion-social-foursquare:before{content:""}.ion-social-foursquare-outline:before{content:""}.ion-social-freebsd-devil:before{content:""}.ion-social-github:before{content:""}.ion-social-github-outline:before{content:""}.ion-social-google:before{content:""}.ion-social-google-outline:before{content:""}.ion-social-googleplus:before{content:""}.ion-social-googleplus-outline:before{content:""}.ion-social-hackernews:before{content:""}.ion-social-hackernews-outline:before{content:""}.ion-social-html5:before{content:""}.ion-social-html5-outline:before{content:""}.ion-social-instagram:before{content:""}.ion-social-instagram-outline:before{content:""}.ion-social-javascript:before{content:""}.ion-social-javascript-outline:before{content:""}.ion-social-linkedin:before{content:""}.ion-social-linkedin-outline:before{content:""}.ion-social-markdown:before{content:""}.ion-social-nodejs:before{content:""}.ion-social-octocat:before{content:""}.ion-social-pinterest:before{content:""}.ion-social-pinterest-outline:before{content:""}.ion-social-python:before{content:""}.ion-social-reddit:before{content:""}.ion-social-reddit-outline:before{content:""}.ion-social-rss:before{content:""}.ion-social-rss-outline:before{content:""}.ion-social-sass:before{content:""}.ion-social-skype:before{content:""}.ion-social-skype-outline:before{content:""}.ion-social-snapchat:before{content:""}.ion-social-snapchat-outline:before{content:""}.ion-social-tumblr:before{content:""}.ion-social-tumblr-outline:before{content:""}.ion-social-tux:before{content:""}.ion-social-twitch:before{content:""}.ion-social-twitch-outline:before{content:""}.ion-social-twitter:before{content:""}.ion-social-twitter-outline:before{content:""}.ion-social-usd:before{content:""}.ion-social-usd-outline:before{content:""}.ion-social-vimeo:before{content:""}.ion-social-vimeo-outline:before{content:""}.ion-social-whatsapp:before{content:""}.ion-social-whatsapp-outline:before{content:""}.ion-social-windows:before{content:""}.ion-social-windows-outline:before{content:""}.ion-social-wordpress:before{content:""}.ion-social-wordpress-outline:before{content:""}.ion-social-yahoo:before{content:""}.ion-social-yahoo-outline:before{content:""}.ion-social-yen:before{content:""}.ion-social-yen-outline:before{content:""}.ion-social-youtube:before{content:""}.ion-social-youtube-outline:before{content:""}.ion-soup-can:before{content:""}.ion-soup-can-outline:before{content:""}.ion-speakerphone:before{content:""}.ion-speedometer:before{content:""}.ion-spoon:before{content:""}.ion-star:before{content:""}.ion-stats-bars:before{content:""}.ion-steam:before{content:""}.ion-stop:before{content:""}.ion-thermometer:before{content:""}.ion-thumbsdown:before{content:""}.ion-thumbsup:before{content:""}.ion-toggle:before{content:""}.ion-toggle-filled:before{content:""}.ion-transgender:before{content:""}.ion-trash-a:before{content:""}.ion-trash-b:before{content:""}.ion-trophy:before{content:""}.ion-tshirt:before{content:""}.ion-tshirt-outline:before{content:""}.ion-umbrella:before{content:""}.ion-university:before{content:""}.ion-unlocked:before{content:""}.ion-upload:before{content:""}.ion-usb:before{content:""}.ion-videocamera:before{content:""}.ion-volume-high:before{content:""}.ion-volume-low:before{content:""}.ion-volume-medium:before{content:""}.ion-volume-mute:before{content:""}.ion-wand:before{content:""}.ion-waterdrop:before{content:""}.ion-wifi:before{content:""}.ion-wineglass:before{content:""}.ion-woman:before{content:""}.ion-wrench:before{content:""}.ion-xbox:before{content:""}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;vertical-align:baseline;font:inherit;font-size:100%}ol,ul{list-style:none}blockquote,q{quotes:none}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none!important}html{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}:focus,a,a:active,a:focus,a:hover,button,button:focus{outline:0}a{-webkit-user-drag:none;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent}a[href]:hover{cursor:pointer}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-size:1em;font-family:monospace,serif}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{position:relative;vertical-align:baseline;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}button,input,select,textarea{margin:0;outline-offset:0;outline-style:none;outline-width:0;-webkit-font-smoothing:inherit;background-image:none}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto}img{-webkit-user-drag:none}table{border-spacing:0;border-collapse:collapse}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{overflow:hidden;-ms-touch-action:pan-y;touch-action:pan-y}.ionic-body,body{-webkit-touch-callout:none;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0;padding:0;color:#000;word-wrap:break-word;font-size:14px;font-family:-apple-system;font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif;line-height:20px;text-rendering:optimizeLegibility;-webkit-backface-visibility:hidden;-webkit-user-drag:none;-ms-content-zooming:none}body.grade-b,body.grade-c{text-rendering:auto}.content{position:relative}.scroll-content{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;margin-top:-1px;padding-top:1px;margin-bottom:-1px;width:auto;height:auto}.menu .scroll-content.scroll-content-false{z-index:11}.scroll-view{position:relative;display:block;overflow:hidden;margin-top:-1px}.scroll-view.overflow-scroll{position:relative}.scroll-view.scroll-x{overflow-x:scroll;overflow-y:hidden}.scroll-view.scroll-y{overflow-x:hidden;overflow-y:scroll}.scroll-view.scroll-xy{overflow-x:scroll;overflow-y:scroll}.scroll{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-transform-origin:left top;transform-origin:left top}@-ms-viewport{width:device-width}.scroll-bar{position:absolute;z-index:9999}.ng-animate .scroll-bar{visibility:hidden}.scroll-bar-h{right:2px;bottom:3px;left:2px;height:3px}.scroll-bar-h .scroll-bar-indicator{height:100%}.scroll-bar-v{top:2px;right:3px;bottom:2px;width:3px}.scroll-bar-v .scroll-bar-indicator{width:100%}.scroll-bar-indicator{position:absolute;border-radius:4px;background:rgba(0,0,0,.3);opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.scroll-bar-indicator.scroll-bar-fade-out{opacity:0}.platform-android .scroll-bar-indicator{border-radius:0}.grade-b .scroll-bar-indicator,.grade-c .scroll-bar-indicator{background:#aaa}.grade-b .scroll-bar-indicator.scroll-bar-fade-out,.grade-c .scroll-bar-indicator.scroll-bar-fade-out{-webkit-transition:none;transition:none}ion-infinite-scroll{height:60px;width:100%;display:block;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}ion-infinite-scroll .icon{font-size:30px;color:#666}ion-infinite-scroll:not(.active) .icon:before,ion-infinite-scroll:not(.active) .spinner{display:none}.overflow-scroll{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;top:0;right:0;bottom:0;left:0;position:absolute}.overflow-scroll.pane{overflow-x:hidden;overflow-y:scroll}.overflow-scroll .scroll{position:static;height:100%;-webkit-transform:translate3d(0,0,0)}.overflow-scroll.keyboard-up:not(.keyboard-up-confirm){overflow:hidden}.has-header{top:44px}.no-header{top:0}.has-subheader{top:88px}.has-tabs-top{top:93px}.has-header.has-subheader.has-tabs-top{top:137px}.has-footer{bottom:44px}.has-subfooter{bottom:88px}.bar-footer.has-tabs,.has-tabs{bottom:49px}.bar-footer.has-tabs.pane,.has-tabs.pane{bottom:49px;height:auto}.bar-subfooter.has-tabs,.has-footer.has-tabs{bottom:93px}.pane{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:0;transition-duration:0;z-index:1}.view{z-index:1}.pane,.view{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background-color:#fff;overflow:hidden}.view-container{position:absolute;display:block;width:100%;height:100%}p{margin:0 0 10px}small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:#000;font-weight:500;font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif;line-height:1.2}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1:first-child,.h2:first-child,.h3:first-child,h1:first-child,h2:first-child,h3:first-child{margin-top:0}.h1+.h1,.h1+.h2,.h1+.h3,.h1+h1,.h1+h2,.h1+h3,.h2+.h1,.h2+.h2,.h2+.h3,.h2+h1,.h2+h2,.h2+h3,.h3+.h1,.h3+.h2,.h3+.h3,.h3+h1,.h3+h2,.h3+h3,h1+.h1,h1+.h2,h1+.h3,h1+h1,h1+h2,h1+h3,h2+.h1,h2+.h2,h2+.h3,h2+h1,h2+h2,h2+h3,h3+.h1,h3+.h2,h3+.h3,h3+h1,h3+h2,h3+h3{margin-top:10px}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}dl{margin-bottom:20px}dd,dt{line-height:1.42857}dt{font-weight:700}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid gray}blockquote p{font-weight:300;font-size:17.5px;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.42857}blockquote small:before{content:'\2014 \00A0'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.42857}a{color:#387ef5}a.subdued{padding-right:10px;color:#888;text-decoration:none}a.subdued:hover{text-decoration:none}a.subdued:last-child{padding-right:0}.action-sheet-backdrop{-webkit-transition:background-color 150ms ease-in-out;transition:background-color 150ms ease-in-out;position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:transparent}.action-sheet-backdrop.active{background-color:rgba(0,0,0,.4)}.action-sheet-wrapper{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:all cubic-bezier(.36,.66,.04,1) 500ms;transition:all cubic-bezier(.36,.66,.04,1) 500ms;position:absolute;bottom:0;left:0;right:0;width:100%;max-width:500px;margin:auto}.action-sheet-up{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.action-sheet{margin-left:8px;margin-right:8px;width:auto;z-index:11;overflow:hidden}.action-sheet .button{display:block;padding:1px;width:100%;border-radius:0;border-color:#d1d3d6;background-color:transparent;color:#007aff;font-size:21px}.action-sheet .button:hover{color:#007aff}.action-sheet .button.destructive,.action-sheet .button.destructive:hover{color:#ff3b30}.action-sheet .button.activated,.action-sheet .button.active{box-shadow:none;border-color:#d1d3d6;color:#007aff;background:#e4e5e7}.action-sheet-has-icons .icon{position:absolute;left:16px}.action-sheet-title{padding:16px;color:#8f8f8f;text-align:center;font-size:13px}.action-sheet-group{margin-bottom:8px;border-radius:4px;background-color:#fff;overflow:hidden}.action-sheet-group .button{border-width:1px 0 0 0}.action-sheet-group .button:first-child:last-child{border-width:0}.action-sheet-options{background:#f1f2f3}.action-sheet-cancel .button{font-weight:500}.action-sheet-open,.action-sheet-open.modal-open .modal{pointer-events:none}.action-sheet-open .action-sheet-backdrop{pointer-events:auto}.platform-android .action-sheet-backdrop.active{background-color:rgba(0,0,0,.2)}.platform-android .action-sheet{margin:0}.platform-android .action-sheet .action-sheet-title,.platform-android .action-sheet .button{text-align:left;border-color:transparent;font-size:16px;color:inherit}.platform-android .action-sheet .action-sheet-title{font-size:14px;padding:16px;color:#666}.platform-android .action-sheet .button.activated,.platform-android .action-sheet .button.active{background:#e8e8e8}.platform-android .action-sheet-group{margin:0;border-radius:0;background-color:#fafafa}.platform-android .action-sheet-cancel{display:none}.platform-android .action-sheet-has-icons .button{padding-left:56px}.backdrop{position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:rgba(0,0,0,.4);visibility:hidden;opacity:0;-webkit-transition:.1s opacity linear;transition:.1s opacity linear}.backdrop.visible{visibility:visible}.backdrop.active{opacity:1}.bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;right:0;left:0;z-index:9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:5px;width:100%;height:44px;border-width:0;border-style:solid;border-top:1px solid transparent;border-bottom:1px solid #ddd;background-color:#fff;background-size:0}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.bar{border:none;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);background-position:bottom;background-size:100% 1px;background-repeat:no-repeat}}.bar.bar-clear{border:none;background:0 0;color:#fff}.bar.bar-clear .button,.bar.bar-clear .title{color:#fff}.bar.item-input-inset .item-input-wrapper{margin-top:-1px}.bar.item-input-inset .item-input-wrapper input{padding-left:8px;width:94%;height:28px;background:0 0}.bar.bar-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.bar.bar-light .title{color:#444}.bar.bar-light.bar-footer{background-image:linear-gradient(180deg,#ddd,#ddd 50%,transparent 50%)}.bar.bar-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.bar.bar-stable .title{color:#444}.bar.bar-stable.bar-footer{background-image:linear-gradient(180deg,#b2b2b2,#b2b2b2 50%,transparent 50%)}.bar.bar-positive{border-color:#0c60ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);color:#fff}.bar.bar-positive .title{color:#fff}.bar.bar-positive.bar-footer{background-image:linear-gradient(180deg,#0c60ee,#0c60ee 50%,transparent 50%)}.bar.bar-calm{border-color:#0a9dc7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);color:#fff}.bar.bar-calm .title{color:#fff}.bar.bar-calm.bar-footer{background-image:linear-gradient(180deg,#0a9dc7,#0a9dc7 50%,transparent 50%)}.bar.bar-assertive{border-color:#e42112;background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);color:#fff}.bar.bar-assertive .title{color:#fff}.bar.bar-assertive.bar-footer{background-image:linear-gradient(180deg,#e42112,#e42112 50%,transparent 50%)}.bar.bar-balanced{border-color:#28a54c;background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);color:#fff}.bar.bar-balanced .title{color:#fff}.bar.bar-balanced.bar-footer{background-image:linear-gradient(180deg,#28a54c,#0c60ee 50%,transparent 50%)}.bar.bar-energized{border-color:#e6b500;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);color:#fff}.bar.bar-energized .title{color:#fff}.bar.bar-energized.bar-footer{background-image:linear-gradient(180deg,#e6b500,#e6b500 50%,transparent 50%)}.bar.bar-royal{border-color:#6b46e5;background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);color:#fff}.bar.bar-royal .title{color:#fff}.bar.bar-royal.bar-footer{background-image:linear-gradient(180deg,#6b46e5,#6b46e5 50%,transparent 50%)}.bar.bar-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.bar.bar-dark .title{color:#fff}.bar.bar-dark.bar-footer{background-image:linear-gradient(180deg,#111,#111 50%,transparent 50%)}.bar .title{display:block;position:absolute;top:0;right:0;left:0;z-index:0;overflow:hidden;margin:0 10px;min-width:30px;height:43px;text-align:center;text-overflow:ellipsis;white-space:nowrap;font-size:17px;font-weight:500;line-height:44px}.bar .title.title-left{text-align:left}.bar .title.title-right{text-align:right}.bar .title a{color:inherit}.bar .button,.bar button{z-index:1;padding:0 8px;min-width:initial;min-height:31px;font-weight:400;font-size:13px;line-height:32px}.bar .button .icon:before,.bar .button.button-icon:before,.bar .button.icon-left:before,.bar .button.icon-right:before,.bar .button.icon:before,.bar button .icon:before,.bar button.button-icon:before,.bar button.icon-left:before,.bar button.icon-right:before,.bar button.icon:before{padding-right:2px;padding-left:2px;font-size:20px;line-height:32px}.bar .button.button-icon,.bar button.button-icon{font-size:17px}.bar .button.button-icon .icon:before,.bar .button.button-icon.icon-left:before,.bar .button.button-icon.icon-right:before,.bar .button.button-icon:before,.bar button.button-icon .icon:before,.bar button.button-icon.icon-left:before,.bar button.button-icon.icon-right:before,.bar button.button-icon:before{vertical-align:top;font-size:32px;line-height:32px}.bar .button.button-clear,.bar button.button-clear{padding-right:2px;padding-left:2px;font-weight:300;font-size:17px}.bar .button.button-clear .icon:before,.bar .button.button-clear.icon-left:before,.bar .button.button-clear.icon-right:before,.bar .button.button-clear.icon:before,.bar button.button-clear .icon:before,.bar button.button-clear.icon-left:before,.bar button.button-clear.icon-right:before,.bar button.button-clear.icon:before{font-size:32px;line-height:32px}.bar .button.back-button,.bar button.back-button{display:block;margin-right:5px;padding:0;white-space:nowrap;font-weight:400}.bar .button.back-button.activated,.bar .button.back-button.active,.bar button.back-button.activated,.bar button.back-button.active{opacity:.2}.bar .button-bar>.button,.bar .buttons>.button{min-height:31px;line-height:32px}.bar .button+.button-bar,.bar .button-bar+.button{margin-left:5px}.bar .buttons,.bar .buttons.primary-buttons,.bar .buttons.secondary-buttons{display:inherit}.bar .buttons span{display:inline-block}.bar .buttons-left span{margin-right:5px;display:inherit}.bar .buttons-right span{margin-left:5px;display:inherit}.bar .buttons.pull-right,.bar .title+.button:last-child,.bar .title+.buttons,.bar>.button+.button:last-child,.bar>.button.pull-right{position:absolute;top:5px;right:5px;bottom:5px}.platform-android .nav-bar-has-subheader .bar{background-image:none}.platform-android .bar .back-button .icon:before{font-size:24px}.platform-android .bar .title{font-size:19px;line-height:44px}.bar-light .button{border-color:transparent;background-color:#fff;color:#444}.bar-light .button:hover{color:#444;text-decoration:none}.bar-light .button.activated,.bar-light .button.active{background-color:#fafafa}.bar-light .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-light .button.button-icon{border-color:transparent;background:0 0}.bar-stable .button{border-color:transparent;background-color:#f8f8f8;color:#444}.bar-stable .button:hover{color:#444;text-decoration:none}.bar-stable .button.activated,.bar-stable .button.active{background-color:#e5e5e5}.bar-stable .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-stable .button.button-icon{border-color:transparent;background:0 0}.bar-positive .button{border-color:transparent;background-color:#387ef5;color:#fff}.bar-positive .button:hover{color:#fff;text-decoration:none}.bar-positive .button.activated,.bar-positive .button.active{background-color:#0c60ee}.bar-positive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-positive .button.button-icon{border-color:transparent;background:0 0}.bar-calm .button{border-color:transparent;background-color:#11c1f3;color:#fff}.bar-calm .button:hover{color:#fff;text-decoration:none}.bar-calm .button.activated,.bar-calm .button.active{background-color:#0a9dc7}.bar-calm .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-calm .button.button-icon{border-color:transparent;background:0 0}.bar-assertive .button{border-color:transparent;background-color:#ef473a;color:#fff}.bar-assertive .button:hover{color:#fff;text-decoration:none}.bar-assertive .button.activated,.bar-assertive .button.active{background-color:#e42112}.bar-assertive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-assertive .button.button-icon{border-color:transparent;background:0 0}.bar-balanced .button{border-color:transparent;background-color:#33cd5f;color:#fff}.bar-balanced .button:hover{color:#fff;text-decoration:none}.bar-balanced .button.activated,.bar-balanced .button.active{background-color:#28a54c}.bar-balanced .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-balanced .button.button-icon{border-color:transparent;background:0 0}.bar-energized .button{border-color:transparent;background-color:#ffc900;color:#fff}.bar-energized .button:hover{color:#fff;text-decoration:none}.bar-energized .button.activated,.bar-energized .button.active{background-color:#e6b500}.bar-energized .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-energized .button.button-icon{border-color:transparent;background:0 0}.bar-royal .button{border-color:transparent;background-color:#886aea;color:#fff}.bar-royal .button:hover{color:#fff;text-decoration:none}.bar-royal .button.activated,.bar-royal .button.active{background-color:#6b46e5}.bar-royal .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-royal .button.button-icon{border-color:transparent;background:0 0}.bar-dark .button{border-color:transparent;background-color:#444;color:#fff}.bar-dark .button:hover{color:#fff;text-decoration:none}.bar-dark .button.activated,.bar-dark .button.active{background-color:#262626}.bar-dark .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-dark .button.button-icon{border-color:transparent;background:0 0}.bar-header{top:0;border-top-width:0;border-bottom-width:1px}.bar-header.has-tabs-top,.tabs-top .bar-header{border-bottom-width:0;background-image:none}.bar-footer{bottom:0;border-top-width:1px;border-bottom-width:0;background-position:top;height:44px}.bar-footer.item-input-inset{position:absolute}.bar-tabs{padding:0}.bar-subheader{top:44px;display:block;height:44px}.bar-subfooter{bottom:44px;display:block;height:44px}.nav-bar-block{position:absolute;top:0;right:0;left:0;z-index:9}.bar .back-button.hide,.bar .buttons .hide{display:none}.nav-bar-tabs-top .bar{background-image:none}.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:horizontal;-moz-flex-direction:horizontal;-ms-flex-direction:horizontal;flex-direction:horizontal;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444;position:absolute;bottom:0;z-index:5;width:100%;height:49px;border-style:solid;border-top-width:1px;background-size:0;line-height:49px}.tabs .tab-item .badge{background-color:#444;color:#f8f8f8}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.tabs{padding-top:2px;border-top:none!important;border-bottom:none;background-position:top;background-size:100% 1px;background-repeat:no-repeat}}.tabs-light>.tabs,.tabs.tabs-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.tabs-light>.tabs .tab-item .badge,.tabs.tabs-light .tab-item .badge{background-color:#444;color:#fff}.tabs-stable>.tabs,.tabs.tabs-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.tabs-stable>.tabs .tab-item .badge,.tabs.tabs-stable .tab-item .badge{background-color:#444;color:#f8f8f8}.tabs-positive>.tabs,.tabs.tabs-positive{border-color:#0c60ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);color:#fff}.tabs-positive>.tabs .tab-item .badge,.tabs.tabs-positive .tab-item .badge{background-color:#fff;color:#387ef5}.tabs-calm>.tabs,.tabs.tabs-calm{border-color:#0a9dc7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);color:#fff}.tabs-calm>.tabs .tab-item .badge,.tabs.tabs-calm .tab-item .badge{background-color:#fff;color:#11c1f3}.tabs-assertive>.tabs,.tabs.tabs-assertive{border-color:#e42112;background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);color:#fff}.tabs-assertive>.tabs .tab-item .badge,.tabs.tabs-assertive .tab-item .badge{background-color:#fff;color:#ef473a}.tabs-balanced>.tabs,.tabs.tabs-balanced{border-color:#28a54c;background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);color:#fff}.tabs-balanced>.tabs .tab-item .badge,.tabs.tabs-balanced .tab-item .badge{background-color:#fff;color:#33cd5f}.tabs-energized>.tabs,.tabs.tabs-energized{border-color:#e6b500;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);color:#fff}.tabs-energized>.tabs .tab-item .badge,.tabs.tabs-energized .tab-item .badge{background-color:#fff;color:#ffc900}.tabs-royal>.tabs,.tabs.tabs-royal{border-color:#6b46e5;background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);color:#fff}.tabs-royal>.tabs .tab-item .badge,.tabs.tabs-royal .tab-item .badge{background-color:#fff;color:#886aea}.tabs-dark>.tabs,.tabs.tabs-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.tabs-dark>.tabs .tab-item .badge,.tabs.tabs-dark .tab-item .badge{background-color:#fff;color:#444}.tabs-striped .tabs{background-color:#fff;background-image:none;border:none;border-bottom:1px solid #ddd;padding-top:2px}.tabs-striped .tab-item.activated,.tabs-striped .tab-item.active,.tabs-striped .tab-item.tab-item-active{margin-top:-2px;border-style:solid;border-width:2px 0 0 0;border-color:#444}.tabs-striped .tab-item.activated .badge,.tabs-striped .tab-item.active .badge,.tabs-striped .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-light .tabs{background-color:#fff}.tabs-striped.tabs-light .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-light .tab-item.activated,.tabs-striped.tabs-light .tab-item.active,.tabs-striped.tabs-light .tab-item.tab-item-active{margin-top:-2px;color:#444;border-style:solid;border-width:2px 0 0 0;border-color:#444}.tabs-striped.tabs-stable .tabs{background-color:#f8f8f8}.tabs-striped.tabs-stable .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-stable .tab-item.activated,.tabs-striped.tabs-stable .tab-item.active,.tabs-striped.tabs-stable .tab-item.tab-item-active{margin-top:-2px;color:#444;border-style:solid;border-width:2px 0 0 0;border-color:#444}.tabs-striped.tabs-positive .tabs{background-color:#387ef5}.tabs-striped.tabs-positive .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-positive .tab-item.activated,.tabs-striped.tabs-positive .tab-item.active,.tabs-striped.tabs-positive .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-calm .tabs{background-color:#11c1f3}.tabs-striped.tabs-calm .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-calm .tab-item.activated,.tabs-striped.tabs-calm .tab-item.active,.tabs-striped.tabs-calm .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-assertive .tabs{background-color:#ef473a}.tabs-striped.tabs-assertive .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-assertive .tab-item.activated,.tabs-striped.tabs-assertive .tab-item.active,.tabs-striped.tabs-assertive .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-balanced .tabs{background-color:#33cd5f}.tabs-striped.tabs-balanced .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-balanced .tab-item.activated,.tabs-striped.tabs-balanced .tab-item.active,.tabs-striped.tabs-balanced .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-energized .tabs{background-color:#ffc900}.tabs-striped.tabs-energized .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-energized .tab-item.activated,.tabs-striped.tabs-energized .tab-item.active,.tabs-striped.tabs-energized .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-royal .tabs{background-color:#886aea}.tabs-striped.tabs-royal .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-royal .tab-item.activated,.tabs-striped.tabs-royal .tab-item.active,.tabs-striped.tabs-royal .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-dark .tabs{background-color:#444}.tabs-striped.tabs-dark .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-dark .tab-item.activated,.tabs-striped.tabs-dark .tab-item.active,.tabs-striped.tabs-dark .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-background-light .tabs{background-color:#fff;background-image:none}.tabs-striped.tabs-background-stable .tabs{background-color:#f8f8f8;background-image:none}.tabs-striped.tabs-background-positive .tabs{background-color:#387ef5;background-image:none}.tabs-striped.tabs-background-calm .tabs{background-color:#11c1f3;background-image:none}.tabs-striped.tabs-background-assertive .tabs{background-color:#ef473a;background-image:none}.tabs-striped.tabs-background-balanced .tabs{background-color:#33cd5f;background-image:none}.tabs-striped.tabs-background-energized .tabs{background-color:#ffc900;background-image:none}.tabs-striped.tabs-background-royal .tabs{background-color:#886aea;background-image:none}.tabs-striped.tabs-background-dark .tabs{background-color:#444;background-image:none}.tabs-striped.tabs-color-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-color-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-light .tab-item.activated,.tabs-striped.tabs-color-light .tab-item.active,.tabs-striped.tabs-color-light .tab-item.tab-item-active{margin-top:-2px;color:#fff;border:0 solid #fff;border-top-width:2px}.tabs-striped.tabs-color-light .tab-item.activated .badge,.tabs-striped.tabs-color-light .tab-item.active .badge,.tabs-striped.tabs-color-light .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-striped.tabs-color-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-stable .tab-item.activated,.tabs-striped.tabs-color-stable .tab-item.active,.tabs-striped.tabs-color-stable .tab-item.tab-item-active{margin-top:-2px;color:#f8f8f8;border:0 solid #f8f8f8;border-top-width:2px}.tabs-striped.tabs-color-stable .tab-item.activated .badge,.tabs-striped.tabs-color-stable .tab-item.active .badge,.tabs-striped.tabs-color-stable .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-positive .tab-item{color:rgba(56,126,245,.4);opacity:1}.tabs-striped.tabs-color-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-positive .tab-item.activated,.tabs-striped.tabs-color-positive .tab-item.active,.tabs-striped.tabs-color-positive .tab-item.tab-item-active{margin-top:-2px;color:#387ef5;border:0 solid #387ef5;border-top-width:2px}.tabs-striped.tabs-color-positive .tab-item.activated .badge,.tabs-striped.tabs-color-positive .tab-item.active .badge,.tabs-striped.tabs-color-positive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-calm .tab-item{color:rgba(17,193,243,.4);opacity:1}.tabs-striped.tabs-color-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-calm .tab-item.activated,.tabs-striped.tabs-color-calm .tab-item.active,.tabs-striped.tabs-color-calm .tab-item.tab-item-active{margin-top:-2px;color:#11c1f3;border:0 solid #11c1f3;border-top-width:2px}.tabs-striped.tabs-color-calm .tab-item.activated .badge,.tabs-striped.tabs-color-calm .tab-item.active .badge,.tabs-striped.tabs-color-calm .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-assertive .tab-item{color:rgba(239,71,58,.4);opacity:1}.tabs-striped.tabs-color-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-assertive .tab-item.activated,.tabs-striped.tabs-color-assertive .tab-item.active,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active{margin-top:-2px;color:#ef473a;border:0 solid #ef473a;border-top-width:2px}.tabs-striped.tabs-color-assertive .tab-item.activated .badge,.tabs-striped.tabs-color-assertive .tab-item.active .badge,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-balanced .tab-item{color:rgba(51,205,95,.4);opacity:1}.tabs-striped.tabs-color-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-balanced .tab-item.activated,.tabs-striped.tabs-color-balanced .tab-item.active,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active{margin-top:-2px;color:#33cd5f;border:0 solid #33cd5f;border-top-width:2px}.tabs-striped.tabs-color-balanced .tab-item.activated .badge,.tabs-striped.tabs-color-balanced .tab-item.active .badge,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-energized .tab-item{color:rgba(255,201,0,.4);opacity:1}.tabs-striped.tabs-color-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-energized .tab-item.activated,.tabs-striped.tabs-color-energized .tab-item.active,.tabs-striped.tabs-color-energized .tab-item.tab-item-active{margin-top:-2px;color:#ffc900;border:0 solid #ffc900;border-top-width:2px}.tabs-striped.tabs-color-energized .tab-item.activated .badge,.tabs-striped.tabs-color-energized .tab-item.active .badge,.tabs-striped.tabs-color-energized .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-royal .tab-item{color:rgba(136,106,234,.4);opacity:1}.tabs-striped.tabs-color-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-royal .tab-item.activated,.tabs-striped.tabs-color-royal .tab-item.active,.tabs-striped.tabs-color-royal .tab-item.tab-item-active{margin-top:-2px;color:#886aea;border:0 solid #886aea;border-top-width:2px}.tabs-striped.tabs-color-royal .tab-item.activated .badge,.tabs-striped.tabs-color-royal .tab-item.active .badge,.tabs-striped.tabs-color-royal .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-color-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-dark .tab-item.activated,.tabs-striped.tabs-color-dark .tab-item.active,.tabs-striped.tabs-color-dark .tab-item.tab-item-active{margin-top:-2px;color:#444;border:0 solid #444;border-top-width:2px}.tabs-striped.tabs-color-dark .tab-item.activated .badge,.tabs-striped.tabs-color-dark .tab-item.active .badge,.tabs-striped.tabs-color-dark .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-background-light .tabs,.tabs-background-light>.tabs{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);border-color:#ddd}.tabs-background-stable .tabs,.tabs-background-stable>.tabs{background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);border-color:#b2b2b2}.tabs-background-positive .tabs,.tabs-background-positive>.tabs{background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);border-color:#0c60ee}.tabs-background-calm .tabs,.tabs-background-calm>.tabs{background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);border-color:#0a9dc7}.tabs-background-assertive .tabs,.tabs-background-assertive>.tabs{background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);border-color:#e42112}.tabs-background-balanced .tabs,.tabs-background-balanced>.tabs{background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);border-color:#28a54c}.tabs-background-energized .tabs,.tabs-background-energized>.tabs{background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);border-color:#e6b500}.tabs-background-royal .tabs,.tabs-background-royal>.tabs{background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);border-color:#6b46e5}.tabs-background-dark .tabs,.tabs-background-dark>.tabs{background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);border-color:#111}.tabs-color-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-color-light .tab-item .badge{opacity:.4}.tabs-color-light .tab-item.activated,.tabs-color-light .tab-item.active,.tabs-color-light .tab-item.tab-item-active{color:#fff;border:0 solid #fff}.tabs-color-light .tab-item.activated .badge,.tabs-color-light .tab-item.active .badge,.tabs-color-light .tab-item.tab-item-active .badge{opacity:1}.tabs-color-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-color-stable .tab-item .badge{opacity:.4}.tabs-color-stable .tab-item.activated,.tabs-color-stable .tab-item.active,.tabs-color-stable .tab-item.tab-item-active{color:#f8f8f8;border:0 solid #f8f8f8}.tabs-color-stable .tab-item.activated .badge,.tabs-color-stable .tab-item.active .badge,.tabs-color-stable .tab-item.tab-item-active .badge{opacity:1}.tabs-color-positive .tab-item{color:rgba(56,126,245,.4);opacity:1}.tabs-color-positive .tab-item .badge{opacity:.4}.tabs-color-positive .tab-item.activated,.tabs-color-positive .tab-item.active,.tabs-color-positive .tab-item.tab-item-active{color:#387ef5;border:0 solid #387ef5}.tabs-color-positive .tab-item.activated .badge,.tabs-color-positive .tab-item.active .badge,.tabs-color-positive .tab-item.tab-item-active .badge{opacity:1}.tabs-color-calm .tab-item{color:rgba(17,193,243,.4);opacity:1}.tabs-color-calm .tab-item .badge{opacity:.4}.tabs-color-calm .tab-item.activated,.tabs-color-calm .tab-item.active,.tabs-color-calm .tab-item.tab-item-active{color:#11c1f3;border:0 solid #11c1f3}.tabs-color-calm .tab-item.activated .badge,.tabs-color-calm .tab-item.active .badge,.tabs-color-calm .tab-item.tab-item-active .badge{opacity:1}.tabs-color-assertive .tab-item{color:rgba(239,71,58,.4);opacity:1}.tabs-color-assertive .tab-item .badge{opacity:.4}.tabs-color-assertive .tab-item.activated,.tabs-color-assertive .tab-item.active,.tabs-color-assertive .tab-item.tab-item-active{color:#ef473a;border:0 solid #ef473a}.tabs-color-assertive .tab-item.activated .badge,.tabs-color-assertive .tab-item.active .badge,.tabs-color-assertive .tab-item.tab-item-active .badge{opacity:1}.tabs-color-balanced .tab-item{color:rgba(51,205,95,.4);opacity:1}.tabs-color-balanced .tab-item .badge{opacity:.4}.tabs-color-balanced .tab-item.activated,.tabs-color-balanced .tab-item.active,.tabs-color-balanced .tab-item.tab-item-active{color:#33cd5f;border:0 solid #33cd5f}.tabs-color-balanced .tab-item.activated .badge,.tabs-color-balanced .tab-item.active .badge,.tabs-color-balanced .tab-item.tab-item-active .badge{opacity:1}.tabs-color-energized .tab-item{color:rgba(255,201,0,.4);opacity:1}.tabs-color-energized .tab-item .badge{opacity:.4}.tabs-color-energized .tab-item.activated,.tabs-color-energized .tab-item.active,.tabs-color-energized .tab-item.tab-item-active{color:#ffc900;border:0 solid #ffc900}.tabs-color-energized .tab-item.activated .badge,.tabs-color-energized .tab-item.active .badge,.tabs-color-energized .tab-item.tab-item-active .badge{opacity:1}.tabs-color-royal .tab-item{color:rgba(136,106,234,.4);opacity:1}.tabs-color-royal .tab-item .badge{opacity:.4}.tabs-color-royal .tab-item.activated,.tabs-color-royal .tab-item.active,.tabs-color-royal .tab-item.tab-item-active{color:#886aea;border:0 solid #886aea}.tabs-color-royal .tab-item.activated .badge,.tabs-color-royal .tab-item.active .badge,.tabs-color-royal .tab-item.tab-item-active .badge{opacity:1}.tabs-color-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-color-dark .tab-item .badge{opacity:.4}.tabs-color-dark .tab-item.activated,.tabs-color-dark .tab-item.active,.tabs-color-dark .tab-item.tab-item-active{color:#444;border:0 solid #444}.tabs-color-dark .tab-item.activated .badge,.tabs-color-dark .tab-item.active .badge,.tabs-color-dark .tab-item.tab-item-active .badge{opacity:1}ion-tabs.tabs-color-active-light .tab-item{color:#444}ion-tabs.tabs-color-active-light .tab-item.activated,ion-tabs.tabs-color-active-light .tab-item.active,ion-tabs.tabs-color-active-light .tab-item.tab-item-active{color:#fff}ion-tabs.tabs-color-active-stable .tab-item{color:#444}ion-tabs.tabs-color-active-stable .tab-item.activated,ion-tabs.tabs-color-active-stable .tab-item.active,ion-tabs.tabs-color-active-stable .tab-item.tab-item-active{color:#f8f8f8}ion-tabs.tabs-color-active-positive .tab-item{color:#444}ion-tabs.tabs-color-active-positive .tab-item.activated,ion-tabs.tabs-color-active-positive .tab-item.active,ion-tabs.tabs-color-active-positive .tab-item.tab-item-active{color:#387ef5}ion-tabs.tabs-color-active-calm .tab-item{color:#444}ion-tabs.tabs-color-active-calm .tab-item.activated,ion-tabs.tabs-color-active-calm .tab-item.active,ion-tabs.tabs-color-active-calm .tab-item.tab-item-active{color:#11c1f3}ion-tabs.tabs-color-active-assertive .tab-item{color:#444}ion-tabs.tabs-color-active-assertive .tab-item.activated,ion-tabs.tabs-color-active-assertive .tab-item.active,ion-tabs.tabs-color-active-assertive .tab-item.tab-item-active{color:#ef473a}ion-tabs.tabs-color-active-balanced .tab-item{color:#444}ion-tabs.tabs-color-active-balanced .tab-item.activated,ion-tabs.tabs-color-active-balanced .tab-item.active,ion-tabs.tabs-color-active-balanced .tab-item.tab-item-active{color:#33cd5f}ion-tabs.tabs-color-active-energized .tab-item{color:#444}ion-tabs.tabs-color-active-energized .tab-item.activated,ion-tabs.tabs-color-active-energized .tab-item.active,ion-tabs.tabs-color-active-energized .tab-item.tab-item-active{color:#ffc900}ion-tabs.tabs-color-active-royal .tab-item{color:#444}ion-tabs.tabs-color-active-royal .tab-item.activated,ion-tabs.tabs-color-active-royal .tab-item.active,ion-tabs.tabs-color-active-royal .tab-item.tab-item-active{color:#886aea}ion-tabs.tabs-color-active-dark .tab-item{color:#fff}ion-tabs.tabs-color-active-dark .tab-item.activated,ion-tabs.tabs-color-active-dark .tab-item.active,ion-tabs.tabs-color-active-dark .tab-item.tab-item-active{color:#444}.tabs-top.tabs-striped{padding-bottom:0}.tabs-top.tabs-striped .tab-item{background:0 0;-webkit-transition:color .1s ease;-moz-transition:color .1s ease;-ms-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.tabs-top.tabs-striped .tab-item.activated,.tabs-top.tabs-striped .tab-item.active,.tabs-top.tabs-striped .tab-item.tab-item-active{margin-top:1px;border-width:0 0 2px 0!important;border-style:solid}.tabs-top.tabs-striped .tab-item.activated>.badge,.tabs-top.tabs-striped .tab-item.activated>i,.tabs-top.tabs-striped .tab-item.active>.badge,.tabs-top.tabs-striped .tab-item.active>i,.tabs-top.tabs-striped .tab-item.tab-item-active>.badge,.tabs-top.tabs-striped .tab-item.tab-item-active>i{margin-top:-1px}.tabs-top.tabs-striped .tab-item .badge{-webkit-transition:color .2s ease;-moz-transition:color .2s ease;-ms-transition:color .2s ease;-o-transition:color .2s ease;transition:color .2s ease}.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated i,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active i,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active i{display:block;margin-top:-1px}.tabs-top.tabs-striped.tabs-icon-left .tab-item{margin-top:1px}.tabs-top.tabs-striped.tabs-icon-left .tab-item.activated .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.activated i,.tabs-top.tabs-striped.tabs-icon-left .tab-item.active .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.active i,.tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active i{margin-top:-.1em}.tabs-top>.tabs,.tabs.tabs-top{top:44px;padding-top:0;background-position:bottom;border-top-width:0;border-bottom-width:1px}.tabs-top>.tabs .tab-item.activated .badge,.tabs-top>.tabs .tab-item.active .badge,.tabs-top>.tabs .tab-item.tab-item-active .badge,.tabs.tabs-top .tab-item.activated .badge,.tabs.tabs-top .tab-item.active .badge,.tabs.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-top~.bar-header{border-bottom-width:0}.tab-item{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;max-width:150px;height:100%;color:inherit;text-align:center;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;font-weight:400;font-size:14px;font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif;opacity:.7}.tab-item:hover{cursor:pointer}.tab-item.tab-hidden,.tabs-item-hide>.tabs,.tabs.tabs-item-hide{display:none}.tabs-icon-bottom.tabs .tab-item,.tabs-icon-bottom>.tabs .tab-item,.tabs-icon-top.tabs .tab-item,.tabs-icon-top>.tabs .tab-item{font-size:10px;line-height:14px}.tab-item .icon{display:block;margin:0 auto;height:32px;font-size:32px}.tabs-icon-left.tabs .tab-item,.tabs-icon-left>.tabs .tab-item,.tabs-icon-right.tabs .tab-item,.tabs-icon-right>.tabs .tab-item{font-size:10px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left.tabs .tab-item .tab-title,.tabs-icon-left>.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .tab-title,.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right.tabs .tab-item .tab-title,.tabs-icon-right>.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .tab-title{display:inline-block;vertical-align:top;margin-top:-.1em}.tabs-icon-left.tabs .tab-item .icon:before,.tabs-icon-left.tabs .tab-item .tab-title:before,.tabs-icon-left>.tabs .tab-item .icon:before,.tabs-icon-left>.tabs .tab-item .tab-title:before,.tabs-icon-right.tabs .tab-item .icon:before,.tabs-icon-right.tabs .tab-item .tab-title:before,.tabs-icon-right>.tabs .tab-item .icon:before,.tabs-icon-right>.tabs .tab-item .tab-title:before{font-size:24px;line-height:49px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .icon{padding-right:3px}.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .icon{padding-left:3px}.tabs-icon-only.tabs .icon,.tabs-icon-only>.tabs .icon{line-height:inherit}.tab-item.has-badge{position:relative}.tab-item .badge{position:absolute;top:4%;right:33%;right:calc(50% - 26px);padding:1px 6px;height:auto;font-size:12px;line-height:16px}.tab-item.activated,.tab-item.active,.tab-item.tab-item-active{opacity:1}.tab-item.activated.tab-item-light,.tab-item.active.tab-item-light,.tab-item.tab-item-active.tab-item-light{color:#fff}.tab-item.activated.tab-item-stable,.tab-item.active.tab-item-stable,.tab-item.tab-item-active.tab-item-stable{color:#f8f8f8}.tab-item.activated.tab-item-positive,.tab-item.active.tab-item-positive,.tab-item.tab-item-active.tab-item-positive{color:#387ef5}.tab-item.activated.tab-item-calm,.tab-item.active.tab-item-calm,.tab-item.tab-item-active.tab-item-calm{color:#11c1f3}.tab-item.activated.tab-item-assertive,.tab-item.active.tab-item-assertive,.tab-item.tab-item-active.tab-item-assertive{color:#ef473a}.tab-item.activated.tab-item-balanced,.tab-item.active.tab-item-balanced,.tab-item.tab-item-active.tab-item-balanced{color:#33cd5f}.tab-item.activated.tab-item-energized,.tab-item.active.tab-item-energized,.tab-item.tab-item-active.tab-item-energized{color:#ffc900}.tab-item.activated.tab-item-royal,.tab-item.active.tab-item-royal,.tab-item.tab-item-active.tab-item-royal{color:#886aea}.tab-item.activated.tab-item-dark,.tab-item.active.tab-item-dark,.tab-item.tab-item-active.tab-item-dark{color:#444}.item.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:0}.item.tabs .icon:before{position:relative}.tab-item.disabled,.tab-item[disabled]{opacity:.4;cursor:default;pointer-events:none}.nav-bar-tabs-top.hide~.view-container .tabs-top .tabs{top:0}.pane[hide-nav-bar=true] .has-tabs-top{top:49px}.menu{position:absolute;top:0;bottom:0;z-index:0;overflow:hidden;min-height:100%;max-height:100%;width:275px;background-color:#fff}.menu .scroll-content{z-index:10}.menu .bar-header{z-index:11}.menu-content{-webkit-transform:none;transform:none;box-shadow:-1px 0 2px rgba(0,0,0,.2),1px 0 2px rgba(0,0,0,.2)}.menu-open .menu-content .pane,.menu-open .menu-content .scroll-content,.menu-open .menu-content .scroll-content .scroll{pointer-events:none}.menu-open .menu-content .scroll-content:not(.overflow-scroll){overflow:hidden}.grade-b .menu-content,.grade-c .menu-content{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;right:-1px;left:-1px;border-right:1px solid #ccc;border-left:1px solid #ccc;box-shadow:none}.menu-left{left:0}.menu-right{right:0}.aside-open.aside-resizing .menu-right{display:none}.menu-animated{-webkit-transition:-webkit-transform 200ms ease;transition:transform 200ms ease}.modal-backdrop,.modal-backdrop-bg{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%}.modal-backdrop-bg{pointer-events:none}.modal{display:block;position:absolute;top:0;z-index:10;overflow:hidden;min-height:100%;width:100%;background-color:#fff}@media (min-width:680px){.modal{top:20%;right:20%;bottom:20%;left:20%;min-height:240px;width:60%}.modal.ng-leave-active{bottom:0}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader){height:44px}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader)>*{margin-top:0}.platform-ios.platform-cordova .modal-wrapper .modal .bar-subheader,.platform-ios.platform-cordova .modal-wrapper .modal .has-header,.platform-ios.platform-cordova .modal-wrapper .modal .tabs-top>.tabs,.platform-ios.platform-cordova .modal-wrapper .modal .tabs.tabs-top{top:44px}.platform-ios.platform-cordova .modal-wrapper .modal .has-subheader{top:88px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-tabs-top{top:93px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top{top:137px}.modal-backdrop-bg{-webkit-transition:opacity 300ms ease-in-out;transition:opacity 300ms ease-in-out;background-color:#000;opacity:0}.active .modal-backdrop-bg{opacity:.5}}.modal-open{pointer-events:none}.modal-open .modal,.modal-open .modal-backdrop{pointer-events:auto}.modal-open.loading-active .modal,.modal-open.loading-active .modal-backdrop{pointer-events:none}.popover-backdrop{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%;background-color:transparent}.popover-backdrop.active{background-color:rgba(0,0,0,.1)}.popover{position:absolute;top:25%;left:50%;z-index:10;display:block;margin-top:12px;margin-left:-110px;height:280px;width:220px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4);opacity:0}.popover .item:first-child{border-top:0}.popover .item:last-child{border-bottom:0}.popover.popover-bottom{margin-top:-12px}.popover,.popover .bar-header{border-radius:2px}.popover .scroll-content{z-index:1;margin:2px 0}.popover .bar-header{border-bottom-right-radius:0;border-bottom-left-radius:0}.popover .has-header{border-top-right-radius:0;border-top-left-radius:0}.popover-arrow{display:none}.platform-ios .popover{box-shadow:0 0 40px rgba(0,0,0,.08);border-radius:10px}.platform-ios .popover .bar-header{-webkit-border-top-right-radius:10px;border-top-right-radius:10px;-webkit-border-top-left-radius:10px;border-top-left-radius:10px}.platform-ios .popover .scroll-content{margin:8px 0;border-radius:10px}.platform-ios .popover .scroll-content.has-header{margin-top:0}.platform-ios .popover-arrow{position:absolute;display:block;top:-17px;width:30px;height:19px;overflow:hidden}.platform-ios .popover-arrow:after{position:absolute;top:12px;left:5px;width:20px;height:20px;background-color:#fff;border-radius:3px;content:'';-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.platform-ios .popover-bottom .popover-arrow{top:auto;bottom:-10px}.platform-ios .popover-bottom .popover-arrow:after{top:-6px}.platform-android .popover{margin-top:-32px;background-color:#fafafa;box-shadow:0 2px 6px rgba(0,0,0,.35)}.platform-android .popover .item{border-color:#fafafa;background-color:#fafafa;color:#4d4d4d}.platform-android .popover.popover-bottom{margin-top:32px}.platform-android .popover-backdrop,.platform-android .popover-backdrop.active{background-color:transparent}.popover-open{pointer-events:none}.popover-open .popover,.popover-open .popover-backdrop{pointer-events:auto}.popover-open.loading-active .popover,.popover-open.loading-active .popover-backdrop{pointer-events:none}@media (min-width:680px){.popover{width:360px;margin-left:-180px}}.popup-container{position:absolute;top:0;left:0;bottom:0;right:0;background:0 0;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;z-index:12;visibility:hidden}.popup-container.popup-showing{visibility:visible}.popup-container.popup-hidden .popup{-webkit-animation-name:scaleOut;animation-name:scaleOut;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.popup-container.active .popup{-webkit-animation-name:superScaleIn;animation-name:superScaleIn;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.popup-container .popup{width:250px;max-width:100%;max-height:90%;border-radius:0;background-color:rgba(255,255,255,.9);display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:vertical;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.popup-container input,.popup-container textarea{width:100%}.popup-head{padding:15px 10px;border-bottom:1px solid #eee;text-align:center}.popup-title{margin:0;padding:0;font-size:15px}.popup-sub-title{margin:5px 0 0 0;padding:0;font-weight:400;font-size:11px}.popup-body{padding:10px;overflow:auto}.popup-buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding:10px;min-height:65px}.popup-buttons .button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;min-height:45px;border-radius:2px;line-height:20px;margin-right:5px}.popup-buttons .button:last-child{margin-right:0}.popup-open,.popup-open.modal-open .modal{pointer-events:none}.popup-open .popup,.popup-open .popup-backdrop{pointer-events:auto}.loading-container{position:absolute;left:0;top:0;right:0;bottom:0;z-index:13;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-transition:.2s opacity linear;transition:.2s opacity linear;visibility:hidden;opacity:0}.loading-container:not(.visible) .icon,.loading-container:not(.visible) .spinner{display:none}.loading-container.visible{visibility:visible}.loading-container.active{opacity:1}.loading-container .loading{padding:20px;border-radius:5px;background-color:rgba(0,0,0,.7);color:#fff;text-align:center;text-overflow:ellipsis;font-size:15px}.loading-container .loading h1,.loading-container .loading h2,.loading-container .loading h3,.loading-container .loading h4,.loading-container .loading h5,.loading-container .loading h6{color:#fff}.item{border-color:#ddd;background-color:#fff;color:#444;position:relative;z-index:2;display:block;margin:-1px;padding:16px;border-width:1px;border-style:solid;font-size:16px}.item h2{margin:0 0 2px 0;font-size:16px;font-weight:400}.item h3{margin:0 0 4px 0;font-size:14px}.item h4{margin:0 0 4px 0;font-size:12px}.item h5,.item h6{margin:0 0 3px 0;font-size:10px}.item p{color:#666;font-size:14px;margin-bottom:2px}.item h1:last-child,.item h2:last-child,.item h3:last-child,.item h4:last-child,.item h5:last-child,.item h6:last-child,.item p:last-child{margin-bottom:0}.item .badge{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;position:absolute;top:16px;right:32px}.item.item-button-right .badge{right:67px}.item.item-divider .badge{top:8px}.item .badge+.badge{margin-right:5px}.item.item-light{border-color:#ddd;background-color:#fff;color:#444}.item.item-stable{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item.item-positive{border-color:#0c60ee;background-color:#387ef5;color:#fff}.item.item-calm{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.item.item-assertive{border-color:#e42112;background-color:#ef473a;color:#fff}.item.item-balanced{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item.item-energized{border-color:#e6b500;background-color:#ffc900;color:#fff}.item.item-royal{border-color:#6b46e5;background-color:#886aea;color:#fff}.item.item-dark{border-color:#111;background-color:#444;color:#fff}.item[ng-click]:hover{cursor:pointer}.item-borderless,.list-borderless .item{border-width:0}.item .item-content.activated,.item .item-content.activated.item-complex>.item-content,.item .item-content.active,.item .item-content.active.item-complex>.item-content,.item-complex.activated .item-content,.item-complex.activated .item-content.item-complex>.item-content,.item-complex.active .item-content,.item-complex.active .item-content.item-complex>.item-content,.item.activated,.item.activated.item-complex>.item-content,.item.active,.item.active.item-complex>.item-content{border-color:#ccc;background-color:#D9D9D9}.item .item-content.activated.item-light,.item .item-content.activated.item-light.item-complex>.item-content,.item .item-content.active.item-light,.item .item-content.active.item-light.item-complex>.item-content,.item-complex.activated .item-content.item-light,.item-complex.activated .item-content.item-light.item-complex>.item-content,.item-complex.active .item-content.item-light,.item-complex.active .item-content.item-light.item-complex>.item-content,.item.activated.item-light,.item.activated.item-light.item-complex>.item-content,.item.active.item-light,.item.active.item-light.item-complex>.item-content{border-color:#ccc;background-color:#fafafa}.item .item-content.activated.item-stable,.item .item-content.activated.item-stable.item-complex>.item-content,.item .item-content.active.item-stable,.item .item-content.active.item-stable.item-complex>.item-content,.item-complex.activated .item-content.item-stable,.item-complex.activated .item-content.item-stable.item-complex>.item-content,.item-complex.active .item-content.item-stable,.item-complex.active .item-content.item-stable.item-complex>.item-content,.item.activated.item-stable,.item.activated.item-stable.item-complex>.item-content,.item.active.item-stable,.item.active.item-stable.item-complex>.item-content{border-color:#a2a2a2;background-color:#e5e5e5}.item .item-content.activated.item-positive,.item .item-content.activated.item-positive.item-complex>.item-content,.item .item-content.active.item-positive,.item .item-content.active.item-positive.item-complex>.item-content,.item-complex.activated .item-content.item-positive,.item-complex.activated .item-content.item-positive.item-complex>.item-content,.item-complex.active .item-content.item-positive,.item-complex.active .item-content.item-positive.item-complex>.item-content,.item.activated.item-positive,.item.activated.item-positive.item-complex>.item-content,.item.active.item-positive,.item.active.item-positive.item-complex>.item-content{border-color:#0c60ee;background-color:#0c60ee}.item .item-content.activated.item-calm,.item .item-content.activated.item-calm.item-complex>.item-content,.item .item-content.active.item-calm,.item .item-content.active.item-calm.item-complex>.item-content,.item-complex.activated .item-content.item-calm,.item-complex.activated .item-content.item-calm.item-complex>.item-content,.item-complex.active .item-content.item-calm,.item-complex.active .item-content.item-calm.item-complex>.item-content,.item.activated.item-calm,.item.activated.item-calm.item-complex>.item-content,.item.active.item-calm,.item.active.item-calm.item-complex>.item-content{border-color:#0a9dc7;background-color:#0a9dc7}.item .item-content.activated.item-assertive,.item .item-content.activated.item-assertive.item-complex>.item-content,.item .item-content.active.item-assertive,.item .item-content.active.item-assertive.item-complex>.item-content,.item-complex.activated .item-content.item-assertive,.item-complex.activated .item-content.item-assertive.item-complex>.item-content,.item-complex.active .item-content.item-assertive,.item-complex.active .item-content.item-assertive.item-complex>.item-content,.item.activated.item-assertive,.item.activated.item-assertive.item-complex>.item-content,.item.active.item-assertive,.item.active.item-assertive.item-complex>.item-content{border-color:#e42112;background-color:#e42112}.item .item-content.activated.item-balanced,.item .item-content.activated.item-balanced.item-complex>.item-content,.item .item-content.active.item-balanced,.item .item-content.active.item-balanced.item-complex>.item-content,.item-complex.activated .item-content.item-balanced,.item-complex.activated .item-content.item-balanced.item-complex>.item-content,.item-complex.active .item-content.item-balanced,.item-complex.active .item-content.item-balanced.item-complex>.item-content,.item.activated.item-balanced,.item.activated.item-balanced.item-complex>.item-content,.item.active.item-balanced,.item.active.item-balanced.item-complex>.item-content{border-color:#28a54c;background-color:#28a54c}.item .item-content.activated.item-energized,.item .item-content.activated.item-energized.item-complex>.item-content,.item .item-content.active.item-energized,.item .item-content.active.item-energized.item-complex>.item-content,.item-complex.activated .item-content.item-energized,.item-complex.activated .item-content.item-energized.item-complex>.item-content,.item-complex.active .item-content.item-energized,.item-complex.active .item-content.item-energized.item-complex>.item-content,.item.activated.item-energized,.item.activated.item-energized.item-complex>.item-content,.item.active.item-energized,.item.active.item-energized.item-complex>.item-content{border-color:#e6b500;background-color:#e6b500}.item .item-content.activated.item-royal,.item .item-content.activated.item-royal.item-complex>.item-content,.item .item-content.active.item-royal,.item .item-content.active.item-royal.item-complex>.item-content,.item-complex.activated .item-content.item-royal,.item-complex.activated .item-content.item-royal.item-complex>.item-content,.item-complex.active .item-content.item-royal,.item-complex.active .item-content.item-royal.item-complex>.item-content,.item.activated.item-royal,.item.activated.item-royal.item-complex>.item-content,.item.active.item-royal,.item.active.item-royal.item-complex>.item-content{border-color:#6b46e5;background-color:#6b46e5}.item .item-content.activated.item-dark,.item .item-content.activated.item-dark.item-complex>.item-content,.item .item-content.active.item-dark,.item .item-content.active.item-dark.item-complex>.item-content,.item-complex.activated .item-content.item-dark,.item-complex.activated .item-content.item-dark.item-complex>.item-content,.item-complex.active .item-content.item-dark,.item-complex.active .item-content.item-dark.item-complex>.item-content,.item.activated.item-dark,.item.activated.item-dark.item-complex>.item-content,.item.active.item-dark,.item.active.item-dark.item-complex>.item-content{border-color:#000;background-color:#262626}.item,.item h1,.item h2,.item h3,.item h4,.item h5,.item h6,.item p,.item-content,.item-content h1,.item-content h2,.item-content h3,.item-content h4,.item-content h5,.item-content h6,.item-content p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a.item{color:inherit;text-decoration:none}a.item:focus,a.item:hover{text-decoration:none}.item-complex,a.item.item-complex,button.item.item-complex{padding:0}.item-complex .item-content,.item-radio .item-content{position:relative;z-index:2;padding:16px 49px 16px 16px;border:none;background-color:#fff}a.item-content{display:block;color:inherit;text-decoration:none}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p,.item-complex.item-text-wrap,.item-complex.item-text-wrap .item-content,.item-complex.item-text-wrap h1,.item-complex.item-text-wrap h2,.item-complex.item-text-wrap h3,.item-complex.item-text-wrap h4,.item-complex.item-text-wrap h5,.item-complex.item-text-wrap h6,.item-complex.item-text-wrap p,.item-text-wrap,.item-text-wrap .item,.item-text-wrap .item-content,.item-text-wrap h1,.item-text-wrap h2,.item-text-wrap h3,.item-text-wrap h4,.item-text-wrap h5,.item-text-wrap h6,.item-text-wrap p{overflow:visible;white-space:normal}.item-complex.item-light>.item-content{border-color:#ddd;background-color:#fff;color:#444}.item-complex.item-light>.item-content.active,.item-complex.item-light>.item-content.active.item-complex>.item-content,.item-complex.item-light>.item-content:active,.item-complex.item-light>.item-content:active.item-complex>.item-content{border-color:#ccc;background-color:#fafafa}.item-complex.item-stable>.item-content{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item-complex.item-stable>.item-content.active,.item-complex.item-stable>.item-content.active.item-complex>.item-content,.item-complex.item-stable>.item-content:active,.item-complex.item-stable>.item-content:active.item-complex>.item-content{border-color:#a2a2a2;background-color:#e5e5e5}.item-complex.item-positive>.item-content{border-color:#0c60ee;background-color:#387ef5;color:#fff}.item-complex.item-positive>.item-content.active,.item-complex.item-positive>.item-content.active.item-complex>.item-content,.item-complex.item-positive>.item-content:active,.item-complex.item-positive>.item-content:active.item-complex>.item-content{border-color:#0c60ee;background-color:#0c60ee}.item-complex.item-calm>.item-content{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.item-complex.item-calm>.item-content.active,.item-complex.item-calm>.item-content.active.item-complex>.item-content,.item-complex.item-calm>.item-content:active,.item-complex.item-calm>.item-content:active.item-complex>.item-content{border-color:#0a9dc7;background-color:#0a9dc7}.item-complex.item-assertive>.item-content{border-color:#e42112;background-color:#ef473a;color:#fff}.item-complex.item-assertive>.item-content.active,.item-complex.item-assertive>.item-content.active.item-complex>.item-content,.item-complex.item-assertive>.item-content:active,.item-complex.item-assertive>.item-content:active.item-complex>.item-content{border-color:#e42112;background-color:#e42112}.item-complex.item-balanced>.item-content{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item-complex.item-balanced>.item-content.active,.item-complex.item-balanced>.item-content.active.item-complex>.item-content,.item-complex.item-balanced>.item-content:active,.item-complex.item-balanced>.item-content:active.item-complex>.item-content{border-color:#28a54c;background-color:#28a54c}.item-complex.item-energized>.item-content{border-color:#e6b500;background-color:#ffc900;color:#fff}.item-complex.item-energized>.item-content.active,.item-complex.item-energized>.item-content.active.item-complex>.item-content,.item-complex.item-energized>.item-content:active,.item-complex.item-energized>.item-content:active.item-complex>.item-content{border-color:#e6b500;background-color:#e6b500}.item-complex.item-royal>.item-content{border-color:#6b46e5;background-color:#886aea;color:#fff}.item-complex.item-royal>.item-content.active,.item-complex.item-royal>.item-content.active.item-complex>.item-content,.item-complex.item-royal>.item-content:active,.item-complex.item-royal>.item-content:active.item-complex>.item-content{border-color:#6b46e5;background-color:#6b46e5}.item-complex.item-dark>.item-content{border-color:#111;background-color:#444;color:#fff}.item-complex.item-dark>.item-content.active,.item-complex.item-dark>.item-content.active.item-complex>.item-content,.item-complex.item-dark>.item-content:active,.item-complex.item-dark>.item-content:active.item-complex>.item-content{border-color:#000;background-color:#262626}.item-icon-left .icon,.item-icon-right .icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-icon-left .icon:before,.item-icon-right .icon:before{display:block;width:32px;text-align:center}.item .fill-icon{min-width:30px;min-height:30px;font-size:28px}.item-icon-left{padding-left:54px}.item-icon-left .icon{left:11px}.item-complex.item-icon-left{padding-left:0}.item-complex.item-icon-left .item-content{padding-left:54px}.item-icon-right{padding-right:54px}.item-icon-right .icon{right:11px}.item-complex.item-icon-right{padding-right:0}.item-complex.item-icon-right .item-content{padding-right:54px}.item-icon-left.item-icon-right .icon:first-child{right:auto}.item-icon-left .item-delete .icon,.item-icon-left.item-icon-right .icon:last-child{left:auto}.item-icon-left .icon-accessory,.item-icon-right .icon-accessory{color:#ccc;font-size:16px}.item-icon-left .icon-accessory{left:3px}.item-icon-right .icon-accessory{right:3px}.item-button-left{padding-left:72px}.item-button-left .item-content>.button,.item-button-left>.button{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;left:11px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-left .item-content>.button .icon:before,.item-button-left>.button .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-left .item-content>.button>.button,.item-button-left>.button>.button{margin:0 2px;min-height:34px;font-size:18px;line-height:32px}.item-button-right,a.item.item-button-right,button.item.item-button-right{padding-right:80px}.item-button-right .item-content>.button,.item-button-right .item-content>.buttons,.item-button-right>.button,.item-button-right>.buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;right:16px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-right .item-content>.button .icon:before,.item-button-right .item-content>.buttons .icon:before,.item-button-right>.button .icon:before,.item-button-right>.buttons .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-right .item-content>.button>.button,.item-button-right .item-content>.buttons>.button,.item-button-right>.button>.button,.item-button-right>.buttons>.button{margin:0 2px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-avatar,.item-avatar .item-content,.item-avatar-left,.item-avatar-left .item-content{padding-left:72px;min-height:72px}.item-avatar .item-content .item-image,.item-avatar .item-content>img:first-child,.item-avatar .item-image,.item-avatar-left .item-content .item-image,.item-avatar-left .item-content>img:first-child,.item-avatar-left .item-image,.item-avatar-left>img:first-child,.item-avatar>img:first-child{position:absolute;top:16px;left:16px;max-width:40px;max-height:40px;width:100%;height:100%;border-radius:50%}.item-avatar-right,.item-avatar-right .item-content{padding-right:72px;min-height:72px}.item-avatar-right .item-content .item-image,.item-avatar-right .item-content>img:first-child,.item-avatar-right .item-image,.item-avatar-right>img:first-child{position:absolute;top:16px;right:16px;max-width:40px;max-height:40px;width:100%;height:100%;border-radius:50%}.item-thumbnail-left,.item-thumbnail-left .item-content{padding-top:8px;padding-left:106px;min-height:100px}.item-thumbnail-left .item-content .item-image,.item-thumbnail-left .item-content>img:first-child,.item-thumbnail-left .item-image,.item-thumbnail-left>img:first-child{position:absolute;top:10px;left:10px;max-width:80px;max-height:80px;width:100%;height:100%}.item-avatar-left.item-complex,.item-avatar.item-complex,.item-thumbnail-left.item-complex{padding-top:0;padding-left:0}.item-thumbnail-right,.item-thumbnail-right .item-content{padding-top:8px;padding-right:106px;min-height:100px}.item-thumbnail-right .item-content .item-image,.item-thumbnail-right .item-content>img:first-child,.item-thumbnail-right .item-image,.item-thumbnail-right>img:first-child{position:absolute;top:10px;right:10px;max-width:80px;max-height:80px;width:100%;height:100%}.item-avatar-right.item-complex,.item-thumbnail-right.item-complex{padding-top:0;padding-right:0}.item-image{padding:0;text-align:center}.item-image .list-img,.item-image img:first-child{width:100%;vertical-align:middle}.item-body{overflow:auto;padding:16px;text-overflow:inherit;white-space:normal}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p{margin-top:16px;margin-bottom:16px}.item-divider{padding-top:8px;padding-bottom:8px;min-height:30px;background-color:#f5f5f5;color:#222;font-weight:500}.item-divider-ios,.platform-ios .item-divider-platform{padding-top:26px;text-transform:uppercase;font-weight:300;font-size:13px;background-color:#efeff4;color:#555}.item-divider-android,.platform-android .item-divider-platform{font-weight:300;font-size:13px}.item-note{float:right;color:#aaa;font-size:14px}.item-left-editable .item-content,.item-right-editable .item-content{-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;transition-property:transform}.item-left-editing.item-left-editable .item-content,.list-left-editing .item-left-editable .item-content{-webkit-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0)}.item-remove-animate.ng-leave{-webkit-transition-duration:300ms;transition-duration:300ms}.item-remove-animate.ng-leave .item-content,.item-remove-animate.ng-leave:last-of-type{-webkit-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-property:all;transition-property:all}.item-remove-animate.ng-leave.ng-leave-active .item-content{opacity:0;-webkit-transform:translate3d(-100%,0,0)!important;transform:translate3d(-100%,0,0)!important}.item-remove-animate.ng-leave.ng-leave-active:last-of-type{opacity:0}.item-remove-animate.ng-leave.ng-leave-active~ion-item:not(.ng-leave){-webkit-transform:translate3d(0,-webkit-calc(-100% + 1px),0);transform:translate3d(0,calc(-100% + 1px),0);-webkit-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(.25,.81,.24,1);transition-timing-function:cubic-bezier(.25,.81,.24,1);-webkit-transition-property:all;transition-property:all}.item-left-edit{-webkit-transition:all ease-in-out 125ms;transition:all ease-in-out 125ms;position:absolute;top:0;left:0;z-index:0;width:50px;height:100%;line-height:100%;display:none;opacity:0;-webkit-transform:translate3d(-21px,0,0);transform:translate3d(-21px,0,0)}.item-left-edit .button{height:100%}.item-left-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%}.item-left-edit.visible{display:block}.item-left-edit.visible.active{opacity:1;-webkit-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}.list-left-editing .item-left-edit{-webkit-transition-delay:125ms;transition-delay:125ms}.item-delete .button.icon{color:#ef473a;font-size:24px}.item-delete .button.icon:hover{opacity:.7}.item-right-edit{-webkit-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;z-index:3;width:75px;height:100%;background:inherit;padding-left:20px;display:block;opacity:0;-webkit-transform:translate3d(75px,0,0);transform:translate3d(75px,0,0)}.item-right-edit .button{min-width:50px;height:100%}.item-right-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-right-edit.visible{display:block}.item-right-edit.visible.active{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.item-reorder .button.icon{color:#444;font-size:32px}.item-reordering{position:absolute;left:0;top:0;z-index:9;width:100%;box-shadow:0 0 10px 0 #aaa}.item-reordering .item-reorder{z-index:9}.item-placeholder{opacity:.7}.item-options{position:absolute;top:0;right:0;z-index:1;height:100%}.item-options .button{height:100%;border:none;border-radius:0;display:-webkit-inline-box;display:-webkit-inline-flex;display:-moz-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.item-options .button:before{margin:0 auto}.list{position:relative;padding-top:1px;padding-bottom:1px;padding-left:0;margin-bottom:20px}.list:last-child{margin-bottom:0}.list:last-child.card{margin-bottom:40px}.list-header{margin-top:20px;padding:5px 15px;background-color:transparent;color:#222;font-weight:700}.card.list .list-item{padding-right:1px;padding-left:1px}.card,.list-inset{overflow:hidden;margin:20px 10px;border-radius:2px;background-color:#fff}.card{padding-top:1px;padding-bottom:1px;box-shadow:0 1px 3px rgba(0,0,0,.3)}.card .item{border-left:0;border-right:0}.card .item:first-child{border-top:0}.card .item:last-child{border-bottom:0}.padding .card,.padding .list-inset{margin-left:0;margin-right:0}.card .item:first-child,.card .item:first-child .item-content,.list-inset .item:first-child,.list-inset .item:first-child .item-content,.padding>.list .item:first-child,.padding>.list .item:first-child .item-content{border-top-left-radius:2px;border-top-right-radius:2px}.card .item:last-child,.card .item:last-child .item-content,.list-inset .item:last-child,.list-inset .item:last-child .item-content,.padding>.list .item:last-child,.padding>.list .item:last-child .item-content{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.card .item:last-child,.list-inset .item:last-child{margin-bottom:-1px}.card .item,.list-inset .item,.padding-horizontal>.list .item,.padding>.list .item{margin-right:0;margin-left:0}.card .item.item-input input,.list-inset .item.item-input input,.padding-horizontal>.list .item.item-input input,.padding>.list .item.item-input input{padding-right:44px}.padding-left>.list .item{margin-left:0}.padding-right>.list .item{margin-right:0}.badge{background-color:transparent;color:#AAA;z-index:1;display:inline-block;padding:3px 8px;min-width:10px;border-radius:10px;vertical-align:baseline;text-align:center;white-space:nowrap;font-weight:700;font-size:14px;line-height:16px}.badge:empty{display:none}.badge.badge-light,.tabs .tab-item .badge.badge-light{background-color:#fff;color:#444}.badge.badge-stable,.tabs .tab-item .badge.badge-stable{background-color:#f8f8f8;color:#444}.badge.badge-positive,.tabs .tab-item .badge.badge-positive{background-color:#387ef5;color:#fff}.badge.badge-calm,.tabs .tab-item .badge.badge-calm{background-color:#11c1f3;color:#fff}.badge.badge-assertive,.tabs .tab-item .badge.badge-assertive{background-color:#ef473a;color:#fff}.badge.badge-balanced,.tabs .tab-item .badge.badge-balanced{background-color:#33cd5f;color:#fff}.badge.badge-energized,.tabs .tab-item .badge.badge-energized{background-color:#ffc900;color:#fff}.badge.badge-royal,.tabs .tab-item .badge.badge-royal{background-color:#886aea;color:#fff}.badge.badge-dark,.tabs .tab-item .badge.badge-dark{background-color:#444;color:#fff}.button .badge{position:relative;top:-1px}.slider{position:relative;visibility:hidden;overflow:hidden}.slider-slides{position:relative;height:100%}.slider-slide{position:relative;display:block;float:left;width:100%;height:100%;vertical-align:top}.slider-slide-image>img{width:100%}.slider-pager{position:absolute;bottom:20px;z-index:1;width:100%;height:15px;text-align:center}.slider-pager .slider-pager-page{display:inline-block;margin:0 3px;width:15px;color:#000;text-decoration:none;opacity:.3}.slider-pager .slider-pager-page.active{-webkit-transition:opacity .4s ease-in;transition:opacity .4s ease-in;opacity:1}.slider-pager-page.ng-animate,.slider-pager-page.ng-enter,.slider-pager-page.ng-leave,.slider-slide.ng-animate,.slider-slide.ng-enter,.slider-slide.ng-leave{-webkit-transition:none!important;transition:none!important}.slider-pager-page.ng-animate,.slider-slide.ng-animate{-webkit-animation:none 0s;animation:none 0s}.swiper-container{margin:0 auto;position:relative;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.swiper-wrapper{z-index:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate(0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{display:block;-webkit-flex-shrink:0;-ms-flex:0 0 auto;flex-shrink:0;position:relative}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;-webkit-transition-property:-webkit-transform,height;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform,height}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-wp8-horizontal{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;-moz-background-size:27px 44px;-webkit-background-size:27px 44px;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:300ms;-moz-transition:300ms;-o-transition:300ms;transition:300ms;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-white .swiper-pagination-bullet{background:#fff}.swiper-pagination-bullet-active{opacity:1}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-container-vertical>.swiper-pagination{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-o-transform:translate(0,-50%);-ms-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination .swiper-pagination-bullet{margin:5px 0;display:block}.swiper-container-horizontal>.swiper-pagination{bottom:10px;left:0;width:100%}.swiper-container-horizontal>.swiper-pagination .swiper-pagination-bullet{margin:0 5px}.swiper-container-3d{-webkit-perspective:1200px;-moz-perspective:1200px;-o-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to left,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to right,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to top,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to bottom,rgba(0,0,0,.5),transparent)}.swiper-container-coverflow .swiper-wrapper{-ms-perspective:1200px}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide,.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube{overflow:visible}.swiper-container-cube .swiper-slide{pointer-events:none;visibility:hidden;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;width:100%;height:100%;z-index:1}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-moz-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;-moz-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:"";width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;-webkit-background-size:100%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{transform:rotate(360deg)}}ion-slides{width:100%;height:100%;display:block}.slide-zoom{display:block;width:100%;text-align:center}.swiper-container{width:100%;height:100%;padding:0;overflow:hidden}.swiper-wrapper{position:absolute;left:0;top:0;width:100%;height:100%;padding:0}.swiper-slide{width:100%;height:100%;box-sizing:border-box}.swiper-slide img{width:auto;height:auto;max-width:100%;max-height:100%}.scroll-refresher{position:absolute;top:-60px;right:0;left:0;overflow:hidden;margin:auto;height:60px}.scroll-refresher .ionic-refresher-content{position:absolute;bottom:15px;left:0;width:100%;color:#666;text-align:center;font-size:30px}.scroll-refresher .ionic-refresher-content .text-pulling,.scroll-refresher .ionic-refresher-content .text-refreshing{font-size:16px;line-height:16px}.scroll-refresher .ionic-refresher-content.ionic-refresher-with-text{bottom:10px}.scroll-refresher .icon-pulling,.scroll-refresher .icon-refreshing{width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.scroll-refresher .icon-pulling{-webkit-animation-name:refresh-spin-back;animation-name:refresh-spin-back;-webkit-animation-duration:200ms;animation-duration:200ms;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:none;animation-fill-mode:none;-webkit-transform:translate3d(0,0,0) rotate(0deg);transform:translate3d(0,0,0) rotate(0deg)}.scroll-refresher .icon-refreshing,.scroll-refresher .text-refreshing{display:none}.scroll-refresher .icon-refreshing{-webkit-animation-duration:1.5s;animation-duration:1.5s}.scroll-refresher.active .icon-pulling:not(.pulling-rotation-disabled){-webkit-animation-name:refresh-spin;animation-name:refresh-spin;-webkit-transform:translate3d(0,0,0) rotate(-180deg);transform:translate3d(0,0,0) rotate(-180deg)}.scroll-refresher.active.refreshing{-webkit-transition:transform .2s;transition:transform .2s;-webkit-transform:scale(1,1);transform:scale(1,1)}.scroll-refresher.active.refreshing .icon-pulling,.scroll-refresher.active.refreshing .text-pulling{display:none}.scroll-refresher.active.refreshing .icon-refreshing,.scroll-refresher.active.refreshing .text-refreshing{display:block}.scroll-refresher.active.refreshing.refreshing-tail{-webkit-transform:scale(0,0);transform:scale(0,0)}.overflow-scroll>.scroll{-webkit-overflow-scrolling:touch;width:100%}.overflow-scroll>.scroll.overscroll{position:fixed;right:0;left:0}.overflow-scroll.padding>.scroll.overscroll{padding:10px}@-webkit-keyframes refresh-spin{0%{-webkit-transform:translate3d(0,0,0) rotate(0)}100%{-webkit-transform:translate3d(0,0,0) rotate(180deg)}}@keyframes refresh-spin{0%{transform:translate3d(0,0,0) rotate(0)}100%{transform:translate3d(0,0,0) rotate(180deg)}}@-webkit-keyframes refresh-spin-back{0%{-webkit-transform:translate3d(0,0,0) rotate(180deg)}100%{-webkit-transform:translate3d(0,0,0) rotate(0)}}@keyframes refresh-spin-back{0%{transform:translate3d(0,0,0) rotate(180deg)}100%{transform:translate3d(0,0,0) rotate(0)}}.spinner{stroke:#444;fill:#444}.spinner svg{width:28px;height:28px}.spinner.spinner-light{stroke:#fff;fill:#fff}.spinner.spinner-stable{stroke:#f8f8f8;fill:#f8f8f8}.spinner.spinner-positive{stroke:#387ef5;fill:#387ef5}.spinner.spinner-calm{stroke:#11c1f3;fill:#11c1f3}.spinner.spinner-balanced{stroke:#33cd5f;fill:#33cd5f}.spinner.spinner-assertive{stroke:#ef473a;fill:#ef473a}.spinner.spinner-energized{stroke:#ffc900;fill:#ffc900}.spinner.spinner-royal{stroke:#886aea;fill:#886aea}.spinner.spinner-dark{stroke:#444;fill:#444}.spinner-android{stroke:#4b8bf4}.spinner-ios,.spinner-ios-small{stroke:#69717d}.spinner-spiral .stop1{stop-color:#fff;stop-opacity:0}.spinner-spiral.spinner-light .stop1{stop-color:#444}.spinner-spiral.spinner-light .stop2{stop-color:#fff}.spinner-spiral.spinner-stable .stop2{stop-color:#f8f8f8}.spinner-spiral.spinner-positive .stop2{stop-color:#387ef5}.spinner-spiral.spinner-calm .stop2{stop-color:#11c1f3}.spinner-spiral.spinner-balanced .stop2{stop-color:#33cd5f}.spinner-spiral.spinner-assertive .stop2{stop-color:#ef473a}.spinner-spiral.spinner-energized .stop2{stop-color:#ffc900}.spinner-spiral.spinner-royal .stop2{stop-color:#886aea}.spinner-spiral.spinner-dark .stop2{stop-color:#444}form{margin:0 0 1.42857}legend{display:block;margin-bottom:1.42857;padding:0;width:100%;border:1px solid #ddd;color:#444;font-size:21px;line-height:2.85714}legend small{color:#f8f8f8;font-size:1.07143}button,input,label,select,textarea{font-weight:400;font-size:14px;line-height:1.42857}button,input,select,textarea{font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif}.item-input{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:6px 0 5px 16px}.item-input input{-webkit-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 220px;-moz-box-flex:1;-moz-flex:1 220px;-ms-flex:1 220px;flex:1 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;padding-right:24px;background-color:transparent}.item-input .button .icon{-webkit-box-flex:0;-webkit-flex:0 0 24px;-moz-box-flex:0;-moz-flex:0 0 24px;-ms-flex:0 0 24px;flex:0 0 24px;position:static;display:inline-block;height:auto;text-align:center;font-size:16px}.item-input .button-bar{-webkit-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.item-input .icon{min-width:14px}.platform-windowsphone .item-input input{flex-shrink:1}.item-input-inset{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:10.67px}.item-input-wrapper{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0;-moz-box-flex:1;-moz-flex:1 0;-ms-flex:1 0;flex:1 0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-border-radius:4px;border-radius:4px;padding-right:8px;padding-left:8px;background:#eee}.item-input-inset .item-input-wrapper input{padding-left:4px;height:29px;background:0 0;line-height:18px}.item-input-wrapper~.button{margin-left:10.67px}.input-label{display:table;padding:7px 10px 7px 0;max-width:200px;width:35%;color:#444;font-size:16px}.placeholder-icon{color:#aaa}.placeholder-icon:first-child{padding-right:6px}.placeholder-icon:last-child{padding-left:6px}.item-stacked-label{display:block;background-color:transparent;box-shadow:none}.item-stacked-label .icon,.item-stacked-label .input-label{display:inline-block;padding:4px 0 0 0;vertical-align:middle}.item-stacked-label input,.item-stacked-label textarea{-webkit-border-radius:2px;border-radius:2px;padding:4px 8px 3px 0;border:none;background-color:#fff}.item-stacked-label input{overflow:hidden;height:46px}.item-select.item-stacked-label select{position:relative;padding:0;max-width:90%;direction:ltr;white-space:pre-wrap;margin:-3px}.item-floating-label{display:block;background-color:transparent;box-shadow:none}.item-floating-label .input-label{position:relative;padding:5px 0 0 0;opacity:0;top:10px;-webkit-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}.item-floating-label .input-label.has-input{opacity:1;top:0;-webkit-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}input[type=search],input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=tel],input[type=color],textarea{display:block;padding-top:2px;padding-left:0;height:34px;color:#111;vertical-align:middle;font-size:14px;line-height:16px}.platform-android input[type=datetime-local],.platform-android input[type=date],.platform-android input[type=month],.platform-android input[type=time],.platform-android input[type=week],.platform-ios input[type=datetime-local],.platform-ios input[type=date],.platform-ios input[type=month],.platform-ios input[type=time],.platform-ios input[type=week]{padding-top:8px}.item-input input,.item-input textarea{width:100%}textarea{padding-left:0}textarea::-moz-placeholder{color:#aaa}textarea:-ms-input-placeholder{color:#aaa}textarea::-webkit-input-placeholder{color:#aaa;text-indent:-3px}textarea{height:auto}input[type=search],input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=tel],input[type=color],textarea{border:0}input[type=radio],input[type=checkbox]{margin:0;line-height:normal}.item-input input[type=button],.item-input input[type=reset],.item-input input[type=submit],.item-input input[type=radio],.item-input input[type=checkbox],.item-input input[type=file],.item-input input[type=image]{width:auto}input[type=file]{line-height:34px}.cloned-text-input+input,.cloned-text-input+textarea,.previous-input-focus{position:absolute!important;left:-9999px;width:200px}input::-moz-placeholder,textarea::-moz-placeholder{color:#aaa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#aaa}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa;text-indent:0}input[disabled],input[readonly]:not(.cloned-text-input),select[disabled],select[readonly],textarea[disabled],textarea[readonly]:not(.cloned-text-input){background-color:#f8f8f8;cursor:not-allowed}input[type=radio][disabled],input[type=radio][readonly],input[type=checkbox][disabled],input[type=checkbox][readonly]{background-color:transparent}.checkbox{position:relative;display:inline-block;padding:7px 7px;cursor:pointer}.checkbox .checkbox-icon:before,.checkbox input:before{border-color:#ddd}.checkbox input:checked+.checkbox-icon:before,.checkbox input:checked:before{background:#387ef5;border-color:#387ef5}.checkbox-light .checkbox-icon:before,.checkbox-light input:before{border-color:#ddd}.checkbox-light input:checked+.checkbox-icon:before,.checkbox-light input:checked:before{background:#ddd;border-color:#ddd}.checkbox-stable .checkbox-icon:before,.checkbox-stable input:before{border-color:#b2b2b2}.checkbox-stable input:checked+.checkbox-icon:before,.checkbox-stable input:checked:before{background:#b2b2b2;border-color:#b2b2b2}.checkbox-positive .checkbox-icon:before,.checkbox-positive input:before{border-color:#387ef5}.checkbox-positive input:checked+.checkbox-icon:before,.checkbox-positive input:checked:before{background:#387ef5;border-color:#387ef5}.checkbox-calm .checkbox-icon:before,.checkbox-calm input:before{border-color:#11c1f3}.checkbox-calm input:checked+.checkbox-icon:before,.checkbox-calm input:checked:before{background:#11c1f3;border-color:#11c1f3}.checkbox-assertive .checkbox-icon:before,.checkbox-assertive input:before{border-color:#ef473a}.checkbox-assertive input:checked+.checkbox-icon:before,.checkbox-assertive input:checked:before{background:#ef473a;border-color:#ef473a}.checkbox-balanced .checkbox-icon:before,.checkbox-balanced input:before{border-color:#33cd5f}.checkbox-balanced input:checked+.checkbox-icon:before,.checkbox-balanced input:checked:before{background:#33cd5f;border-color:#33cd5f}.checkbox-energized .checkbox-icon:before,.checkbox-energized input:before{border-color:#ffc900}.checkbox-energized input:checked+.checkbox-icon:before,.checkbox-energized input:checked:before{background:#ffc900;border-color:#ffc900}.checkbox-royal .checkbox-icon:before,.checkbox-royal input:before{border-color:#886aea}.checkbox-royal input:checked+.checkbox-icon:before,.checkbox-royal input:checked:before{background:#886aea;border-color:#886aea}.checkbox-dark .checkbox-icon:before,.checkbox-dark input:before{border-color:#444}.checkbox-dark input:checked+.checkbox-icon:before,.checkbox-dark input:checked:before{background:#444;border-color:#444}.checkbox input:disabled+.checkbox-icon:before,.checkbox input:disabled:before{border-color:#ddd}.checkbox input:disabled:checked+.checkbox-icon:before,.checkbox input:disabled:checked:before{background:#ddd}.checkbox.checkbox-input-hidden input{display:none!important}.checkbox input,.checkbox-icon{position:relative;width:28px;height:28px;display:block;border:0;background:0 0;cursor:pointer;-webkit-appearance:none}.checkbox input:before,.checkbox-icon:before{display:table;width:100%;height:100%;border-width:1px;border-style:solid;border-radius:28px;background:#fff;content:' ';-webkit-transition:background-color 20ms ease-in-out;transition:background-color 20ms ease-in-out}.checkbox input:checked:before,input:checked+.checkbox-icon:before{border-width:2px}.checkbox input:after,.checkbox-icon:after{-webkit-transition:opacity .05s ease-in-out;transition:opacity .05s ease-in-out;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);position:absolute;top:33%;left:25%;display:table;width:14px;height:6px;border:1px solid #fff;border-top:0;border-right:0;content:' ';opacity:0}.checkbox-square .checkbox-icon:before,.checkbox-square input:before,.platform-android .checkbox-platform .checkbox-icon:before,.platform-android .checkbox-platform input:before{border-radius:2px;width:72%;height:72%;margin-top:14%;margin-left:14%;border-width:2px}.checkbox-square .checkbox-icon:after,.checkbox-square input:after,.platform-android .checkbox-platform .checkbox-icon:after,.platform-android .checkbox-platform input:after{border-width:2px;top:19%;left:25%;width:13px;height:7px}.platform-android .item-checkbox-right .checkbox-square .checkbox-icon::after{top:31%}.grade-c .checkbox input:after,.grade-c .checkbox-icon:after{-webkit-transform:rotate(0);transform:rotate(0);top:3px;left:4px;border:none;color:#fff;content:'\2713';font-weight:700;font-size:20px}.checkbox input:checked:after,input:checked+.checkbox-icon:after{opacity:1}.item-checkbox{padding-left:60px}.item-checkbox.active{box-shadow:none}.item-checkbox .checkbox{position:absolute;top:50%;right:8px;left:8px;z-index:3;margin-top:-21px}.item-checkbox.item-checkbox-right{padding-right:60px;padding-left:16px}.item-checkbox-right .checkbox input,.item-checkbox-right .checkbox-icon{float:right}.item-toggle{pointer-events:none}.toggle{position:relative;display:inline-block;pointer-events:auto;margin:-5px;padding:5px}.toggle input:checked+.track{border-color:#4cd964;background-color:#4cd964}.toggle.dragging .handle{background-color:#f2f2f2!important}.toggle.toggle-light input:checked+.track{border-color:#ddd;background-color:#ddd}.toggle.toggle-stable input:checked+.track{border-color:#b2b2b2;background-color:#b2b2b2}.toggle.toggle-positive input:checked+.track{border-color:#387ef5;background-color:#387ef5}.toggle.toggle-calm input:checked+.track{border-color:#11c1f3;background-color:#11c1f3}.toggle.toggle-assertive input:checked+.track{border-color:#ef473a;background-color:#ef473a}.toggle.toggle-balanced input:checked+.track{border-color:#33cd5f;background-color:#33cd5f}.toggle.toggle-energized input:checked+.track{border-color:#ffc900;background-color:#ffc900}.toggle.toggle-royal input:checked+.track{border-color:#886aea;background-color:#886aea}.toggle.toggle-dark input:checked+.track{border-color:#444;background-color:#444}.toggle input{display:none}.toggle .track{-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:background-color,border;transition-property:background-color,border;display:inline-block;box-sizing:border-box;width:51px;height:31px;border:solid 2px #e6e6e6;border-radius:20px;background-color:#fff;content:' ';cursor:pointer;pointer-events:none}.platform-android4_2 .toggle .track{-webkit-background-clip:padding-box}.toggle .handle{-webkit-transition:.3s cubic-bezier(0,1.1,1,1.1);transition:.3s cubic-bezier(0,1.1,1,1.1);-webkit-transition-property:background-color,transform;transition-property:background-color,transform;position:absolute;display:block;width:27px;height:27px;border-radius:27px;background-color:#fff;top:7px;left:7px;box-shadow:0 2px 7px rgba(0,0,0,.35),0 1px 1px rgba(0,0,0,.15)}.toggle .handle:before{position:absolute;top:-4px;left:-21.5px;padding:18.5px 34px;content:" "}.toggle input:checked+.track .handle{-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0);background-color:#fff}.item-toggle.active{box-shadow:none}.item-toggle,.item-toggle.item-complex .item-content{padding-right:99px}.item-toggle.item-complex{padding-right:0}.item-toggle .toggle{position:absolute;top:10px;right:16px;z-index:3}.toggle input:disabled+.track{opacity:.6}.toggle-small .track{border:0;width:34px;height:15px;background:#9e9e9e}.toggle-small input:checked+.track{background:rgba(0,150,137,.5)}.toggle-small .handle{top:2px;left:4px;width:21px;height:21px;box-shadow:0 2px 5px rgba(0,0,0,.25)}.toggle-small input:checked+.track .handle{-webkit-transform:translate3d(16px,0,0);transform:translate3d(16px,0,0);background:#009689}.toggle-small.item-toggle .toggle{top:19px}.toggle-small .toggle-light input:checked+.track{background-color:rgba(221,221,221,.5)}.toggle-small .toggle-light input:checked+.track .handle{background-color:#ddd}.toggle-small .toggle-stable input:checked+.track{background-color:rgba(178,178,178,.5)}.toggle-small .toggle-stable input:checked+.track .handle{background-color:#b2b2b2}.toggle-small .toggle-positive input:checked+.track{background-color:rgba(56,126,245,.5)}.toggle-small .toggle-positive input:checked+.track .handle{background-color:#387ef5}.toggle-small .toggle-calm input:checked+.track{background-color:rgba(17,193,243,.5)}.toggle-small .toggle-calm input:checked+.track .handle{background-color:#11c1f3}.toggle-small .toggle-assertive input:checked+.track{background-color:rgba(239,71,58,.5)}.toggle-small .toggle-assertive input:checked+.track .handle{background-color:#ef473a}.toggle-small .toggle-balanced input:checked+.track{background-color:rgba(51,205,95,.5)}.toggle-small .toggle-balanced input:checked+.track .handle{background-color:#33cd5f}.toggle-small .toggle-energized input:checked+.track{background-color:rgba(255,201,0,.5)}.toggle-small .toggle-energized input:checked+.track .handle{background-color:#ffc900}.toggle-small .toggle-royal input:checked+.track{background-color:rgba(136,106,234,.5)}.toggle-small .toggle-royal input:checked+.track .handle{background-color:#886aea}.toggle-small .toggle-dark input:checked+.track{background-color:rgba(68,68,68,.5)}.toggle-small .toggle-dark input:checked+.track .handle{background-color:#444}.item-radio{padding:0}.item-radio:hover{cursor:pointer}.item-radio .item-content{padding-right:64px}.item-radio .radio-icon{position:absolute;top:0;right:0;z-index:3;visibility:hidden;padding:14px;height:100%;font-size:24px}.item-radio input{position:absolute;left:-9999px}.item-radio input:checked+.radio-content .item-content{background:#f7f7f7}.item-radio input:checked+.radio-content .radio-icon{visibility:visible}.range input{overflow:hidden;margin-top:5px;margin-bottom:5px;padding-right:2px;padding-left:1px;width:auto;height:43px;outline:0;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0,#ccc),color-stop(100%,#ccc));background:linear-gradient(to right,#ccc 0,#ccc 100%);background-position:center;background-size:99% 2px;background-repeat:no-repeat;-webkit-appearance:none}.range input::-moz-focus-outer{border:0}.range input::-webkit-slider-thumb{position:relative;width:28px;height:28px;border-radius:50%;background-color:#fff;box-shadow:0 0 2px rgba(0,0,0,.3),0 3px 5px rgba(0,0,0,.2);cursor:pointer;-webkit-appearance:none;border:0}.range input::-webkit-slider-thumb:before{position:absolute;top:13px;left:-2001px;width:2000px;height:2px;background:#444;content:' '}.range input::-webkit-slider-thumb:after{position:absolute;top:-15px;left:-15px;padding:30px;content:' '}.range input::-ms-fill-lower{height:2px;background:#444}.range{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;padding:2px 11px}.range.range-light input::-webkit-slider-thumb:before{background:#ddd}.range.range-light input::-ms-fill-lower{background:#ddd}.range.range-stable input::-webkit-slider-thumb:before{background:#b2b2b2}.range.range-stable input::-ms-fill-lower{background:#b2b2b2}.range.range-positive input::-webkit-slider-thumb:before{background:#387ef5}.range.range-positive input::-ms-fill-lower{background:#387ef5}.range.range-calm input::-webkit-slider-thumb:before{background:#11c1f3}.range.range-calm input::-ms-fill-lower{background:#11c1f3}.range.range-balanced input::-webkit-slider-thumb:before{background:#33cd5f}.range.range-balanced input::-ms-fill-lower{background:#33cd5f}.range.range-assertive input::-webkit-slider-thumb:before{background:#ef473a}.range.range-assertive input::-ms-fill-lower{background:#ef473a}.range.range-energized input::-webkit-slider-thumb:before{background:#ffc900}.range.range-energized input::-ms-fill-lower{background:#ffc900}.range.range-royal input::-webkit-slider-thumb:before{background:#886aea}.range.range-royal input::-ms-fill-lower{background:#886aea}.range.range-dark input::-webkit-slider-thumb:before{background:#444}.range.range-dark input::-ms-fill-lower{background:#444}.range .icon{-webkit-box-flex:0;-webkit-flex:0;-moz-box-flex:0;-moz-flex:0;-ms-flex:0;flex:0;display:block;min-width:24px;text-align:center;font-size:24px}.range input{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;margin-right:10px;margin-left:10px}.range-label{-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-box-flex:0;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;display:block;white-space:nowrap}.range-label:first-child{padding-left:5px}.range input+.range-label{padding-right:5px;padding-left:0}.platform-windowsphone .range input{height:auto}.item-select{position:relative}.item-select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;bottom:0;right:0;padding:0 48px 0 16px;max-width:65%;border:none;background:#fff;color:#333;text-indent:.01px;text-overflow:'';white-space:nowrap;font-size:14px;cursor:pointer;direction:rtl}.item-select select::-ms-expand{display:none}.item-select option{direction:ltr}.item-select:after{position:absolute;top:50%;right:16px;margin-top:-3px;width:0;height:0;border-top:5px solid;border-right:5px solid transparent;border-left:5px solid transparent;color:#999;content:"";pointer-events:none}.item-select.item-light select{background:#fff;color:#444}.item-select.item-stable select{background:#f8f8f8;color:#444}.item-select.item-stable .input-label,.item-select.item-stable:after{color:#666}.item-select.item-positive select{background:#387ef5;color:#fff}.item-select.item-positive .input-label,.item-select.item-positive:after{color:#fff}.item-select.item-calm select{background:#11c1f3;color:#fff}.item-select.item-calm .input-label,.item-select.item-calm:after{color:#fff}.item-select.item-assertive select{background:#ef473a;color:#fff}.item-select.item-assertive .input-label,.item-select.item-assertive:after{color:#fff}.item-select.item-balanced select{background:#33cd5f;color:#fff}.item-select.item-balanced .input-label,.item-select.item-balanced:after{color:#fff}.item-select.item-energized select{background:#ffc900;color:#fff}.item-select.item-energized .input-label,.item-select.item-energized:after{color:#fff}.item-select.item-royal select{background:#886aea;color:#fff}.item-select.item-royal .input-label,.item-select.item-royal:after{color:#fff}.item-select.item-dark select{background:#444;color:#fff}.item-select.item-dark .input-label,.item-select.item-dark:after{color:#fff}select[multiple],select[size]{height:auto}progress{display:block;margin:15px auto;width:100%}.button{border-color:transparent;background-color:#f8f8f8;color:#444;position:relative;display:inline-block;margin:0;padding:0 12px;min-width:52px;min-height:47px;border-width:1px;border-style:solid;border-radius:4px;vertical-align:top;text-align:center;text-overflow:ellipsis;font-size:16px;line-height:42px;cursor:pointer}.button:hover{color:#444;text-decoration:none}.button.activated,.button.active{background-color:#e5e5e5}.button:after{position:absolute;top:-6px;right:-6px;bottom:-6px;left:-6px;content:' '}.button .icon{vertical-align:top;pointer-events:none}.button .icon:before,.button.icon-left:before,.button.icon-right:before,.button.icon:before{display:inline-block;padding:0 0 1px 0;vertical-align:inherit;font-size:24px;line-height:41px;pointer-events:none}.button.icon-left:before{float:left;padding-right:.2em;padding-left:0}.button.icon-right:before{float:right;padding-right:0;padding-left:.2em}.button.button-block,.button.button-full{margin-top:10px;margin-bottom:10px}.button.button-light{border-color:transparent;background-color:#fff;color:#444}.button.button-light:hover{color:#444;text-decoration:none}.button.button-light.activated,.button.button-light.active{background-color:#fafafa}.button.button-light.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ddd}.button.button-light.button-icon{border-color:transparent;background:0 0}.button.button-light.button-outline{border-color:#ddd;background:0 0;color:#ddd}.button.button-light.button-outline.activated,.button.button-light.button-outline.active{background-color:#ddd;box-shadow:none;color:#fff}.button.button-stable{border-color:transparent;background-color:#f8f8f8;color:#444}.button.button-stable:hover{color:#444;text-decoration:none}.button.button-stable.activated,.button.button-stable.active{background-color:#e5e5e5}.button.button-stable.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#b2b2b2}.button.button-stable.button-icon{border-color:transparent;background:0 0}.button.button-stable.button-outline{border-color:#b2b2b2;background:0 0;color:#b2b2b2}.button.button-stable.button-outline.activated,.button.button-stable.button-outline.active{background-color:#b2b2b2;box-shadow:none;color:#fff}.button.button-positive{border-color:transparent;background-color:#387ef5;color:#fff}.button.button-positive:hover{color:#fff;text-decoration:none}.button.button-positive.activated,.button.button-positive.active{background-color:#0c60ee}.button.button-positive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#387ef5}.button.button-positive.button-icon{border-color:transparent;background:0 0}.button.button-positive.button-outline{border-color:#387ef5;background:0 0;color:#387ef5}.button.button-positive.button-outline.activated,.button.button-positive.button-outline.active{background-color:#387ef5;box-shadow:none;color:#fff}.button.button-calm{border-color:transparent;background-color:#11c1f3;color:#fff}.button.button-calm:hover{color:#fff;text-decoration:none}.button.button-calm.activated,.button.button-calm.active{background-color:#0a9dc7}.button.button-calm.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#11c1f3}.button.button-calm.button-icon{border-color:transparent;background:0 0}.button.button-calm.button-outline{border-color:#11c1f3;background:0 0;color:#11c1f3}.button.button-calm.button-outline.activated,.button.button-calm.button-outline.active{background-color:#11c1f3;box-shadow:none;color:#fff}.button.button-assertive{border-color:transparent;background-color:#ef473a;color:#fff}.button.button-assertive:hover{color:#fff;text-decoration:none}.button.button-assertive.activated,.button.button-assertive.active{background-color:#e42112}.button.button-assertive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ef473a}.button.button-assertive.button-icon{border-color:transparent;background:0 0}.button.button-assertive.button-outline{border-color:#ef473a;background:0 0;color:#ef473a}.button.button-assertive.button-outline.activated,.button.button-assertive.button-outline.active{background-color:#ef473a;box-shadow:none;color:#fff}.button.button-balanced{border-color:transparent;background-color:#33cd5f;color:#fff}.button.button-balanced:hover{color:#fff;text-decoration:none}.button.button-balanced.activated,.button.button-balanced.active{background-color:#28a54c}.button.button-balanced.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#33cd5f}.button.button-balanced.button-icon{border-color:transparent;background:0 0}.button.button-balanced.button-outline{border-color:#33cd5f;background:0 0;color:#33cd5f}.button.button-balanced.button-outline.activated,.button.button-balanced.button-outline.active{background-color:#33cd5f;box-shadow:none;color:#fff}.button.button-energized{border-color:transparent;background-color:#ffc900;color:#fff}.button.button-energized:hover{color:#fff;text-decoration:none}.button.button-energized.activated,.button.button-energized.active{background-color:#e6b500}.button.button-energized.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ffc900}.button.button-energized.button-icon{border-color:transparent;background:0 0}.button.button-energized.button-outline{border-color:#ffc900;background:0 0;color:#ffc900}.button.button-energized.button-outline.activated,.button.button-energized.button-outline.active{background-color:#ffc900;box-shadow:none;color:#fff}.button.button-royal{border-color:transparent;background-color:#886aea;color:#fff}.button.button-royal:hover{color:#fff;text-decoration:none}.button.button-royal.activated,.button.button-royal.active{background-color:#6b46e5}.button.button-royal.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#886aea}.button.button-royal.button-icon{border-color:transparent;background:0 0}.button.button-royal.button-outline{border-color:#886aea;background:0 0;color:#886aea}.button.button-royal.button-outline.activated,.button.button-royal.button-outline.active{background-color:#886aea;box-shadow:none;color:#fff}.button.button-dark{border-color:transparent;background-color:#444;color:#fff}.button.button-dark:hover{color:#fff;text-decoration:none}.button.button-dark.activated,.button.button-dark.active{background-color:#262626}.button.button-dark.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444}.button.button-dark.button-icon{border-color:transparent;background:0 0}.button.button-dark.button-outline{border-color:#444;background:0 0;color:#444}.button.button-dark.button-outline.activated,.button.button-dark.button-outline.active{background-color:#444;box-shadow:none;color:#fff}.button-small{padding:2px 4px 1px;min-width:28px;min-height:30px;font-size:12px;line-height:26px}.button-small .icon:before,.button-small.icon-left:before,.button-small.icon-right:before,.button-small.icon:before{font-size:16px;line-height:19px;margin-top:3px}.button-large{padding:0 16px;min-width:68px;min-height:59px;font-size:20px;line-height:53px}.button-large .icon:before,.button-large.icon-left:before,.button-large.icon-right:before,.button-large.icon:before{padding-bottom:2px;font-size:32px;line-height:51px}.button-icon{-webkit-transition:opacity .1s;transition:opacity .1s;padding:0 6px;min-width:initial;border-color:transparent;background:0 0}.button-icon.button.activated,.button-icon.button.active{border-color:transparent;background:0 0;box-shadow:none;opacity:.3}.button-icon .icon:before,.button-icon.icon:before{font-size:32px}.button-clear{-webkit-transition:opacity .1s;transition:opacity .1s;padding:0 6px;max-height:42px;border-color:transparent;background:0 0;box-shadow:none}.button-clear.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#b2b2b2}.button-clear.button-icon{border-color:transparent;background:0 0}.button-clear.activated,.button-clear.active{opacity:.3}.button-outline{-webkit-transition:opacity .1s;transition:opacity .1s;background:0 0;box-shadow:none}.button-outline.button-outline{border-color:#b2b2b2;background:0 0;color:#b2b2b2}.button-outline.button-outline.activated,.button-outline.button-outline.active{background-color:#b2b2b2;box-shadow:none;color:#fff}.padding>.button.button-block:first-child{margin-top:0}.button-block{display:block;clear:both}.button-block:after{clear:both}.button-full,.button-full>.button{display:block;margin-right:0;margin-left:0;border-right-width:0;border-left-width:0;border-radius:0}.button-full>button.button,button.button-block,button.button-full,input.button.button-block{width:100%}a.button{text-decoration:none}a.button .icon:before,a.button.icon-left:before,a.button.icon-right:before,a.button.icon:before{margin-top:2px}.button.disabled,.button[disabled]{opacity:.4;cursor:default!important;pointer-events:none}.button-bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;width:100%}.button-bar.button-bar-inline{display:block;width:auto}.button-bar.button-bar-inline:after,.button-bar.button-bar-inline:before{display:table;content:"";line-height:0}.button-bar.button-bar-inline:after{clear:both}.button-bar.button-bar-inline>.button{width:auto;display:inline-block;float:left}.button-bar>.button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;padding:0 16px;width:0;border-width:1px 0 1px 1px;border-radius:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}.button-bar>.button .icon:before,.button-bar>.button:before{line-height:44px}.button-bar>.button:first-child{border-radius:4px 0 0 4px}.button-bar>.button:last-child{border-right-width:1px;border-radius:0 4px 4px 0}.button-bar>.button:only-child{border-radius:4px}.button-bar>.button-small .icon:before,.button-bar>.button-small:before{line-height:28px}.row{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:5px;width:100%}.row-wrap{-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.row-no-padding,.row-no-padding>.col{padding:0}.row+.row{margin-top:-5px;padding-top:0}.col{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;padding:5px;width:100%}.row-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;-moz-align-items:flex-start;align-items:flex-start}.row-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;-moz-align-items:flex-end;align-items:flex-end}.row-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.row-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;align-items:stretch}.row-baseline{-webkit-box-align:baseline;-ms-flex-align:baseline;-webkit-align-items:baseline;-moz-align-items:baseline;align-items:baseline}.col-top{-webkit-align-self:flex-start;-moz-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.col-bottom{-webkit-align-self:flex-end;-moz-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.col-center{-webkit-align-self:center;-moz-align-self:center;-ms-flex-item-align:center;align-self:center}.col-offset-10{margin-left:10%}.col-offset-20{margin-left:20%}.col-offset-25{margin-left:25%}.col-offset-33,.col-offset-34{margin-left:33.3333%}.col-offset-50{margin-left:50%}.col-offset-66,.col-offset-67{margin-left:66.6666%}.col-offset-75{margin-left:75%}.col-offset-80{margin-left:80%}.col-offset-90{margin-left:90%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 10%;-moz-box-flex:0;-moz-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%;max-width:10%}.col-20{-webkit-box-flex:0;-webkit-flex:0 0 20%;-moz-box-flex:0;-moz-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-25{-webkit-box-flex:0;-webkit-flex:0 0 25%;-moz-box-flex:0;-moz-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-33,.col-34{-webkit-box-flex:0;-webkit-flex:0 0 33.3333%;-moz-box-flex:0;-moz-flex:0 0 33.3333%;-ms-flex:0 0 33.3333%;flex:0 0 33.3333%;max-width:33.3333%}.col-40{-webkit-box-flex:0;-webkit-flex:0 0 40%;-moz-box-flex:0;-moz-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%;max-width:40%}.col-50{-webkit-box-flex:0;-webkit-flex:0 0 50%;-moz-box-flex:0;-moz-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-60{-webkit-box-flex:0;-webkit-flex:0 0 60%;-moz-box-flex:0;-moz-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%;max-width:60%}.col-66,.col-67{-webkit-box-flex:0;-webkit-flex:0 0 66.6666%;-moz-box-flex:0;-moz-flex:0 0 66.6666%;-ms-flex:0 0 66.6666%;flex:0 0 66.6666%;max-width:66.6666%}.col-75{-webkit-box-flex:0;-webkit-flex:0 0 75%;-moz-box-flex:0;-moz-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-80{-webkit-box-flex:0;-webkit-flex:0 0 80%;-moz-box-flex:0;-moz-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-90{-webkit-box-flex:0;-webkit-flex:0 0 90%;-moz-box-flex:0;-moz-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%;max-width:90%}@media (max-width:567px){.responsive-sm{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-sm .col,.responsive-sm .col-10,.responsive-sm .col-20,.responsive-sm .col-25,.responsive-sm .col-33,.responsive-sm .col-34,.responsive-sm .col-50,.responsive-sm .col-66,.responsive-sm .col-67,.responsive-sm .col-75,.responsive-sm .col-80,.responsive-sm .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:767px){.responsive-md{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-md .col,.responsive-md .col-10,.responsive-md .col-20,.responsive-md .col-25,.responsive-md .col-33,.responsive-md .col-34,.responsive-md .col-50,.responsive-md .col-66,.responsive-md .col-67,.responsive-md .col-75,.responsive-md .col-80,.responsive-md .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:1023px){.responsive-lg{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-lg .col,.responsive-lg .col-10,.responsive-lg .col-20,.responsive-lg .col-25,.responsive-lg .col-33,.responsive-lg .col-34,.responsive-lg .col-50,.responsive-lg .col-66,.responsive-lg .col-67,.responsive-lg .col-75,.responsive-lg .col-80,.responsive-lg .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}.hide{display:none}.opacity-hide{opacity:0}.grade-b .opacity-hide,.grade-c .opacity-hide{opacity:1;display:none}.show{display:block}.opacity-show{opacity:1}.invisible{visibility:hidden}.keyboard-open .hide-on-keyboard-open{display:none}.keyboard-open .bar-footer.hide-on-keyboard-open+.pane .has-footer,.keyboard-open .tabs.hide-on-keyboard-open+.pane .has-tabs{bottom:0}.inline{display:inline-block}.disable-pointer-events{pointer-events:none}.enable-pointer-events{pointer-events:auto}.disable-user-behavior{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent;-webkit-user-drag:none;-ms-touch-action:none;-ms-content-zooming:none}.click-block{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;z-index:99999;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);overflow:hidden}.click-block-hide{-webkit-transform:translate3d(-9999px,0,0);transform:translate3d(-9999px,0,0)}.no-resize{resize:none}.block{display:block;clear:both}.block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.full-image{width:100%}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.padding{padding:10px}.padding-top,.padding-vertical{padding-top:10px}.padding-horizontal,.padding-right{padding-right:10px}.padding-bottom,.padding-vertical{padding-bottom:10px}.padding-horizontal,.padding-left{padding-left:10px}.iframe-wrapper{position:fixed;-webkit-overflow-scrolling:touch;overflow:scroll}.iframe-wrapper iframe{height:100%;width:100%}.rounded{border-radius:4px}.light,a.light{color:#fff}.light-bg{background-color:#fff}.light-border{border-color:#ddd}.stable,a.stable{color:#f8f8f8}.stable-bg{background-color:#f8f8f8}.stable-border{border-color:#b2b2b2}.positive,a.positive{color:#387ef5}.positive-bg{background-color:#387ef5}.positive-border{border-color:#0c60ee}.calm,a.calm{color:#11c1f3}.calm-bg{background-color:#11c1f3}.calm-border{border-color:#0a9dc7}.assertive,a.assertive{color:#ef473a}.assertive-bg{background-color:#ef473a}.assertive-border{border-color:#e42112}.balanced,a.balanced{color:#33cd5f}.balanced-bg{background-color:#33cd5f}.balanced-border{border-color:#28a54c}.energized,a.energized{color:#ffc900}.energized-bg{background-color:#ffc900}.energized-border{border-color:#e6b500}.royal,a.royal{color:#886aea}.royal-bg{background-color:#886aea}.royal-border{border-color:#6b46e5}.dark,a.dark{color:#444}.dark-bg{background-color:#444}.dark-border{border-color:#111}[collection-repeat]{left:0!important;top:0!important;position:absolute!important;z-index:1}.collection-repeat-container{position:relative;z-index:1}.collection-repeat-after-container{z-index:0;display:block}.collection-repeat-after-container.horizontal{display:inline-block}.ng-cloak,.ng-hide:not(.ng-hide-animate),.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader){height:64px}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper{margin-top:19px!important}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader)>*{margin-top:20px}.platform-ios.platform-cordova:not(.fullscreen) .bar-subheader,.platform-ios.platform-cordova:not(.fullscreen) .has-header,.platform-ios.platform-cordova:not(.fullscreen) .tabs-top>.tabs,.platform-ios.platform-cordova:not(.fullscreen) .tabs.tabs-top{top:64px}.platform-ios.platform-cordova:not(.fullscreen) .has-subheader{top:108px}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-tabs-top{top:113px}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-subheader.has-tabs-top{top:157px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader){height:44px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper{margin-top:-1px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader)>*{margin-top:0}.platform-ios.platform-cordova .popover .bar-subheader,.platform-ios.platform-cordova .popover .has-header{top:44px}.platform-ios.platform-cordova .popover .has-subheader{top:88px}.platform-ios.platform-cordova.status-bar-hide{margin-bottom:20px}@media (orientation:landscape){.platform-ios.platform-browser.platform-ipad{position:fixed}}.platform-c:not(.enable-transitions) *{-webkit-transition:none!important;transition:none!important}.slide-in-up{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.slide-in-up.ng-enter,.slide-in-up>.ng-enter{-webkit-transition:all cubic-bezier(.1,.7,.1,1) 400ms;transition:all cubic-bezier(.1,.7,.1,1) 400ms}.slide-in-up.ng-enter-active,.slide-in-up>.ng-enter-active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-in-up.ng-leave,.slide-in-up>.ng-leave{-webkit-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms}@-webkit-keyframes scaleOut{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.8);opacity:0}}@keyframes scaleOut{from{transform:scale(1);opacity:1}to{transform:scale(.8);opacity:0}}@-webkit-keyframes superScaleIn{from{-webkit-transform:scale(1.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@keyframes superScaleIn{from{transform:scale(1.2);opacity:0}to{transform:scale(1);opacity:1}}[nav-view-transition=ios] [nav-view=entering],[nav-view-transition=ios] [nav-view=leaving]{-webkit-transition-duration:500ms;transition-duration:500ms;-webkit-transition-timing-function:cubic-bezier(.36,.66,.04,1);transition-timing-function:cubic-bezier(.36,.66,.04,1);-webkit-transition-property:opacity,-webkit-transform,box-shadow;transition-property:opacity,transform,box-shadow}[nav-view-transition=ios][nav-view-direction=forward],[nav-view-transition=ios][nav-view-direction=back]{background-color:#000}[nav-view-transition=ios] [nav-view=active],[nav-view-transition=ios][nav-view-direction=forward] [nav-view=entering],[nav-view-transition=ios][nav-view-direction=back] [nav-view=leaving]{z-index:3}[nav-view-transition=ios][nav-view-direction=forward] [nav-view=leaving],[nav-view-transition=ios][nav-view-direction=back] [nav-view=entering]{z-index:2}[nav-bar-transition=ios] .back-text,[nav-bar-transition=ios] .buttons,[nav-bar-transition=ios] .title{-webkit-transition-duration:500ms;transition-duration:500ms;-webkit-transition-timing-function:cubic-bezier(.36,.66,.04,1);transition-timing-function:cubic-bezier(.36,.66,.04,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,transform}[nav-bar-transition=ios] [nav-bar=entering],[nav-bar-transition=ios] [nav-bar=active]{z-index:10}[nav-bar-transition=ios] [nav-bar=entering] .bar,[nav-bar-transition=ios] [nav-bar=active] .bar{background:0 0}[nav-bar-transition=ios] [nav-bar=cached]{display:block}[nav-bar-transition=ios] [nav-bar=cached] .header-item{display:none}[nav-view-transition=android] [nav-view=entering],[nav-view-transition=android] [nav-view=leaving]{-webkit-transition-duration:200ms;transition-duration:200ms;-webkit-transition-timing-function:cubic-bezier(.4,.6,.2,1);transition-timing-function:cubic-bezier(.4,.6,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform}[nav-view-transition=android] [nav-view=active],[nav-view-transition=android][nav-view-direction=forward] [nav-view=entering],[nav-view-transition=android][nav-view-direction=back] [nav-view=leaving]{z-index:3}[nav-view-transition=android][nav-view-direction=forward] [nav-view=leaving],[nav-view-transition=android][nav-view-direction=back] [nav-view=entering]{z-index:2}[nav-bar-transition=android] .buttons,[nav-bar-transition=android] .title{-webkit-transition-duration:200ms;transition-duration:200ms;-webkit-transition-timing-function:cubic-bezier(.4,.6,.2,1);transition-timing-function:cubic-bezier(.4,.6,.2,1);-webkit-transition-property:opacity;transition-property:opacity}[nav-bar-transition=android] [nav-bar=entering],[nav-bar-transition=android] [nav-bar=active]{z-index:10}[nav-bar-transition=android] [nav-bar=entering] .bar,[nav-bar-transition=android] [nav-bar=active] .bar{background:0 0}[nav-bar-transition=android] [nav-bar=cached]{display:block}[nav-bar-transition=android] [nav-bar=cached] .header-item{display:none}[nav-swipe=fast] .back-text,[nav-swipe=fast] .buttons,[nav-swipe=fast] .title,[nav-swipe=fast] [nav-view]{-webkit-transition-duration:50ms;transition-duration:50ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}[nav-swipe=slow] .back-text,[nav-swipe=slow] .buttons,[nav-swipe=slow] .title,[nav-swipe=slow] [nav-view]{-webkit-transition-duration:160ms;transition-duration:160ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}[nav-bar=cached],[nav-view=cached]{display:none}[nav-view=stage]{opacity:0;-webkit-transition-duration:0;transition-duration:0}[nav-bar=stage] .back-text,[nav-bar=stage] .buttons,[nav-bar=stage] .title{position:absolute;opacity:0;-webkit-transition-duration:0s;transition-duration:0s} \ No newline at end of file diff --git a/www/lib/ionic/fonts/ionicons.eot b/www/lib/ionic/fonts/ionicons.eot new file mode 100644 index 0000000000000000000000000000000000000000..92a3f20a39267ae7f45144f412a995a663730360 GIT binary patch literal 120724 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

8E#xmG!w{$tO5=<$!EHPzZXo}IBc1_sqA&q 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 literal 0 HcmV?d00001 diff --git a/www/lib/ionic/fonts/ionicons.woff b/www/lib/ionic/fonts/ionicons.woff new file mode 100644 index 0000000000000000000000000000000000000000..5f3a14e0a5ca6d20cc4fac708979e807b0d51bc3 GIT binary patch literal 67904 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

  • F(S(gioucm()OHA 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 E0LEz`i~s-t literal 0 HcmV?d00001 diff --git a/www/lib/ionic/js/angular-ui/angular-ui-router.js b/www/lib/ionic/js/angular-ui/angular-ui-router.js new file mode 100644 index 0000000..d2636f8 --- /dev/null +++ b/www/lib/ionic/js/angular-ui/angular-ui-router.js @@ -0,0 +1,4232 @@ +/** + * State-based routing for AngularJS + * @version v0.2.13 + * @link http://angular-ui.github.com/ + * @license MIT License, http://www.opensource.org/licenses/MIT + */ + +/* commonjs package manager support (eg componentjs) */ +if (typeof module !== "undefined" && typeof exports !== "undefined" && module.exports === exports){ + module.exports = 'ui.router'; +} + +(function (window, angular, undefined) { +/*jshint globalstrict:true*/ +/*global angular:false*/ +'use strict'; + +var isDefined = angular.isDefined, + isFunction = angular.isFunction, + isString = angular.isString, + isObject = angular.isObject, + isArray = angular.isArray, + forEach = angular.forEach, + extend = angular.extend, + copy = angular.copy; + +function inherit(parent, extra) { + return extend(new (extend(function() {}, { prototype: parent }))(), extra); +} + +function merge(dst) { + forEach(arguments, function(obj) { + if (obj !== dst) { + forEach(obj, function(value, key) { + if (!dst.hasOwnProperty(key)) dst[key] = value; + }); + } + }); + return dst; +} + +/** + * Finds the common ancestor path between two states. + * + * @param {Object} first The first state. + * @param {Object} second The second state. + * @return {Array} Returns an array of state names in descending order, not including the root. + */ +function ancestors(first, second) { + var path = []; + + for (var n in first.path) { + if (first.path[n] !== second.path[n]) break; + path.push(first.path[n]); + } + return path; +} + +/** + * IE8-safe wrapper for `Object.keys()`. + * + * @param {Object} object A JavaScript object. + * @return {Array} Returns the keys of the object as an array. + */ +function objectKeys(object) { + if (Object.keys) { + return Object.keys(object); + } + var result = []; + + angular.forEach(object, function(val, key) { + result.push(key); + }); + return result; +} + +/** + * IE8-safe wrapper for `Array.prototype.indexOf()`. + * + * @param {Array} array A JavaScript array. + * @param {*} value A value to search the array for. + * @return {Number} Returns the array index value of `value`, or `-1` if not present. + */ +function indexOf(array, value) { + if (Array.prototype.indexOf) { + return array.indexOf(value, Number(arguments[2]) || 0); + } + var len = array.length >>> 0, from = Number(arguments[2]) || 0; + from = (from < 0) ? Math.ceil(from) : Math.floor(from); + + if (from < 0) from += len; + + for (; from < len; from++) { + if (from in array && array[from] === value) return from; + } + return -1; +} + +/** + * Merges a set of parameters with all parameters inherited between the common parents of the + * current state and a given destination state. + * + * @param {Object} currentParams The value of the current state parameters ($stateParams). + * @param {Object} newParams The set of parameters which will be composited with inherited params. + * @param {Object} $current Internal definition of object representing the current state. + * @param {Object} $to Internal definition of object representing state to transition to. + */ +function inheritParams(currentParams, newParams, $current, $to) { + var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = []; + + for (var i in parents) { + if (!parents[i].params) continue; + parentParams = objectKeys(parents[i].params); + if (!parentParams.length) continue; + + for (var j in parentParams) { + if (indexOf(inheritList, parentParams[j]) >= 0) continue; + inheritList.push(parentParams[j]); + inherited[parentParams[j]] = currentParams[parentParams[j]]; + } + } + return extend({}, inherited, newParams); +} + +/** + * Performs a non-strict comparison of the subset of two objects, defined by a list of keys. + * + * @param {Object} a The first object. + * @param {Object} b The second object. + * @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified, + * it defaults to the list of keys in `a`. + * @return {Boolean} Returns `true` if the keys match, otherwise `false`. + */ +function equalForKeys(a, b, keys) { + if (!keys) { + keys = []; + for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility + } + + for (var i=0; i + * + * + * + * + * + * + * + * + * + * + * + * + */ +angular.module('ui.router', ['ui.router.state']); + +angular.module('ui.router.compat', ['ui.router']); + +/** + * @ngdoc object + * @name ui.router.util.$resolve + * + * @requires $q + * @requires $injector + * + * @description + * Manages resolution of (acyclic) graphs of promises. + */ +$Resolve.$inject = ['$q', '$injector']; +function $Resolve( $q, $injector) { + + var VISIT_IN_PROGRESS = 1, + VISIT_DONE = 2, + NOTHING = {}, + NO_DEPENDENCIES = [], + NO_LOCALS = NOTHING, + NO_PARENT = extend($q.when(NOTHING), { $$promises: NOTHING, $$values: NOTHING }); + + + /** + * @ngdoc function + * @name ui.router.util.$resolve#study + * @methodOf ui.router.util.$resolve + * + * @description + * Studies a set of invocables that are likely to be used multiple times. + *
    +   * $resolve.study(invocables)(locals, parent, self)
    +   * 
    + * is equivalent to + *
    +   * $resolve.resolve(invocables, locals, parent, self)
    +   * 
    + * but the former is more efficient (in fact `resolve` just calls `study` + * internally). + * + * @param {object} invocables Invocable objects + * @return {function} a function to pass in locals, parent and self + */ + this.study = function (invocables) { + if (!isObject(invocables)) throw new Error("'invocables' must be an object"); + var invocableKeys = objectKeys(invocables || {}); + + // Perform a topological sort of invocables to build an ordered plan + var plan = [], cycle = [], visited = {}; + function visit(value, key) { + if (visited[key] === VISIT_DONE) return; + + cycle.push(key); + if (visited[key] === VISIT_IN_PROGRESS) { + cycle.splice(0, indexOf(cycle, key)); + throw new Error("Cyclic dependency: " + cycle.join(" -> ")); + } + visited[key] = VISIT_IN_PROGRESS; + + if (isString(value)) { + plan.push(key, [ function() { return $injector.get(value); }], NO_DEPENDENCIES); + } else { + var params = $injector.annotate(value); + forEach(params, function (param) { + if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param); + }); + plan.push(key, value, params); + } + + cycle.pop(); + visited[key] = VISIT_DONE; + } + forEach(invocables, visit); + invocables = cycle = visited = null; // plan is all that's required + + function isResolve(value) { + return isObject(value) && value.then && value.$$promises; + } + + return function (locals, parent, self) { + if (isResolve(locals) && self === undefined) { + self = parent; parent = locals; locals = null; + } + if (!locals) locals = NO_LOCALS; + else if (!isObject(locals)) { + throw new Error("'locals' must be an object"); + } + if (!parent) parent = NO_PARENT; + else if (!isResolve(parent)) { + throw new Error("'parent' must be a promise returned by $resolve.resolve()"); + } + + // To complete the overall resolution, we have to wait for the parent + // promise and for the promise for each invokable in our plan. + var resolution = $q.defer(), + result = resolution.promise, + promises = result.$$promises = {}, + values = extend({}, locals), + wait = 1 + plan.length/3, + merged = false; + + function done() { + // Merge parent values we haven't got yet and publish our own $$values + if (!--wait) { + if (!merged) merge(values, parent.$$values); + result.$$values = values; + result.$$promises = result.$$promises || true; // keep for isResolve() + delete result.$$inheritedValues; + resolution.resolve(values); + } + } + + function fail(reason) { + result.$$failure = reason; + resolution.reject(reason); + } + + // Short-circuit if parent has already failed + if (isDefined(parent.$$failure)) { + fail(parent.$$failure); + return result; + } + + if (parent.$$inheritedValues) { + merge(values, omit(parent.$$inheritedValues, invocableKeys)); + } + + // Merge parent values if the parent has already resolved, or merge + // parent promises and wait if the parent resolve is still in progress. + extend(promises, parent.$$promises); + if (parent.$$values) { + merged = merge(values, omit(parent.$$values, invocableKeys)); + result.$$inheritedValues = omit(parent.$$values, invocableKeys); + done(); + } else { + if (parent.$$inheritedValues) { + result.$$inheritedValues = omit(parent.$$inheritedValues, invocableKeys); + } + parent.then(done, fail); + } + + // Process each invocable in the plan, but ignore any where a local of the same name exists. + for (var i=0, ii=plan.length; i} The template html as a string, or a promise + * for that string. + */ + this.fromUrl = function (url, params) { + if (isFunction(url)) url = url(params); + if (url == null) return null; + else return $http + .get(url, { cache: $templateCache, headers: { Accept: 'text/html' }}) + .then(function(response) { return response.data; }); + }; + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromProvider + * @methodOf ui.router.util.$templateFactory + * + * @description + * Creates a template by invoking an injectable provider function. + * + * @param {Function} provider Function to invoke via `$injector.invoke` + * @param {Object} params Parameters for the template. + * @param {Object} locals Locals to pass to `invoke`. Defaults to + * `{ params: params }`. + * @return {string|Promise.} The template html as a string, or a promise + * for that string. + */ + this.fromProvider = function (provider, params, locals) { + return $injector.invoke(provider, null, locals || { params: params }); + }; +} + +angular.module('ui.router.util').service('$templateFactory', $TemplateFactory); + +var $$UMFP; // reference to $UrlMatcherFactoryProvider + +/** + * @ngdoc object + * @name ui.router.util.type:UrlMatcher + * + * @description + * Matches URLs against patterns and extracts named parameters from the path or the search + * part of the URL. A URL pattern consists of a path pattern, optionally followed by '?' and a list + * of search parameters. Multiple search parameter names are separated by '&'. Search parameters + * do not influence whether or not a URL is matched, but their values are passed through into + * the matched parameters returned by {@link ui.router.util.type:UrlMatcher#methods_exec exec}. + * + * Path parameter placeholders can be specified using simple colon/catch-all syntax or curly brace + * syntax, which optionally allows a regular expression for the parameter to be specified: + * + * * `':'` name - colon placeholder + * * `'*'` name - catch-all placeholder + * * `'{' name '}'` - curly placeholder + * * `'{' name ':' regexp|type '}'` - curly placeholder with regexp or type name. Should the + * regexp itself contain curly braces, they must be in matched pairs or escaped with a backslash. + * + * Parameter names may contain only word characters (latin letters, digits, and underscore) and + * must be unique within the pattern (across both path and search parameters). For colon + * placeholders or curly placeholders without an explicit regexp, a path parameter matches any + * number of characters other than '/'. For catch-all placeholders the path parameter matches + * any number of characters. + * + * Examples: + * + * * `'/hello/'` - Matches only if the path is exactly '/hello/'. There is no special treatment for + * trailing slashes, and patterns have to match the entire path, not just a prefix. + * * `'/user/:id'` - Matches '/user/bob' or '/user/1234!!!' or even '/user/' but not '/user' or + * '/user/bob/details'. The second path segment will be captured as the parameter 'id'. + * * `'/user/{id}'` - Same as the previous example, but using curly brace syntax. + * * `'/user/{id:[^/]*}'` - Same as the previous example. + * * `'/user/{id:[0-9a-fA-F]{1,8}}'` - Similar to the previous example, but only matches if the id + * parameter consists of 1 to 8 hex digits. + * * `'/files/{path:.*}'` - Matches any URL starting with '/files/' and captures the rest of the + * path into the parameter 'path'. + * * `'/files/*path'` - ditto. + * * `'/calendar/{start:date}'` - Matches "/calendar/2014-11-12" (because the pattern defined + * in the built-in `date` Type matches `2014-11-12`) and provides a Date object in $stateParams.start + * + * @param {string} pattern The pattern to compile into a matcher. + * @param {Object} config A configuration object hash: + * @param {Object=} parentMatcher Used to concatenate the pattern/config onto + * an existing UrlMatcher + * + * * `caseInsensitive` - `true` if URL matching should be case insensitive, otherwise `false`, the default value (for backward compatibility) is `false`. + * * `strict` - `false` if matching against a URL with a trailing slash should be treated as equivalent to a URL without a trailing slash, the default value is `true`. + * + * @property {string} prefix A static prefix of this pattern. The matcher guarantees that any + * URL matching this matcher (i.e. any string for which {@link ui.router.util.type:UrlMatcher#methods_exec exec()} returns + * non-null) will start with this prefix. + * + * @property {string} source The pattern that was passed into the constructor + * + * @property {string} sourcePath The path portion of the source property + * + * @property {string} sourceSearch The search portion of the source property + * + * @property {string} regex The constructed regex that will be used to match against the url when + * it is time to determine which url will match. + * + * @returns {Object} New `UrlMatcher` object + */ +function UrlMatcher(pattern, config, parentMatcher) { + config = extend({ params: {} }, isObject(config) ? config : {}); + + // Find all placeholders and create a compiled pattern, using either classic or curly syntax: + // '*' name + // ':' name + // '{' name '}' + // '{' name ':' regexp '}' + // The regular expression is somewhat complicated due to the need to allow curly braces + // inside the regular expression. The placeholder regexp breaks down as follows: + // ([:*])([\w\[\]]+) - classic placeholder ($1 / $2) (search version has - for snake-case) + // \{([\w\[\]]+)(?:\:( ... ))?\} - curly brace placeholder ($3) with optional regexp/type ... ($4) (search version has - for snake-case + // (?: ... | ... | ... )+ - the regexp consists of any number of atoms, an atom being either + // [^{}\\]+ - anything other than curly braces or backslash + // \\. - a backslash escape + // \{(?:[^{}\\]+|\\.)*\} - a matched set of curly braces containing other atoms + var placeholder = /([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g, + searchPlaceholder = /([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g, + compiled = '^', last = 0, m, + segments = this.segments = [], + parentParams = parentMatcher ? parentMatcher.params : {}, + params = this.params = parentMatcher ? parentMatcher.params.$$new() : new $$UMFP.ParamSet(), + paramNames = []; + + function addParameter(id, type, config, location) { + paramNames.push(id); + if (parentParams[id]) return parentParams[id]; + if (!/^\w+(-+\w+)*(?:\[\])?$/.test(id)) throw new Error("Invalid parameter name '" + id + "' in pattern '" + pattern + "'"); + if (params[id]) throw new Error("Duplicate parameter name '" + id + "' in pattern '" + pattern + "'"); + params[id] = new $$UMFP.Param(id, type, config, location); + return params[id]; + } + + function quoteRegExp(string, pattern, squash) { + var surroundPattern = ['',''], result = string.replace(/[\\\[\]\^$*+?.()|{}]/g, "\\$&"); + if (!pattern) return result; + switch(squash) { + case false: surroundPattern = ['(', ')']; break; + case true: surroundPattern = ['?(', ')?']; break; + default: surroundPattern = ['(' + squash + "|", ')?']; break; + } + return result + surroundPattern[0] + pattern + surroundPattern[1]; + } + + this.source = pattern; + + // Split into static segments separated by path parameter placeholders. + // The number of segments is always 1 more than the number of parameters. + function matchDetails(m, isSearch) { + var id, regexp, segment, type, cfg, arrayMode; + id = m[2] || m[3]; // IE[78] returns '' for unmatched groups instead of null + cfg = config.params[id]; + segment = pattern.substring(last, m.index); + regexp = isSearch ? m[4] : m[4] || (m[1] == '*' ? '.*' : null); + type = $$UMFP.type(regexp || "string") || inherit($$UMFP.type("string"), { pattern: new RegExp(regexp) }); + return { + id: id, regexp: regexp, segment: segment, type: type, cfg: cfg + }; + } + + var p, param, segment; + while ((m = placeholder.exec(pattern))) { + p = matchDetails(m, false); + if (p.segment.indexOf('?') >= 0) break; // we're into the search part + + param = addParameter(p.id, p.type, p.cfg, "path"); + compiled += quoteRegExp(p.segment, param.type.pattern.source, param.squash); + segments.push(p.segment); + last = placeholder.lastIndex; + } + segment = pattern.substring(last); + + // Find any search parameter names and remove them from the last segment + var i = segment.indexOf('?'); + + if (i >= 0) { + var search = this.sourceSearch = segment.substring(i); + segment = segment.substring(0, i); + this.sourcePath = pattern.substring(0, last + i); + + if (search.length > 0) { + last = 0; + while ((m = searchPlaceholder.exec(search))) { + p = matchDetails(m, true); + param = addParameter(p.id, p.type, p.cfg, "search"); + last = placeholder.lastIndex; + // check if ?& + } + } + } else { + this.sourcePath = pattern; + this.sourceSearch = ''; + } + + compiled += quoteRegExp(segment) + (config.strict === false ? '\/?' : '') + '$'; + segments.push(segment); + + this.regexp = new RegExp(compiled, config.caseInsensitive ? 'i' : undefined); + this.prefix = segments[0]; + this.$$paramNames = paramNames; +} + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#concat + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Returns a new matcher for a pattern constructed by appending the path part and adding the + * search parameters of the specified pattern to this pattern. The current pattern is not + * modified. This can be understood as creating a pattern for URLs that are relative to (or + * suffixes of) the current pattern. + * + * @example + * The following two matchers are equivalent: + *
    + * new UrlMatcher('/user/{id}?q').concat('/details?date');
    + * new UrlMatcher('/user/{id}/details?q&date');
    + * 
    + * + * @param {string} pattern The pattern to append. + * @param {Object} config An object hash of the configuration for the matcher. + * @returns {UrlMatcher} A matcher for the concatenated pattern. + */ +UrlMatcher.prototype.concat = function (pattern, config) { + // Because order of search parameters is irrelevant, we can add our own search + // parameters to the end of the new pattern. Parse the new pattern by itself + // and then join the bits together, but it's much easier to do this on a string level. + var defaultConfig = { + caseInsensitive: $$UMFP.caseInsensitive(), + strict: $$UMFP.strictMode(), + squash: $$UMFP.defaultSquashPolicy() + }; + return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch, extend(defaultConfig, config), this); +}; + +UrlMatcher.prototype.toString = function () { + return this.source; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#exec + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Tests the specified path against this matcher, and returns an object containing the captured + * parameter values, or null if the path does not match. The returned object contains the values + * of any search parameters that are mentioned in the pattern, but their value may be null if + * they are not present in `searchParams`. This means that search parameters are always treated + * as optional. + * + * @example + *
    + * new UrlMatcher('/user/{id}?q&r').exec('/user/bob', {
    + *   x: '1', q: 'hello'
    + * });
    + * // returns { id: 'bob', q: 'hello', r: null }
    + * 
    + * + * @param {string} path The URL path to match, e.g. `$location.path()`. + * @param {Object} searchParams URL search parameters, e.g. `$location.search()`. + * @returns {Object} The captured parameter values. + */ +UrlMatcher.prototype.exec = function (path, searchParams) { + var m = this.regexp.exec(path); + if (!m) return null; + searchParams = searchParams || {}; + + var paramNames = this.parameters(), nTotal = paramNames.length, + nPath = this.segments.length - 1, + values = {}, i, j, cfg, paramName; + + if (nPath !== m.length - 1) throw new Error("Unbalanced capture group in route '" + this.source + "'"); + + function decodePathArray(string) { + function reverseString(str) { return str.split("").reverse().join(""); } + function unquoteDashes(str) { return str.replace(/\\-/, "-"); } + + var split = reverseString(string).split(/-(?!\\)/); + var allReversed = map(split, reverseString); + return map(allReversed, unquoteDashes).reverse(); + } + + for (i = 0; i < nPath; i++) { + paramName = paramNames[i]; + var param = this.params[paramName]; + var paramVal = m[i+1]; + // if the param value matches a pre-replace pair, replace the value before decoding. + for (j = 0; j < param.replace; j++) { + if (param.replace[j].from === paramVal) paramVal = param.replace[j].to; + } + if (paramVal && param.array === true) paramVal = decodePathArray(paramVal); + values[paramName] = param.value(paramVal); + } + for (/**/; i < nTotal; i++) { + paramName = paramNames[i]; + values[paramName] = this.params[paramName].value(searchParams[paramName]); + } + + return values; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#parameters + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Returns the names of all path and search parameters of this pattern in an unspecified order. + * + * @returns {Array.} An array of parameter names. Must be treated as read-only. If the + * pattern has no parameters, an empty array is returned. + */ +UrlMatcher.prototype.parameters = function (param) { + if (!isDefined(param)) return this.$$paramNames; + return this.params[param] || null; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#validate + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Checks an object hash of parameters to validate their correctness according to the parameter + * types of this `UrlMatcher`. + * + * @param {Object} params The object hash of parameters to validate. + * @returns {boolean} Returns `true` if `params` validates, otherwise `false`. + */ +UrlMatcher.prototype.validates = function (params) { + return this.params.$$validates(params); +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#format + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Creates a URL that matches this pattern by substituting the specified values + * for the path and search parameters. Null values for path parameters are + * treated as empty strings. + * + * @example + *
    + * new UrlMatcher('/user/{id}?q').format({ id:'bob', q:'yes' });
    + * // returns '/user/bob?q=yes'
    + * 
    + * + * @param {Object} values the values to substitute for the parameters in this pattern. + * @returns {string} the formatted URL (path and optionally search part). + */ +UrlMatcher.prototype.format = function (values) { + values = values || {}; + var segments = this.segments, params = this.parameters(), paramset = this.params; + if (!this.validates(values)) return null; + + var i, search = false, nPath = segments.length - 1, nTotal = params.length, result = segments[0]; + + function encodeDashes(str) { // Replace dashes with encoded "\-" + return encodeURIComponent(str).replace(/-/g, function(c) { return '%5C%' + c.charCodeAt(0).toString(16).toUpperCase(); }); + } + + for (i = 0; i < nTotal; i++) { + var isPathParam = i < nPath; + var name = params[i], param = paramset[name], value = param.value(values[name]); + var isDefaultValue = param.isOptional && param.type.equals(param.value(), value); + var squash = isDefaultValue ? param.squash : false; + var encoded = param.type.encode(value); + + if (isPathParam) { + var nextSegment = segments[i + 1]; + if (squash === false) { + if (encoded != null) { + if (isArray(encoded)) { + result += map(encoded, encodeDashes).join("-"); + } else { + result += encodeURIComponent(encoded); + } + } + result += nextSegment; + } else if (squash === true) { + var capture = result.match(/\/$/) ? /\/?(.*)/ : /(.*)/; + result += nextSegment.match(capture)[1]; + } else if (isString(squash)) { + result += squash + nextSegment; + } + } else { + if (encoded == null || (isDefaultValue && squash !== false)) continue; + if (!isArray(encoded)) encoded = [ encoded ]; + encoded = map(encoded, encodeURIComponent).join('&' + name + '='); + result += (search ? '&' : '?') + (name + '=' + encoded); + search = true; + } + } + + return result; +}; + +/** + * @ngdoc object + * @name ui.router.util.type:Type + * + * @description + * Implements an interface to define custom parameter types that can be decoded from and encoded to + * string parameters matched in a URL. Used by {@link ui.router.util.type:UrlMatcher `UrlMatcher`} + * objects when matching or formatting URLs, or comparing or validating parameter values. + * + * See {@link ui.router.util.$urlMatcherFactory#methods_type `$urlMatcherFactory#type()`} for more + * information on registering custom types. + * + * @param {Object} config A configuration object which contains the custom type definition. The object's + * properties will override the default methods and/or pattern in `Type`'s public interface. + * @example + *
    + * {
    + *   decode: function(val) { return parseInt(val, 10); },
    + *   encode: function(val) { return val && val.toString(); },
    + *   equals: function(a, b) { return this.is(a) && a === b; },
    + *   is: function(val) { return angular.isNumber(val) isFinite(val) && val % 1 === 0; },
    + *   pattern: /\d+/
    + * }
    + * 
    + * + * @property {RegExp} pattern The regular expression pattern used to match values of this type when + * coming from a substring of a URL. + * + * @returns {Object} Returns a new `Type` object. + */ +function Type(config) { + extend(this, config); +} + +/** + * @ngdoc function + * @name ui.router.util.type:Type#is + * @methodOf ui.router.util.type:Type + * + * @description + * Detects whether a value is of a particular type. Accepts a native (decoded) value + * and determines whether it matches the current `Type` object. + * + * @param {*} val The value to check. + * @param {string} key Optional. If the type check is happening in the context of a specific + * {@link ui.router.util.type:UrlMatcher `UrlMatcher`} object, this is the name of the + * parameter in which `val` is stored. Can be used for meta-programming of `Type` objects. + * @returns {Boolean} Returns `true` if the value matches the type, otherwise `false`. + */ +Type.prototype.is = function(val, key) { + return true; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#encode + * @methodOf ui.router.util.type:Type + * + * @description + * Encodes a custom/native type value to a string that can be embedded in a URL. Note that the + * return value does *not* need to be URL-safe (i.e. passed through `encodeURIComponent()`), it + * only needs to be a representation of `val` that has been coerced to a string. + * + * @param {*} val The value to encode. + * @param {string} key The name of the parameter in which `val` is stored. Can be used for + * meta-programming of `Type` objects. + * @returns {string} Returns a string representation of `val` that can be encoded in a URL. + */ +Type.prototype.encode = function(val, key) { + return val; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#decode + * @methodOf ui.router.util.type:Type + * + * @description + * Converts a parameter value (from URL string or transition param) to a custom/native value. + * + * @param {string} val The URL parameter value to decode. + * @param {string} key The name of the parameter in which `val` is stored. Can be used for + * meta-programming of `Type` objects. + * @returns {*} Returns a custom representation of the URL parameter value. + */ +Type.prototype.decode = function(val, key) { + return val; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#equals + * @methodOf ui.router.util.type:Type + * + * @description + * Determines whether two decoded values are equivalent. + * + * @param {*} a A value to compare against. + * @param {*} b A value to compare against. + * @returns {Boolean} Returns `true` if the values are equivalent/equal, otherwise `false`. + */ +Type.prototype.equals = function(a, b) { + return a == b; +}; + +Type.prototype.$subPattern = function() { + var sub = this.pattern.toString(); + return sub.substr(1, sub.length - 2); +}; + +Type.prototype.pattern = /.*/; + +Type.prototype.toString = function() { return "{Type:" + this.name + "}"; }; + +/* + * Wraps an existing custom Type as an array of Type, depending on 'mode'. + * e.g.: + * - urlmatcher pattern "/path?{queryParam[]:int}" + * - url: "/path?queryParam=1&queryParam=2 + * - $stateParams.queryParam will be [1, 2] + * if `mode` is "auto", then + * - url: "/path?queryParam=1 will create $stateParams.queryParam: 1 + * - url: "/path?queryParam=1&queryParam=2 will create $stateParams.queryParam: [1, 2] + */ +Type.prototype.$asArray = function(mode, isSearch) { + if (!mode) return this; + if (mode === "auto" && !isSearch) throw new Error("'auto' array mode is for query parameters only"); + return new ArrayType(this, mode); + + function ArrayType(type, mode) { + function bindTo(type, callbackName) { + return function() { + return type[callbackName].apply(type, arguments); + }; + } + + // Wrap non-array value as array + function arrayWrap(val) { return isArray(val) ? val : (isDefined(val) ? [ val ] : []); } + // Unwrap array value for "auto" mode. Return undefined for empty array. + function arrayUnwrap(val) { + switch(val.length) { + case 0: return undefined; + case 1: return mode === "auto" ? val[0] : val; + default: return val; + } + } + function falsey(val) { return !val; } + + // Wraps type (.is/.encode/.decode) functions to operate on each value of an array + function arrayHandler(callback, allTruthyMode) { + return function handleArray(val) { + val = arrayWrap(val); + var result = map(val, callback); + if (allTruthyMode === true) + return filter(result, falsey).length === 0; + return arrayUnwrap(result); + }; + } + + // Wraps type (.equals) functions to operate on each value of an array + function arrayEqualsHandler(callback) { + return function handleArray(val1, val2) { + var left = arrayWrap(val1), right = arrayWrap(val2); + if (left.length !== right.length) return false; + for (var i = 0; i < left.length; i++) { + if (!callback(left[i], right[i])) return false; + } + return true; + }; + } + + this.encode = arrayHandler(bindTo(type, 'encode')); + this.decode = arrayHandler(bindTo(type, 'decode')); + this.is = arrayHandler(bindTo(type, 'is'), true); + this.equals = arrayEqualsHandler(bindTo(type, 'equals')); + this.pattern = type.pattern; + this.$arrayMode = mode; + } +}; + + + +/** + * @ngdoc object + * @name ui.router.util.$urlMatcherFactory + * + * @description + * Factory for {@link ui.router.util.type:UrlMatcher `UrlMatcher`} instances. The factory + * is also available to providers under the name `$urlMatcherFactoryProvider`. + */ +function $UrlMatcherFactory() { + $$UMFP = this; + + var isCaseInsensitive = false, isStrictMode = true, defaultSquashPolicy = false; + + function valToString(val) { return val != null ? val.toString().replace(/\//g, "%2F") : val; } + function valFromString(val) { return val != null ? val.toString().replace(/%2F/g, "/") : val; } +// TODO: in 1.0, make string .is() return false if value is undefined by default. +// function regexpMatches(val) { /*jshint validthis:true */ return isDefined(val) && this.pattern.test(val); } + function regexpMatches(val) { /*jshint validthis:true */ return this.pattern.test(val); } + + var $types = {}, enqueue = true, typeQueue = [], injector, defaultTypes = { + string: { + encode: valToString, + decode: valFromString, + is: regexpMatches, + pattern: /[^/]*/ + }, + int: { + encode: valToString, + decode: function(val) { return parseInt(val, 10); }, + is: function(val) { return isDefined(val) && this.decode(val.toString()) === val; }, + pattern: /\d+/ + }, + bool: { + encode: function(val) { return val ? 1 : 0; }, + decode: function(val) { return parseInt(val, 10) !== 0; }, + is: function(val) { return val === true || val === false; }, + pattern: /0|1/ + }, + date: { + encode: function (val) { + if (!this.is(val)) + return undefined; + return [ val.getFullYear(), + ('0' + (val.getMonth() + 1)).slice(-2), + ('0' + val.getDate()).slice(-2) + ].join("-"); + }, + decode: function (val) { + if (this.is(val)) return val; + var match = this.capture.exec(val); + return match ? new Date(match[1], match[2] - 1, match[3]) : undefined; + }, + is: function(val) { return val instanceof Date && !isNaN(val.valueOf()); }, + equals: function (a, b) { return this.is(a) && this.is(b) && a.toISOString() === b.toISOString(); }, + pattern: /[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/, + capture: /([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/ + }, + json: { + encode: angular.toJson, + decode: angular.fromJson, + is: angular.isObject, + equals: angular.equals, + pattern: /[^/]*/ + }, + any: { // does not encode/decode + encode: angular.identity, + decode: angular.identity, + is: angular.identity, + equals: angular.equals, + pattern: /.*/ + } + }; + + function getDefaultConfig() { + return { + strict: isStrictMode, + caseInsensitive: isCaseInsensitive + }; + } + + function isInjectable(value) { + return (isFunction(value) || (isArray(value) && isFunction(value[value.length - 1]))); + } + + /** + * [Internal] Get the default value of a parameter, which may be an injectable function. + */ + $UrlMatcherFactory.$$getDefaultValue = function(config) { + if (!isInjectable(config.value)) return config.value; + if (!injector) throw new Error("Injectable functions cannot be called at configuration time"); + return injector.invoke(config.value); + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#caseInsensitive + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Defines whether URL matching should be case sensitive (the default behavior), or not. + * + * @param {boolean} value `false` to match URL in a case sensitive manner; otherwise `true`; + * @returns {boolean} the current value of caseInsensitive + */ + this.caseInsensitive = function(value) { + if (isDefined(value)) + isCaseInsensitive = value; + return isCaseInsensitive; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#strictMode + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Defines whether URLs should match trailing slashes, or not (the default behavior). + * + * @param {boolean=} value `false` to match trailing slashes in URLs, otherwise `true`. + * @returns {boolean} the current value of strictMode + */ + this.strictMode = function(value) { + if (isDefined(value)) + isStrictMode = value; + return isStrictMode; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#defaultSquashPolicy + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Sets the default behavior when generating or matching URLs with default parameter values. + * + * @param {string} value A string that defines the default parameter URL squashing behavior. + * `nosquash`: When generating an href with a default parameter value, do not squash the parameter value from the URL + * `slash`: When generating an href with a default parameter value, squash (remove) the parameter value, and, if the + * parameter is surrounded by slashes, squash (remove) one slash from the URL + * any other string, e.g. "~": When generating an href with a default parameter value, squash (remove) + * the parameter value from the URL and replace it with this string. + */ + this.defaultSquashPolicy = function(value) { + if (!isDefined(value)) return defaultSquashPolicy; + if (value !== true && value !== false && !isString(value)) + throw new Error("Invalid squash policy: " + value + ". Valid policies: false, true, arbitrary-string"); + defaultSquashPolicy = value; + return value; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#compile + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Creates a {@link ui.router.util.type:UrlMatcher `UrlMatcher`} for the specified pattern. + * + * @param {string} pattern The URL pattern. + * @param {Object} config The config object hash. + * @returns {UrlMatcher} The UrlMatcher. + */ + this.compile = function (pattern, config) { + return new UrlMatcher(pattern, extend(getDefaultConfig(), config)); + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#isMatcher + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Returns true if the specified object is a `UrlMatcher`, or false otherwise. + * + * @param {Object} object The object to perform the type check against. + * @returns {Boolean} Returns `true` if the object matches the `UrlMatcher` interface, by + * implementing all the same methods. + */ + this.isMatcher = function (o) { + if (!isObject(o)) return false; + var result = true; + + forEach(UrlMatcher.prototype, function(val, name) { + if (isFunction(val)) { + result = result && (isDefined(o[name]) && isFunction(o[name])); + } + }); + return result; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#type + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Registers a custom {@link ui.router.util.type:Type `Type`} object that can be used to + * generate URLs with typed parameters. + * + * @param {string} name The type name. + * @param {Object|Function} definition The type definition. See + * {@link ui.router.util.type:Type `Type`} for information on the values accepted. + * @param {Object|Function} definitionFn (optional) A function that is injected before the app + * runtime starts. The result of this function is merged into the existing `definition`. + * See {@link ui.router.util.type:Type `Type`} for information on the values accepted. + * + * @returns {Object} Returns `$urlMatcherFactoryProvider`. + * + * @example + * This is a simple example of a custom type that encodes and decodes items from an + * array, using the array index as the URL-encoded value: + * + *
    +   * var list = ['John', 'Paul', 'George', 'Ringo'];
    +   *
    +   * $urlMatcherFactoryProvider.type('listItem', {
    +   *   encode: function(item) {
    +   *     // Represent the list item in the URL using its corresponding index
    +   *     return list.indexOf(item);
    +   *   },
    +   *   decode: function(item) {
    +   *     // Look up the list item by index
    +   *     return list[parseInt(item, 10)];
    +   *   },
    +   *   is: function(item) {
    +   *     // Ensure the item is valid by checking to see that it appears
    +   *     // in the list
    +   *     return list.indexOf(item) > -1;
    +   *   }
    +   * });
    +   *
    +   * $stateProvider.state('list', {
    +   *   url: "/list/{item:listItem}",
    +   *   controller: function($scope, $stateParams) {
    +   *     console.log($stateParams.item);
    +   *   }
    +   * });
    +   *
    +   * // ...
    +   *
    +   * // Changes URL to '/list/3', logs "Ringo" to the console
    +   * $state.go('list', { item: "Ringo" });
    +   * 
    + * + * This is a more complex example of a type that relies on dependency injection to + * interact with services, and uses the parameter name from the URL to infer how to + * handle encoding and decoding parameter values: + * + *
    +   * // Defines a custom type that gets a value from a service,
    +   * // where each service gets different types of values from
    +   * // a backend API:
    +   * $urlMatcherFactoryProvider.type('dbObject', {}, function(Users, Posts) {
    +   *
    +   *   // Matches up services to URL parameter names
    +   *   var services = {
    +   *     user: Users,
    +   *     post: Posts
    +   *   };
    +   *
    +   *   return {
    +   *     encode: function(object) {
    +   *       // Represent the object in the URL using its unique ID
    +   *       return object.id;
    +   *     },
    +   *     decode: function(value, key) {
    +   *       // Look up the object by ID, using the parameter
    +   *       // name (key) to call the correct service
    +   *       return services[key].findById(value);
    +   *     },
    +   *     is: function(object, key) {
    +   *       // Check that object is a valid dbObject
    +   *       return angular.isObject(object) && object.id && services[key];
    +   *     }
    +   *     equals: function(a, b) {
    +   *       // Check the equality of decoded objects by comparing
    +   *       // their unique IDs
    +   *       return a.id === b.id;
    +   *     }
    +   *   };
    +   * });
    +   *
    +   * // In a config() block, you can then attach URLs with
    +   * // type-annotated parameters:
    +   * $stateProvider.state('users', {
    +   *   url: "/users",
    +   *   // ...
    +   * }).state('users.item', {
    +   *   url: "/{user:dbObject}",
    +   *   controller: function($scope, $stateParams) {
    +   *     // $stateParams.user will now be an object returned from
    +   *     // the Users service
    +   *   },
    +   *   // ...
    +   * });
    +   * 
    + */ + this.type = function (name, definition, definitionFn) { + if (!isDefined(definition)) return $types[name]; + if ($types.hasOwnProperty(name)) throw new Error("A type named '" + name + "' has already been defined."); + + $types[name] = new Type(extend({ name: name }, definition)); + if (definitionFn) { + typeQueue.push({ name: name, def: definitionFn }); + if (!enqueue) flushTypeQueue(); + } + return this; + }; + + // `flushTypeQueue()` waits until `$urlMatcherFactory` is injected before invoking the queued `definitionFn`s + function flushTypeQueue() { + while(typeQueue.length) { + var type = typeQueue.shift(); + if (type.pattern) throw new Error("You cannot override a type's .pattern at runtime."); + angular.extend($types[type.name], injector.invoke(type.def)); + } + } + + // Register default types. Store them in the prototype of $types. + forEach(defaultTypes, function(type, name) { $types[name] = new Type(extend({name: name}, type)); }); + $types = inherit($types, {}); + + /* No need to document $get, since it returns this */ + this.$get = ['$injector', function ($injector) { + injector = $injector; + enqueue = false; + flushTypeQueue(); + + forEach(defaultTypes, function(type, name) { + if (!$types[name]) $types[name] = new Type(type); + }); + return this; + }]; + + this.Param = function Param(id, type, config, location) { + var self = this; + config = unwrapShorthand(config); + type = getType(config, type, location); + var arrayMode = getArrayMode(); + type = arrayMode ? type.$asArray(arrayMode, location === "search") : type; + if (type.name === "string" && !arrayMode && location === "path" && config.value === undefined) + config.value = ""; // for 0.2.x; in 0.3.0+ do not automatically default to "" + var isOptional = config.value !== undefined; + var squash = getSquashPolicy(config, isOptional); + var replace = getReplace(config, arrayMode, isOptional, squash); + + function unwrapShorthand(config) { + var keys = isObject(config) ? objectKeys(config) : []; + var isShorthand = indexOf(keys, "value") === -1 && indexOf(keys, "type") === -1 && + indexOf(keys, "squash") === -1 && indexOf(keys, "array") === -1; + if (isShorthand) config = { value: config }; + config.$$fn = isInjectable(config.value) ? config.value : function () { return config.value; }; + return config; + } + + function getType(config, urlType, location) { + if (config.type && urlType) throw new Error("Param '"+id+"' has two type configurations."); + if (urlType) return urlType; + if (!config.type) return (location === "config" ? $types.any : $types.string); + return config.type instanceof Type ? config.type : new Type(config.type); + } + + // array config: param name (param[]) overrides default settings. explicit config overrides param name. + function getArrayMode() { + var arrayDefaults = { array: (location === "search" ? "auto" : false) }; + var arrayParamNomenclature = id.match(/\[\]$/) ? { array: true } : {}; + return extend(arrayDefaults, arrayParamNomenclature, config).array; + } + + /** + * returns false, true, or the squash value to indicate the "default parameter url squash policy". + */ + function getSquashPolicy(config, isOptional) { + var squash = config.squash; + if (!isOptional || squash === false) return false; + if (!isDefined(squash) || squash == null) return defaultSquashPolicy; + if (squash === true || isString(squash)) return squash; + throw new Error("Invalid squash policy: '" + squash + "'. Valid policies: false, true, or arbitrary string"); + } + + function getReplace(config, arrayMode, isOptional, squash) { + var replace, configuredKeys, defaultPolicy = [ + { from: "", to: (isOptional || arrayMode ? undefined : "") }, + { from: null, to: (isOptional || arrayMode ? undefined : "") } + ]; + replace = isArray(config.replace) ? config.replace : []; + if (isString(squash)) + replace.push({ from: squash, to: undefined }); + configuredKeys = map(replace, function(item) { return item.from; } ); + return filter(defaultPolicy, function(item) { return indexOf(configuredKeys, item.from) === -1; }).concat(replace); + } + + /** + * [Internal] Get the default value of a parameter, which may be an injectable function. + */ + function $$getDefaultValue() { + if (!injector) throw new Error("Injectable functions cannot be called at configuration time"); + return injector.invoke(config.$$fn); + } + + /** + * [Internal] Gets the decoded representation of a value if the value is defined, otherwise, returns the + * default value, which may be the result of an injectable function. + */ + function $value(value) { + function hasReplaceVal(val) { return function(obj) { return obj.from === val; }; } + function $replace(value) { + var replacement = map(filter(self.replace, hasReplaceVal(value)), function(obj) { return obj.to; }); + return replacement.length ? replacement[0] : value; + } + value = $replace(value); + return isDefined(value) ? self.type.decode(value) : $$getDefaultValue(); + } + + function toString() { return "{Param:" + id + " " + type + " squash: '" + squash + "' optional: " + isOptional + "}"; } + + extend(this, { + id: id, + type: type, + location: location, + array: arrayMode, + squash: squash, + replace: replace, + isOptional: isOptional, + value: $value, + dynamic: undefined, + config: config, + toString: toString + }); + }; + + function ParamSet(params) { + extend(this, params || {}); + } + + ParamSet.prototype = { + $$new: function() { + return inherit(this, extend(new ParamSet(), { $$parent: this})); + }, + $$keys: function () { + var keys = [], chain = [], parent = this, + ignore = objectKeys(ParamSet.prototype); + while (parent) { chain.push(parent); parent = parent.$$parent; } + chain.reverse(); + forEach(chain, function(paramset) { + forEach(objectKeys(paramset), function(key) { + if (indexOf(keys, key) === -1 && indexOf(ignore, key) === -1) keys.push(key); + }); + }); + return keys; + }, + $$values: function(paramValues) { + var values = {}, self = this; + forEach(self.$$keys(), function(key) { + values[key] = self[key].value(paramValues && paramValues[key]); + }); + return values; + }, + $$equals: function(paramValues1, paramValues2) { + var equal = true, self = this; + forEach(self.$$keys(), function(key) { + var left = paramValues1 && paramValues1[key], right = paramValues2 && paramValues2[key]; + if (!self[key].type.equals(left, right)) equal = false; + }); + return equal; + }, + $$validates: function $$validate(paramValues) { + var result = true, isOptional, val, param, self = this; + + forEach(this.$$keys(), function(key) { + param = self[key]; + val = paramValues[key]; + isOptional = !val && param.isOptional; + result = result && (isOptional || !!param.type.is(val)); + }); + return result; + }, + $$parent: undefined + }; + + this.ParamSet = ParamSet; +} + +// Register as a provider so it's available to other providers +angular.module('ui.router.util').provider('$urlMatcherFactory', $UrlMatcherFactory); +angular.module('ui.router.util').run(['$urlMatcherFactory', function($urlMatcherFactory) { }]); + +/** + * @ngdoc object + * @name ui.router.router.$urlRouterProvider + * + * @requires ui.router.util.$urlMatcherFactoryProvider + * @requires $locationProvider + * + * @description + * `$urlRouterProvider` has the responsibility of watching `$location`. + * When `$location` changes it runs through a list of rules one by one until a + * match is found. `$urlRouterProvider` is used behind the scenes anytime you specify + * a url in a state configuration. All urls are compiled into a UrlMatcher object. + * + * There are several methods on `$urlRouterProvider` that make it useful to use directly + * in your module config. + */ +$UrlRouterProvider.$inject = ['$locationProvider', '$urlMatcherFactoryProvider']; +function $UrlRouterProvider( $locationProvider, $urlMatcherFactory) { + var rules = [], otherwise = null, interceptDeferred = false, listener; + + // Returns a string that is a prefix of all strings matching the RegExp + function regExpPrefix(re) { + var prefix = /^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(re.source); + return (prefix != null) ? prefix[1].replace(/\\(.)/g, "$1") : ''; + } + + // Interpolates matched values into a String.replace()-style pattern + function interpolate(pattern, match) { + return pattern.replace(/\$(\$|\d{1,2})/, function (m, what) { + return match[what === '$' ? 0 : Number(what)]; + }); + } + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#rule + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Defines rules that are used by `$urlRouterProvider` to find matches for + * specific URLs. + * + * @example + *
    +   * var app = angular.module('app', ['ui.router.router']);
    +   *
    +   * app.config(function ($urlRouterProvider) {
    +   *   // Here's an example of how you might allow case insensitive urls
    +   *   $urlRouterProvider.rule(function ($injector, $location) {
    +   *     var path = $location.path(),
    +   *         normalized = path.toLowerCase();
    +   *
    +   *     if (path !== normalized) {
    +   *       return normalized;
    +   *     }
    +   *   });
    +   * });
    +   * 
    + * + * @param {object} rule Handler function that takes `$injector` and `$location` + * services as arguments. You can use them to return a valid path as a string. + * + * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance + */ + this.rule = function (rule) { + if (!isFunction(rule)) throw new Error("'rule' must be a function"); + rules.push(rule); + return this; + }; + + /** + * @ngdoc object + * @name ui.router.router.$urlRouterProvider#otherwise + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Defines a path that is used when an invalid route is requested. + * + * @example + *
    +   * var app = angular.module('app', ['ui.router.router']);
    +   *
    +   * app.config(function ($urlRouterProvider) {
    +   *   // if the path doesn't match any of the urls you configured
    +   *   // otherwise will take care of routing the user to the
    +   *   // specified url
    +   *   $urlRouterProvider.otherwise('/index');
    +   *
    +   *   // Example of using function rule as param
    +   *   $urlRouterProvider.otherwise(function ($injector, $location) {
    +   *     return '/a/valid/url';
    +   *   });
    +   * });
    +   * 
    + * + * @param {string|object} rule The url path you want to redirect to or a function + * rule that returns the url path. The function version is passed two params: + * `$injector` and `$location` services, and must return a url string. + * + * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance + */ + this.otherwise = function (rule) { + if (isString(rule)) { + var redirect = rule; + rule = function () { return redirect; }; + } + else if (!isFunction(rule)) throw new Error("'rule' must be a function"); + otherwise = rule; + return this; + }; + + + function handleIfMatch($injector, handler, match) { + if (!match) return false; + var result = $injector.invoke(handler, handler, { $match: match }); + return isDefined(result) ? result : true; + } + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#when + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Registers a handler for a given url matching. if handle is a string, it is + * treated as a redirect, and is interpolated according to the syntax of match + * (i.e. like `String.replace()` for `RegExp`, or like a `UrlMatcher` pattern otherwise). + * + * If the handler is a function, it is injectable. It gets invoked if `$location` + * matches. You have the option of inject the match object as `$match`. + * + * The handler can return + * + * - **falsy** to indicate that the rule didn't match after all, then `$urlRouter` + * will continue trying to find another one that matches. + * - **string** which is treated as a redirect and passed to `$location.url()` + * - **void** or any **truthy** value tells `$urlRouter` that the url was handled. + * + * @example + *
    +   * var app = angular.module('app', ['ui.router.router']);
    +   *
    +   * app.config(function ($urlRouterProvider) {
    +   *   $urlRouterProvider.when($state.url, function ($match, $stateParams) {
    +   *     if ($state.$current.navigable !== state ||
    +   *         !equalForKeys($match, $stateParams) {
    +   *      $state.transitionTo(state, $match, false);
    +   *     }
    +   *   });
    +   * });
    +   * 
    + * + * @param {string|object} what The incoming path that you want to redirect. + * @param {string|object} handler The path you want to redirect your user to. + */ + this.when = function (what, handler) { + var redirect, handlerIsString = isString(handler); + if (isString(what)) what = $urlMatcherFactory.compile(what); + + if (!handlerIsString && !isFunction(handler) && !isArray(handler)) + throw new Error("invalid 'handler' in when()"); + + var strategies = { + matcher: function (what, handler) { + if (handlerIsString) { + redirect = $urlMatcherFactory.compile(handler); + handler = ['$match', function ($match) { return redirect.format($match); }]; + } + return extend(function ($injector, $location) { + return handleIfMatch($injector, handler, what.exec($location.path(), $location.search())); + }, { + prefix: isString(what.prefix) ? what.prefix : '' + }); + }, + regex: function (what, handler) { + if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky"); + + if (handlerIsString) { + redirect = handler; + handler = ['$match', function ($match) { return interpolate(redirect, $match); }]; + } + return extend(function ($injector, $location) { + return handleIfMatch($injector, handler, what.exec($location.path())); + }, { + prefix: regExpPrefix(what) + }); + } + }; + + var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp }; + + for (var n in check) { + if (check[n]) return this.rule(strategies[n](what, handler)); + } + + throw new Error("invalid 'what' in when()"); + }; + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#deferIntercept + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Disables (or enables) deferring location change interception. + * + * If you wish to customize the behavior of syncing the URL (for example, if you wish to + * defer a transition but maintain the current URL), call this method at configuration time. + * Then, at run time, call `$urlRouter.listen()` after you have configured your own + * `$locationChangeSuccess` event handler. + * + * @example + *
    +   * var app = angular.module('app', ['ui.router.router']);
    +   *
    +   * app.config(function ($urlRouterProvider) {
    +   *
    +   *   // Prevent $urlRouter from automatically intercepting URL changes;
    +   *   // this allows you to configure custom behavior in between
    +   *   // location changes and route synchronization:
    +   *   $urlRouterProvider.deferIntercept();
    +   *
    +   * }).run(function ($rootScope, $urlRouter, UserService) {
    +   *
    +   *   $rootScope.$on('$locationChangeSuccess', function(e) {
    +   *     // UserService is an example service for managing user state
    +   *     if (UserService.isLoggedIn()) return;
    +   *
    +   *     // Prevent $urlRouter's default handler from firing
    +   *     e.preventDefault();
    +   *
    +   *     UserService.handleLogin().then(function() {
    +   *       // Once the user has logged in, sync the current URL
    +   *       // to the router:
    +   *       $urlRouter.sync();
    +   *     });
    +   *   });
    +   *
    +   *   // Configures $urlRouter's listener *after* your custom listener
    +   *   $urlRouter.listen();
    +   * });
    +   * 
    + * + * @param {boolean} defer Indicates whether to defer location change interception. Passing + no parameter is equivalent to `true`. + */ + this.deferIntercept = function (defer) { + if (defer === undefined) defer = true; + interceptDeferred = defer; + }; + + /** + * @ngdoc object + * @name ui.router.router.$urlRouter + * + * @requires $location + * @requires $rootScope + * @requires $injector + * @requires $browser + * + * @description + * + */ + this.$get = $get; + $get.$inject = ['$location', '$rootScope', '$injector', '$browser']; + function $get( $location, $rootScope, $injector, $browser) { + + var baseHref = $browser.baseHref(), location = $location.url(), lastPushedUrl; + + function appendBasePath(url, isHtml5, absolute) { + if (baseHref === '/') return url; + if (isHtml5) return baseHref.slice(0, -1) + url; + if (absolute) return baseHref.slice(1) + url; + return url; + } + + // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree + function update(evt) { + if (evt && evt.defaultPrevented) return; + var ignoreUpdate = lastPushedUrl && $location.url() === lastPushedUrl; + lastPushedUrl = undefined; + if (ignoreUpdate) return true; + + function check(rule) { + var handled = rule($injector, $location); + + if (!handled) return false; + if (isString(handled)) $location.replace().url(handled); + return true; + } + var n = rules.length, i; + + for (i = 0; i < n; i++) { + if (check(rules[i])) return; + } + // always check otherwise last to allow dynamic updates to the set of rules + if (otherwise) check(otherwise); + } + + function listen() { + listener = listener || $rootScope.$on('$locationChangeSuccess', update); + return listener; + } + + if (!interceptDeferred) listen(); + + return { + /** + * @ngdoc function + * @name ui.router.router.$urlRouter#sync + * @methodOf ui.router.router.$urlRouter + * + * @description + * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`. + * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event, + * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed + * with the transition by calling `$urlRouter.sync()`. + * + * @example + *
    +       * angular.module('app', ['ui.router'])
    +       *   .run(function($rootScope, $urlRouter) {
    +       *     $rootScope.$on('$locationChangeSuccess', function(evt) {
    +       *       // Halt state change from even starting
    +       *       evt.preventDefault();
    +       *       // Perform custom logic
    +       *       var meetsRequirement = ...
    +       *       // Continue with the update and state transition if logic allows
    +       *       if (meetsRequirement) $urlRouter.sync();
    +       *     });
    +       * });
    +       * 
    + */ + sync: function() { + update(); + }, + + listen: function() { + return listen(); + }, + + update: function(read) { + if (read) { + location = $location.url(); + return; + } + if ($location.url() === location) return; + + $location.url(location); + $location.replace(); + }, + + push: function(urlMatcher, params, options) { + $location.url(urlMatcher.format(params || {})); + lastPushedUrl = options && options.$$avoidResync ? $location.url() : undefined; + if (options && options.replace) $location.replace(); + }, + + /** + * @ngdoc function + * @name ui.router.router.$urlRouter#href + * @methodOf ui.router.router.$urlRouter + * + * @description + * A URL generation method that returns the compiled URL for a given + * {@link ui.router.util.type:UrlMatcher `UrlMatcher`}, populated with the provided parameters. + * + * @example + *
    +       * $bob = $urlRouter.href(new UrlMatcher("/about/:person"), {
    +       *   person: "bob"
    +       * });
    +       * // $bob == "/about/bob";
    +       * 
    + * + * @param {UrlMatcher} urlMatcher The `UrlMatcher` object which is used as the template of the URL to generate. + * @param {object=} params An object of parameter values to fill the matcher's required parameters. + * @param {object=} options Options object. The options are: + * + * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl". + * + * @returns {string} Returns the fully compiled URL, or `null` if `params` fail validation against `urlMatcher` + */ + href: function(urlMatcher, params, options) { + if (!urlMatcher.validates(params)) return null; + + var isHtml5 = $locationProvider.html5Mode(); + if (angular.isObject(isHtml5)) { + isHtml5 = isHtml5.enabled; + } + + var url = urlMatcher.format(params); + options = options || {}; + + if (!isHtml5 && url !== null) { + url = "#" + $locationProvider.hashPrefix() + url; + } + url = appendBasePath(url, isHtml5, options.absolute); + + if (!options.absolute || !url) { + return url; + } + + var slash = (!isHtml5 && url ? '/' : ''), port = $location.port(); + port = (port === 80 || port === 443 ? '' : ':' + port); + + return [$location.protocol(), '://', $location.host(), port, slash, url].join(''); + } + }; + } +} + +angular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider); + +/** + * @ngdoc object + * @name ui.router.state.$stateProvider + * + * @requires ui.router.router.$urlRouterProvider + * @requires ui.router.util.$urlMatcherFactoryProvider + * + * @description + * The new `$stateProvider` works similar to Angular's v1 router, but it focuses purely + * on state. + * + * A state corresponds to a "place" in the application in terms of the overall UI and + * navigation. A state describes (via the controller / template / view properties) what + * the UI looks like and does at that place. + * + * States often have things in common, and the primary way of factoring out these + * commonalities in this model is via the state hierarchy, i.e. parent/child states aka + * nested states. + * + * The `$stateProvider` provides interfaces to declare these states for your app. + */ +$StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider']; +function $StateProvider( $urlRouterProvider, $urlMatcherFactory) { + + var root, states = {}, $state, queue = {}, abstractKey = 'abstract'; + + // Builds state properties from definition passed to registerState() + var stateBuilder = { + + // Derive parent state from a hierarchical name only if 'parent' is not explicitly defined. + // state.children = []; + // if (parent) parent.children.push(state); + parent: function(state) { + if (isDefined(state.parent) && state.parent) return findState(state.parent); + // regex matches any valid composite state name + // would match "contact.list" but not "contacts" + var compositeName = /^(.+)\.[^.]+$/.exec(state.name); + return compositeName ? findState(compositeName[1]) : root; + }, + + // inherit 'data' from parent and override by own values (if any) + data: function(state) { + if (state.parent && state.parent.data) { + state.data = state.self.data = extend({}, state.parent.data, state.data); + } + return state.data; + }, + + // Build a URLMatcher if necessary, either via a relative or absolute URL + url: function(state) { + var url = state.url, config = { params: state.params || {} }; + + if (isString(url)) { + if (url.charAt(0) == '^') return $urlMatcherFactory.compile(url.substring(1), config); + return (state.parent.navigable || root).url.concat(url, config); + } + + if (!url || $urlMatcherFactory.isMatcher(url)) return url; + throw new Error("Invalid url '" + url + "' in state '" + state + "'"); + }, + + // Keep track of the closest ancestor state that has a URL (i.e. is navigable) + navigable: function(state) { + return state.url ? state : (state.parent ? state.parent.navigable : null); + }, + + // Own parameters for this state. state.url.params is already built at this point. Create and add non-url params + ownParams: function(state) { + var params = state.url && state.url.params || new $$UMFP.ParamSet(); + forEach(state.params || {}, function(config, id) { + if (!params[id]) params[id] = new $$UMFP.Param(id, null, config, "config"); + }); + return params; + }, + + // Derive parameters for this state and ensure they're a super-set of parent's parameters + params: function(state) { + return state.parent && state.parent.params ? extend(state.parent.params.$$new(), state.ownParams) : new $$UMFP.ParamSet(); + }, + + // If there is no explicit multi-view configuration, make one up so we don't have + // to handle both cases in the view directive later. Note that having an explicit + // 'views' property will mean the default unnamed view properties are ignored. This + // is also a good time to resolve view names to absolute names, so everything is a + // straight lookup at link time. + views: function(state) { + var views = {}; + + forEach(isDefined(state.views) ? state.views : { '': state }, function (view, name) { + if (name.indexOf('@') < 0) name += '@' + state.parent.name; + views[name] = view; + }); + return views; + }, + + // Keep a full path from the root down to this state as this is needed for state activation. + path: function(state) { + return state.parent ? state.parent.path.concat(state) : []; // exclude root from path + }, + + // Speed up $state.contains() as it's used a lot + includes: function(state) { + var includes = state.parent ? extend({}, state.parent.includes) : {}; + includes[state.name] = true; + return includes; + }, + + $delegates: {} + }; + + function isRelative(stateName) { + return stateName.indexOf(".") === 0 || stateName.indexOf("^") === 0; + } + + function findState(stateOrName, base) { + if (!stateOrName) return undefined; + + var isStr = isString(stateOrName), + name = isStr ? stateOrName : stateOrName.name, + path = isRelative(name); + + if (path) { + if (!base) throw new Error("No reference point given for path '" + name + "'"); + base = findState(base); + + var rel = name.split("."), i = 0, pathLength = rel.length, current = base; + + for (; i < pathLength; i++) { + if (rel[i] === "" && i === 0) { + current = base; + continue; + } + if (rel[i] === "^") { + if (!current.parent) throw new Error("Path '" + name + "' not valid for state '" + base.name + "'"); + current = current.parent; + continue; + } + break; + } + rel = rel.slice(i).join("."); + name = current.name + (current.name && rel ? "." : "") + rel; + } + var state = states[name]; + + if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) { + return state; + } + return undefined; + } + + function queueState(parentName, state) { + if (!queue[parentName]) { + queue[parentName] = []; + } + queue[parentName].push(state); + } + + function flushQueuedChildren(parentName) { + var queued = queue[parentName] || []; + while(queued.length) { + registerState(queued.shift()); + } + } + + function registerState(state) { + // Wrap a new object around the state so we can store our private details easily. + state = inherit(state, { + self: state, + resolve: state.resolve || {}, + toString: function() { return this.name; } + }); + + var name = state.name; + if (!isString(name) || name.indexOf('@') >= 0) throw new Error("State must have a valid name"); + if (states.hasOwnProperty(name)) throw new Error("State '" + name + "'' is already defined"); + + // Get parent name + var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.')) + : (isString(state.parent)) ? state.parent + : (isObject(state.parent) && isString(state.parent.name)) ? state.parent.name + : ''; + + // If parent is not registered yet, add state to queue and register later + if (parentName && !states[parentName]) { + return queueState(parentName, state.self); + } + + for (var key in stateBuilder) { + if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]); + } + states[name] = state; + + // Register the state in the global state list and with $urlRouter if necessary. + if (!state[abstractKey] && state.url) { + $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) { + if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) { + $state.transitionTo(state, $match, { inherit: true, location: false }); + } + }]); + } + + // Register any queued children + flushQueuedChildren(name); + + return state; + } + + // Checks text to see if it looks like a glob. + function isGlob (text) { + return text.indexOf('*') > -1; + } + + // Returns true if glob matches current $state name. + function doesStateMatchGlob (glob) { + var globSegments = glob.split('.'), + segments = $state.$current.name.split('.'); + + //match greedy starts + if (globSegments[0] === '**') { + segments = segments.slice(indexOf(segments, globSegments[1])); + segments.unshift('**'); + } + //match greedy ends + if (globSegments[globSegments.length - 1] === '**') { + segments.splice(indexOf(segments, globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE); + segments.push('**'); + } + + if (globSegments.length != segments.length) { + return false; + } + + //match single stars + for (var i = 0, l = globSegments.length; i < l; i++) { + if (globSegments[i] === '*') { + segments[i] = '*'; + } + } + + return segments.join('') === globSegments.join(''); + } + + + // Implicit root state that is always active + root = registerState({ + name: '', + url: '^', + views: null, + 'abstract': true + }); + root.navigable = null; + + + /** + * @ngdoc function + * @name ui.router.state.$stateProvider#decorator + * @methodOf ui.router.state.$stateProvider + * + * @description + * Allows you to extend (carefully) or override (at your own peril) the + * `stateBuilder` object used internally by `$stateProvider`. This can be used + * to add custom functionality to ui-router, for example inferring templateUrl + * based on the state name. + * + * When passing only a name, it returns the current (original or decorated) builder + * function that matches `name`. + * + * The builder functions that can be decorated are listed below. Though not all + * necessarily have a good use case for decoration, that is up to you to decide. + * + * In addition, users can attach custom decorators, which will generate new + * properties within the state's internal definition. There is currently no clear + * use-case for this beyond accessing internal states (i.e. $state.$current), + * however, expect this to become increasingly relevant as we introduce additional + * meta-programming features. + * + * **Warning**: Decorators should not be interdependent because the order of + * execution of the builder functions in non-deterministic. Builder functions + * should only be dependent on the state definition object and super function. + * + * + * Existing builder functions and current return values: + * + * - **parent** `{object}` - returns the parent state object. + * - **data** `{object}` - returns state data, including any inherited data that is not + * overridden by own values (if any). + * - **url** `{object}` - returns a {@link ui.router.util.type:UrlMatcher UrlMatcher} + * or `null`. + * - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is + * navigable). + * - **params** `{object}` - returns an array of state params that are ensured to + * be a super-set of parent's params. + * - **views** `{object}` - returns a views object where each key is an absolute view + * name (i.e. "viewName@stateName") and each value is the config object + * (template, controller) for the view. Even when you don't use the views object + * explicitly on a state config, one is still created for you internally. + * So by decorating this builder function you have access to decorating template + * and controller properties. + * - **ownParams** `{object}` - returns an array of params that belong to the state, + * not including any params defined by ancestor states. + * - **path** `{string}` - returns the full path from the root down to this state. + * Needed for state activation. + * - **includes** `{object}` - returns an object that includes every state that + * would pass a `$state.includes()` test. + * + * @example + *
    +   * // Override the internal 'views' builder with a function that takes the state
    +   * // definition, and a reference to the internal function being overridden:
    +   * $stateProvider.decorator('views', function (state, parent) {
    +   *   var result = {},
    +   *       views = parent(state);
    +   *
    +   *   angular.forEach(views, function (config, name) {
    +   *     var autoName = (state.name + '.' + name).replace('.', '/');
    +   *     config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';
    +   *     result[name] = config;
    +   *   });
    +   *   return result;
    +   * });
    +   *
    +   * $stateProvider.state('home', {
    +   *   views: {
    +   *     'contact.list': { controller: 'ListController' },
    +   *     'contact.item': { controller: 'ItemController' }
    +   *   }
    +   * });
    +   *
    +   * // ...
    +   *
    +   * $state.go('home');
    +   * // Auto-populates list and item views with /partials/home/contact/list.html,
    +   * // and /partials/home/contact/item.html, respectively.
    +   * 
    + * + * @param {string} name The name of the builder function to decorate. + * @param {object} func A function that is responsible for decorating the original + * builder function. The function receives two parameters: + * + * - `{object}` - state - The state config object. + * - `{object}` - super - The original builder function. + * + * @return {object} $stateProvider - $stateProvider instance + */ + this.decorator = decorator; + function decorator(name, func) { + /*jshint validthis: true */ + if (isString(name) && !isDefined(func)) { + return stateBuilder[name]; + } + if (!isFunction(func) || !isString(name)) { + return this; + } + if (stateBuilder[name] && !stateBuilder.$delegates[name]) { + stateBuilder.$delegates[name] = stateBuilder[name]; + } + stateBuilder[name] = func; + return this; + } + + /** + * @ngdoc function + * @name ui.router.state.$stateProvider#state + * @methodOf ui.router.state.$stateProvider + * + * @description + * Registers a state configuration under a given state name. The stateConfig object + * has the following acceptable properties. + * + * @param {string} name A unique state name, e.g. "home", "about", "contacts". + * To create a parent/child state use a dot, e.g. "about.sales", "home.newest". + * @param {object} stateConfig State configuration object. + * @param {string|function=} stateConfig.template + *
    + * html template as a string or a function that returns + * an html template as a string which should be used by the uiView directives. This property + * takes precedence over templateUrl. + * + * If `template` is a function, it will be called with the following parameters: + * + * - {array.<object>} - state parameters extracted from the current $location.path() by + * applying the current state + * + *
    template:
    +   *   "

    inline template definition

    " + + * "
    "
    + *
    template: function(params) {
    +   *       return "

    generated template

    "; }
    + * + * + * @param {string|function=} stateConfig.templateUrl + * + * + * path or function that returns a path to an html + * template that should be used by uiView. + * + * If `templateUrl` is a function, it will be called with the following parameters: + * + * - {array.<object>} - state parameters extracted from the current $location.path() by + * applying the current state + * + *
    templateUrl: "home.html"
    + *
    templateUrl: function(params) {
    +   *     return myTemplates[params.pageId]; }
    + * + * @param {function=} stateConfig.templateProvider + * + * Provider function that returns HTML content string. + *
     templateProvider:
    +   *       function(MyTemplateService, params) {
    +   *         return MyTemplateService.getTemplate(params.pageId);
    +   *       }
    + * + * @param {string|function=} stateConfig.controller + * + * + * Controller fn that should be associated with newly + * related scope or the name of a registered controller if passed as a string. + * Optionally, the ControllerAs may be declared here. + *
    controller: "MyRegisteredController"
    + *
    controller:
    +   *     "MyRegisteredController as fooCtrl"}
    + *
    controller: function($scope, MyService) {
    +   *     $scope.data = MyService.getData(); }
    + * + * @param {function=} stateConfig.controllerProvider + * + * + * Injectable provider function that returns the actual controller or string. + *
    controllerProvider:
    +   *   function(MyResolveData) {
    +   *     if (MyResolveData.foo)
    +   *       return "FooCtrl"
    +   *     else if (MyResolveData.bar)
    +   *       return "BarCtrl";
    +   *     else return function($scope) {
    +   *       $scope.baz = "Qux";
    +   *     }
    +   *   }
    + * + * @param {string=} stateConfig.controllerAs + * + * + * A controller alias name. If present the controller will be + * published to scope under the controllerAs name. + *
    controllerAs: "myCtrl"
    + * + * @param {object=} stateConfig.resolve + * + * + * An optional map<string, function> of dependencies which + * should be injected into the controller. If any of these dependencies are promises, + * the router will wait for them all to be resolved before the controller is instantiated. + * If all the promises are resolved successfully, the $stateChangeSuccess event is fired + * and the values of the resolved promises are injected into any controllers that reference them. + * If any of the promises are rejected the $stateChangeError event is fired. + * + * The map object is: + * + * - key - {string}: name of dependency to be injected into controller + * - factory - {string|function}: If string then it is alias for service. Otherwise if function, + * it is injected and return value it treated as dependency. If result is a promise, it is + * resolved before its value is injected into controller. + * + *
    resolve: {
    +   *     myResolve1:
    +   *       function($http, $stateParams) {
    +   *         return $http.get("/api/foos/"+stateParams.fooID);
    +   *       }
    +   *     }
    + * + * @param {string=} stateConfig.url + * + * + * A url fragment with optional parameters. When a state is navigated or + * transitioned to, the `$stateParams` service will be populated with any + * parameters that were passed. + * + * examples: + *
    url: "/home"
    +   * url: "/users/:userid"
    +   * url: "/books/{bookid:[a-zA-Z_-]}"
    +   * url: "/books/{categoryid:int}"
    +   * url: "/books/{publishername:string}/{categoryid:int}"
    +   * url: "/messages?before&after"
    +   * url: "/messages?{before:date}&{after:date}"
    + * url: "/messages/:mailboxid?{before:date}&{after:date}" + * + * @param {object=} stateConfig.views + * + * an optional map<string, object> which defined multiple views, or targets views + * manually/explicitly. + * + * Examples: + * + * Targets three named `ui-view`s in the parent state's template + *
    views: {
    +   *     header: {
    +   *       controller: "headerCtrl",
    +   *       templateUrl: "header.html"
    +   *     }, body: {
    +   *       controller: "bodyCtrl",
    +   *       templateUrl: "body.html"
    +   *     }, footer: {
    +   *       controller: "footCtrl",
    +   *       templateUrl: "footer.html"
    +   *     }
    +   *   }
    + * + * Targets named `ui-view="header"` from grandparent state 'top''s template, and named `ui-view="body" from parent state's template. + *
    views: {
    +   *     'header@top': {
    +   *       controller: "msgHeaderCtrl",
    +   *       templateUrl: "msgHeader.html"
    +   *     }, 'body': {
    +   *       controller: "messagesCtrl",
    +   *       templateUrl: "messages.html"
    +   *     }
    +   *   }
    + * + * @param {boolean=} [stateConfig.abstract=false] + * + * An abstract state will never be directly activated, + * but can provide inherited properties to its common children states. + *
    abstract: true
    + * + * @param {function=} stateConfig.onEnter + * + * + * Callback function for when a state is entered. Good way + * to trigger an action or dispatch an event, such as opening a dialog. + * If minifying your scripts, make sure to explictly annotate this function, + * because it won't be automatically annotated by your build tools. + * + *
    onEnter: function(MyService, $stateParams) {
    +   *     MyService.foo($stateParams.myParam);
    +   * }
    + * + * @param {function=} stateConfig.onExit + * + * + * Callback function for when a state is exited. Good way to + * trigger an action or dispatch an event, such as opening a dialog. + * If minifying your scripts, make sure to explictly annotate this function, + * because it won't be automatically annotated by your build tools. + * + *
    onExit: function(MyService, $stateParams) {
    +   *     MyService.cleanup($stateParams.myParam);
    +   * }
    + * + * @param {boolean=} [stateConfig.reloadOnSearch=true] + * + * + * If `false`, will not retrigger the same state + * just because a search/query parameter has changed (via $location.search() or $location.hash()). + * Useful for when you'd like to modify $location.search() without triggering a reload. + *
    reloadOnSearch: false
    + * + * @param {object=} stateConfig.data + * + * + * Arbitrary data object, useful for custom configuration. The parent state's `data` is + * prototypally inherited. In other words, adding a data property to a state adds it to + * the entire subtree via prototypal inheritance. + * + *
    data: {
    +   *     requiredRole: 'foo'
    +   * } 
    + * + * @param {object=} stateConfig.params + * + * + * A map which optionally configures parameters declared in the `url`, or + * defines additional non-url parameters. For each parameter being + * configured, add a configuration object keyed to the name of the parameter. + * + * Each parameter configuration object may contain the following properties: + * + * - ** value ** - {object|function=}: specifies the default value for this + * parameter. This implicitly sets this parameter as optional. + * + * When UI-Router routes to a state and no value is + * specified for this parameter in the URL or transition, the + * default value will be used instead. If `value` is a function, + * it will be injected and invoked, and the return value used. + * + * *Note*: `undefined` is treated as "no default value" while `null` + * is treated as "the default value is `null`". + * + * *Shorthand*: If you only need to configure the default value of the + * parameter, you may use a shorthand syntax. In the **`params`** + * map, instead mapping the param name to a full parameter configuration + * object, simply set map it to the default parameter value, e.g.: + * + *
    // define a parameter's default value
    +   * params: {
    +   *     param1: { value: "defaultValue" }
    +   * }
    +   * // shorthand default values
    +   * params: {
    +   *     param1: "defaultValue",
    +   *     param2: "param2Default"
    +   * }
    + * + * - ** array ** - {boolean=}: *(default: false)* If true, the param value will be + * treated as an array of values. If you specified a Type, the value will be + * treated as an array of the specified Type. Note: query parameter values + * default to a special `"auto"` mode. + * + * For query parameters in `"auto"` mode, if multiple values for a single parameter + * are present in the URL (e.g.: `/foo?bar=1&bar=2&bar=3`) then the values + * are mapped to an array (e.g.: `{ foo: [ '1', '2', '3' ] }`). However, if + * only one value is present (e.g.: `/foo?bar=1`) then the value is treated as single + * value (e.g.: `{ foo: '1' }`). + * + *
    params: {
    +   *     param1: { array: true }
    +   * }
    + * + * - ** squash ** - {bool|string=}: `squash` configures how a default parameter value is represented in the URL when + * the current parameter value is the same as the default value. If `squash` is not set, it uses the + * configured default squash policy. + * (See {@link ui.router.util.$urlMatcherFactory#methods_defaultSquashPolicy `defaultSquashPolicy()`}) + * + * There are three squash settings: + * + * - false: The parameter's default value is not squashed. It is encoded and included in the URL + * - true: The parameter's default value is omitted from the URL. If the parameter is preceeded and followed + * by slashes in the state's `url` declaration, then one of those slashes are omitted. + * This can allow for cleaner looking URLs. + * - `""`: The parameter's default value is replaced with an arbitrary placeholder of your choice. + * + *
    params: {
    +   *     param1: {
    +   *       value: "defaultId",
    +   *       squash: true
    +   * } }
    +   * // squash "defaultValue" to "~"
    +   * params: {
    +   *     param1: {
    +   *       value: "defaultValue",
    +   *       squash: "~"
    +   * } }
    +   * 
    + * + * + * @example + *
    +   * // Some state name examples
    +   *
    +   * // stateName can be a single top-level name (must be unique).
    +   * $stateProvider.state("home", {});
    +   *
    +   * // Or it can be a nested state name. This state is a child of the
    +   * // above "home" state.
    +   * $stateProvider.state("home.newest", {});
    +   *
    +   * // Nest states as deeply as needed.
    +   * $stateProvider.state("home.newest.abc.xyz.inception", {});
    +   *
    +   * // state() returns $stateProvider, so you can chain state declarations.
    +   * $stateProvider
    +   *   .state("home", {})
    +   *   .state("about", {})
    +   *   .state("contacts", {});
    +   * 
    + * + */ + this.state = state; + function state(name, definition) { + /*jshint validthis: true */ + if (isObject(name)) definition = name; + else definition.name = name; + registerState(definition); + return this; + } + + /** + * @ngdoc object + * @name ui.router.state.$state + * + * @requires $rootScope + * @requires $q + * @requires ui.router.state.$view + * @requires $injector + * @requires ui.router.util.$resolve + * @requires ui.router.state.$stateParams + * @requires ui.router.router.$urlRouter + * + * @property {object} params A param object, e.g. {sectionId: section.id)}, that + * you'd like to test against the current active state. + * @property {object} current A reference to the state's config object. However + * you passed it in. Useful for accessing custom data. + * @property {object} transition Currently pending transition. A promise that'll + * resolve or reject. + * + * @description + * `$state` service is responsible for representing states as well as transitioning + * between them. It also provides interfaces to ask for current state or even states + * you're coming from. + */ + this.$get = $get; + $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$urlRouter', '$location', '$urlMatcherFactory']; + function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $urlRouter, $location, $urlMatcherFactory) { + + var TransitionSuperseded = $q.reject(new Error('transition superseded')); + var TransitionPrevented = $q.reject(new Error('transition prevented')); + var TransitionAborted = $q.reject(new Error('transition aborted')); + var TransitionFailed = $q.reject(new Error('transition failed')); + + // Handles the case where a state which is the target of a transition is not found, and the user + // can optionally retry or defer the transition + function handleRedirect(redirect, state, params, options) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateNotFound + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when a requested state **cannot be found** using the provided state name during transition. + * The event is broadcast allowing any handlers a single chance to deal with the error (usually by + * lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler, + * you can see its three properties in the example. You can use `event.preventDefault()` to abort the + * transition and the promise returned from `go` will be rejected with a `'transition aborted'` value. + * + * @param {Object} event Event object. + * @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties. + * @param {State} fromState Current state object. + * @param {Object} fromParams Current state params. + * + * @example + * + *
    +       * // somewhere, assume lazy.state has not been defined
    +       * $state.go("lazy.state", {a:1, b:2}, {inherit:false});
    +       *
    +       * // somewhere else
    +       * $scope.$on('$stateNotFound',
    +       * function(event, unfoundState, fromState, fromParams){
    +       *     console.log(unfoundState.to); // "lazy.state"
    +       *     console.log(unfoundState.toParams); // {a:1, b:2}
    +       *     console.log(unfoundState.options); // {inherit:false} + default options
    +       * })
    +       * 
    + */ + var evt = $rootScope.$broadcast('$stateNotFound', redirect, state, params); + + if (evt.defaultPrevented) { + $urlRouter.update(); + return TransitionAborted; + } + + if (!evt.retry) { + return null; + } + + // Allow the handler to return a promise to defer state lookup retry + if (options.$retry) { + $urlRouter.update(); + return TransitionFailed; + } + var retryTransition = $state.transition = $q.when(evt.retry); + + retryTransition.then(function() { + if (retryTransition !== $state.transition) return TransitionSuperseded; + redirect.options.$retry = true; + return $state.transitionTo(redirect.to, redirect.toParams, redirect.options); + }, function() { + return TransitionAborted; + }); + $urlRouter.update(); + + return retryTransition; + } + + root.locals = { resolve: null, globals: { $stateParams: {} } }; + + $state = { + params: {}, + current: root.self, + $current: root, + transition: null + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#reload + * @methodOf ui.router.state.$state + * + * @description + * A method that force reloads the current state. All resolves are re-resolved, events are not re-fired, + * and controllers reinstantiated (bug with controllers reinstantiating right now, fixing soon). + * + * @example + *
    +     * var app angular.module('app', ['ui.router']);
    +     *
    +     * app.controller('ctrl', function ($scope, $state) {
    +     *   $scope.reload = function(){
    +     *     $state.reload();
    +     *   }
    +     * });
    +     * 
    + * + * `reload()` is just an alias for: + *
    +     * $state.transitionTo($state.current, $stateParams, { 
    +     *   reload: true, inherit: false, notify: true
    +     * });
    +     * 
    + * + * @returns {promise} A promise representing the state of the new transition. See + * {@link ui.router.state.$state#methods_go $state.go}. + */ + $state.reload = function reload() { + return $state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: true }); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#go + * @methodOf ui.router.state.$state + * + * @description + * Convenience method for transitioning to a new state. `$state.go` calls + * `$state.transitionTo` internally but automatically sets options to + * `{ location: true, inherit: true, relative: $state.$current, notify: true }`. + * This allows you to easily use an absolute or relative to path and specify + * only the parameters you'd like to update (while letting unspecified parameters + * inherit from the currently active ancestor states). + * + * @example + *
    +     * var app = angular.module('app', ['ui.router']);
    +     *
    +     * app.controller('ctrl', function ($scope, $state) {
    +     *   $scope.changeState = function () {
    +     *     $state.go('contact.detail');
    +     *   };
    +     * });
    +     * 
    + * + * + * @param {string} to Absolute state name or relative state path. Some examples: + * + * - `$state.go('contact.detail')` - will go to the `contact.detail` state + * - `$state.go('^')` - will go to a parent state + * - `$state.go('^.sibling')` - will go to a sibling state + * - `$state.go('.child.grandchild')` - will go to grandchild state + * + * @param {object=} params A map of the parameters that will be sent to the state, + * will populate $stateParams. Any parameters that are not specified will be inherited from currently + * defined parameters. This allows, for example, going to a sibling state that shares parameters + * specified in a parent state. Parameter inheritance only works between common ancestor states, I.e. + * transitioning to a sibling will get you the parameters for all parents, transitioning to a child + * will get you all current parameters, etc. + * @param {object=} options Options object. The options are: + * + * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false` + * will not. If string, must be `"replace"`, which will update url and also replace last history record. + * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events. + * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params + * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd + * use this when you want to force a reload when *everything* is the same, including search params. + * + * @returns {promise} A promise representing the state of the new transition. + * + * Possible success values: + * + * - $state.current + * + *
    Possible rejection values: + * + * - 'transition superseded' - when a newer transition has been started after this one + * - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener + * - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or + * when a `$stateNotFound` `event.retry` promise errors. + * - 'transition failed' - when a state has been unsuccessfully found after 2 tries. + * - *resolve error* - when an error has occurred with a `resolve` + * + */ + $state.go = function go(to, params, options) { + return $state.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options)); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#transitionTo + * @methodOf ui.router.state.$state + * + * @description + * Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go} + * uses `transitionTo` internally. `$state.go` is recommended in most situations. + * + * @example + *
    +     * var app = angular.module('app', ['ui.router']);
    +     *
    +     * app.controller('ctrl', function ($scope, $state) {
    +     *   $scope.changeState = function () {
    +     *     $state.transitionTo('contact.detail');
    +     *   };
    +     * });
    +     * 
    + * + * @param {string} to State name. + * @param {object=} toParams A map of the parameters that will be sent to the state, + * will populate $stateParams. + * @param {object=} options Options object. The options are: + * + * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false` + * will not. If string, must be `"replace"`, which will update url and also replace last history record. + * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events. + * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params + * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd + * use this when you want to force a reload when *everything* is the same, including search params. + * + * @returns {promise} A promise representing the state of the new transition. See + * {@link ui.router.state.$state#methods_go $state.go}. + */ + $state.transitionTo = function transitionTo(to, toParams, options) { + toParams = toParams || {}; + options = extend({ + location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false + }, options || {}); + + var from = $state.$current, fromParams = $state.params, fromPath = from.path; + var evt, toState = findState(to, options.relative); + + if (!isDefined(toState)) { + var redirect = { to: to, toParams: toParams, options: options }; + var redirectResult = handleRedirect(redirect, from.self, fromParams, options); + + if (redirectResult) { + return redirectResult; + } + + // Always retry once if the $stateNotFound was not prevented + // (handles either redirect changed or state lazy-definition) + to = redirect.to; + toParams = redirect.toParams; + options = redirect.options; + toState = findState(to, options.relative); + + if (!isDefined(toState)) { + if (!options.relative) throw new Error("No such state '" + to + "'"); + throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'"); + } + } + if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'"); + if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState); + if (!toState.params.$$validates(toParams)) return TransitionFailed; + + toParams = toState.params.$$values(toParams); + to = toState; + + var toPath = to.path; + + // Starting from the root of the path, keep all levels that haven't changed + var keep = 0, state = toPath[keep], locals = root.locals, toLocals = []; + + if (!options.reload) { + while (state && state === fromPath[keep] && state.ownParams.$$equals(toParams, fromParams)) { + locals = toLocals[keep] = state.locals; + keep++; + state = toPath[keep]; + } + } + + // If we're going to the same state and all locals are kept, we've got nothing to do. + // But clear 'transition', as we still want to cancel any other pending transitions. + // TODO: We may not want to bump 'transition' if we're called from a location change + // that we've initiated ourselves, because we might accidentally abort a legitimate + // transition initiated from code? + if (shouldTriggerReload(to, from, locals, options)) { + if (to.self.reloadOnSearch !== false) $urlRouter.update(); + $state.transition = null; + return $q.when($state.current); + } + + // Filter parameters before we pass them to event handlers etc. + toParams = filterByKeys(to.params.$$keys(), toParams || {}); + + // Broadcast start event and cancel the transition if requested + if (options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeStart + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when the state transition **begins**. You can use `event.preventDefault()` + * to prevent the transition from happening and then the transition promise will be + * rejected with a `'transition prevented'` value. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + * + * @example + * + *
    +         * $rootScope.$on('$stateChangeStart',
    +         * function(event, toState, toParams, fromState, fromParams){
    +         *     event.preventDefault();
    +         *     // transitionTo() promise will be rejected with
    +         *     // a 'transition prevented' error
    +         * })
    +         * 
    + */ + if ($rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams).defaultPrevented) { + $urlRouter.update(); + return TransitionPrevented; + } + } + + // Resolve locals for the remaining states, but don't update any global state just + // yet -- if anything fails to resolve the current state needs to remain untouched. + // We also set up an inheritance chain for the locals here. This allows the view directive + // to quickly look up the correct definition for each view in the current state. Even + // though we create the locals object itself outside resolveState(), it is initially + // empty and gets filled asynchronously. We need to keep track of the promise for the + // (fully resolved) current locals, and pass this down the chain. + var resolved = $q.when(locals); + + for (var l = keep; l < toPath.length; l++, state = toPath[l]) { + locals = toLocals[l] = inherit(locals); + resolved = resolveState(state, toParams, state === to, resolved, locals, options); + } + + // Once everything is resolved, we are ready to perform the actual transition + // and return a promise for the new state. We also keep track of what the + // current promise is, so that we can detect overlapping transitions and + // keep only the outcome of the last transition. + var transition = $state.transition = resolved.then(function () { + var l, entering, exiting; + + if ($state.transition !== transition) return TransitionSuperseded; + + // Exit 'from' states not kept + for (l = fromPath.length - 1; l >= keep; l--) { + exiting = fromPath[l]; + if (exiting.self.onExit) { + $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals); + } + exiting.locals = null; + } + + // Enter 'to' states not kept + for (l = keep; l < toPath.length; l++) { + entering = toPath[l]; + entering.locals = toLocals[l]; + if (entering.self.onEnter) { + $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals); + } + } + + // Run it again, to catch any transitions in callbacks + if ($state.transition !== transition) return TransitionSuperseded; + + // Update globals in $state + $state.$current = to; + $state.current = to.self; + $state.params = toParams; + copy($state.params, $stateParams); + $state.transition = null; + + if (options.location && to.navigable) { + $urlRouter.push(to.navigable.url, to.navigable.locals.globals.$stateParams, { + $$avoidResync: true, replace: options.location === 'replace' + }); + } + + if (options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeSuccess + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired once the state transition is **complete**. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + */ + $rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams); + } + $urlRouter.update(true); + + return $state.current; + }, function (error) { + if ($state.transition !== transition) return TransitionSuperseded; + + $state.transition = null; + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeError + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when an **error occurs** during transition. It's important to note that if you + * have any errors in your resolve functions (javascript errors, non-existent services, etc) + * they will not throw traditionally. You must listen for this $stateChangeError event to + * catch **ALL** errors. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + * @param {Error} error The resolve error object. + */ + evt = $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error); + + if (!evt.defaultPrevented) { + $urlRouter.update(); + } + + return $q.reject(error); + }); + + return transition; + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#is + * @methodOf ui.router.state.$state + * + * @description + * Similar to {@link ui.router.state.$state#methods_includes $state.includes}, + * but only checks for the full state name. If params is supplied then it will be + * tested for strict equality against the current active params object, so all params + * must match with none missing and no extras. + * + * @example + *
    +     * $state.$current.name = 'contacts.details.item';
    +     *
    +     * // absolute name
    +     * $state.is('contact.details.item'); // returns true
    +     * $state.is(contactDetailItemStateObject); // returns true
    +     *
    +     * // relative name (. and ^), typically from a template
    +     * // E.g. from the 'contacts.details' template
    +     * 
    Item
    + *
    + * + * @param {string|object} stateOrName The state name (absolute or relative) or state object you'd like to check. + * @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like + * to test against the current active state. + * @param {object=} options An options object. The options are: + * + * - **`relative`** - {string|object} - If `stateOrName` is a relative state name and `options.relative` is set, .is will + * test relative to `options.relative` state (or name). + * + * @returns {boolean} Returns true if it is the state. + */ + $state.is = function is(stateOrName, params, options) { + options = extend({ relative: $state.$current }, options || {}); + var state = findState(stateOrName, options.relative); + + if (!isDefined(state)) { return undefined; } + if ($state.$current !== state) { return false; } + return params ? equalForKeys(state.params.$$values(params), $stateParams) : true; + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#includes + * @methodOf ui.router.state.$state + * + * @description + * A method to determine if the current active state is equal to or is the child of the + * state stateName. If any params are passed then they will be tested for a match as well. + * Not all the parameters need to be passed, just the ones you'd like to test for equality. + * + * @example + * Partial and relative names + *
    +     * $state.$current.name = 'contacts.details.item';
    +     *
    +     * // Using partial names
    +     * $state.includes("contacts"); // returns true
    +     * $state.includes("contacts.details"); // returns true
    +     * $state.includes("contacts.details.item"); // returns true
    +     * $state.includes("contacts.list"); // returns false
    +     * $state.includes("about"); // returns false
    +     *
    +     * // Using relative names (. and ^), typically from a template
    +     * // E.g. from the 'contacts.details' template
    +     * 
    Item
    + *
    + * + * Basic globbing patterns + *
    +     * $state.$current.name = 'contacts.details.item.url';
    +     *
    +     * $state.includes("*.details.*.*"); // returns true
    +     * $state.includes("*.details.**"); // returns true
    +     * $state.includes("**.item.**"); // returns true
    +     * $state.includes("*.details.item.url"); // returns true
    +     * $state.includes("*.details.*.url"); // returns true
    +     * $state.includes("*.details.*"); // returns false
    +     * $state.includes("item.**"); // returns false
    +     * 
    + * + * @param {string} stateOrName A partial name, relative name, or glob pattern + * to be searched for within the current state name. + * @param {object=} params A param object, e.g. `{sectionId: section.id}`, + * that you'd like to test against the current active state. + * @param {object=} options An options object. The options are: + * + * - **`relative`** - {string|object=} - If `stateOrName` is a relative state reference and `options.relative` is set, + * .includes will test relative to `options.relative` state (or name). + * + * @returns {boolean} Returns true if it does include the state + */ + $state.includes = function includes(stateOrName, params, options) { + options = extend({ relative: $state.$current }, options || {}); + if (isString(stateOrName) && isGlob(stateOrName)) { + if (!doesStateMatchGlob(stateOrName)) { + return false; + } + stateOrName = $state.$current.name; + } + + var state = findState(stateOrName, options.relative); + if (!isDefined(state)) { return undefined; } + if (!isDefined($state.$current.includes[state.name])) { return false; } + return params ? equalForKeys(state.params.$$values(params), $stateParams, objectKeys(params)) : true; + }; + + + /** + * @ngdoc function + * @name ui.router.state.$state#href + * @methodOf ui.router.state.$state + * + * @description + * A url generation method that returns the compiled url for the given state populated with the given params. + * + * @example + *
    +     * expect($state.href("about.person", { person: "bob" })).toEqual("/about/bob");
    +     * 
    + * + * @param {string|object} stateOrName The state name or state object you'd like to generate a url from. + * @param {object=} params An object of parameter values to fill the state's required parameters. + * @param {object=} options Options object. The options are: + * + * - **`lossy`** - {boolean=true} - If true, and if there is no url associated with the state provided in the + * first parameter, then the constructed href url will be built from the first navigable ancestor (aka + * ancestor with a valid url). + * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl". + * + * @returns {string} compiled state url + */ + $state.href = function href(stateOrName, params, options) { + options = extend({ + lossy: true, + inherit: true, + absolute: false, + relative: $state.$current + }, options || {}); + + var state = findState(stateOrName, options.relative); + + if (!isDefined(state)) return null; + if (options.inherit) params = inheritParams($stateParams, params || {}, $state.$current, state); + + var nav = (state && options.lossy) ? state.navigable : state; + + if (!nav || nav.url === undefined || nav.url === null) { + return null; + } + return $urlRouter.href(nav.url, filterByKeys(state.params.$$keys(), params || {}), { + absolute: options.absolute + }); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#get + * @methodOf ui.router.state.$state + * + * @description + * Returns the state configuration object for any specific state or all states. + * + * @param {string|object=} stateOrName (absolute or relative) If provided, will only get the config for + * the requested state. If not provided, returns an array of ALL state configs. + * @param {string|object=} context When stateOrName is a relative state reference, the state will be retrieved relative to context. + * @returns {Object|Array} State configuration object or array of all objects. + */ + $state.get = function (stateOrName, context) { + if (arguments.length === 0) return map(objectKeys(states), function(name) { return states[name].self; }); + var state = findState(stateOrName, context || $state.$current); + return (state && state.self) ? state.self : null; + }; + + function resolveState(state, params, paramsAreFiltered, inherited, dst, options) { + // Make a restricted $stateParams with only the parameters that apply to this state if + // necessary. In addition to being available to the controller and onEnter/onExit callbacks, + // we also need $stateParams to be available for any $injector calls we make during the + // dependency resolution process. + var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params.$$keys(), params); + var locals = { $stateParams: $stateParams }; + + // Resolve 'global' dependencies for the state, i.e. those not specific to a view. + // We're also including $stateParams in this; that way the parameters are restricted + // to the set that should be visible to the state, and are independent of when we update + // the global $state and $stateParams values. + dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state); + var promises = [dst.resolve.then(function (globals) { + dst.globals = globals; + })]; + if (inherited) promises.push(inherited); + + // Resolve template and dependencies for all views. + forEach(state.views, function (view, name) { + var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {}); + injectables.$template = [ function () { + return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: options.notify }) || ''; + }]; + + promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) { + // References to the controller (only instantiated at link time) + if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) { + var injectLocals = angular.extend({}, injectables, locals); + result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals); + } else { + result.$$controller = view.controller; + } + // Provide access to the state itself for internal use + result.$$state = state; + result.$$controllerAs = view.controllerAs; + dst[name] = result; + })); + }); + + // Wait for all the promises and then return the activation object + return $q.all(promises).then(function (values) { + return dst; + }); + } + + return $state; + } + + function shouldTriggerReload(to, from, locals, options) { + if (to === from && ((locals === from.locals && !options.reload) || (to.self.reloadOnSearch === false))) { + return true; + } + } +} + +angular.module('ui.router.state') + .value('$stateParams', {}) + .provider('$state', $StateProvider); + + +$ViewProvider.$inject = []; +function $ViewProvider() { + + this.$get = $get; + /** + * @ngdoc object + * @name ui.router.state.$view + * + * @requires ui.router.util.$templateFactory + * @requires $rootScope + * + * @description + * + */ + $get.$inject = ['$rootScope', '$templateFactory']; + function $get( $rootScope, $templateFactory) { + return { + // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... }) + /** + * @ngdoc function + * @name ui.router.state.$view#load + * @methodOf ui.router.state.$view + * + * @description + * + * @param {string} name name + * @param {object} options option object. + */ + load: function load(name, options) { + var result, defaults = { + template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {} + }; + options = extend(defaults, options); + + if (options.view) { + result = $templateFactory.fromConfig(options.view, options.params, options.locals); + } + if (result && options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$viewContentLoading + * @eventOf ui.router.state.$view + * @eventType broadcast on root scope + * @description + * + * Fired once the view **begins loading**, *before* the DOM is rendered. + * + * @param {Object} event Event object. + * @param {Object} viewConfig The view config properties (template, controller, etc). + * + * @example + * + *
    +         * $scope.$on('$viewContentLoading',
    +         * function(event, viewConfig){
    +         *     // Access to all the view config properties.
    +         *     // and one special property 'targetView'
    +         *     // viewConfig.targetView
    +         * });
    +         * 
    + */ + $rootScope.$broadcast('$viewContentLoading', options); + } + return result; + } + }; + } +} + +angular.module('ui.router.state').provider('$view', $ViewProvider); + +/** + * @ngdoc object + * @name ui.router.state.$uiViewScrollProvider + * + * @description + * Provider that returns the {@link ui.router.state.$uiViewScroll} service function. + */ +function $ViewScrollProvider() { + + var useAnchorScroll = false; + + /** + * @ngdoc function + * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll + * @methodOf ui.router.state.$uiViewScrollProvider + * + * @description + * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for + * scrolling based on the url anchor. + */ + this.useAnchorScroll = function () { + useAnchorScroll = true; + }; + + /** + * @ngdoc object + * @name ui.router.state.$uiViewScroll + * + * @requires $anchorScroll + * @requires $timeout + * + * @description + * When called with a jqLite element, it scrolls the element into view (after a + * `$timeout` so the DOM has time to refresh). + * + * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor, + * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}. + */ + this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) { + if (useAnchorScroll) { + return $anchorScroll; + } + + return function ($element) { + $timeout(function () { + $element[0].scrollIntoView(); + }, 0, false); + }; + }]; +} + +angular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider); + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-view + * + * @requires ui.router.state.$state + * @requires $compile + * @requires $controller + * @requires $injector + * @requires ui.router.state.$uiViewScroll + * @requires $document + * + * @restrict ECA + * + * @description + * The ui-view directive tells $state where to place your templates. + * + * @param {string=} name A view name. The name should be unique amongst the other views in the + * same state. You can have views of the same name that live in different states. + * + * @param {string=} autoscroll It allows you to set the scroll behavior of the browser window + * when a view is populated. By default, $anchorScroll is overridden by ui-router's custom scroll + * service, {@link ui.router.state.$uiViewScroll}. This custom service let's you + * scroll ui-view elements into view when they are populated during a state activation. + * + * *Note: To revert back to old [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) + * functionality, call `$uiViewScrollProvider.useAnchorScroll()`.* + * + * @param {string=} onload Expression to evaluate whenever the view updates. + * + * @example + * A view can be unnamed or named. + *
    + * 
    + * 
    + * + * + *
    + *
    + * + * You can only have one unnamed view within any template (or root html). If you are only using a + * single view and it is unnamed then you can populate it like so: + *
    + * 
    + * $stateProvider.state("home", { + * template: "

    HELLO!

    " + * }) + *
    + * + * The above is a convenient shortcut equivalent to specifying your view explicitly with the {@link ui.router.state.$stateProvider#views `views`} + * config property, by name, in this case an empty name: + *
    + * $stateProvider.state("home", {
    + *   views: {
    + *     "": {
    + *       template: "

    HELLO!

    " + * } + * } + * }) + *
    + * + * But typically you'll only use the views property if you name your view or have more than one view + * in the same template. There's not really a compelling reason to name a view if its the only one, + * but you could if you wanted, like so: + *
    + * 
    + *
    + *
    + * $stateProvider.state("home", {
    + *   views: {
    + *     "main": {
    + *       template: "

    HELLO!

    " + * } + * } + * }) + *
    + * + * Really though, you'll use views to set up multiple views: + *
    + * 
    + *
    + *
    + *
    + * + *
    + * $stateProvider.state("home", {
    + *   views: {
    + *     "": {
    + *       template: "

    HELLO!

    " + * }, + * "chart": { + * template: "" + * }, + * "data": { + * template: "" + * } + * } + * }) + *
    + * + * Examples for `autoscroll`: + * + *
    + * 
    + * 
    + *
    + * 
    + * 
    + * 
    + * 
    + * 
    + */ +$ViewDirective.$inject = ['$state', '$injector', '$uiViewScroll', '$interpolate']; +function $ViewDirective( $state, $injector, $uiViewScroll, $interpolate) { + + function getService() { + return ($injector.has) ? function(service) { + return $injector.has(service) ? $injector.get(service) : null; + } : function(service) { + try { + return $injector.get(service); + } catch (e) { + return null; + } + }; + } + + var service = getService(), + $animator = service('$animator'), + $animate = service('$animate'); + + // Returns a set of DOM manipulation functions based on which Angular version + // it should use + function getRenderer(attrs, scope) { + var statics = function() { + return { + enter: function (element, target, cb) { target.after(element); cb(); }, + leave: function (element, cb) { element.remove(); cb(); } + }; + }; + + if ($animate) { + return { + enter: function(element, target, cb) { + var promise = $animate.enter(element, null, target, cb); + if (promise && promise.then) promise.then(cb); + }, + leave: function(element, cb) { + var promise = $animate.leave(element, cb); + if (promise && promise.then) promise.then(cb); + } + }; + } + + if ($animator) { + var animate = $animator && $animator(scope, attrs); + + return { + enter: function(element, target, cb) {animate.enter(element, null, target); cb(); }, + leave: function(element, cb) { animate.leave(element); cb(); } + }; + } + + return statics(); + } + + var directive = { + restrict: 'ECA', + terminal: true, + priority: 400, + transclude: 'element', + compile: function (tElement, tAttrs, $transclude) { + return function (scope, $element, attrs) { + var previousEl, currentEl, currentScope, latestLocals, + onloadExp = attrs.onload || '', + autoScrollExp = attrs.autoscroll, + renderer = getRenderer(attrs, scope); + + scope.$on('$stateChangeSuccess', function() { + updateView(false); + }); + scope.$on('$viewContentLoading', function() { + updateView(false); + }); + + updateView(true); + + function cleanupLastView() { + if (previousEl) { + previousEl.remove(); + previousEl = null; + } + + if (currentScope) { + currentScope.$destroy(); + currentScope = null; + } + + if (currentEl) { + renderer.leave(currentEl, function() { + previousEl = null; + }); + + previousEl = currentEl; + currentEl = null; + } + } + + function updateView(firstTime) { + var newScope, + name = getUiViewName(scope, attrs, $element, $interpolate), + previousLocals = name && $state.$current && $state.$current.locals[name]; + + if (!firstTime && previousLocals === latestLocals) return; // nothing to do + newScope = scope.$new(); + latestLocals = $state.$current.locals[name]; + + var clone = $transclude(newScope, function(clone) { + renderer.enter(clone, $element, function onUiViewEnter() { + if(currentScope) { + currentScope.$emit('$viewContentAnimationEnded'); + } + + if (angular.isDefined(autoScrollExp) && !autoScrollExp || scope.$eval(autoScrollExp)) { + $uiViewScroll(clone); + } + }); + cleanupLastView(); + }); + + currentEl = clone; + currentScope = newScope; + /** + * @ngdoc event + * @name ui.router.state.directive:ui-view#$viewContentLoaded + * @eventOf ui.router.state.directive:ui-view + * @eventType emits on ui-view directive scope + * @description * + * Fired once the view is **loaded**, *after* the DOM is rendered. + * + * @param {Object} event Event object. + */ + currentScope.$emit('$viewContentLoaded'); + currentScope.$eval(onloadExp); + } + }; + } + }; + + return directive; +} + +$ViewDirectiveFill.$inject = ['$compile', '$controller', '$state', '$interpolate']; +function $ViewDirectiveFill ( $compile, $controller, $state, $interpolate) { + return { + restrict: 'ECA', + priority: -400, + compile: function (tElement) { + var initial = tElement.html(); + return function (scope, $element, attrs) { + var current = $state.$current, + name = getUiViewName(scope, attrs, $element, $interpolate), + locals = current && current.locals[name]; + + if (! locals) { + return; + } + + $element.data('$uiView', { name: name, state: locals.$$state }); + $element.html(locals.$template ? locals.$template : initial); + + var link = $compile($element.contents()); + + if (locals.$$controller) { + locals.$scope = scope; + var controller = $controller(locals.$$controller, locals); + if (locals.$$controllerAs) { + scope[locals.$$controllerAs] = controller; + } + $element.data('$ngControllerController', controller); + $element.children().data('$ngControllerController', controller); + } + + link(scope); + }; + } + }; +} + +/** + * Shared ui-view code for both directives: + * Given scope, element, and its attributes, return the view's name + */ +function getUiViewName(scope, attrs, element, $interpolate) { + var name = $interpolate(attrs.uiView || attrs.name || '')(scope); + var inherited = element.inheritedData('$uiView'); + return name.indexOf('@') >= 0 ? name : (name + '@' + (inherited ? inherited.state.name : '')); +} + +angular.module('ui.router.state').directive('uiView', $ViewDirective); +angular.module('ui.router.state').directive('uiView', $ViewDirectiveFill); + +function parseStateRef(ref, current) { + var preparsed = ref.match(/^\s*({[^}]*})\s*$/), parsed; + if (preparsed) ref = current + '(' + preparsed[1] + ')'; + parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/); + if (!parsed || parsed.length !== 4) throw new Error("Invalid state ref '" + ref + "'"); + return { state: parsed[1], paramExpr: parsed[3] || null }; +} + +function stateContext(el) { + var stateData = el.parent().inheritedData('$uiView'); + + if (stateData && stateData.state && stateData.state.name) { + return stateData.state; + } +} + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref + * + * @requires ui.router.state.$state + * @requires $timeout + * + * @restrict A + * + * @description + * A directive that binds a link (`` tag) to a state. If the state has an associated + * URL, the directive will automatically generate & update the `href` attribute via + * the {@link ui.router.state.$state#methods_href $state.href()} method. Clicking + * the link will trigger a state transition with optional parameters. + * + * Also middle-clicking, right-clicking, and ctrl-clicking on the link will be + * handled natively by the browser. + * + * You can also use relative state paths within ui-sref, just like the relative + * paths passed to `$state.go()`. You just need to be aware that the path is relative + * to the state that the link lives in, in other words the state that loaded the + * template containing the link. + * + * You can specify options to pass to {@link ui.router.state.$state#go $state.go()} + * using the `ui-sref-opts` attribute. Options are restricted to `location`, `inherit`, + * and `reload`. + * + * @example + * Here's an example of how you'd use ui-sref and how it would compile. If you have the + * following template: + *
    + * Home | About | Next page
    + * 
    + * 
    + * 
    + * + * Then the compiled html would be (assuming Html5Mode is off and current state is contacts): + *
    + * Home | About | Next page
    + * 
    + * 
      + *
    • + * Joe + *
    • + *
    • + * Alice + *
    • + *
    • + * Bob + *
    • + *
    + * + * Home + *
    + * + * @param {string} ui-sref 'stateName' can be any valid absolute or relative state + * @param {Object} ui-sref-opts options to pass to {@link ui.router.state.$state#go $state.go()} + */ +$StateRefDirective.$inject = ['$state', '$timeout']; +function $StateRefDirective($state, $timeout) { + var allowedOptions = ['location', 'inherit', 'reload']; + + return { + restrict: 'A', + require: ['?^uiSrefActive', '?^uiSrefActiveEq'], + link: function(scope, element, attrs, uiSrefActive) { + var ref = parseStateRef(attrs.uiSref, $state.current.name); + var params = null, url = null, base = stateContext(element) || $state.$current; + var newHref = null, isAnchor = element.prop("tagName") === "A"; + var isForm = element[0].nodeName === "FORM"; + var attr = isForm ? "action" : "href", nav = true; + + var options = { relative: base, inherit: true }; + var optionsOverride = scope.$eval(attrs.uiSrefOpts) || {}; + + angular.forEach(allowedOptions, function(option) { + if (option in optionsOverride) { + options[option] = optionsOverride[option]; + } + }); + + var update = function(newVal) { + if (newVal) params = angular.copy(newVal); + if (!nav) return; + + newHref = $state.href(ref.state, params, options); + + var activeDirective = uiSrefActive[1] || uiSrefActive[0]; + if (activeDirective) { + activeDirective.$$setStateInfo(ref.state, params); + } + if (newHref === null) { + nav = false; + return false; + } + attrs.$set(attr, newHref); + }; + + if (ref.paramExpr) { + scope.$watch(ref.paramExpr, function(newVal, oldVal) { + if (newVal !== params) update(newVal); + }, true); + params = angular.copy(scope.$eval(ref.paramExpr)); + } + update(); + + if (isForm) return; + + element.bind("click", function(e) { + var button = e.which || e.button; + if ( !(button > 1 || e.ctrlKey || e.metaKey || e.shiftKey || element.attr('target')) ) { + // HACK: This is to allow ng-clicks to be processed before the transition is initiated: + var transition = $timeout(function() { + $state.go(ref.state, params, options); + }); + e.preventDefault(); + + // if the state has no URL, ignore one preventDefault from the directive. + var ignorePreventDefaultCount = isAnchor && !newHref ? 1: 0; + e.preventDefault = function() { + if (ignorePreventDefaultCount-- <= 0) + $timeout.cancel(transition); + }; + } + }); + } + }; +} + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref-active + * + * @requires ui.router.state.$state + * @requires ui.router.state.$stateParams + * @requires $interpolate + * + * @restrict A + * + * @description + * A directive working alongside ui-sref to add classes to an element when the + * related ui-sref directive's state is active, and removing them when it is inactive. + * The primary use-case is to simplify the special appearance of navigation menus + * relying on `ui-sref`, by having the "active" state's menu button appear different, + * distinguishing it from the inactive menu items. + * + * ui-sref-active can live on the same element as ui-sref or on a parent element. The first + * ui-sref-active found at the same level or above the ui-sref will be used. + * + * Will activate when the ui-sref's target state or any child state is active. If you + * need to activate only when the ui-sref target state is active and *not* any of + * it's children, then you will use + * {@link ui.router.state.directive:ui-sref-active-eq ui-sref-active-eq} + * + * @example + * Given the following template: + *
    + * 
    + * 
    + * + * + * When the app state is "app.user" (or any children states), and contains the state parameter "user" with value "bilbobaggins", + * the resulting HTML will appear as (note the 'active' class): + *
    + * 
    + * 
    + * + * The class name is interpolated **once** during the directives link time (any further changes to the + * interpolated value are ignored). + * + * Multiple classes may be specified in a space-separated format: + *
    + * 
      + *
    • + * link + *
    • + *
    + *
    + */ + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref-active-eq + * + * @requires ui.router.state.$state + * @requires ui.router.state.$stateParams + * @requires $interpolate + * + * @restrict A + * + * @description + * The same as {@link ui.router.state.directive:ui-sref-active ui-sref-active} but will only activate + * when the exact target state used in the `ui-sref` is active; no child states. + * + */ +$StateRefActiveDirective.$inject = ['$state', '$stateParams', '$interpolate']; +function $StateRefActiveDirective($state, $stateParams, $interpolate) { + return { + restrict: "A", + controller: ['$scope', '$element', '$attrs', function ($scope, $element, $attrs) { + var state, params, activeClass; + + // There probably isn't much point in $observing this + // uiSrefActive and uiSrefActiveEq share the same directive object with some + // slight difference in logic routing + activeClass = $interpolate($attrs.uiSrefActiveEq || $attrs.uiSrefActive || '', false)($scope); + + // Allow uiSref to communicate with uiSrefActive[Equals] + this.$$setStateInfo = function (newState, newParams) { + state = $state.get(newState, stateContext($element)); + params = newParams; + update(); + }; + + $scope.$on('$stateChangeSuccess', update); + + // Update route state + function update() { + if (isMatch()) { + $element.addClass(activeClass); + } else { + $element.removeClass(activeClass); + } + } + + function isMatch() { + if (typeof $attrs.uiSrefActiveEq !== 'undefined') { + return state && $state.is(state.name, params); + } else { + return state && $state.includes(state.name, params); + } + } + }] + }; +} + +angular.module('ui.router.state') + .directive('uiSref', $StateRefDirective) + .directive('uiSrefActive', $StateRefActiveDirective) + .directive('uiSrefActiveEq', $StateRefActiveDirective); + +/** + * @ngdoc filter + * @name ui.router.state.filter:isState + * + * @requires ui.router.state.$state + * + * @description + * Translates to {@link ui.router.state.$state#methods_is $state.is("stateName")}. + */ +$IsStateFilter.$inject = ['$state']; +function $IsStateFilter($state) { + var isFilter = function (state) { + return $state.is(state); + }; + isFilter.$stateful = true; + return isFilter; +} + +/** + * @ngdoc filter + * @name ui.router.state.filter:includedByState + * + * @requires ui.router.state.$state + * + * @description + * Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}. + */ +$IncludedByStateFilter.$inject = ['$state']; +function $IncludedByStateFilter($state) { + var includesFilter = function (state) { + return $state.includes(state); + }; + includesFilter.$stateful = true; + return includesFilter; +} + +angular.module('ui.router.state') + .filter('isState', $IsStateFilter) + .filter('includedByState', $IncludedByStateFilter); +})(window, window.angular); \ No newline at end of file diff --git a/www/lib/ionic/js/angular-ui/angular-ui-router.min.js b/www/lib/ionic/js/angular-ui/angular-ui-router.min.js new file mode 100644 index 0000000..be06fb5 --- /dev/null +++ b/www/lib/ionic/js/angular-ui/angular-ui-router.min.js @@ -0,0 +1,7 @@ +/** + * State-based routing for AngularJS + * @version v0.2.13 + * @link http://angular-ui.github.com/ + * @license MIT License, http://www.opensource.org/licenses/MIT + */ +"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(a,b,c){"use strict";function d(a,b){return M(new(M(function(){},{prototype:a})),b)}function e(a){return L(arguments,function(b){b!==a&&L(b,function(b,c){a.hasOwnProperty(c)||(a[c]=b)})}),a}function f(a,b){var c=[];for(var d in a.path){if(a.path[d]!==b.path[d])break;c.push(a.path[d])}return c}function g(a){if(Object.keys)return Object.keys(a);var c=[];return b.forEach(a,function(a,b){c.push(b)}),c}function h(a,b){if(Array.prototype.indexOf)return a.indexOf(b,Number(arguments[2])||0);var c=a.length>>>0,d=Number(arguments[2])||0;for(d=0>d?Math.ceil(d):Math.floor(d),0>d&&(d+=c);c>d;d++)if(d in a&&a[d]===b)return d;return-1}function i(a,b,c,d){var e,i=f(c,d),j={},k=[];for(var l in i)if(i[l].params&&(e=g(i[l].params),e.length))for(var m in e)h(k,e[m])>=0||(k.push(e[m]),j[e[m]]=a[e[m]]);return M({},j,b)}function j(a,b,c){if(!c){c=[];for(var d in a)c.push(d)}for(var e=0;e "));if(s[c]=d,I(a))q.push(c,[function(){return b.get(a)}],j);else{var e=b.annotate(a);L(e,function(a){a!==c&&i.hasOwnProperty(a)&&n(i[a],a)}),q.push(c,a,e)}r.pop(),s[c]=f}}function o(a){return J(a)&&a.then&&a.$$promises}if(!J(i))throw new Error("'invocables' must be an object");var p=g(i||{}),q=[],r=[],s={};return L(i,n),i=r=s=null,function(d,f,g){function h(){--u||(v||e(t,f.$$values),r.$$values=t,r.$$promises=r.$$promises||!0,delete r.$$inheritedValues,n.resolve(t))}function i(a){r.$$failure=a,n.reject(a)}function j(c,e,f){function j(a){l.reject(a),i(a)}function k(){if(!G(r.$$failure))try{l.resolve(b.invoke(e,g,t)),l.promise.then(function(a){t[c]=a,h()},j)}catch(a){j(a)}}var l=a.defer(),m=0;L(f,function(a){s.hasOwnProperty(a)&&!d.hasOwnProperty(a)&&(m++,s[a].then(function(b){t[a]=b,--m||k()},j))}),m||k(),s[c]=l.promise}if(o(d)&&g===c&&(g=f,f=d,d=null),d){if(!J(d))throw new Error("'locals' must be an object")}else d=k;if(f){if(!o(f))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else f=m;var n=a.defer(),r=n.promise,s=r.$$promises={},t=M({},d),u=1+q.length/3,v=!1;if(G(f.$$failure))return i(f.$$failure),r;f.$$inheritedValues&&e(t,l(f.$$inheritedValues,p)),M(s,f.$$promises),f.$$values?(v=e(t,l(f.$$values,p)),r.$$inheritedValues=l(f.$$values,p),h()):(f.$$inheritedValues&&(r.$$inheritedValues=l(f.$$inheritedValues,p)),f.then(h,i));for(var w=0,x=q.length;x>w;w+=3)d.hasOwnProperty(q[w])?h():j(q[w],q[w+1],q[w+2]);return r}},this.resolve=function(a,b,c,d){return this.study(a)(b,c,d)}}function p(a,b,c){this.fromConfig=function(a,b,c){return G(a.template)?this.fromString(a.template,b):G(a.templateUrl)?this.fromUrl(a.templateUrl,b):G(a.templateProvider)?this.fromProvider(a.templateProvider,b,c):null},this.fromString=function(a,b){return H(a)?a(b):a},this.fromUrl=function(c,d){return H(c)&&(c=c(d)),null==c?null:a.get(c,{cache:b,headers:{Accept:"text/html"}}).then(function(a){return a.data})},this.fromProvider=function(a,b,d){return c.invoke(a,null,d||{params:b})}}function q(a,b,e){function f(b,c,d,e){if(q.push(b),o[b])return o[b];if(!/^\w+(-+\w+)*(?:\[\])?$/.test(b))throw new Error("Invalid parameter name '"+b+"' in pattern '"+a+"'");if(p[b])throw new Error("Duplicate parameter name '"+b+"' in pattern '"+a+"'");return p[b]=new O.Param(b,c,d,e),p[b]}function g(a,b,c){var d=["",""],e=a.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!b)return e;switch(c){case!1:d=["(",")"];break;case!0:d=["?(",")?"];break;default:d=["("+c+"|",")?"]}return e+d[0]+b+d[1]}function h(c,e){var f,g,h,i,j;return f=c[2]||c[3],j=b.params[f],h=a.substring(m,c.index),g=e?c[4]:c[4]||("*"==c[1]?".*":null),i=O.type(g||"string")||d(O.type("string"),{pattern:new RegExp(g)}),{id:f,regexp:g,segment:h,type:i,cfg:j}}b=M({params:{}},J(b)?b:{});var i,j=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,k=/([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,l="^",m=0,n=this.segments=[],o=e?e.params:{},p=this.params=e?e.params.$$new():new O.ParamSet,q=[];this.source=a;for(var r,s,t;(i=j.exec(a))&&(r=h(i,!1),!(r.segment.indexOf("?")>=0));)s=f(r.id,r.type,r.cfg,"path"),l+=g(r.segment,s.type.pattern.source,s.squash),n.push(r.segment),m=j.lastIndex;t=a.substring(m);var u=t.indexOf("?");if(u>=0){var v=this.sourceSearch=t.substring(u);if(t=t.substring(0,u),this.sourcePath=a.substring(0,m+u),v.length>0)for(m=0;i=k.exec(v);)r=h(i,!0),s=f(r.id,r.type,r.cfg,"search"),m=j.lastIndex}else this.sourcePath=a,this.sourceSearch="";l+=g(t)+(b.strict===!1?"/?":"")+"$",n.push(t),this.regexp=new RegExp(l,b.caseInsensitive?"i":c),this.prefix=n[0],this.$$paramNames=q}function r(a){M(this,a)}function s(){function a(a){return null!=a?a.toString().replace(/\//g,"%2F"):a}function e(a){return null!=a?a.toString().replace(/%2F/g,"/"):a}function f(a){return this.pattern.test(a)}function i(){return{strict:t,caseInsensitive:p}}function j(a){return H(a)||K(a)&&H(a[a.length-1])}function k(){for(;x.length;){var a=x.shift();if(a.pattern)throw new Error("You cannot override a type's .pattern at runtime.");b.extend(v[a.name],o.invoke(a.def))}}function l(a){M(this,a||{})}O=this;var o,p=!1,t=!0,u=!1,v={},w=!0,x=[],y={string:{encode:a,decode:e,is:f,pattern:/[^/]*/},"int":{encode:a,decode:function(a){return parseInt(a,10)},is:function(a){return G(a)&&this.decode(a.toString())===a},pattern:/\d+/},bool:{encode:function(a){return a?1:0},decode:function(a){return 0!==parseInt(a,10)},is:function(a){return a===!0||a===!1},pattern:/0|1/},date:{encode:function(a){return this.is(a)?[a.getFullYear(),("0"+(a.getMonth()+1)).slice(-2),("0"+a.getDate()).slice(-2)].join("-"):c},decode:function(a){if(this.is(a))return a;var b=this.capture.exec(a);return b?new Date(b[1],b[2]-1,b[3]):c},is:function(a){return a instanceof Date&&!isNaN(a.valueOf())},equals:function(a,b){return this.is(a)&&this.is(b)&&a.toISOString()===b.toISOString()},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:b.toJson,decode:b.fromJson,is:b.isObject,equals:b.equals,pattern:/[^/]*/},any:{encode:b.identity,decode:b.identity,is:b.identity,equals:b.equals,pattern:/.*/}};s.$$getDefaultValue=function(a){if(!j(a.value))return a.value;if(!o)throw new Error("Injectable functions cannot be called at configuration time");return o.invoke(a.value)},this.caseInsensitive=function(a){return G(a)&&(p=a),p},this.strictMode=function(a){return G(a)&&(t=a),t},this.defaultSquashPolicy=function(a){if(!G(a))return u;if(a!==!0&&a!==!1&&!I(a))throw new Error("Invalid squash policy: "+a+". Valid policies: false, true, arbitrary-string");return u=a,a},this.compile=function(a,b){return new q(a,M(i(),b))},this.isMatcher=function(a){if(!J(a))return!1;var b=!0;return L(q.prototype,function(c,d){H(c)&&(b=b&&G(a[d])&&H(a[d]))}),b},this.type=function(a,b,c){if(!G(b))return v[a];if(v.hasOwnProperty(a))throw new Error("A type named '"+a+"' has already been defined.");return v[a]=new r(M({name:a},b)),c&&(x.push({name:a,def:c}),w||k()),this},L(y,function(a,b){v[b]=new r(M({name:b},a))}),v=d(v,{}),this.$get=["$injector",function(a){return o=a,w=!1,k(),L(y,function(a,b){v[b]||(v[b]=new r(a))}),this}],this.Param=function(a,b,d,e){function f(a){var b=J(a)?g(a):[],c=-1===h(b,"value")&&-1===h(b,"type")&&-1===h(b,"squash")&&-1===h(b,"array");return c&&(a={value:a}),a.$$fn=j(a.value)?a.value:function(){return a.value},a}function i(b,c,d){if(b.type&&c)throw new Error("Param '"+a+"' has two type configurations.");return c?c:b.type?b.type instanceof r?b.type:new r(b.type):"config"===d?v.any:v.string}function k(){var b={array:"search"===e?"auto":!1},c=a.match(/\[\]$/)?{array:!0}:{};return M(b,c,d).array}function l(a,b){var c=a.squash;if(!b||c===!1)return!1;if(!G(c)||null==c)return u;if(c===!0||I(c))return c;throw new Error("Invalid squash policy: '"+c+"'. Valid policies: false, true, or arbitrary string")}function p(a,b,d,e){var f,g,i=[{from:"",to:d||b?c:""},{from:null,to:d||b?c:""}];return f=K(a.replace)?a.replace:[],I(e)&&f.push({from:e,to:c}),g=n(f,function(a){return a.from}),m(i,function(a){return-1===h(g,a.from)}).concat(f)}function q(){if(!o)throw new Error("Injectable functions cannot be called at configuration time");return o.invoke(d.$$fn)}function s(a){function b(a){return function(b){return b.from===a}}function c(a){var c=n(m(w.replace,b(a)),function(a){return a.to});return c.length?c[0]:a}return a=c(a),G(a)?w.type.decode(a):q()}function t(){return"{Param:"+a+" "+b+" squash: '"+z+"' optional: "+y+"}"}var w=this;d=f(d),b=i(d,b,e);var x=k();b=x?b.$asArray(x,"search"===e):b,"string"!==b.name||x||"path"!==e||d.value!==c||(d.value="");var y=d.value!==c,z=l(d,y),A=p(d,x,y,z);M(this,{id:a,type:b,location:e,array:x,squash:z,replace:A,isOptional:y,value:s,dynamic:c,config:d,toString:t})},l.prototype={$$new:function(){return d(this,M(new l,{$$parent:this}))},$$keys:function(){for(var a=[],b=[],c=this,d=g(l.prototype);c;)b.push(c),c=c.$$parent;return b.reverse(),L(b,function(b){L(g(b),function(b){-1===h(a,b)&&-1===h(d,b)&&a.push(b)})}),a},$$values:function(a){var b={},c=this;return L(c.$$keys(),function(d){b[d]=c[d].value(a&&a[d])}),b},$$equals:function(a,b){var c=!0,d=this;return L(d.$$keys(),function(e){var f=a&&a[e],g=b&&b[e];d[e].type.equals(f,g)||(c=!1)}),c},$$validates:function(a){var b,c,d,e=!0,f=this;return L(this.$$keys(),function(g){d=f[g],c=a[g],b=!c&&d.isOptional,e=e&&(b||!!d.type.is(c))}),e},$$parent:c},this.ParamSet=l}function t(a,d){function e(a){var b=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(a.source);return null!=b?b[1].replace(/\\(.)/g,"$1"):""}function f(a,b){return a.replace(/\$(\$|\d{1,2})/,function(a,c){return b["$"===c?0:Number(c)]})}function g(a,b,c){if(!c)return!1;var d=a.invoke(b,b,{$match:c});return G(d)?d:!0}function h(d,e,f,g){function h(a,b,c){return"/"===p?a:b?p.slice(0,-1)+a:c?p.slice(1)+a:a}function m(a){function b(a){var b=a(f,d);return b?(I(b)&&d.replace().url(b),!0):!1}if(!a||!a.defaultPrevented){var e=o&&d.url()===o;if(o=c,e)return!0;var g,h=j.length;for(g=0;h>g;g++)if(b(j[g]))return;k&&b(k)}}function n(){return i=i||e.$on("$locationChangeSuccess",m)}var o,p=g.baseHref(),q=d.url();return l||n(),{sync:function(){m()},listen:function(){return n()},update:function(a){return a?void(q=d.url()):void(d.url()!==q&&(d.url(q),d.replace()))},push:function(a,b,e){d.url(a.format(b||{})),o=e&&e.$$avoidResync?d.url():c,e&&e.replace&&d.replace()},href:function(c,e,f){if(!c.validates(e))return null;var g=a.html5Mode();b.isObject(g)&&(g=g.enabled);var i=c.format(e);if(f=f||{},g||null===i||(i="#"+a.hashPrefix()+i),i=h(i,g,f.absolute),!f.absolute||!i)return i;var j=!g&&i?"/":"",k=d.port();return k=80===k||443===k?"":":"+k,[d.protocol(),"://",d.host(),k,j,i].join("")}}}var i,j=[],k=null,l=!1;this.rule=function(a){if(!H(a))throw new Error("'rule' must be a function");return j.push(a),this},this.otherwise=function(a){if(I(a)){var b=a;a=function(){return b}}else if(!H(a))throw new Error("'rule' must be a function");return k=a,this},this.when=function(a,b){var c,h=I(b);if(I(a)&&(a=d.compile(a)),!h&&!H(b)&&!K(b))throw new Error("invalid 'handler' in when()");var i={matcher:function(a,b){return h&&(c=d.compile(b),b=["$match",function(a){return c.format(a)}]),M(function(c,d){return g(c,b,a.exec(d.path(),d.search()))},{prefix:I(a.prefix)?a.prefix:""})},regex:function(a,b){if(a.global||a.sticky)throw new Error("when() RegExp must not be global or sticky");return h&&(c=b,b=["$match",function(a){return f(c,a)}]),M(function(c,d){return g(c,b,a.exec(d.path()))},{prefix:e(a)})}},j={matcher:d.isMatcher(a),regex:a instanceof RegExp};for(var k in j)if(j[k])return this.rule(i[k](a,b));throw new Error("invalid 'what' in when()")},this.deferIntercept=function(a){a===c&&(a=!0),l=a},this.$get=h,h.$inject=["$location","$rootScope","$injector","$browser"]}function u(a,e){function f(a){return 0===a.indexOf(".")||0===a.indexOf("^")}function l(a,b){if(!a)return c;var d=I(a),e=d?a:a.name,g=f(e);if(g){if(!b)throw new Error("No reference point given for path '"+e+"'");b=l(b);for(var h=e.split("."),i=0,j=h.length,k=b;j>i;i++)if(""!==h[i]||0!==i){if("^"!==h[i])break;if(!k.parent)throw new Error("Path '"+e+"' not valid for state '"+b.name+"'");k=k.parent}else k=b;h=h.slice(i).join("."),e=k.name+(k.name&&h?".":"")+h}var m=y[e];return!m||!d&&(d||m!==a&&m.self!==a)?c:m}function m(a,b){z[a]||(z[a]=[]),z[a].push(b)}function o(a){for(var b=z[a]||[];b.length;)p(b.shift())}function p(b){b=d(b,{self:b,resolve:b.resolve||{},toString:function(){return this.name}});var c=b.name;if(!I(c)||c.indexOf("@")>=0)throw new Error("State must have a valid name");if(y.hasOwnProperty(c))throw new Error("State '"+c+"'' is already defined");var e=-1!==c.indexOf(".")?c.substring(0,c.lastIndexOf(".")):I(b.parent)?b.parent:J(b.parent)&&I(b.parent.name)?b.parent.name:"";if(e&&!y[e])return m(e,b.self);for(var f in B)H(B[f])&&(b[f]=B[f](b,B.$delegates[f]));return y[c]=b,!b[A]&&b.url&&a.when(b.url,["$match","$stateParams",function(a,c){x.$current.navigable==b&&j(a,c)||x.transitionTo(b,a,{inherit:!0,location:!1})}]),o(c),b}function q(a){return a.indexOf("*")>-1}function r(a){var b=a.split("."),c=x.$current.name.split(".");if("**"===b[0]&&(c=c.slice(h(c,b[1])),c.unshift("**")),"**"===b[b.length-1]&&(c.splice(h(c,b[b.length-2])+1,Number.MAX_VALUE),c.push("**")),b.length!=c.length)return!1;for(var d=0,e=b.length;e>d;d++)"*"===b[d]&&(c[d]="*");return c.join("")===b.join("")}function s(a,b){return I(a)&&!G(b)?B[a]:H(b)&&I(a)?(B[a]&&!B.$delegates[a]&&(B.$delegates[a]=B[a]),B[a]=b,this):this}function t(a,b){return J(a)?b=a:b.name=a,p(b),this}function u(a,e,f,h,m,o,p){function s(b,c,d,f){var g=a.$broadcast("$stateNotFound",b,c,d);if(g.defaultPrevented)return p.update(),B;if(!g.retry)return null;if(f.$retry)return p.update(),C;var h=x.transition=e.when(g.retry);return h.then(function(){return h!==x.transition?u:(b.options.$retry=!0,x.transitionTo(b.to,b.toParams,b.options))},function(){return B}),p.update(),h}function t(a,c,d,g,i,j){var l=d?c:k(a.params.$$keys(),c),n={$stateParams:l};i.resolve=m.resolve(a.resolve,n,i.resolve,a);var o=[i.resolve.then(function(a){i.globals=a})];return g&&o.push(g),L(a.views,function(c,d){var e=c.resolve&&c.resolve!==a.resolve?c.resolve:{};e.$template=[function(){return f.load(d,{view:c,locals:n,params:l,notify:j.notify})||""}],o.push(m.resolve(e,n,i.resolve,a).then(function(f){if(H(c.controllerProvider)||K(c.controllerProvider)){var g=b.extend({},e,n);f.$$controller=h.invoke(c.controllerProvider,null,g)}else f.$$controller=c.controller;f.$$state=a,f.$$controllerAs=c.controllerAs,i[d]=f}))}),e.all(o).then(function(){return i})}var u=e.reject(new Error("transition superseded")),z=e.reject(new Error("transition prevented")),B=e.reject(new Error("transition aborted")),C=e.reject(new Error("transition failed"));return w.locals={resolve:null,globals:{$stateParams:{}}},x={params:{},current:w.self,$current:w,transition:null},x.reload=function(){return x.transitionTo(x.current,o,{reload:!0,inherit:!1,notify:!0})},x.go=function(a,b,c){return x.transitionTo(a,b,M({inherit:!0,relative:x.$current},c))},x.transitionTo=function(b,c,f){c=c||{},f=M({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},f||{});var g,j=x.$current,m=x.params,n=j.path,q=l(b,f.relative);if(!G(q)){var r={to:b,toParams:c,options:f},y=s(r,j.self,m,f);if(y)return y;if(b=r.to,c=r.toParams,f=r.options,q=l(b,f.relative),!G(q)){if(!f.relative)throw new Error("No such state '"+b+"'");throw new Error("Could not resolve '"+b+"' from state '"+f.relative+"'")}}if(q[A])throw new Error("Cannot transition to abstract state '"+b+"'");if(f.inherit&&(c=i(o,c||{},x.$current,q)),!q.params.$$validates(c))return C;c=q.params.$$values(c),b=q;var B=b.path,D=0,E=B[D],F=w.locals,H=[];if(!f.reload)for(;E&&E===n[D]&&E.ownParams.$$equals(c,m);)F=H[D]=E.locals,D++,E=B[D];if(v(b,j,F,f))return b.self.reloadOnSearch!==!1&&p.update(),x.transition=null,e.when(x.current);if(c=k(b.params.$$keys(),c||{}),f.notify&&a.$broadcast("$stateChangeStart",b.self,c,j.self,m).defaultPrevented)return p.update(),z;for(var I=e.when(F),J=D;J=D;d--)g=n[d],g.self.onExit&&h.invoke(g.self.onExit,g.self,g.locals.globals),g.locals=null;for(d=D;d=0?e:e+"@"+(f?f.state.name:"")}function A(a,b){var c,d=a.match(/^\s*({[^}]*})\s*$/);if(d&&(a=b+"("+d[1]+")"),c=a.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/),!c||4!==c.length)throw new Error("Invalid state ref '"+a+"'");return{state:c[1],paramExpr:c[3]||null}}function B(a){var b=a.parent().inheritedData("$uiView");return b&&b.state&&b.state.name?b.state:void 0}function C(a,c){var d=["location","inherit","reload"];return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(e,f,g,h){var i=A(g.uiSref,a.current.name),j=null,k=B(f)||a.$current,l=null,m="A"===f.prop("tagName"),n="FORM"===f[0].nodeName,o=n?"action":"href",p=!0,q={relative:k,inherit:!0},r=e.$eval(g.uiSrefOpts)||{};b.forEach(d,function(a){a in r&&(q[a]=r[a])});var s=function(c){if(c&&(j=b.copy(c)),p){l=a.href(i.state,j,q);var d=h[1]||h[0];return d&&d.$$setStateInfo(i.state,j),null===l?(p=!1,!1):void g.$set(o,l)}};i.paramExpr&&(e.$watch(i.paramExpr,function(a){a!==j&&s(a)},!0),j=b.copy(e.$eval(i.paramExpr))),s(),n||f.bind("click",function(b){var d=b.which||b.button;if(!(d>1||b.ctrlKey||b.metaKey||b.shiftKey||f.attr("target"))){var e=c(function(){a.go(i.state,j,q)});b.preventDefault();var g=m&&!l?1:0;b.preventDefault=function(){g--<=0&&c.cancel(e)}}})}}}function D(a,b,c){return{restrict:"A",controller:["$scope","$element","$attrs",function(b,d,e){function f(){g()?d.addClass(j):d.removeClass(j)}function g(){return"undefined"!=typeof e.uiSrefActiveEq?h&&a.is(h.name,i):h&&a.includes(h.name,i)}var h,i,j;j=c(e.uiSrefActiveEq||e.uiSrefActive||"",!1)(b),this.$$setStateInfo=function(b,c){h=a.get(b,B(d)),i=c,f()},b.$on("$stateChangeSuccess",f)}]}}function E(a){var b=function(b){return a.is(b)};return b.$stateful=!0,b}function F(a){var b=function(b){return a.includes(b)};return b.$stateful=!0,b}var G=b.isDefined,H=b.isFunction,I=b.isString,J=b.isObject,K=b.isArray,L=b.forEach,M=b.extend,N=b.copy;b.module("ui.router.util",["ng"]),b.module("ui.router.router",["ui.router.util"]),b.module("ui.router.state",["ui.router.router","ui.router.util"]),b.module("ui.router",["ui.router.state"]),b.module("ui.router.compat",["ui.router"]),o.$inject=["$q","$injector"],b.module("ui.router.util").service("$resolve",o),p.$inject=["$http","$templateCache","$injector"],b.module("ui.router.util").service("$templateFactory",p);var O;q.prototype.concat=function(a,b){var c={caseInsensitive:O.caseInsensitive(),strict:O.strictMode(),squash:O.defaultSquashPolicy()};return new q(this.sourcePath+a+this.sourceSearch,M(c,b),this)},q.prototype.toString=function(){return this.source},q.prototype.exec=function(a,b){function c(a){function b(a){return a.split("").reverse().join("")}function c(a){return a.replace(/\\-/,"-")}var d=b(a).split(/-(?!\\)/),e=n(d,b);return n(e,c).reverse()}var d=this.regexp.exec(a);if(!d)return null;b=b||{};var e,f,g,h=this.parameters(),i=h.length,j=this.segments.length-1,k={};if(j!==d.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");for(e=0;j>e;e++){g=h[e];var l=this.params[g],m=d[e+1];for(f=0;fe;e++)g=h[e],k[g]=this.params[g].value(b[g]);return k},q.prototype.parameters=function(a){return G(a)?this.params[a]||null:this.$$paramNames},q.prototype.validates=function(a){return this.params.$$validates(a)},q.prototype.format=function(a){function b(a){return encodeURIComponent(a).replace(/-/g,function(a){return"%5C%"+a.charCodeAt(0).toString(16).toUpperCase()})}a=a||{};var c=this.segments,d=this.parameters(),e=this.params;if(!this.validates(a))return null;var f,g=!1,h=c.length-1,i=d.length,j=c[0];for(f=0;i>f;f++){var k=h>f,l=d[f],m=e[l],o=m.value(a[l]),p=m.isOptional&&m.type.equals(m.value(),o),q=p?m.squash:!1,r=m.type.encode(o);if(k){var s=c[f+1];if(q===!1)null!=r&&(j+=K(r)?n(r,b).join("-"):encodeURIComponent(r)),j+=s;else if(q===!0){var t=j.match(/\/$/)?/\/?(.*)/:/(.*)/;j+=s.match(t)[1]}else I(q)&&(j+=q+s)}else{if(null==r||p&&q!==!1)continue;K(r)||(r=[r]),r=n(r,encodeURIComponent).join("&"+l+"="),j+=(g?"&":"?")+(l+"="+r),g=!0}}return j},r.prototype.is=function(){return!0},r.prototype.encode=function(a){return a},r.prototype.decode=function(a){return a},r.prototype.equals=function(a,b){return a==b},r.prototype.$subPattern=function(){var a=this.pattern.toString();return a.substr(1,a.length-2)},r.prototype.pattern=/.*/,r.prototype.toString=function(){return"{Type:"+this.name+"}"},r.prototype.$asArray=function(a,b){function d(a,b){function d(a,b){return function(){return a[b].apply(a,arguments)}}function e(a){return K(a)?a:G(a)?[a]:[]}function f(a){switch(a.length){case 0:return c;case 1:return"auto"===b?a[0]:a;default:return a}}function g(a){return!a}function h(a,b){return function(c){c=e(c);var d=n(c,a);return b===!0?0===m(d,g).length:f(d)}}function i(a){return function(b,c){var d=e(b),f=e(c);if(d.length!==f.length)return!1;for(var g=0;g 0) { + className += (i > 0) ? ' ' : ''; + className += isPrefix ? fix + klass + : klass + fix; + } + }); + return className; +} + +function removeFromArray(arr, val) { + var index = arr.indexOf(val); + if (val >= 0) { + arr.splice(index, 1); + } +} + +function stripCommentsFromElement(element) { + if (element instanceof jqLite) { + switch (element.length) { + case 0: + return []; + break; + + case 1: + // there is no point of stripping anything if the element + // is the only element within the jqLite wrapper. + // (it's important that we retain the element instance.) + if (element[0].nodeType === ELEMENT_NODE) { + return element; + } + break; + + default: + return jqLite(extractElementNode(element)); + break; + } + } + + if (element.nodeType === ELEMENT_NODE) { + return jqLite(element); + } +} + +function extractElementNode(element) { + if (!element[0]) return element; + for (var i = 0; i < element.length; i++) { + var elm = element[i]; + if (elm.nodeType == ELEMENT_NODE) { + return elm; + } + } +} + +function $$addClass($$jqLite, element, className) { + forEach(element, function(elm) { + $$jqLite.addClass(elm, className); + }); +} + +function $$removeClass($$jqLite, element, className) { + forEach(element, function(elm) { + $$jqLite.removeClass(elm, className); + }); +} + +function applyAnimationClassesFactory($$jqLite) { + return function(element, options) { + if (options.addClass) { + $$addClass($$jqLite, element, options.addClass); + options.addClass = null; + } + if (options.removeClass) { + $$removeClass($$jqLite, element, options.removeClass); + options.removeClass = null; + } + } +} + +function prepareAnimationOptions(options) { + options = options || {}; + if (!options.$$prepared) { + var domOperation = options.domOperation || noop; + options.domOperation = function() { + options.$$domOperationFired = true; + domOperation(); + domOperation = noop; + }; + options.$$prepared = true; + } + return options; +} + +function applyAnimationStyles(element, options) { + applyAnimationFromStyles(element, options); + applyAnimationToStyles(element, options); +} + +function applyAnimationFromStyles(element, options) { + if (options.from) { + element.css(options.from); + options.from = null; + } +} + +function applyAnimationToStyles(element, options) { + if (options.to) { + element.css(options.to); + options.to = null; + } +} + +function mergeAnimationOptions(element, target, newOptions) { + var toAdd = (target.addClass || '') + ' ' + (newOptions.addClass || ''); + var toRemove = (target.removeClass || '') + ' ' + (newOptions.removeClass || ''); + var classes = resolveElementClasses(element.attr('class'), toAdd, toRemove); + + extend(target, newOptions); + + if (classes.addClass) { + target.addClass = classes.addClass; + } else { + target.addClass = null; + } + + if (classes.removeClass) { + target.removeClass = classes.removeClass; + } else { + target.removeClass = null; + } + + return target; +} + +function resolveElementClasses(existing, toAdd, toRemove) { + var ADD_CLASS = 1; + var REMOVE_CLASS = -1; + + var flags = {}; + existing = splitClassesToLookup(existing); + + toAdd = splitClassesToLookup(toAdd); + forEach(toAdd, function(value, key) { + flags[key] = ADD_CLASS; + }); + + toRemove = splitClassesToLookup(toRemove); + forEach(toRemove, function(value, key) { + flags[key] = flags[key] === ADD_CLASS ? null : REMOVE_CLASS; + }); + + var classes = { + addClass: '', + removeClass: '' + }; + + forEach(flags, function(val, klass) { + var prop, allow; + if (val === ADD_CLASS) { + prop = 'addClass'; + allow = !existing[klass]; + } else if (val === REMOVE_CLASS) { + prop = 'removeClass'; + allow = existing[klass]; + } + if (allow) { + if (classes[prop].length) { + classes[prop] += ' '; + } + classes[prop] += klass; + } + }); + + function splitClassesToLookup(classes) { + if (isString(classes)) { + classes = classes.split(' '); + } + + var obj = {}; + forEach(classes, function(klass) { + // sometimes the split leaves empty string values + // incase extra spaces were applied to the options + if (klass.length) { + obj[klass] = true; + } + }); + return obj; + } + + return classes; +} + +function getDomNode(element) { + return (element instanceof angular.element) ? element[0] : element; +} + +var $$rAFSchedulerFactory = ['$$rAF', function($$rAF) { + var tickQueue = []; + var cancelFn; + + function scheduler(tasks) { + // we make a copy since RAFScheduler mutates the state + // of the passed in array variable and this would be difficult + // to track down on the outside code + tickQueue.push([].concat(tasks)); + nextTick(); + } + + /* waitUntilQuiet does two things: + * 1. It will run the FINAL `fn` value only when an uncancelled RAF has passed through + * 2. It will delay the next wave of tasks from running until the quiet `fn` has run. + * + * The motivation here is that animation code can request more time from the scheduler + * before the next wave runs. This allows for certain DOM properties such as classes to + * be resolved in time for the next animation to run. + */ + scheduler.waitUntilQuiet = function(fn) { + if (cancelFn) cancelFn(); + + cancelFn = $$rAF(function() { + cancelFn = null; + fn(); + nextTick(); + }); + }; + + return scheduler; + + function nextTick() { + if (!tickQueue.length) return; + + var updatedQueue = []; + for (var i = 0; i < tickQueue.length; i++) { + var innerQueue = tickQueue[i]; + runNextTask(innerQueue); + if (innerQueue.length) { + updatedQueue.push(innerQueue); + } + } + tickQueue = updatedQueue; + + if (!cancelFn) { + $$rAF(function() { + if (!cancelFn) nextTick(); + }); + } + } + + function runNextTask(tasks) { + var nextTask = tasks.shift(); + nextTask(); + } +}]; + +var $$AnimateChildrenDirective = [function() { + return function(scope, element, attrs) { + var val = attrs.ngAnimateChildren; + if (angular.isString(val) && val.length === 0) { //empty attribute + element.data(NG_ANIMATE_CHILDREN_DATA, true); + } else { + attrs.$observe('ngAnimateChildren', function(value) { + value = value === 'on' || value === 'true'; + element.data(NG_ANIMATE_CHILDREN_DATA, value); + }); + } + }; +}]; + +/** + * @ngdoc service + * @name $animateCss + * @kind object + * + * @description + * The `$animateCss` service is a useful utility to trigger customized CSS-based transitions/keyframes + * from a JavaScript-based animation or directly from a directive. The purpose of `$animateCss` is NOT + * to side-step how `$animate` and ngAnimate work, but the goal is to allow pre-existing animations or + * directives to create more complex animations that can be purely driven using CSS code. + * + * Note that only browsers that support CSS transitions and/or keyframe animations are capable of + * rendering animations triggered via `$animateCss` (bad news for IE9 and lower). + * + * ## Usage + * Once again, `$animateCss` is designed to be used inside of a registered JavaScript animation that + * is powered by ngAnimate. It is possible to use `$animateCss` directly inside of a directive, however, + * any automatic control over cancelling animations and/or preventing animations from being run on + * child elements will not be handled by Angular. For this to work as expected, please use `$animate` to + * trigger the animation and then setup a JavaScript animation that injects `$animateCss` to trigger + * the CSS animation. + * + * The example below shows how we can create a folding animation on an element using `ng-if`: + * + * ```html + * + *
    + * This element will go BOOM + *
    + * + * ``` + * + * Now we create the **JavaScript animation** that will trigger the CSS transition: + * + * ```js + * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) { + * return { + * enter: function(element, doneFn) { + * var height = element[0].offsetHeight; + * return $animateCss(element, { + * from: { height:'0px' }, + * to: { height:height + 'px' }, + * duration: 1 // one second + * }); + * } + * } + * }]); + * ``` + * + * ## More Advanced Uses + * + * `$animateCss` is the underlying code that ngAnimate uses to power **CSS-based animations** behind the scenes. Therefore CSS hooks + * like `.ng-EVENT`, `.ng-EVENT-active`, `.ng-EVENT-stagger` are all features that can be triggered using `$animateCss` via JavaScript code. + * + * This also means that just about any combination of adding classes, removing classes, setting styles, dynamically setting a keyframe animation, + * applying a hardcoded duration or delay value, changing the animation easing or applying a stagger animation are all options that work with + * `$animateCss`. The service itself is smart enough to figure out the combination of options and examine the element styling properties in order + * to provide a working animation that will run in CSS. + * + * The example below showcases a more advanced version of the `.fold-animation` from the example above: + * + * ```js + * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) { + * return { + * enter: function(element, doneFn) { + * var height = element[0].offsetHeight; + * return $animateCss(element, { + * addClass: 'red large-text pulse-twice', + * easing: 'ease-out', + * from: { height:'0px' }, + * to: { height:height + 'px' }, + * duration: 1 // one second + * }); + * } + * } + * }]); + * ``` + * + * Since we're adding/removing CSS classes then the CSS transition will also pick those up: + * + * ```css + * /* since a hardcoded duration value of 1 was provided in the JavaScript animation code, + * the CSS classes below will be transitioned despite them being defined as regular CSS classes */ + * .red { background:red; } + * .large-text { font-size:20px; } + * + * /* we can also use a keyframe animation and $animateCss will make it work alongside the transition */ + * .pulse-twice { + * animation: 0.5s pulse linear 2; + * -webkit-animation: 0.5s pulse linear 2; + * } + * + * @keyframes pulse { + * from { transform: scale(0.5); } + * to { transform: scale(1.5); } + * } + * + * @-webkit-keyframes pulse { + * from { -webkit-transform: scale(0.5); } + * to { -webkit-transform: scale(1.5); } + * } + * ``` + * + * Given this complex combination of CSS classes, styles and options, `$animateCss` will figure everything out and make the animation happen. + * + * ## How the Options are handled + * + * `$animateCss` is very versatile and intelligent when it comes to figuring out what configurations to apply to the element to ensure the animation + * works with the options provided. Say for example we were adding a class that contained a keyframe value and we wanted to also animate some inline + * styles using the `from` and `to` properties. + * + * ```js + * var animator = $animateCss(element, { + * from: { background:'red' }, + * to: { background:'blue' } + * }); + * animator.start(); + * ``` + * + * ```css + * .rotating-animation { + * animation:0.5s rotate linear; + * -webkit-animation:0.5s rotate linear; + * } + * + * @keyframes rotate { + * from { transform: rotate(0deg); } + * to { transform: rotate(360deg); } + * } + * + * @-webkit-keyframes rotate { + * from { -webkit-transform: rotate(0deg); } + * to { -webkit-transform: rotate(360deg); } + * } + * ``` + * + * The missing pieces here are that we do not have a transition set (within the CSS code nor within the `$animateCss` options) and the duration of the animation is + * going to be detected from what the keyframe styles on the CSS class are. In this event, `$animateCss` will automatically create an inline transition + * style matching the duration detected from the keyframe style (which is present in the CSS class that is being added) and then prepare both the transition + * and keyframe animations to run in parallel on the element. Then when the animation is underway the provided `from` and `to` CSS styles will be applied + * and spread across the transition and keyframe animation. + * + * ## What is returned + * + * `$animateCss` works in two stages: a preparation phase and an animation phase. Therefore when `$animateCss` is first called it will NOT actually + * start the animation. All that is going on here is that the element is being prepared for the animation (which means that the generated CSS classes are + * added and removed on the element). Once `$animateCss` is called it will return an object with the following properties: + * + * ```js + * var animator = $animateCss(element, { ... }); + * ``` + * + * Now what do the contents of our `animator` variable look like: + * + * ```js + * { + * // starts the animation + * start: Function, + * + * // ends (aborts) the animation + * end: Function + * } + * ``` + * + * To actually start the animation we need to run `animation.start()` which will then return a promise that we can hook into to detect when the animation ends. + * If we choose not to run the animation then we MUST run `animation.end()` to perform a cleanup on the element (since some CSS classes and stlyes may have been + * applied to the element during the preparation phase). Note that all other properties such as duration, delay, transitions and keyframes are just properties + * and that changing them will not reconfigure the parameters of the animation. + * + * ### runner.done() vs runner.then() + * It is documented that `animation.start()` will return a promise object and this is true, however, there is also an additional method available on the + * runner called `.done(callbackFn)`. The done method works the same as `.finally(callbackFn)`, however, it does **not trigger a digest to occur**. + * Therefore, for performance reasons, it's always best to use `runner.done(callback)` instead of `runner.then()`, `runner.catch()` or `runner.finally()` + * unless you really need a digest to kick off afterwards. + * + * Keep in mind that, to make this easier, ngAnimate has tweaked the JS animations API to recognize when a runner instance is returned from $animateCss + * (so there is no need to call `runner.done(doneFn)` inside of your JavaScript animation code). + * Check the {@link ngAnimate.$animateCss#usage animation code above} to see how this works. + * + * @param {DOMElement} element the element that will be animated + * @param {object} options the animation-related options that will be applied during the animation + * + * * `event` - The DOM event (e.g. enter, leave, move). When used, a generated CSS class of `ng-EVENT` and `ng-EVENT-active` will be applied + * to the element during the animation. Multiple events can be provided when spaces are used as a separator. (Note that this will not perform any DOM operation.) + * * `easing` - The CSS easing value that will be applied to the transition or keyframe animation (or both). + * * `transition` - The raw CSS transition style that will be used (e.g. `1s linear all`). + * * `keyframeStyle` - The raw CSS keyframe animation style that will be used (e.g. `1s my_animation linear`). + * * `from` - The starting CSS styles (a key/value object) that will be applied at the start of the animation. + * * `to` - The ending CSS styles (a key/value object) that will be applied across the animation via a CSS transition. + * * `addClass` - A space separated list of CSS classes that will be added to the element and spread across the animation. + * * `removeClass` - A space separated list of CSS classes that will be removed from the element and spread across the animation. + * * `duration` - A number value representing the total duration of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `0` + * is provided then the animation will be skipped entirely. + * * `delay` - A number value representing the total delay of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `true` is + * used then whatever delay value is detected from the CSS classes will be mirrored on the elements styles (e.g. by setting delay true then the style value + * of the element will be `transition-delay: DETECTED_VALUE`). Using `true` is useful when you want the CSS classes and inline styles to all share the same + * CSS delay value. + * * `stagger` - A numeric time value representing the delay between successively animated elements + * ({@link ngAnimate#css-staggering-animations Click here to learn how CSS-based staggering works in ngAnimate.}) + * * `staggerIndex` - The numeric index representing the stagger item (e.g. a value of 5 is equal to the sixth item in the stagger; therefore when a + * `stagger` option value of `0.1` is used then there will be a stagger delay of `600ms`) + * `applyClassesEarly` - Whether or not the classes being added or removed will be used when detecting the animation. This is set by `$animate` when enter/leave/move animations are fired to ensure that the CSS classes are resolved in time. (Note that this will prevent any transitions from occuring on the classes being added and removed.) + * + * @return {object} an object with start and end methods and details about the animation. + * + * * `start` - The method to start the animation. This will return a `Promise` when called. + * * `end` - This method will cancel the animation and remove all applied CSS classes and styles. + */ + +// Detect proper transitionend/animationend event names. +var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT; + +// If unprefixed events are not supported but webkit-prefixed are, use the latter. +// Otherwise, just use W3C names, browsers not supporting them at all will just ignore them. +// Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend` +// but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`. +// Register both events in case `window.onanimationend` is not supported because of that, +// do the same for `transitionend` as Safari is likely to exhibit similar behavior. +// Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit +// therefore there is no reason to test anymore for other vendor prefixes: +// http://caniuse.com/#search=transition +if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) { + CSS_PREFIX = '-webkit-'; + TRANSITION_PROP = 'WebkitTransition'; + TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend'; +} else { + TRANSITION_PROP = 'transition'; + TRANSITIONEND_EVENT = 'transitionend'; +} + +if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) { + CSS_PREFIX = '-webkit-'; + ANIMATION_PROP = 'WebkitAnimation'; + ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend'; +} else { + ANIMATION_PROP = 'animation'; + ANIMATIONEND_EVENT = 'animationend'; +} + +var DURATION_KEY = 'Duration'; +var PROPERTY_KEY = 'Property'; +var DELAY_KEY = 'Delay'; +var TIMING_KEY = 'TimingFunction'; +var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount'; +var ANIMATION_PLAYSTATE_KEY = 'PlayState'; +var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3; +var CLOSING_TIME_BUFFER = 1.5; +var ONE_SECOND = 1000; +var BASE_TEN = 10; + +var SAFE_FAST_FORWARD_DURATION_VALUE = 9999; + +var ANIMATION_DELAY_PROP = ANIMATION_PROP + DELAY_KEY; +var ANIMATION_DURATION_PROP = ANIMATION_PROP + DURATION_KEY; + +var TRANSITION_DELAY_PROP = TRANSITION_PROP + DELAY_KEY; +var TRANSITION_DURATION_PROP = TRANSITION_PROP + DURATION_KEY; + +var DETECT_CSS_PROPERTIES = { + transitionDuration: TRANSITION_DURATION_PROP, + transitionDelay: TRANSITION_DELAY_PROP, + transitionProperty: TRANSITION_PROP + PROPERTY_KEY, + animationDuration: ANIMATION_DURATION_PROP, + animationDelay: ANIMATION_DELAY_PROP, + animationIterationCount: ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY +}; + +var DETECT_STAGGER_CSS_PROPERTIES = { + transitionDuration: TRANSITION_DURATION_PROP, + transitionDelay: TRANSITION_DELAY_PROP, + animationDuration: ANIMATION_DURATION_PROP, + animationDelay: ANIMATION_DELAY_PROP +}; + +function computeCssStyles($window, element, properties) { + var styles = Object.create(null); + var detectedStyles = $window.getComputedStyle(element) || {}; + forEach(properties, function(formalStyleName, actualStyleName) { + var val = detectedStyles[formalStyleName]; + if (val) { + var c = val.charAt(0); + + // only numerical-based values have a negative sign or digit as the first value + if (c === '-' || c === '+' || c >= 0) { + val = parseMaxTime(val); + } + + // by setting this to null in the event that the delay is not set or is set directly as 0 + // then we can still allow for zegative values to be used later on and not mistake this + // value for being greater than any other negative value. + if (val === 0) { + val = null; + } + styles[actualStyleName] = val; + } + }); + + return styles; +} + +function parseMaxTime(str) { + var maxValue = 0; + var values = str.split(/\s*,\s*/); + forEach(values, function(value) { + // it's always safe to consider only second values and omit `ms` values since + // getComputedStyle will always handle the conversion for us + if (value.charAt(value.length - 1) == 's') { + value = value.substring(0, value.length - 1); + } + value = parseFloat(value) || 0; + maxValue = maxValue ? Math.max(value, maxValue) : value; + }); + return maxValue; +} + +function truthyTimingValue(val) { + return val === 0 || val != null; +} + +function getCssTransitionDurationStyle(duration, applyOnlyDuration) { + var style = TRANSITION_PROP; + var value = duration + 's'; + if (applyOnlyDuration) { + style += DURATION_KEY; + } else { + value += ' linear all'; + } + return [style, value]; +} + +function getCssKeyframeDurationStyle(duration) { + return [ANIMATION_DURATION_PROP, duration + 's']; +} + +function getCssDelayStyle(delay, isKeyframeAnimation) { + var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP; + return [prop, delay + 's']; +} + +function blockTransitions(node, duration) { + // we use a negative delay value since it performs blocking + // yet it doesn't kill any existing transitions running on the + // same element which makes this safe for class-based animations + var value = duration ? '-' + duration + 's' : ''; + applyInlineStyle(node, [TRANSITION_DELAY_PROP, value]); + return [TRANSITION_DELAY_PROP, value]; +} + +function blockKeyframeAnimations(node, applyBlock) { + var value = applyBlock ? 'paused' : ''; + var key = ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY; + applyInlineStyle(node, [key, value]); + return [key, value]; +} + +function applyInlineStyle(node, styleTuple) { + var prop = styleTuple[0]; + var value = styleTuple[1]; + node.style[prop] = value; +} + +function createLocalCacheLookup() { + var cache = Object.create(null); + return { + flush: function() { + cache = Object.create(null); + }, + + count: function(key) { + var entry = cache[key]; + return entry ? entry.total : 0; + }, + + get: function(key) { + var entry = cache[key]; + return entry && entry.value; + }, + + put: function(key, value) { + if (!cache[key]) { + cache[key] = { total: 1, value: value }; + } else { + cache[key].total++; + } + } + }; +} + +var $AnimateCssProvider = ['$animateProvider', function($animateProvider) { + var gcsLookup = createLocalCacheLookup(); + var gcsStaggerLookup = createLocalCacheLookup(); + + this.$get = ['$window', '$$jqLite', '$$AnimateRunner', '$timeout', + '$document', '$sniffer', '$$rAFScheduler', + function($window, $$jqLite, $$AnimateRunner, $timeout, + $document, $sniffer, $$rAFScheduler) { + + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + + var parentCounter = 0; + function gcsHashFn(node, extraClasses) { + var KEY = "$$ngAnimateParentKey"; + var parentNode = node.parentNode; + var parentID = parentNode[KEY] || (parentNode[KEY] = ++parentCounter); + return parentID + '-' + node.getAttribute('class') + '-' + extraClasses; + } + + function computeCachedCssStyles(node, className, cacheKey, properties) { + var timings = gcsLookup.get(cacheKey); + + if (!timings) { + timings = computeCssStyles($window, node, properties); + if (timings.animationIterationCount === 'infinite') { + timings.animationIterationCount = 1; + } + } + + // we keep putting this in multiple times even though the value and the cacheKey are the same + // because we're keeping an interal tally of how many duplicate animations are detected. + gcsLookup.put(cacheKey, timings); + return timings; + } + + function computeCachedCssStaggerStyles(node, className, cacheKey, properties) { + var stagger; + + // if we have one or more existing matches of matching elements + // containing the same parent + CSS styles (which is how cacheKey works) + // then staggering is possible + if (gcsLookup.count(cacheKey) > 0) { + stagger = gcsStaggerLookup.get(cacheKey); + + if (!stagger) { + var staggerClassName = pendClasses(className, '-stagger'); + + $$jqLite.addClass(node, staggerClassName); + + stagger = computeCssStyles($window, node, properties); + + // force the conversion of a null value to zero incase not set + stagger.animationDuration = Math.max(stagger.animationDuration, 0); + stagger.transitionDuration = Math.max(stagger.transitionDuration, 0); + + $$jqLite.removeClass(node, staggerClassName); + + gcsStaggerLookup.put(cacheKey, stagger); + } + } + + return stagger || {}; + } + + var bod = getDomNode($document).body; + var rafWaitQueue = []; + function waitUntilQuiet(callback) { + rafWaitQueue.push(callback); + $$rAFScheduler.waitUntilQuiet(function() { + gcsLookup.flush(); + gcsStaggerLookup.flush(); + + //the line below will force the browser to perform a repaint so + //that all the animated elements within the animation frame will + //be properly updated and drawn on screen. This is required to + //ensure that the preparation animation is properly flushed so that + //the active state picks up from there. DO NOT REMOVE THIS LINE. + //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH + //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND + //WILL TAKE YEARS AWAY FROM YOUR LIFE. + var width = bod.offsetWidth + 1; + + // we use a for loop to ensure that if the queue is changed + // during this looping then it will consider new requests + for (var i = 0; i < rafWaitQueue.length; i++) { + rafWaitQueue[i](width); + } + rafWaitQueue.length = 0; + }); + } + + return init; + + function computeTimings(node, className, cacheKey) { + var timings = computeCachedCssStyles(node, className, cacheKey, DETECT_CSS_PROPERTIES); + var aD = timings.animationDelay; + var tD = timings.transitionDelay; + timings.maxDelay = aD && tD + ? Math.max(aD, tD) + : (aD || tD); + timings.maxDuration = Math.max( + timings.animationDuration * timings.animationIterationCount, + timings.transitionDuration); + + return timings; + } + + function init(element, options) { + var node = getDomNode(element); + if (!node || !node.parentNode) { + return closeAndReturnNoopAnimator(); + } + + options = prepareAnimationOptions(options); + + var temporaryStyles = []; + var classes = element.attr('class'); + var styles = packageStyles(options); + var animationClosed; + var animationPaused; + var animationCompleted; + var runner; + var runnerHost; + var maxDelay; + var maxDelayTime; + var maxDuration; + var maxDurationTime; + + if (options.duration === 0 || (!$sniffer.animations && !$sniffer.transitions)) { + return closeAndReturnNoopAnimator(); + } + + var method = options.event && isArray(options.event) + ? options.event.join(' ') + : options.event; + + var isStructural = method && options.structural; + var structuralClassName = ''; + var addRemoveClassName = ''; + + if (isStructural) { + structuralClassName = pendClasses(method, 'ng-', true); + } else if (method) { + structuralClassName = method; + } + + if (options.addClass) { + addRemoveClassName += pendClasses(options.addClass, '-add'); + } + + if (options.removeClass) { + if (addRemoveClassName.length) { + addRemoveClassName += ' '; + } + addRemoveClassName += pendClasses(options.removeClass, '-remove'); + } + + // there may be a situation where a structural animation is combined together + // with CSS classes that need to resolve before the animation is computed. + // However this means that there is no explicit CSS code to block the animation + // from happening (by setting 0s none in the class name). If this is the case + // we need to apply the classes before the first rAF so we know to continue if + // there actually is a detected transition or keyframe animation + if (options.applyClassesEarly && addRemoveClassName.length) { + applyAnimationClasses(element, options); + addRemoveClassName = ''; + } + + var setupClasses = [structuralClassName, addRemoveClassName].join(' ').trim(); + var fullClassName = classes + ' ' + setupClasses; + var activeClasses = pendClasses(setupClasses, '-active'); + var hasToStyles = styles.to && Object.keys(styles.to).length > 0; + var containsKeyframeAnimation = (options.keyframeStyle || '').length > 0; + + // there is no way we can trigger an animation if no styles and + // no classes are being applied which would then trigger a transition, + // unless there a is raw keyframe value that is applied to the element. + if (!containsKeyframeAnimation + && !hasToStyles + && !setupClasses) { + return closeAndReturnNoopAnimator(); + } + + var cacheKey, stagger; + if (options.stagger > 0) { + var staggerVal = parseFloat(options.stagger); + stagger = { + transitionDelay: staggerVal, + animationDelay: staggerVal, + transitionDuration: 0, + animationDuration: 0 + }; + } else { + cacheKey = gcsHashFn(node, fullClassName); + stagger = computeCachedCssStaggerStyles(node, setupClasses, cacheKey, DETECT_STAGGER_CSS_PROPERTIES); + } + + $$jqLite.addClass(element, setupClasses); + + var applyOnlyDuration; + + if (options.transitionStyle) { + var transitionStyle = [TRANSITION_PROP, options.transitionStyle]; + applyInlineStyle(node, transitionStyle); + temporaryStyles.push(transitionStyle); + } + + if (options.duration >= 0) { + applyOnlyDuration = node.style[TRANSITION_PROP].length > 0; + var durationStyle = getCssTransitionDurationStyle(options.duration, applyOnlyDuration); + + // we set the duration so that it will be picked up by getComputedStyle later + applyInlineStyle(node, durationStyle); + temporaryStyles.push(durationStyle); + } + + if (options.keyframeStyle) { + var keyframeStyle = [ANIMATION_PROP, options.keyframeStyle]; + applyInlineStyle(node, keyframeStyle); + temporaryStyles.push(keyframeStyle); + } + + var itemIndex = stagger + ? options.staggerIndex >= 0 + ? options.staggerIndex + : gcsLookup.count(cacheKey) + : 0; + + var isFirst = itemIndex === 0; + + // this is a pre-emptive way of forcing the setup classes to be added and applied INSTANTLY + // without causing any combination of transitions to kick in. By adding a negative delay value + // it forces the setup class' transition to end immediately. We later then remove the negative + // transition delay to allow for the transition to naturally do it's thing. The beauty here is + // that if there is no transition defined then nothing will happen and this will also allow + // other transitions to be stacked on top of each other without any chopping them out. + if (isFirst) { + blockTransitions(node, SAFE_FAST_FORWARD_DURATION_VALUE); + } + + var timings = computeTimings(node, fullClassName, cacheKey); + var relativeDelay = timings.maxDelay; + maxDelay = Math.max(relativeDelay, 0); + maxDuration = timings.maxDuration; + + var flags = {}; + flags.hasTransitions = timings.transitionDuration > 0; + flags.hasAnimations = timings.animationDuration > 0; + flags.hasTransitionAll = flags.hasTransitions && timings.transitionProperty == 'all'; + flags.applyTransitionDuration = hasToStyles && ( + (flags.hasTransitions && !flags.hasTransitionAll) + || (flags.hasAnimations && !flags.hasTransitions)); + flags.applyAnimationDuration = options.duration && flags.hasAnimations; + flags.applyTransitionDelay = truthyTimingValue(options.delay) && (flags.applyTransitionDuration || flags.hasTransitions); + flags.applyAnimationDelay = truthyTimingValue(options.delay) && flags.hasAnimations; + flags.recalculateTimingStyles = addRemoveClassName.length > 0; + + if (flags.applyTransitionDuration || flags.applyAnimationDuration) { + maxDuration = options.duration ? parseFloat(options.duration) : maxDuration; + + if (flags.applyTransitionDuration) { + flags.hasTransitions = true; + timings.transitionDuration = maxDuration; + applyOnlyDuration = node.style[TRANSITION_PROP + PROPERTY_KEY].length > 0; + temporaryStyles.push(getCssTransitionDurationStyle(maxDuration, applyOnlyDuration)); + } + + if (flags.applyAnimationDuration) { + flags.hasAnimations = true; + timings.animationDuration = maxDuration; + temporaryStyles.push(getCssKeyframeDurationStyle(maxDuration)); + } + } + + if (maxDuration === 0 && !flags.recalculateTimingStyles) { + return closeAndReturnNoopAnimator(); + } + + // we need to recalculate the delay value since we used a pre-emptive negative + // delay value and the delay value is required for the final event checking. This + // property will ensure that this will happen after the RAF phase has passed. + if (options.duration == null && timings.transitionDuration > 0) { + flags.recalculateTimingStyles = flags.recalculateTimingStyles || isFirst; + } + + maxDelayTime = maxDelay * ONE_SECOND; + maxDurationTime = maxDuration * ONE_SECOND; + if (!options.skipBlocking) { + flags.blockTransition = timings.transitionDuration > 0; + flags.blockKeyframeAnimation = timings.animationDuration > 0 && + stagger.animationDelay > 0 && + stagger.animationDuration === 0; + } + + applyAnimationFromStyles(element, options); + if (!flags.blockTransition) { + blockTransitions(node, false); + } + + applyBlocking(maxDuration); + + // TODO(matsko): for 1.5 change this code to have an animator object for better debugging + return { + $$willAnimate: true, + end: endFn, + start: function() { + if (animationClosed) return; + + runnerHost = { + end: endFn, + cancel: cancelFn, + resume: null, //this will be set during the start() phase + pause: null + }; + + runner = new $$AnimateRunner(runnerHost); + + waitUntilQuiet(start); + + // we don't have access to pause/resume the animation + // since it hasn't run yet. AnimateRunner will therefore + // set noop functions for resume and pause and they will + // later be overridden once the animation is triggered + return runner; + } + }; + + function endFn() { + close(); + } + + function cancelFn() { + close(true); + } + + function close(rejected) { // jshint ignore:line + // if the promise has been called already then we shouldn't close + // the animation again + if (animationClosed || (animationCompleted && animationPaused)) return; + animationClosed = true; + animationPaused = false; + + $$jqLite.removeClass(element, setupClasses); + $$jqLite.removeClass(element, activeClasses); + + blockKeyframeAnimations(node, false); + blockTransitions(node, false); + + forEach(temporaryStyles, function(entry) { + // There is only one way to remove inline style properties entirely from elements. + // By using `removeProperty` this works, but we need to convert camel-cased CSS + // styles down to hyphenated values. + node.style[entry[0]] = ''; + }); + + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + + // the reason why we have this option is to allow a synchronous closing callback + // that is fired as SOON as the animation ends (when the CSS is removed) or if + // the animation never takes off at all. A good example is a leave animation since + // the element must be removed just after the animation is over or else the element + // will appear on screen for one animation frame causing an overbearing flicker. + if (options.onDone) { + options.onDone(); + } + + // if the preparation function fails then the promise is not setup + if (runner) { + runner.complete(!rejected); + } + } + + function applyBlocking(duration) { + if (flags.blockTransition) { + blockTransitions(node, duration); + } + + if (flags.blockKeyframeAnimation) { + blockKeyframeAnimations(node, !!duration); + } + } + + function closeAndReturnNoopAnimator() { + runner = new $$AnimateRunner({ + end: endFn, + cancel: cancelFn + }); + + close(); + + return { + $$willAnimate: false, + start: function() { + return runner; + }, + end: endFn + }; + } + + function start() { + if (animationClosed) return; + if (!node.parentNode) { + close(); + return; + } + + var startTime, events = []; + + // even though we only pause keyframe animations here the pause flag + // will still happen when transitions are used. Only the transition will + // not be paused since that is not possible. If the animation ends when + // paused then it will not complete until unpaused or cancelled. + var playPause = function(playAnimation) { + if (!animationCompleted) { + animationPaused = !playAnimation; + if (timings.animationDuration) { + var value = blockKeyframeAnimations(node, animationPaused); + animationPaused + ? temporaryStyles.push(value) + : removeFromArray(temporaryStyles, value); + } + } else if (animationPaused && playAnimation) { + animationPaused = false; + close(); + } + }; + + // checking the stagger duration prevents an accidently cascade of the CSS delay style + // being inherited from the parent. If the transition duration is zero then we can safely + // rely that the delay value is an intential stagger delay style. + var maxStagger = itemIndex > 0 + && ((timings.transitionDuration && stagger.transitionDuration === 0) || + (timings.animationDuration && stagger.animationDuration === 0)) + && Math.max(stagger.animationDelay, stagger.transitionDelay); + if (maxStagger) { + $timeout(triggerAnimationStart, + Math.floor(maxStagger * itemIndex * ONE_SECOND), + false); + } else { + triggerAnimationStart(); + } + + // this will decorate the existing promise runner with pause/resume methods + runnerHost.resume = function() { + playPause(true); + }; + + runnerHost.pause = function() { + playPause(false); + }; + + function triggerAnimationStart() { + // just incase a stagger animation kicks in when the animation + // itself was cancelled entirely + if (animationClosed) return; + + applyBlocking(false); + + forEach(temporaryStyles, function(entry) { + var key = entry[0]; + var value = entry[1]; + node.style[key] = value; + }); + + applyAnimationClasses(element, options); + $$jqLite.addClass(element, activeClasses); + + if (flags.recalculateTimingStyles) { + fullClassName = node.className + ' ' + setupClasses; + cacheKey = gcsHashFn(node, fullClassName); + + timings = computeTimings(node, fullClassName, cacheKey); + relativeDelay = timings.maxDelay; + maxDelay = Math.max(relativeDelay, 0); + maxDuration = timings.maxDuration; + + if (maxDuration === 0) { + close(); + return; + } + + flags.hasTransitions = timings.transitionDuration > 0; + flags.hasAnimations = timings.animationDuration > 0; + } + + if (flags.applyTransitionDelay || flags.applyAnimationDelay) { + relativeDelay = typeof options.delay !== "boolean" && truthyTimingValue(options.delay) + ? parseFloat(options.delay) + : relativeDelay; + + maxDelay = Math.max(relativeDelay, 0); + + var delayStyle; + if (flags.applyTransitionDelay) { + timings.transitionDelay = relativeDelay; + delayStyle = getCssDelayStyle(relativeDelay); + temporaryStyles.push(delayStyle); + node.style[delayStyle[0]] = delayStyle[1]; + } + + if (flags.applyAnimationDelay) { + timings.animationDelay = relativeDelay; + delayStyle = getCssDelayStyle(relativeDelay, true); + temporaryStyles.push(delayStyle); + node.style[delayStyle[0]] = delayStyle[1]; + } + } + + maxDelayTime = maxDelay * ONE_SECOND; + maxDurationTime = maxDuration * ONE_SECOND; + + if (options.easing) { + var easeProp, easeVal = options.easing; + if (flags.hasTransitions) { + easeProp = TRANSITION_PROP + TIMING_KEY; + temporaryStyles.push([easeProp, easeVal]); + node.style[easeProp] = easeVal; + } + if (flags.hasAnimations) { + easeProp = ANIMATION_PROP + TIMING_KEY; + temporaryStyles.push([easeProp, easeVal]); + node.style[easeProp] = easeVal; + } + } + + if (timings.transitionDuration) { + events.push(TRANSITIONEND_EVENT); + } + + if (timings.animationDuration) { + events.push(ANIMATIONEND_EVENT); + } + + startTime = Date.now(); + element.on(events.join(' '), onAnimationProgress); + $timeout(onAnimationExpired, maxDelayTime + CLOSING_TIME_BUFFER * maxDurationTime); + + applyAnimationToStyles(element, options); + } + + function onAnimationExpired() { + // although an expired animation is a failed animation, getting to + // this outcome is very easy if the CSS code screws up. Therefore we + // should still continue normally as if the animation completed correctly. + close(); + } + + function onAnimationProgress(event) { + event.stopPropagation(); + var ev = event.originalEvent || event; + var timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now(); + + /* Firefox (or possibly just Gecko) likes to not round values up + * when a ms measurement is used for the animation */ + var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES)); + + /* $manualTimeStamp is a mocked timeStamp value which is set + * within browserTrigger(). This is only here so that tests can + * mock animations properly. Real events fallback to event.timeStamp, + * or, if they don't, then a timeStamp is automatically created for them. + * We're checking to see if the timeStamp surpasses the expected delay, + * but we're using elapsedTime instead of the timeStamp on the 2nd + * pre-condition since animations sometimes close off early */ + if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) { + // we set this flag to ensure that if the transition is paused then, when resumed, + // the animation will automatically close itself since transitions cannot be paused. + animationCompleted = true; + close(); + } + } + } + } + }]; +}]; + +var $$AnimateCssDriverProvider = ['$$animationProvider', function($$animationProvider) { + $$animationProvider.drivers.push('$$animateCssDriver'); + + var NG_ANIMATE_SHIM_CLASS_NAME = 'ng-animate-shim'; + var NG_ANIMATE_ANCHOR_CLASS_NAME = 'ng-anchor'; + + var NG_OUT_ANCHOR_CLASS_NAME = 'ng-anchor-out'; + var NG_IN_ANCHOR_CLASS_NAME = 'ng-anchor-in'; + + this.$get = ['$animateCss', '$rootScope', '$$AnimateRunner', '$rootElement', '$document', '$sniffer', + function($animateCss, $rootScope, $$AnimateRunner, $rootElement, $document, $sniffer) { + + // only browsers that support these properties can render animations + if (!$sniffer.animations && !$sniffer.transitions) return noop; + + var bodyNode = getDomNode($document).body; + var rootNode = getDomNode($rootElement); + + var rootBodyElement = jqLite(bodyNode.parentNode === rootNode ? bodyNode : rootNode); + + return function initDriverFn(animationDetails) { + return animationDetails.from && animationDetails.to + ? prepareFromToAnchorAnimation(animationDetails.from, + animationDetails.to, + animationDetails.classes, + animationDetails.anchors) + : prepareRegularAnimation(animationDetails); + }; + + function filterCssClasses(classes) { + //remove all the `ng-` stuff + return classes.replace(/\bng-\S+\b/g, ''); + } + + function getUniqueValues(a, b) { + if (isString(a)) a = a.split(' '); + if (isString(b)) b = b.split(' '); + return a.filter(function(val) { + return b.indexOf(val) === -1; + }).join(' '); + } + + function prepareAnchoredAnimation(classes, outAnchor, inAnchor) { + var clone = jqLite(getDomNode(outAnchor).cloneNode(true)); + var startingClasses = filterCssClasses(getClassVal(clone)); + + outAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME); + inAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME); + + clone.addClass(NG_ANIMATE_ANCHOR_CLASS_NAME); + + rootBodyElement.append(clone); + + var animatorIn, animatorOut = prepareOutAnimation(); + + // the user may not end up using the `out` animation and + // only making use of the `in` animation or vice-versa. + // In either case we should allow this and not assume the + // animation is over unless both animations are not used. + if (!animatorOut) { + animatorIn = prepareInAnimation(); + if (!animatorIn) { + return end(); + } + } + + var startingAnimator = animatorOut || animatorIn; + + return { + start: function() { + var runner; + + var currentAnimation = startingAnimator.start(); + currentAnimation.done(function() { + currentAnimation = null; + if (!animatorIn) { + animatorIn = prepareInAnimation(); + if (animatorIn) { + currentAnimation = animatorIn.start(); + currentAnimation.done(function() { + currentAnimation = null; + end(); + runner.complete(); + }); + return currentAnimation; + } + } + // in the event that there is no `in` animation + end(); + runner.complete(); + }); + + runner = new $$AnimateRunner({ + end: endFn, + cancel: endFn + }); + + return runner; + + function endFn() { + if (currentAnimation) { + currentAnimation.end(); + } + } + } + }; + + function calculateAnchorStyles(anchor) { + var styles = {}; + + var coords = getDomNode(anchor).getBoundingClientRect(); + + // we iterate directly since safari messes up and doesn't return + // all the keys for the coods object when iterated + forEach(['width','height','top','left'], function(key) { + var value = coords[key]; + switch (key) { + case 'top': + value += bodyNode.scrollTop; + break; + case 'left': + value += bodyNode.scrollLeft; + break; + } + styles[key] = Math.floor(value) + 'px'; + }); + return styles; + } + + function prepareOutAnimation() { + var animator = $animateCss(clone, { + addClass: NG_OUT_ANCHOR_CLASS_NAME, + delay: true, + from: calculateAnchorStyles(outAnchor) + }); + + // read the comment within `prepareRegularAnimation` to understand + // why this check is necessary + return animator.$$willAnimate ? animator : null; + } + + function getClassVal(element) { + return element.attr('class') || ''; + } + + function prepareInAnimation() { + var endingClasses = filterCssClasses(getClassVal(inAnchor)); + var toAdd = getUniqueValues(endingClasses, startingClasses); + var toRemove = getUniqueValues(startingClasses, endingClasses); + + var animator = $animateCss(clone, { + to: calculateAnchorStyles(inAnchor), + addClass: NG_IN_ANCHOR_CLASS_NAME + ' ' + toAdd, + removeClass: NG_OUT_ANCHOR_CLASS_NAME + ' ' + toRemove, + delay: true + }); + + // read the comment within `prepareRegularAnimation` to understand + // why this check is necessary + return animator.$$willAnimate ? animator : null; + } + + function end() { + clone.remove(); + outAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME); + inAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME); + } + } + + function prepareFromToAnchorAnimation(from, to, classes, anchors) { + var fromAnimation = prepareRegularAnimation(from); + var toAnimation = prepareRegularAnimation(to); + + var anchorAnimations = []; + forEach(anchors, function(anchor) { + var outElement = anchor['out']; + var inElement = anchor['in']; + var animator = prepareAnchoredAnimation(classes, outElement, inElement); + if (animator) { + anchorAnimations.push(animator); + } + }); + + // no point in doing anything when there are no elements to animate + if (!fromAnimation && !toAnimation && anchorAnimations.length === 0) return; + + return { + start: function() { + var animationRunners = []; + + if (fromAnimation) { + animationRunners.push(fromAnimation.start()); + } + + if (toAnimation) { + animationRunners.push(toAnimation.start()); + } + + forEach(anchorAnimations, function(animation) { + animationRunners.push(animation.start()); + }); + + var runner = new $$AnimateRunner({ + end: endFn, + cancel: endFn // CSS-driven animations cannot be cancelled, only ended + }); + + $$AnimateRunner.all(animationRunners, function(status) { + runner.complete(status); + }); + + return runner; + + function endFn() { + forEach(animationRunners, function(runner) { + runner.end(); + }); + } + } + }; + } + + function prepareRegularAnimation(animationDetails) { + var element = animationDetails.element; + var options = animationDetails.options || {}; + + if (animationDetails.structural) { + // structural animations ensure that the CSS classes are always applied + // before the detection starts. + options.structural = options.applyClassesEarly = true; + + // we special case the leave animation since we want to ensure that + // the element is removed as soon as the animation is over. Otherwise + // a flicker might appear or the element may not be removed at all + options.event = animationDetails.event; + if (options.event === 'leave') { + options.onDone = options.domOperation; + } + } else { + options.event = null; + } + + var animator = $animateCss(element, options); + + // the driver lookup code inside of $$animation attempts to spawn a + // driver one by one until a driver returns a.$$willAnimate animator object. + // $animateCss will always return an object, however, it will pass in + // a flag as a hint as to whether an animation was detected or not + return animator.$$willAnimate ? animator : null; + } + }]; +}]; + +// TODO(matsko): use caching here to speed things up for detection +// TODO(matsko): add documentation +// by the time... + +var $$AnimateJsProvider = ['$animateProvider', function($animateProvider) { + this.$get = ['$injector', '$$AnimateRunner', '$$rAFMutex', '$$jqLite', + function($injector, $$AnimateRunner, $$rAFMutex, $$jqLite) { + + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + // $animateJs(element, 'enter'); + return function(element, event, classes, options) { + // the `classes` argument is optional and if it is not used + // then the classes will be resolved from the element's className + // property as well as options.addClass/options.removeClass. + if (arguments.length === 3 && isObject(classes)) { + options = classes; + classes = null; + } + + options = prepareAnimationOptions(options); + if (!classes) { + classes = element.attr('class') || ''; + if (options.addClass) { + classes += ' ' + options.addClass; + } + if (options.removeClass) { + classes += ' ' + options.removeClass; + } + } + + var classesToAdd = options.addClass; + var classesToRemove = options.removeClass; + + // the lookupAnimations function returns a series of animation objects that are + // matched up with one or more of the CSS classes. These animation objects are + // defined via the module.animation factory function. If nothing is detected then + // we don't return anything which then makes $animation query the next driver. + var animations = lookupAnimations(classes); + var before, after; + if (animations.length) { + var afterFn, beforeFn; + if (event == 'leave') { + beforeFn = 'leave'; + afterFn = 'afterLeave'; // TODO(matsko): get rid of this + } else { + beforeFn = 'before' + event.charAt(0).toUpperCase() + event.substr(1); + afterFn = event; + } + + if (event !== 'enter' && event !== 'move') { + before = packageAnimations(element, event, options, animations, beforeFn); + } + after = packageAnimations(element, event, options, animations, afterFn); + } + + // no matching animations + if (!before && !after) return; + + function applyOptions() { + options.domOperation(); + applyAnimationClasses(element, options); + } + + return { + start: function() { + var closeActiveAnimations; + var chain = []; + + if (before) { + chain.push(function(fn) { + closeActiveAnimations = before(fn); + }); + } + + if (chain.length) { + chain.push(function(fn) { + applyOptions(); + fn(true); + }); + } else { + applyOptions(); + } + + if (after) { + chain.push(function(fn) { + closeActiveAnimations = after(fn); + }); + } + + var animationClosed = false; + var runner = new $$AnimateRunner({ + end: function() { + endAnimations(); + }, + cancel: function() { + endAnimations(true); + } + }); + + $$AnimateRunner.chain(chain, onComplete); + return runner; + + function onComplete(success) { + animationClosed = true; + applyOptions(); + applyAnimationStyles(element, options); + runner.complete(success); + } + + function endAnimations(cancelled) { + if (!animationClosed) { + (closeActiveAnimations || noop)(cancelled); + onComplete(cancelled); + } + } + } + }; + + function executeAnimationFn(fn, element, event, options, onDone) { + var args; + switch (event) { + case 'animate': + args = [element, options.from, options.to, onDone]; + break; + + case 'setClass': + args = [element, classesToAdd, classesToRemove, onDone]; + break; + + case 'addClass': + args = [element, classesToAdd, onDone]; + break; + + case 'removeClass': + args = [element, classesToRemove, onDone]; + break; + + default: + args = [element, onDone]; + break; + } + + args.push(options); + + var value = fn.apply(fn, args); + if (value) { + if (isFunction(value.start)) { + value = value.start(); + } + + if (value instanceof $$AnimateRunner) { + value.done(onDone); + } else if (isFunction(value)) { + // optional onEnd / onCancel callback + return value; + } + } + + return noop; + } + + function groupEventedAnimations(element, event, options, animations, fnName) { + var operations = []; + forEach(animations, function(ani) { + var animation = ani[fnName]; + if (!animation) return; + + // note that all of these animations will run in parallel + operations.push(function() { + var runner; + var endProgressCb; + + var resolved = false; + var onAnimationComplete = function(rejected) { + if (!resolved) { + resolved = true; + (endProgressCb || noop)(rejected); + runner.complete(!rejected); + } + }; + + runner = new $$AnimateRunner({ + end: function() { + onAnimationComplete(); + }, + cancel: function() { + onAnimationComplete(true); + } + }); + + endProgressCb = executeAnimationFn(animation, element, event, options, function(result) { + var cancelled = result === false; + onAnimationComplete(cancelled); + }); + + return runner; + }); + }); + + return operations; + } + + function packageAnimations(element, event, options, animations, fnName) { + var operations = groupEventedAnimations(element, event, options, animations, fnName); + if (operations.length === 0) { + var a,b; + if (fnName === 'beforeSetClass') { + a = groupEventedAnimations(element, 'removeClass', options, animations, 'beforeRemoveClass'); + b = groupEventedAnimations(element, 'addClass', options, animations, 'beforeAddClass'); + } else if (fnName === 'setClass') { + a = groupEventedAnimations(element, 'removeClass', options, animations, 'removeClass'); + b = groupEventedAnimations(element, 'addClass', options, animations, 'addClass'); + } + + if (a) { + operations = operations.concat(a); + } + if (b) { + operations = operations.concat(b); + } + } + + if (operations.length === 0) return; + + // TODO(matsko): add documentation + return function startAnimation(callback) { + var runners = []; + if (operations.length) { + forEach(operations, function(animateFn) { + runners.push(animateFn()); + }); + } + + runners.length ? $$AnimateRunner.all(runners, callback) : callback(); + + return function endFn(reject) { + forEach(runners, function(runner) { + reject ? runner.cancel() : runner.end(); + }); + }; + }; + } + }; + + function lookupAnimations(classes) { + classes = isArray(classes) ? classes : classes.split(' '); + var matches = [], flagMap = {}; + for (var i=0; i < classes.length; i++) { + var klass = classes[i], + animationFactory = $animateProvider.$$registeredAnimations[klass]; + if (animationFactory && !flagMap[klass]) { + matches.push($injector.get(animationFactory)); + flagMap[klass] = true; + } + } + return matches; + } + }]; +}]; + +var $$AnimateJsDriverProvider = ['$$animationProvider', function($$animationProvider) { + $$animationProvider.drivers.push('$$animateJsDriver'); + this.$get = ['$$animateJs', '$$AnimateRunner', function($$animateJs, $$AnimateRunner) { + return function initDriverFn(animationDetails) { + if (animationDetails.from && animationDetails.to) { + var fromAnimation = prepareAnimation(animationDetails.from); + var toAnimation = prepareAnimation(animationDetails.to); + if (!fromAnimation && !toAnimation) return; + + return { + start: function() { + var animationRunners = []; + + if (fromAnimation) { + animationRunners.push(fromAnimation.start()); + } + + if (toAnimation) { + animationRunners.push(toAnimation.start()); + } + + $$AnimateRunner.all(animationRunners, done); + + var runner = new $$AnimateRunner({ + end: endFnFactory(), + cancel: endFnFactory() + }); + + return runner; + + function endFnFactory() { + return function() { + forEach(animationRunners, function(runner) { + // at this point we cannot cancel animations for groups just yet. 1.5+ + runner.end(); + }); + }; + } + + function done(status) { + runner.complete(status); + } + } + }; + } else { + return prepareAnimation(animationDetails); + } + }; + + function prepareAnimation(animationDetails) { + // TODO(matsko): make sure to check for grouped animations and delegate down to normal animations + var element = animationDetails.element; + var event = animationDetails.event; + var options = animationDetails.options; + var classes = animationDetails.classes; + return $$animateJs(element, event, classes, options); + } + }]; +}]; + +var NG_ANIMATE_ATTR_NAME = 'data-ng-animate'; +var NG_ANIMATE_PIN_DATA = '$ngAnimatePin'; +var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) { + var PRE_DIGEST_STATE = 1; + var RUNNING_STATE = 2; + + var rules = this.rules = { + skip: [], + cancel: [], + join: [] + }; + + function isAllowed(ruleType, element, currentAnimation, previousAnimation) { + return rules[ruleType].some(function(fn) { + return fn(element, currentAnimation, previousAnimation); + }); + } + + function hasAnimationClasses(options, and) { + options = options || {}; + var a = (options.addClass || '').length > 0; + var b = (options.removeClass || '').length > 0; + return and ? a && b : a || b; + } + + rules.join.push(function(element, newAnimation, currentAnimation) { + // if the new animation is class-based then we can just tack that on + return !newAnimation.structural && hasAnimationClasses(newAnimation.options); + }); + + rules.skip.push(function(element, newAnimation, currentAnimation) { + // there is no need to animate anything if no classes are being added and + // there is no structural animation that will be triggered + return !newAnimation.structural && !hasAnimationClasses(newAnimation.options); + }); + + rules.skip.push(function(element, newAnimation, currentAnimation) { + // why should we trigger a new structural animation if the element will + // be removed from the DOM anyway? + return currentAnimation.event == 'leave' && newAnimation.structural; + }); + + rules.skip.push(function(element, newAnimation, currentAnimation) { + // if there is a current animation then skip the class-based animation + return currentAnimation.structural && !newAnimation.structural; + }); + + rules.cancel.push(function(element, newAnimation, currentAnimation) { + // there can never be two structural animations running at the same time + return currentAnimation.structural && newAnimation.structural; + }); + + rules.cancel.push(function(element, newAnimation, currentAnimation) { + // if the previous animation is already running, but the new animation will + // be triggered, but the new animation is structural + return currentAnimation.state === RUNNING_STATE && newAnimation.structural; + }); + + rules.cancel.push(function(element, newAnimation, currentAnimation) { + var nO = newAnimation.options; + var cO = currentAnimation.options; + + // if the exact same CSS class is added/removed then it's safe to cancel it + return (nO.addClass && nO.addClass === cO.removeClass) || (nO.removeClass && nO.removeClass === cO.addClass); + }); + + this.$get = ['$$rAF', '$rootScope', '$rootElement', '$document', '$$HashMap', + '$$animation', '$$AnimateRunner', '$templateRequest', '$$jqLite', + function($$rAF, $rootScope, $rootElement, $document, $$HashMap, + $$animation, $$AnimateRunner, $templateRequest, $$jqLite) { + + var activeAnimationsLookup = new $$HashMap(); + var disabledElementsLookup = new $$HashMap(); + + var animationsEnabled = null; + + // Wait until all directive and route-related templates are downloaded and + // compiled. The $templateRequest.totalPendingRequests variable keeps track of + // all of the remote templates being currently downloaded. If there are no + // templates currently downloading then the watcher will still fire anyway. + var deregisterWatch = $rootScope.$watch( + function() { return $templateRequest.totalPendingRequests === 0; }, + function(isEmpty) { + if (!isEmpty) return; + deregisterWatch(); + + // Now that all templates have been downloaded, $animate will wait until + // the post digest queue is empty before enabling animations. By having two + // calls to $postDigest calls we can ensure that the flag is enabled at the + // very end of the post digest queue. Since all of the animations in $animate + // use $postDigest, it's important that the code below executes at the end. + // This basically means that the page is fully downloaded and compiled before + // any animations are triggered. + $rootScope.$$postDigest(function() { + $rootScope.$$postDigest(function() { + // we check for null directly in the event that the application already called + // .enabled() with whatever arguments that it provided it with + if (animationsEnabled === null) { + animationsEnabled = true; + } + }); + }); + } + ); + + var bodyElement = jqLite($document[0].body); + + var callbackRegistry = {}; + + // remember that the classNameFilter is set during the provider/config + // stage therefore we can optimize here and setup a helper function + var classNameFilter = $animateProvider.classNameFilter(); + var isAnimatableClassName = !classNameFilter + ? function() { return true; } + : function(className) { + return classNameFilter.test(className); + }; + + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + + function normalizeAnimationOptions(element, options) { + return mergeAnimationOptions(element, options, {}); + } + + function findCallbacks(element, event) { + var targetNode = getDomNode(element); + + var matches = []; + var entries = callbackRegistry[event]; + if (entries) { + forEach(entries, function(entry) { + if (entry.node.contains(targetNode)) { + matches.push(entry.callback); + } + }); + } + + return matches; + } + + function triggerCallback(event, element, phase, data) { + $$rAF(function() { + forEach(findCallbacks(element, event), function(callback) { + callback(element, phase, data); + }); + }); + } + + return { + on: function(event, container, callback) { + var node = extractElementNode(container); + callbackRegistry[event] = callbackRegistry[event] || []; + callbackRegistry[event].push({ + node: node, + callback: callback + }); + }, + + off: function(event, container, callback) { + var entries = callbackRegistry[event]; + if (!entries) return; + + callbackRegistry[event] = arguments.length === 1 + ? null + : filterFromRegistry(entries, container, callback); + + function filterFromRegistry(list, matchContainer, matchCallback) { + var containerNode = extractElementNode(matchContainer); + return list.filter(function(entry) { + var isMatch = entry.node === containerNode && + (!matchCallback || entry.callback === matchCallback); + return !isMatch; + }); + } + }, + + pin: function(element, parentElement) { + assertArg(isElement(element), 'element', 'not an element'); + assertArg(isElement(parentElement), 'parentElement', 'not an element'); + element.data(NG_ANIMATE_PIN_DATA, parentElement); + }, + + push: function(element, event, options, domOperation) { + options = options || {}; + options.domOperation = domOperation; + return queueAnimation(element, event, options); + }, + + // this method has four signatures: + // () - global getter + // (bool) - global setter + // (element) - element getter + // (element, bool) - element setter + enabled: function(element, bool) { + var argCount = arguments.length; + + if (argCount === 0) { + // () - Global getter + bool = !!animationsEnabled; + } else { + var hasElement = isElement(element); + + if (!hasElement) { + // (bool) - Global setter + bool = animationsEnabled = !!element; + } else { + var node = getDomNode(element); + var recordExists = disabledElementsLookup.get(node); + + if (argCount === 1) { + // (element) - Element getter + bool = !recordExists; + } else { + // (element, bool) - Element setter + bool = !!bool; + if (!bool) { + disabledElementsLookup.put(node, true); + } else if (recordExists) { + disabledElementsLookup.remove(node); + } + } + } + } + + return bool; + } + }; + + function queueAnimation(element, event, options) { + var node, parent; + element = stripCommentsFromElement(element); + if (element) { + node = getDomNode(element); + parent = element.parent(); + } + + options = prepareAnimationOptions(options); + + // we create a fake runner with a working promise. + // These methods will become available after the digest has passed + var runner = new $$AnimateRunner(); + + // there are situations where a directive issues an animation for + // a jqLite wrapper that contains only comment nodes... If this + // happens then there is no way we can perform an animation + if (!node) { + close(); + return runner; + } + + if (isArray(options.addClass)) { + options.addClass = options.addClass.join(' '); + } + + if (isArray(options.removeClass)) { + options.removeClass = options.removeClass.join(' '); + } + + if (options.from && !isObject(options.from)) { + options.from = null; + } + + if (options.to && !isObject(options.to)) { + options.to = null; + } + + var className = [node.className, options.addClass, options.removeClass].join(' '); + if (!isAnimatableClassName(className)) { + close(); + return runner; + } + + var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0; + + // this is a hard disable of all animations for the application or on + // the element itself, therefore there is no need to continue further + // past this point if not enabled + var skipAnimations = !animationsEnabled || disabledElementsLookup.get(node); + var existingAnimation = (!skipAnimations && activeAnimationsLookup.get(node)) || {}; + var hasExistingAnimation = !!existingAnimation.state; + + // there is no point in traversing the same collection of parent ancestors if a followup + // animation will be run on the same element that already did all that checking work + if (!skipAnimations && (!hasExistingAnimation || existingAnimation.state != PRE_DIGEST_STATE)) { + skipAnimations = !areAnimationsAllowed(element, parent, event); + } + + if (skipAnimations) { + close(); + return runner; + } + + if (isStructural) { + closeChildAnimations(element); + } + + var newAnimation = { + structural: isStructural, + element: element, + event: event, + close: close, + options: options, + runner: runner + }; + + if (hasExistingAnimation) { + var skipAnimationFlag = isAllowed('skip', element, newAnimation, existingAnimation); + if (skipAnimationFlag) { + if (existingAnimation.state === RUNNING_STATE) { + close(); + return runner; + } else { + mergeAnimationOptions(element, existingAnimation.options, options); + return existingAnimation.runner; + } + } + + var cancelAnimationFlag = isAllowed('cancel', element, newAnimation, existingAnimation); + if (cancelAnimationFlag) { + if (existingAnimation.state === RUNNING_STATE) { + // this will end the animation right away and it is safe + // to do so since the animation is already running and the + // runner callback code will run in async + existingAnimation.runner.end(); + } else if (existingAnimation.structural) { + // this means that the animation is queued into a digest, but + // hasn't started yet. Therefore it is safe to run the close + // method which will call the runner methods in async. + existingAnimation.close(); + } else { + // this will merge the existing animation options into this new follow-up animation + mergeAnimationOptions(element, newAnimation.options, existingAnimation.options); + } + } else { + // a joined animation means that this animation will take over the existing one + // so an example would involve a leave animation taking over an enter. Then when + // the postDigest kicks in the enter will be ignored. + var joinAnimationFlag = isAllowed('join', element, newAnimation, existingAnimation); + if (joinAnimationFlag) { + if (existingAnimation.state === RUNNING_STATE) { + normalizeAnimationOptions(element, options); + } else { + event = newAnimation.event = existingAnimation.event; + options = mergeAnimationOptions(element, existingAnimation.options, newAnimation.options); + return runner; + } + } + } + } else { + // normalization in this case means that it removes redundant CSS classes that + // already exist (addClass) or do not exist (removeClass) on the element + normalizeAnimationOptions(element, options); + } + + // when the options are merged and cleaned up we may end up not having to do + // an animation at all, therefore we should check this before issuing a post + // digest callback. Structural animations will always run no matter what. + var isValidAnimation = newAnimation.structural; + if (!isValidAnimation) { + // animate (from/to) can be quickly checked first, otherwise we check if any classes are present + isValidAnimation = (newAnimation.event === 'animate' && Object.keys(newAnimation.options.to || {}).length > 0) + || hasAnimationClasses(newAnimation.options); + } + + if (!isValidAnimation) { + close(); + clearElementAnimationState(element); + return runner; + } + + if (isStructural) { + closeParentClassBasedAnimations(parent); + } + + // the counter keeps track of cancelled animations + var counter = (existingAnimation.counter || 0) + 1; + newAnimation.counter = counter; + + markElementAnimationState(element, PRE_DIGEST_STATE, newAnimation); + + $rootScope.$$postDigest(function() { + var animationDetails = activeAnimationsLookup.get(node); + var animationCancelled = !animationDetails; + animationDetails = animationDetails || {}; + + // if addClass/removeClass is called before something like enter then the + // registered parent element may not be present. The code below will ensure + // that a final value for parent element is obtained + var parentElement = element.parent() || []; + + // animate/structural/class-based animations all have requirements. Otherwise there + // is no point in performing an animation. The parent node must also be set. + var isValidAnimation = parentElement.length > 0 + && (animationDetails.event === 'animate' + || animationDetails.structural + || hasAnimationClasses(animationDetails.options)); + + // this means that the previous animation was cancelled + // even if the follow-up animation is the same event + if (animationCancelled || animationDetails.counter !== counter || !isValidAnimation) { + // if another animation did not take over then we need + // to make sure that the domOperation and options are + // handled accordingly + if (animationCancelled) { + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + } + + // if the event changed from something like enter to leave then we do + // it, otherwise if it's the same then the end result will be the same too + if (animationCancelled || (isStructural && animationDetails.event !== event)) { + options.domOperation(); + runner.end(); + } + + // in the event that the element animation was not cancelled or a follow-up animation + // isn't allowed to animate from here then we need to clear the state of the element + // so that any future animations won't read the expired animation data. + if (!isValidAnimation) { + clearElementAnimationState(element); + } + + return; + } + + // this combined multiple class to addClass / removeClass into a setClass event + // so long as a structural event did not take over the animation + event = !animationDetails.structural && hasAnimationClasses(animationDetails.options, true) + ? 'setClass' + : animationDetails.event; + + if (animationDetails.structural) { + closeParentClassBasedAnimations(parentElement); + } + + markElementAnimationState(element, RUNNING_STATE); + var realRunner = $$animation(element, event, animationDetails.options); + realRunner.done(function(status) { + close(!status); + var animationDetails = activeAnimationsLookup.get(node); + if (animationDetails && animationDetails.counter === counter) { + clearElementAnimationState(getDomNode(element)); + } + notifyProgress(runner, event, 'close', {}); + }); + + // this will update the runner's flow-control events based on + // the `realRunner` object. + runner.setHost(realRunner); + notifyProgress(runner, event, 'start', {}); + }); + + return runner; + + function notifyProgress(runner, event, phase, data) { + triggerCallback(event, element, phase, data); + runner.progress(event, phase, data); + } + + function close(reject) { // jshint ignore:line + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + options.domOperation(); + runner.complete(!reject); + } + } + + function closeChildAnimations(element) { + var node = getDomNode(element); + var children = node.querySelectorAll('[' + NG_ANIMATE_ATTR_NAME + ']'); + forEach(children, function(child) { + var state = parseInt(child.getAttribute(NG_ANIMATE_ATTR_NAME)); + var animationDetails = activeAnimationsLookup.get(child); + switch (state) { + case RUNNING_STATE: + animationDetails.runner.end(); + /* falls through */ + case PRE_DIGEST_STATE: + if (animationDetails) { + activeAnimationsLookup.remove(child); + } + break; + } + }); + } + + function clearElementAnimationState(element) { + var node = getDomNode(element); + node.removeAttribute(NG_ANIMATE_ATTR_NAME); + activeAnimationsLookup.remove(node); + } + + function isMatchingElement(nodeOrElmA, nodeOrElmB) { + return getDomNode(nodeOrElmA) === getDomNode(nodeOrElmB); + } + + function closeParentClassBasedAnimations(startingElement) { + var parentNode = getDomNode(startingElement); + do { + if (!parentNode || parentNode.nodeType !== ELEMENT_NODE) break; + + var animationDetails = activeAnimationsLookup.get(parentNode); + if (animationDetails) { + examineParentAnimation(parentNode, animationDetails); + } + + parentNode = parentNode.parentNode; + } while (true); + + // since animations are detected from CSS classes, we need to flush all parent + // class-based animations so that the parent classes are all present for child + // animations to properly function (otherwise any CSS selectors may not work) + function examineParentAnimation(node, animationDetails) { + // enter/leave/move always have priority + if (animationDetails.structural || !hasAnimationClasses(animationDetails.options)) return; + + if (animationDetails.state === RUNNING_STATE) { + animationDetails.runner.end(); + } + clearElementAnimationState(node); + } + } + + function areAnimationsAllowed(element, parentElement, event) { + var bodyElementDetected = false; + var rootElementDetected = false; + var parentAnimationDetected = false; + var animateChildren; + + var parentHost = element.data(NG_ANIMATE_PIN_DATA); + if (parentHost) { + parentElement = parentHost; + } + + while (parentElement && parentElement.length) { + if (!rootElementDetected) { + // angular doesn't want to attempt to animate elements outside of the application + // therefore we need to ensure that the rootElement is an ancestor of the current element + rootElementDetected = isMatchingElement(parentElement, $rootElement); + } + + var parentNode = parentElement[0]; + if (parentNode.nodeType !== ELEMENT_NODE) { + // no point in inspecting the #document element + break; + } + + var details = activeAnimationsLookup.get(parentNode) || {}; + // either an enter, leave or move animation will commence + // therefore we can't allow any animations to take place + // but if a parent animation is class-based then that's ok + if (!parentAnimationDetected) { + parentAnimationDetected = details.structural || disabledElementsLookup.get(parentNode); + } + + if (isUndefined(animateChildren) || animateChildren === true) { + var value = parentElement.data(NG_ANIMATE_CHILDREN_DATA); + if (isDefined(value)) { + animateChildren = value; + } + } + + // there is no need to continue traversing at this point + if (parentAnimationDetected && animateChildren === false) break; + + if (!rootElementDetected) { + // angular doesn't want to attempt to animate elements outside of the application + // therefore we need to ensure that the rootElement is an ancestor of the current element + rootElementDetected = isMatchingElement(parentElement, $rootElement); + if (!rootElementDetected) { + parentHost = parentElement.data(NG_ANIMATE_PIN_DATA); + if (parentHost) { + parentElement = parentHost; + } + } + } + + if (!bodyElementDetected) { + // we also need to ensure that the element is or will be apart of the body element + // otherwise it is pointless to even issue an animation to be rendered + bodyElementDetected = isMatchingElement(parentElement, bodyElement); + } + + parentElement = parentElement.parent(); + } + + var allowAnimation = !parentAnimationDetected || animateChildren; + return allowAnimation && rootElementDetected && bodyElementDetected; + } + + function markElementAnimationState(element, state, details) { + details = details || {}; + details.state = state; + + var node = getDomNode(element); + node.setAttribute(NG_ANIMATE_ATTR_NAME, state); + + var oldValue = activeAnimationsLookup.get(node); + var newValue = oldValue + ? extend(oldValue, details) + : details; + activeAnimationsLookup.put(node, newValue); + } + }]; +}]; + +var $$rAFMutexFactory = ['$$rAF', function($$rAF) { + return function() { + var passed = false; + $$rAF(function() { + passed = true; + }); + return function(fn) { + passed ? fn() : $$rAF(fn); + }; + }; +}]; + +var $$AnimateRunnerFactory = ['$q', '$$rAFMutex', function($q, $$rAFMutex) { + var INITIAL_STATE = 0; + var DONE_PENDING_STATE = 1; + var DONE_COMPLETE_STATE = 2; + + AnimateRunner.chain = function(chain, callback) { + var index = 0; + + next(); + function next() { + if (index === chain.length) { + callback(true); + return; + } + + chain[index](function(response) { + if (response === false) { + callback(false); + return; + } + index++; + next(); + }); + } + }; + + AnimateRunner.all = function(runners, callback) { + var count = 0; + var status = true; + forEach(runners, function(runner) { + runner.done(onProgress); + }); + + function onProgress(response) { + status = status && response; + if (++count === runners.length) { + callback(status); + } + } + }; + + function AnimateRunner(host) { + this.setHost(host); + + this._doneCallbacks = []; + this._runInAnimationFrame = $$rAFMutex(); + this._state = 0; + } + + AnimateRunner.prototype = { + setHost: function(host) { + this.host = host || {}; + }, + + done: function(fn) { + if (this._state === DONE_COMPLETE_STATE) { + fn(); + } else { + this._doneCallbacks.push(fn); + } + }, + + progress: noop, + + getPromise: function() { + if (!this.promise) { + var self = this; + this.promise = $q(function(resolve, reject) { + self.done(function(status) { + status === false ? reject() : resolve(); + }); + }); + } + return this.promise; + }, + + then: function(resolveHandler, rejectHandler) { + return this.getPromise().then(resolveHandler, rejectHandler); + }, + + 'catch': function(handler) { + return this.getPromise()['catch'](handler); + }, + + 'finally': function(handler) { + return this.getPromise()['finally'](handler); + }, + + pause: function() { + if (this.host.pause) { + this.host.pause(); + } + }, + + resume: function() { + if (this.host.resume) { + this.host.resume(); + } + }, + + end: function() { + if (this.host.end) { + this.host.end(); + } + this._resolve(true); + }, + + cancel: function() { + if (this.host.cancel) { + this.host.cancel(); + } + this._resolve(false); + }, + + complete: function(response) { + var self = this; + if (self._state === INITIAL_STATE) { + self._state = DONE_PENDING_STATE; + self._runInAnimationFrame(function() { + self._resolve(response); + }); + } + }, + + _resolve: function(response) { + if (this._state !== DONE_COMPLETE_STATE) { + forEach(this._doneCallbacks, function(fn) { + fn(response); + }); + this._doneCallbacks.length = 0; + this._state = DONE_COMPLETE_STATE; + } + } + }; + + return AnimateRunner; +}]; + +var $$AnimationProvider = ['$animateProvider', function($animateProvider) { + var NG_ANIMATE_REF_ATTR = 'ng-animate-ref'; + + var drivers = this.drivers = []; + + var RUNNER_STORAGE_KEY = '$$animationRunner'; + + function setRunner(element, runner) { + element.data(RUNNER_STORAGE_KEY, runner); + } + + function removeRunner(element) { + element.removeData(RUNNER_STORAGE_KEY); + } + + function getRunner(element) { + return element.data(RUNNER_STORAGE_KEY); + } + + this.$get = ['$$jqLite', '$rootScope', '$injector', '$$AnimateRunner', '$$rAFScheduler', + function($$jqLite, $rootScope, $injector, $$AnimateRunner, $$rAFScheduler) { + + var animationQueue = []; + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + + var totalPendingClassBasedAnimations = 0; + var totalActiveClassBasedAnimations = 0; + var classBasedAnimationsQueue = []; + + // TODO(matsko): document the signature in a better way + return function(element, event, options) { + options = prepareAnimationOptions(options); + var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0; + + // there is no animation at the current moment, however + // these runner methods will get later updated with the + // methods leading into the driver's end/cancel methods + // for now they just stop the animation from starting + var runner = new $$AnimateRunner({ + end: function() { close(); }, + cancel: function() { close(true); } + }); + + if (!drivers.length) { + close(); + return runner; + } + + setRunner(element, runner); + + var classes = mergeClasses(element.attr('class'), mergeClasses(options.addClass, options.removeClass)); + var tempClasses = options.tempClasses; + if (tempClasses) { + classes += ' ' + tempClasses; + options.tempClasses = null; + } + + var classBasedIndex; + if (!isStructural) { + classBasedIndex = totalPendingClassBasedAnimations; + totalPendingClassBasedAnimations += 1; + } + + animationQueue.push({ + // this data is used by the postDigest code and passed into + // the driver step function + element: element, + classes: classes, + event: event, + classBasedIndex: classBasedIndex, + structural: isStructural, + options: options, + beforeStart: beforeStart, + close: close + }); + + element.on('$destroy', handleDestroyedElement); + + // we only want there to be one function called within the post digest + // block. This way we can group animations for all the animations that + // were apart of the same postDigest flush call. + if (animationQueue.length > 1) return runner; + + $rootScope.$$postDigest(function() { + totalActiveClassBasedAnimations = totalPendingClassBasedAnimations; + totalPendingClassBasedAnimations = 0; + classBasedAnimationsQueue.length = 0; + + var animations = []; + forEach(animationQueue, function(entry) { + // the element was destroyed early on which removed the runner + // form its storage. This means we can't animate this element + // at all and it already has been closed due to destruction. + if (getRunner(entry.element)) { + animations.push(entry); + } + }); + + // now any future animations will be in another postDigest + animationQueue.length = 0; + + forEach(groupAnimations(animations), function(animationEntry) { + if (animationEntry.structural) { + triggerAnimationStart(); + } else { + classBasedAnimationsQueue.push({ + node: getDomNode(animationEntry.element), + fn: triggerAnimationStart + }); + + if (animationEntry.classBasedIndex === totalActiveClassBasedAnimations - 1) { + // we need to sort each of the animations in order of parent to child + // relationships. This ensures that the child classes are applied at the + // right time. + classBasedAnimationsQueue = classBasedAnimationsQueue.sort(function(a,b) { + return b.node.contains(a.node); + }).map(function(entry) { + return entry.fn; + }); + + $$rAFScheduler(classBasedAnimationsQueue); + } + } + + function triggerAnimationStart() { + // it's important that we apply the `ng-animate` CSS class and the + // temporary classes before we do any driver invoking since these + // CSS classes may be required for proper CSS detection. + animationEntry.beforeStart(); + + var startAnimationFn, closeFn = animationEntry.close; + + // in the event that the element was removed before the digest runs or + // during the RAF sequencing then we should not trigger the animation. + var targetElement = animationEntry.anchors + ? (animationEntry.from.element || animationEntry.to.element) + : animationEntry.element; + + if (getRunner(targetElement) && getDomNode(targetElement).parentNode) { + var operation = invokeFirstDriver(animationEntry); + if (operation) { + startAnimationFn = operation.start; + } + } + + if (!startAnimationFn) { + closeFn(); + } else { + var animationRunner = startAnimationFn(); + animationRunner.done(function(status) { + closeFn(!status); + }); + updateAnimationRunners(animationEntry, animationRunner); + } + } + }); + }); + + return runner; + + // TODO(matsko): change to reference nodes + function getAnchorNodes(node) { + var SELECTOR = '[' + NG_ANIMATE_REF_ATTR + ']'; + var items = node.hasAttribute(NG_ANIMATE_REF_ATTR) + ? [node] + : node.querySelectorAll(SELECTOR); + var anchors = []; + forEach(items, function(node) { + var attr = node.getAttribute(NG_ANIMATE_REF_ATTR); + if (attr && attr.length) { + anchors.push(node); + } + }); + return anchors; + } + + function groupAnimations(animations) { + var preparedAnimations = []; + var refLookup = {}; + forEach(animations, function(animation, index) { + var element = animation.element; + var node = getDomNode(element); + var event = animation.event; + var enterOrMove = ['enter', 'move'].indexOf(event) >= 0; + var anchorNodes = animation.structural ? getAnchorNodes(node) : []; + + if (anchorNodes.length) { + var direction = enterOrMove ? 'to' : 'from'; + + forEach(anchorNodes, function(anchor) { + var key = anchor.getAttribute(NG_ANIMATE_REF_ATTR); + refLookup[key] = refLookup[key] || {}; + refLookup[key][direction] = { + animationID: index, + element: jqLite(anchor) + }; + }); + } else { + preparedAnimations.push(animation); + } + }); + + var usedIndicesLookup = {}; + var anchorGroups = {}; + forEach(refLookup, function(operations, key) { + var from = operations.from; + var to = operations.to; + + if (!from || !to) { + // only one of these is set therefore we can't have an + // anchor animation since all three pieces are required + var index = from ? from.animationID : to.animationID; + var indexKey = index.toString(); + if (!usedIndicesLookup[indexKey]) { + usedIndicesLookup[indexKey] = true; + preparedAnimations.push(animations[index]); + } + return; + } + + var fromAnimation = animations[from.animationID]; + var toAnimation = animations[to.animationID]; + var lookupKey = from.animationID.toString(); + if (!anchorGroups[lookupKey]) { + var group = anchorGroups[lookupKey] = { + structural: true, + beforeStart: function() { + fromAnimation.beforeStart(); + toAnimation.beforeStart(); + }, + close: function() { + fromAnimation.close(); + toAnimation.close(); + }, + classes: cssClassesIntersection(fromAnimation.classes, toAnimation.classes), + from: fromAnimation, + to: toAnimation, + anchors: [] // TODO(matsko): change to reference nodes + }; + + // the anchor animations require that the from and to elements both have at least + // one shared CSS class which effictively marries the two elements together to use + // the same animation driver and to properly sequence the anchor animation. + if (group.classes.length) { + preparedAnimations.push(group); + } else { + preparedAnimations.push(fromAnimation); + preparedAnimations.push(toAnimation); + } + } + + anchorGroups[lookupKey].anchors.push({ + 'out': from.element, 'in': to.element + }); + }); + + return preparedAnimations; + } + + function cssClassesIntersection(a,b) { + a = a.split(' '); + b = b.split(' '); + var matches = []; + + for (var i = 0; i < a.length; i++) { + var aa = a[i]; + if (aa.substring(0,3) === 'ng-') continue; + + for (var j = 0; j < b.length; j++) { + if (aa === b[j]) { + matches.push(aa); + break; + } + } + } + + return matches.join(' '); + } + + function invokeFirstDriver(animationDetails) { + // we loop in reverse order since the more general drivers (like CSS and JS) + // may attempt more elements, but custom drivers are more particular + for (var i = drivers.length - 1; i >= 0; i--) { + var driverName = drivers[i]; + if (!$injector.has(driverName)) continue; // TODO(matsko): remove this check + + var factory = $injector.get(driverName); + var driver = factory(animationDetails); + if (driver) { + return driver; + } + } + } + + function beforeStart() { + element.addClass(NG_ANIMATE_CLASSNAME); + if (tempClasses) { + $$jqLite.addClass(element, tempClasses); + } + } + + function updateAnimationRunners(animation, newRunner) { + if (animation.from && animation.to) { + update(animation.from.element); + update(animation.to.element); + } else { + update(animation.element); + } + + function update(element) { + getRunner(element).setHost(newRunner); + } + } + + function handleDestroyedElement() { + var runner = getRunner(element); + if (runner && (event !== 'leave' || !options.$$domOperationFired)) { + runner.end(); + } + } + + function close(rejected) { // jshint ignore:line + element.off('$destroy', handleDestroyedElement); + removeRunner(element); + + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + options.domOperation(); + + if (tempClasses) { + $$jqLite.removeClass(element, tempClasses); + } + + element.removeClass(NG_ANIMATE_CLASSNAME); + runner.complete(!rejected); + } + }; + }]; +}]; + +/* global angularAnimateModule: true, + + $$rAFMutexFactory, + $$rAFSchedulerFactory, + $$AnimateChildrenDirective, + $$AnimateRunnerFactory, + $$AnimateQueueProvider, + $$AnimationProvider, + $AnimateCssProvider, + $$AnimateCssDriverProvider, + $$AnimateJsProvider, + $$AnimateJsDriverProvider, +*/ + +/** + * @ngdoc module + * @name ngAnimate + * @description + * + * The `ngAnimate` module provides support for CSS-based animations (keyframes and transitions) as well as JavaScript-based animations via + * callback hooks. Animations are not enabled by default, however, by including `ngAnimate` then the animation hooks are enabled for an Angular app. + * + *
    + * + * # Usage + * Simply put, there are two ways to make use of animations when ngAnimate is used: by using **CSS** and **JavaScript**. The former works purely based + * using CSS (by using matching CSS selectors/styles) and the latter triggers animations that are registered via `module.animation()`. For + * both CSS and JS animations the sole requirement is to have a matching `CSS class` that exists both in the registered animation and within + * the HTML element that the animation will be triggered on. + * + * ## Directive Support + * The following directives are "animation aware": + * + * | Directive | Supported Animations | + * |----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| + * | {@link ng.directive:ngRepeat#animations ngRepeat} | enter, leave and move | + * | {@link ngRoute.directive:ngView#animations ngView} | enter and leave | + * | {@link ng.directive:ngInclude#animations ngInclude} | enter and leave | + * | {@link ng.directive:ngSwitch#animations ngSwitch} | enter and leave | + * | {@link ng.directive:ngIf#animations ngIf} | enter and leave | + * | {@link ng.directive:ngClass#animations ngClass} | add and remove (the CSS class(es) present) | + * | {@link ng.directive:ngShow#animations ngShow} & {@link ng.directive:ngHide#animations ngHide} | add and remove (the ng-hide class value) | + * | {@link ng.directive:form#animation-hooks form} & {@link ng.directive:ngModel#animation-hooks ngModel} | add and remove (dirty, pristine, valid, invalid & all other validations) | + * | {@link module:ngMessages#animations ngMessages} | add and remove (ng-active & ng-inactive) | + * | {@link module:ngMessages#animations ngMessage} | enter and leave | + * + * (More information can be found by visiting each the documentation associated with each directive.) + * + * ## CSS-based Animations + * + * CSS-based animations with ngAnimate are unique since they require no JavaScript code at all. By using a CSS class that we reference between our HTML + * and CSS code we can create an animation that will be picked up by Angular when an the underlying directive performs an operation. + * + * The example below shows how an `enter` animation can be made possible on a element using `ng-if`: + * + * ```html + *
    + * Fade me in out + *
    + * + * + * ``` + * + * Notice the CSS class **fade**? We can now create the CSS transition code that references this class: + * + * ```css + * /* The starting CSS styles for the enter animation */ + * .fade.ng-enter { + * transition:0.5s linear all; + * opacity:0; + * } + * + * /* The finishing CSS styles for the enter animation */ + * .fade.ng-enter.ng-enter-active { + * opacity:1; + * } + * ``` + * + * The key thing to remember here is that, depending on the animation event (which each of the directives above trigger depending on what's going on) two + * generated CSS classes will be applied to the element; in the example above we have `.ng-enter` and `.ng-enter-active`. For CSS transitions, the transition + * code **must** be defined within the starting CSS class (in this case `.ng-enter`). The destination class is what the transition will animate towards. + * + * If for example we wanted to create animations for `leave` and `move` (ngRepeat triggers move) then we can do so using the same CSS naming conventions: + * + * ```css + * /* now the element will fade out before it is removed from the DOM */ + * .fade.ng-leave { + * transition:0.5s linear all; + * opacity:1; + * } + * .fade.ng-leave.ng-leave-active { + * opacity:0; + * } + * ``` + * + * We can also make use of **CSS Keyframes** by referencing the keyframe animation within the starting CSS class: + * + * ```css + * /* there is no need to define anything inside of the destination + * CSS class since the keyframe will take charge of the animation */ + * .fade.ng-leave { + * animation: my_fade_animation 0.5s linear; + * -webkit-animation: my_fade_animation 0.5s linear; + * } + * + * @keyframes my_fade_animation { + * from { opacity:1; } + * to { opacity:0; } + * } + * + * @-webkit-keyframes my_fade_animation { + * from { opacity:1; } + * to { opacity:0; } + * } + * ``` + * + * Feel free also mix transitions and keyframes together as well as any other CSS classes on the same element. + * + * ### CSS Class-based Animations + * + * Class-based animations (animations that are triggered via `ngClass`, `ngShow`, `ngHide` and some other directives) have a slightly different + * naming convention. Class-based animations are basic enough that a standard transition or keyframe can be referenced on the class being added + * and removed. + * + * For example if we wanted to do a CSS animation for `ngHide` then we place an animation on the `.ng-hide` CSS class: + * + * ```html + *
    + * Show and hide me + *
    + * + * + * + * ``` + * + * All that is going on here with ngShow/ngHide behind the scenes is the `.ng-hide` class is added/removed (when the hidden state is valid). Since + * ngShow and ngHide are animation aware then we can match up a transition and ngAnimate handles the rest. + * + * In addition the addition and removal of the CSS class, ngAnimate also provides two helper methods that we can use to further decorate the animation + * with CSS styles. + * + * ```html + *
    + * Highlight this box + *
    + * + * + * + * ``` + * + * We can also make use of CSS keyframes by placing them within the CSS classes. + * + * + * ### CSS Staggering Animations + * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a + * curtain-like effect. The ngAnimate module (versions >=1.2) supports staggering animations and the stagger effect can be + * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for + * the animation. The style property expected within the stagger class can either be a **transition-delay** or an + * **animation-delay** property (or both if your animation contains both transitions and keyframe animations). + * + * ```css + * .my-animation.ng-enter { + * /* standard transition code */ + * transition: 1s linear all; + * opacity:0; + * } + * .my-animation.ng-enter-stagger { + * /* this will have a 100ms delay between each successive leave animation */ + * transition-delay: 0.1s; + * + * /* in case the stagger doesn't work then the duration value + * must be set to 0 to avoid an accidental CSS inheritance */ + * transition-duration: 0s; + * } + * .my-animation.ng-enter.ng-enter-active { + * /* standard transition styles */ + * opacity:1; + * } + * ``` + * + * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations + * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this + * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation + * will also be reset if one or more animation frames have passed since the multiple calls to `$animate` were fired. + * + * The following code will issue the **ng-leave-stagger** event on the element provided: + * + * ```js + * var kids = parent.children(); + * + * $animate.leave(kids[0]); //stagger index=0 + * $animate.leave(kids[1]); //stagger index=1 + * $animate.leave(kids[2]); //stagger index=2 + * $animate.leave(kids[3]); //stagger index=3 + * $animate.leave(kids[4]); //stagger index=4 + * + * window.requestAnimationFrame(function() { + * //stagger has reset itself + * $animate.leave(kids[5]); //stagger index=0 + * $animate.leave(kids[6]); //stagger index=1 + * + * $scope.$digest(); + * }); + * ``` + * + * Stagger animations are currently only supported within CSS-defined animations. + * + * ### The `ng-animate` CSS class + * + * When ngAnimate is animating an element it will apply the `ng-animate` CSS class to the element for the duration of the animation. + * This is a temporary CSS class and it will be removed once the animation is over (for both JavaScript and CSS-based animations). + * + * Therefore, animations can be applied to an element using this temporary class directly via CSS. + * + * ```css + * .zipper.ng-animate { + * transition:0.5s linear all; + * } + * .zipper.ng-enter { + * opacity:0; + * } + * .zipper.ng-enter.ng-enter-active { + * opacity:1; + * } + * .zipper.ng-leave { + * opacity:1; + * } + * .zipper.ng-leave.ng-leave-active { + * opacity:0; + * } + * ``` + * + * (Note that the `ng-animate` CSS class is reserved and it cannot be applied on an element directly since ngAnimate will always remove + * the CSS class once an animation has completed.) + * + * + * ## JavaScript-based Animations + * + * ngAnimate also allows for animations to be consumed by JavaScript code. The approach is similar to CSS-based animations (where there is a shared + * CSS class that is referenced in our HTML code) but in addition we need to register the JavaScript animation on the module. By making use of the + * `module.animation()` module function we can register the ainmation. + * + * Let's see an example of a enter/leave animation using `ngRepeat`: + * + * ```html + *
    + * {{ item }} + *
    + * ``` + * + * See the **slide** CSS class? Let's use that class to define an animation that we'll structure in our module code by using `module.animation`: + * + * ```js + * myModule.animation('.slide', [function() { + * return { + * // make note that other events (like addClass/removeClass) + * // have different function input parameters + * enter: function(element, doneFn) { + * jQuery(element).fadeIn(1000, doneFn); + * + * // remember to call doneFn so that angular + * // knows that the animation has concluded + * }, + * + * move: function(element, doneFn) { + * jQuery(element).fadeIn(1000, doneFn); + * }, + * + * leave: function(element, doneFn) { + * jQuery(element).fadeOut(1000, doneFn); + * } + * } + * }] + * ``` + * + * The nice thing about JS-based animations is that we can inject other services and make use of advanced animation libraries such as + * greensock.js and velocity.js. + * + * If our animation code class-based (meaning that something like `ngClass`, `ngHide` and `ngShow` triggers it) then we can still define + * our animations inside of the same registered animation, however, the function input arguments are a bit different: + * + * ```html + *
    + * this box is moody + *
    + * + * + * + * ``` + * + * ```js + * myModule.animation('.colorful', [function() { + * return { + * addClass: function(element, className, doneFn) { + * // do some cool animation and call the doneFn + * }, + * removeClass: function(element, className, doneFn) { + * // do some cool animation and call the doneFn + * }, + * setClass: function(element, addedClass, removedClass, doneFn) { + * // do some cool animation and call the doneFn + * } + * } + * }] + * ``` + * + * ## CSS + JS Animations Together + * + * AngularJS 1.4 and higher has taken steps to make the amalgamation of CSS and JS animations more flexible. However, unlike earlier versions of Angular, + * defining CSS and JS animations to work off of the same CSS class will not work anymore. Therefore the example below will only result in **JS animations taking + * charge of the animation**: + * + * ```html + *
    + * Slide in and out + *
    + * ``` + * + * ```js + * myModule.animation('.slide', [function() { + * return { + * enter: function(element, doneFn) { + * jQuery(element).slideIn(1000, doneFn); + * } + * } + * }] + * ``` + * + * ```css + * .slide.ng-enter { + * transition:0.5s linear all; + * transform:translateY(-100px); + * } + * .slide.ng-enter.ng-enter-active { + * transform:translateY(0); + * } + * ``` + * + * Does this mean that CSS and JS animations cannot be used together? Do JS-based animations always have higher priority? We can make up for the + * lack of CSS animations by using the `$animateCss` service to trigger our own tweaked-out, CSS-based animations directly from + * our own JS-based animation code: + * + * ```js + * myModule.animation('.slide', ['$animateCss', function($animateCss) { + * return { + * enter: function(element, doneFn) { +* // this will trigger `.slide.ng-enter` and `.slide.ng-enter-active`. + * var runner = $animateCss(element, { + * event: 'enter', + * structural: true + * }).start(); +* runner.done(doneFn); + * } + * } + * }] + * ``` + * + * The nice thing here is that we can save bandwidth by sticking to our CSS-based animation code and we don't need to rely on a 3rd-party animation framework. + * + * The `$animateCss` service is very powerful since we can feed in all kinds of extra properties that will be evaluated and fed into a CSS transition or + * keyframe animation. For example if we wanted to animate the height of an element while adding and removing classes then we can do so by providing that + * data into `$animateCss` directly: + * + * ```js + * myModule.animation('.slide', ['$animateCss', function($animateCss) { + * return { + * enter: function(element, doneFn) { + * var runner = $animateCss(element, { + * event: 'enter', + * addClass: 'maroon-setting', + * from: { height:0 }, + * to: { height: 200 } + * }).start(); + * + * runner.done(doneFn); + * } + * } + * }] + * ``` + * + * Now we can fill in the rest via our transition CSS code: + * + * ```css + * /* the transition tells ngAnimate to make the animation happen */ + * .slide.ng-enter { transition:0.5s linear all; } + * + * /* this extra CSS class will be absorbed into the transition + * since the $animateCss code is adding the class */ + * .maroon-setting { background:red; } + * ``` + * + * And `$animateCss` will figure out the rest. Just make sure to have the `done()` callback fire the `doneFn` function to signal when the animation is over. + * + * To learn more about what's possible be sure to visit the {@link ngAnimate.$animateCss $animateCss service}. + * + * ## Animation Anchoring (via `ng-animate-ref`) + * + * ngAnimate in AngularJS 1.4 comes packed with the ability to cross-animate elements between + * structural areas of an application (like views) by pairing up elements using an attribute + * called `ng-animate-ref`. + * + * Let's say for example we have two views that are managed by `ng-view` and we want to show + * that there is a relationship between two components situated in within these views. By using the + * `ng-animate-ref` attribute we can identify that the two components are paired together and we + * can then attach an animation, which is triggered when the view changes. + * + * Say for example we have the following template code: + * + * ```html + * + *
    + *
    + * + * + * + * + * + * + * + * + * ``` + * + * Now, when the view changes (once the link is clicked), ngAnimate will examine the + * HTML contents to see if there is a match reference between any components in the view + * that is leaving and the view that is entering. It will scan both the view which is being + * removed (leave) and inserted (enter) to see if there are any paired DOM elements that + * contain a matching ref value. + * + * The two images match since they share the same ref value. ngAnimate will now create a + * transport element (which is a clone of the first image element) and it will then attempt + * to animate to the position of the second image element in the next view. For the animation to + * work a special CSS class called `ng-anchor` will be added to the transported element. + * + * We can now attach a transition onto the `.banner.ng-anchor` CSS class and then + * ngAnimate will handle the entire transition for us as well as the addition and removal of + * any changes of CSS classes between the elements: + * + * ```css + * .banner.ng-anchor { + * /* this animation will last for 1 second since there are + * two phases to the animation (an `in` and an `out` phase) */ + * transition:0.5s linear all; + * } + * ``` + * + * We also **must** include animations for the views that are being entered and removed + * (otherwise anchoring wouldn't be possible since the new view would be inserted right away). + * + * ```css + * .view-animation.ng-enter, .view-animation.ng-leave { + * transition:0.5s linear all; + * position:fixed; + * left:0; + * top:0; + * width:100%; + * } + * .view-animation.ng-enter { + * transform:translateX(100%); + * } + * .view-animation.ng-leave, + * .view-animation.ng-enter.ng-enter-active { + * transform:translateX(0%); + * } + * .view-animation.ng-leave.ng-leave-active { + * transform:translateX(-100%); + * } + * ``` + * + * Now we can jump back to the anchor animation. When the animation happens, there are two stages that occur: + * an `out` and an `in` stage. The `out` stage happens first and that is when the element is animated away + * from its origin. Once that animation is over then the `in` stage occurs which animates the + * element to its destination. The reason why there are two animations is to give enough time + * for the enter animation on the new element to be ready. + * + * The example above sets up a transition for both the in and out phases, but we can also target the out or + * in phases directly via `ng-anchor-out` and `ng-anchor-in`. + * + * ```css + * .banner.ng-anchor-out { + * transition: 0.5s linear all; + * + * /* the scale will be applied during the out animation, + * but will be animated away when the in animation runs */ + * transform: scale(1.2); + * } + * + * .banner.ng-anchor-in { + * transition: 1s linear all; + * } + * ``` + * + * + * + * + * ### Anchoring Demo + * + + + Home +
    +
    +
    +
    +
    + + angular.module('anchoringExample', ['ngAnimate', 'ngRoute']) + .config(['$routeProvider', function($routeProvider) { + $routeProvider.when('/', { + templateUrl: 'home.html', + controller: 'HomeController as home' + }); + $routeProvider.when('/profile/:id', { + templateUrl: 'profile.html', + controller: 'ProfileController as profile' + }); + }]) + .run(['$rootScope', function($rootScope) { + $rootScope.records = [ + { id:1, title: "Miss Beulah Roob" }, + { id:2, title: "Trent Morissette" }, + { id:3, title: "Miss Ava Pouros" }, + { id:4, title: "Rod Pouros" }, + { id:5, title: "Abdul Rice" }, + { id:6, title: "Laurie Rutherford Sr." }, + { id:7, title: "Nakia McLaughlin" }, + { id:8, title: "Jordon Blanda DVM" }, + { id:9, title: "Rhoda Hand" }, + { id:10, title: "Alexandrea Sauer" } + ]; + }]) + .controller('HomeController', [function() { + //empty + }]) + .controller('ProfileController', ['$rootScope', '$routeParams', function($rootScope, $routeParams) { + var index = parseInt($routeParams.id, 10); + var record = $rootScope.records[index - 1]; + + this.title = record.title; + this.id = record.id; + }]); + + +

    Welcome to the home page

    +

    Please click on an element

    + + {{ record.title }} + +
    + +
    + {{ profile.title }} +
    +
    + + .record { + display:block; + font-size:20px; + } + .profile { + background:black; + color:white; + font-size:100px; + } + .view-container { + position:relative; + } + .view-container > .view.ng-animate { + position:absolute; + top:0; + left:0; + width:100%; + min-height:500px; + } + .view.ng-enter, .view.ng-leave, + .record.ng-anchor { + transition:0.5s linear all; + } + .view.ng-enter { + transform:translateX(100%); + } + .view.ng-enter.ng-enter-active, .view.ng-leave { + transform:translateX(0%); + } + .view.ng-leave.ng-leave-active { + transform:translateX(-100%); + } + .record.ng-anchor-out { + background:red; + } + +
    + * + * ### How is the element transported? + * + * When an anchor animation occurs, ngAnimate will clone the starting element and position it exactly where the starting + * element is located on screen via absolute positioning. The cloned element will be placed inside of the root element + * of the application (where ng-app was defined) and all of the CSS classes of the starting element will be applied. The + * element will then animate into the `out` and `in` animations and will eventually reach the coordinates and match + * the dimensions of the destination element. During the entire animation a CSS class of `.ng-animate-shim` will be applied + * to both the starting and destination elements in order to hide them from being visible (the CSS styling for the class + * is: `visibility:hidden`). Once the anchor reaches its destination then it will be removed and the destination element + * will become visible since the shim class will be removed. + * + * ### How is the morphing handled? + * + * CSS Anchoring relies on transitions and keyframes and the internal code is intelligent enough to figure out + * what CSS classes differ between the starting element and the destination element. These different CSS classes + * will be added/removed on the anchor element and a transition will be applied (the transition that is provided + * in the anchor class). Long story short, ngAnimate will figure out what classes to add and remove which will + * make the transition of the element as smooth and automatic as possible. Be sure to use simple CSS classes that + * do not rely on DOM nesting structure so that the anchor element appears the same as the starting element (since + * the cloned element is placed inside of root element which is likely close to the body element). + * + * Note that if the root element is on the `` element then the cloned node will be placed inside of body. + * + * + * ## Using $animate in your directive code + * + * So far we've explored how to feed in animations into an Angular application, but how do we trigger animations within our own directives in our application? + * By injecting the `$animate` service into our directive code, we can trigger structural and class-based hooks which can then be consumed by animations. Let's + * imagine we have a greeting box that shows and hides itself when the data changes + * + * ```html + * Hi there + * ``` + * + * ```js + * ngModule.directive('greetingBox', ['$animate', function($animate) { + * return function(scope, element, attrs) { + * attrs.$observe('active', function(value) { + * value ? $animate.addClass(element, 'on') : $animate.removeClass(element, 'on'); + * }); + * }); + * }]); + * ``` + * + * Now the `on` CSS class is added and removed on the greeting box component. Now if we add a CSS class on top of the greeting box element + * in our HTML code then we can trigger a CSS or JS animation to happen. + * + * ```css + * /* normally we would create a CSS class to reference on the element */ + * greeting-box.on { transition:0.5s linear all; background:green; color:white; } + * ``` + * + * The `$animate` service contains a variety of other methods like `enter`, `leave`, `animate` and `setClass`. To learn more about what's + * possible be sure to visit the {@link ng.$animate $animate service API page}. + * + * + * ### Preventing Collisions With Third Party Libraries + * + * Some third-party frameworks place animation duration defaults across many element or className + * selectors in order to make their code small and reuseable. This can lead to issues with ngAnimate, which + * is expecting actual animations on these elements and has to wait for their completion. + * + * You can prevent this unwanted behavior by using a prefix on all your animation classes: + * + * ```css + * /* prefixed with animate- */ + * .animate-fade-add.animate-fade-add-active { + * transition:1s linear all; + * opacity:0; + * } + * ``` + * + * You then configure `$animate` to enforce this prefix: + * + * ```js + * $animateProvider.classNameFilter(/animate-/); + * ``` + * + * This also may provide your application with a speed boost since only specific elements containing CSS class prefix + * will be evaluated for animation when any DOM changes occur in the application. + * + * ## Callbacks and Promises + * + * When `$animate` is called it returns a promise that can be used to capture when the animation has ended. Therefore if we were to trigger + * an animation (within our directive code) then we can continue performing directive and scope related activities after the animation has + * ended by chaining onto the returned promise that animation method returns. + * + * ```js + * // somewhere within the depths of the directive + * $animate.enter(element, parent).then(function() { + * //the animation has completed + * }); + * ``` + * + * (Note that earlier versions of Angular prior to v1.4 required the promise code to be wrapped using `$scope.$apply(...)`. This is not the case + * anymore.) + * + * In addition to the animation promise, we can also make use of animation-related callbacks within our directives and controller code by registering + * an event listener using the `$animate` service. Let's say for example that an animation was triggered on our view + * routing controller to hook into that: + * + * ```js + * ngModule.controller('HomePageController', ['$animate', function($animate) { + * $animate.on('enter', ngViewElement, function(element) { + * // the animation for this route has completed + * }]); + * }]) + * ``` + * + * (Note that you will need to trigger a digest within the callback to get angular to notice any scope-related changes.) + */ + +/** + * @ngdoc service + * @name $animate + * @kind object + * + * @description + * The ngAnimate `$animate` service documentation is the same for the core `$animate` service. + * + * Click here {@link ng.$animate $animate to learn more about animations with `$animate`}. + */ +angular.module('ngAnimate', []) + .directive('ngAnimateChildren', $$AnimateChildrenDirective) + + .factory('$$rAFMutex', $$rAFMutexFactory) + .factory('$$rAFScheduler', $$rAFSchedulerFactory) + + .factory('$$AnimateRunner', $$AnimateRunnerFactory) + + .provider('$$animateQueue', $$AnimateQueueProvider) + .provider('$$animation', $$AnimationProvider) + + .provider('$animateCss', $AnimateCssProvider) + .provider('$$animateCssDriver', $$AnimateCssDriverProvider) + + .provider('$$animateJs', $$AnimateJsProvider) + .provider('$$animateJsDriver', $$AnimateJsDriverProvider); + + +})(window, window.angular); diff --git a/www/lib/ionic/js/angular/angular-animate.min.js b/www/lib/ionic/js/angular/angular-animate.min.js new file mode 100644 index 0000000..a99eac1 --- /dev/null +++ b/www/lib/ionic/js/angular/angular-animate.min.js @@ -0,0 +1,52 @@ +/* + AngularJS v1.4.3 + (c) 2010-2015 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(F,t,W){'use strict';function ua(a,b,c){if(!a)throw ngMinErr("areq",b||"?",c||"required");return a}function va(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;X(a)&&(a=a.join(" "));X(b)&&(b=b.join(" "));return a+" "+b}function Ea(a){var b={};a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from);return b}function ba(a,b,c){var d="";a=X(a)?a:a&&U(a)&&a.length?a.split(/\s+/):[];u(a,function(a,s){a&&0=F&&b>=J&&(C=!0,m())}if(!K)if(g.parentNode){var x,p=[],k=function(a){if(C)D&&a&&(D=!1,m());else if(D=!a,y.animationDuration)if(a= +ma(g,D),D)l.push(a);else{var b=l,c=b.indexOf(a);0<=a&&b.splice(c,1)}},r=0 + * + * See {@link ngResource.$resource `$resource`} for usage. + */ + +/** + * @ngdoc service + * @name $resource + * @requires $http + * + * @description + * A factory which creates a resource object that lets you interact with + * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources. + * + * The returned resource object has action methods which provide high-level behaviors without + * the need to interact with the low level {@link ng.$http $http} service. + * + * Requires the {@link ngResource `ngResource`} module to be installed. + * + * By default, trailing slashes will be stripped from the calculated URLs, + * which can pose problems with server backends that do not expect that + * behavior. This can be disabled by configuring the `$resourceProvider` like + * this: + * + * ```js + app.config(['$resourceProvider', function($resourceProvider) { + // Don't strip trailing slashes from calculated URLs + $resourceProvider.defaults.stripTrailingSlashes = false; + }]); + * ``` + * + * @param {string} url A parameterized URL template with parameters prefixed by `:` as in + * `/user/:username`. If you are using a URL with a port number (e.g. + * `http://example.com:8080/api`), it will be respected. + * + * If you are using a url with a suffix, just add the suffix, like this: + * `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')` + * or even `$resource('http://example.com/resource/:resource_id.:format')` + * If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be + * collapsed down to a single `.`. If you need this sequence to appear and not collapse then you + * can escape it with `/\.`. + * + * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in + * `actions` methods. If any of the parameter value is a function, it will be executed every time + * when a param value needs to be obtained for a request (unless the param was overridden). + * + * Each key value in the parameter object is first bound to url template if present and then any + * excess keys are appended to the url search query after the `?`. + * + * Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in + * URL `/path/greet?salutation=Hello`. + * + * If the parameter value is prefixed with `@` then the value for that parameter will be extracted + * from the corresponding property on the `data` object (provided when calling an action method). For + * example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of `someParam` + * will be `data.someProp`. + * + * @param {Object.=} actions Hash with declaration of custom actions that should extend + * the default set of resource actions. The declaration should be created in the format of {@link + * ng.$http#usage $http.config}: + * + * {action1: {method:?, params:?, isArray:?, headers:?, ...}, + * action2: {method:?, params:?, isArray:?, headers:?, ...}, + * ...} + * + * Where: + * + * - **`action`** – {string} – The name of action. This name becomes the name of the method on + * your resource object. + * - **`method`** – {string} – Case insensitive HTTP method (e.g. `GET`, `POST`, `PUT`, + * `DELETE`, `JSONP`, etc). + * - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of + * the parameter value is a function, it will be executed every time when a param value needs to + * be obtained for a request (unless the param was overridden). + * - **`url`** – {string} – action specific `url` override. The url templating is supported just + * like for the resource-level urls. + * - **`isArray`** – {boolean=} – If true then the returned object for this action is an array, + * see `returns` section. + * - **`transformRequest`** – + * `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * request body and headers and returns its transformed (typically serialized) version. + * By default, transformRequest will contain one function that checks if the request data is + * an object and serializes to using `angular.toJson`. To prevent this behavior, set + * `transformRequest` to an empty array: `transformRequest: []` + * - **`transformResponse`** – + * `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * response body and headers and returns its transformed (typically deserialized) version. + * By default, transformResponse will contain one function that checks if the response looks like + * a JSON string and deserializes it using `angular.fromJson`. To prevent this behavior, set + * `transformResponse` to an empty array: `transformResponse: []` + * - **`cache`** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the + * GET request, otherwise if a cache instance built with + * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for + * caching. + * - **`timeout`** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} that + * should abort the request when resolved. + * - **`withCredentials`** - `{boolean}` - whether to set the `withCredentials` flag on the + * XHR object. See + * [requests with credentials](https://developer.mozilla.org/en/http_access_control#section_5) + * for more information. + * - **`responseType`** - `{string}` - see + * [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType). + * - **`interceptor`** - `{Object=}` - The interceptor object has two optional methods - + * `response` and `responseError`. Both `response` and `responseError` interceptors get called + * with `http response` object. See {@link ng.$http $http interceptors}. + * + * @param {Object} options Hash with custom settings that should extend the + * default `$resourceProvider` behavior. The only supported option is + * + * Where: + * + * - **`stripTrailingSlashes`** – {boolean} – If true then the trailing + * slashes from any calculated URL will be stripped. (Defaults to true.) + * + * @returns {Object} A resource "class" object with methods for the default set of resource actions + * optionally extended with custom `actions`. The default set contains these actions: + * ```js + * { 'get': {method:'GET'}, + * 'save': {method:'POST'}, + * 'query': {method:'GET', isArray:true}, + * 'remove': {method:'DELETE'}, + * 'delete': {method:'DELETE'} }; + * ``` + * + * Calling these methods invoke an {@link ng.$http} with the specified http method, + * destination and parameters. When the data is returned from the server then the object is an + * instance of the resource class. The actions `save`, `remove` and `delete` are available on it + * as methods with the `$` prefix. This allows you to easily perform CRUD operations (create, + * read, update, delete) on server-side data like this: + * ```js + * var User = $resource('/user/:userId', {userId:'@id'}); + * var user = User.get({userId:123}, function() { + * user.abc = true; + * user.$save(); + * }); + * ``` + * + * It is important to realize that invoking a $resource object method immediately returns an + * empty reference (object or array depending on `isArray`). Once the data is returned from the + * server the existing reference is populated with the actual data. This is a useful trick since + * usually the resource is assigned to a model which is then rendered by the view. Having an empty + * object results in no rendering, once the data arrives from the server then the object is + * populated with the data and the view automatically re-renders itself showing the new data. This + * means that in most cases one never has to write a callback function for the action methods. + * + * The action methods on the class object or instance object can be invoked with the following + * parameters: + * + * - HTTP GET "class" actions: `Resource.action([parameters], [success], [error])` + * - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])` + * - non-GET instance actions: `instance.$action([parameters], [success], [error])` + * + * + * Success callback is called with (value, responseHeaders) arguments, where the value is + * the populated resource instance or collection object. The error callback is called + * with (httpResponse) argument. + * + * Class actions return empty instance (with additional properties below). + * Instance actions return promise of the action. + * + * The Resource instances and collection have these additional properties: + * + * - `$promise`: the {@link ng.$q promise} of the original server interaction that created this + * instance or collection. + * + * On success, the promise is resolved with the same resource instance or collection object, + * updated with data from server. This makes it easy to use in + * {@link ngRoute.$routeProvider resolve section of $routeProvider.when()} to defer view + * rendering until the resource(s) are loaded. + * + * On failure, the promise is resolved with the {@link ng.$http http response} object, without + * the `resource` property. + * + * If an interceptor object was provided, the promise will instead be resolved with the value + * returned by the interceptor. + * + * - `$resolved`: `true` after first server interaction is completed (either with success or + * rejection), `false` before that. Knowing if the Resource has been resolved is useful in + * data-binding. + * + * @example + * + * # Credit card resource + * + * ```js + // Define CreditCard class + var CreditCard = $resource('/user/:userId/card/:cardId', + {userId:123, cardId:'@id'}, { + charge: {method:'POST', params:{charge:true}} + }); + + // We can retrieve a collection from the server + var cards = CreditCard.query(function() { + // GET: /user/123/card + // server returns: [ {id:456, number:'1234', name:'Smith'} ]; + + var card = cards[0]; + // each item is an instance of CreditCard + expect(card instanceof CreditCard).toEqual(true); + card.name = "J. Smith"; + // non GET methods are mapped onto the instances + card.$save(); + // POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'} + // server returns: {id:456, number:'1234', name: 'J. Smith'}; + + // our custom method is mapped as well. + card.$charge({amount:9.99}); + // POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'} + }); + + // we can create an instance as well + var newCard = new CreditCard({number:'0123'}); + newCard.name = "Mike Smith"; + newCard.$save(); + // POST: /user/123/card {number:'0123', name:'Mike Smith'} + // server returns: {id:789, number:'0123', name: 'Mike Smith'}; + expect(newCard.id).toEqual(789); + * ``` + * + * The object returned from this function execution is a resource "class" which has "static" method + * for each action in the definition. + * + * Calling these methods invoke `$http` on the `url` template with the given `method`, `params` and + * `headers`. + * When the data is returned from the server then the object is an instance of the resource type and + * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD + * operations (create, read, update, delete) on server-side data. + + ```js + var User = $resource('/user/:userId', {userId:'@id'}); + User.get({userId:123}, function(user) { + user.abc = true; + user.$save(); + }); + ``` + * + * It's worth noting that the success callback for `get`, `query` and other methods gets passed + * in the response that came from the server as well as $http header getter function, so one + * could rewrite the above example and get access to http headers as: + * + ```js + var User = $resource('/user/:userId', {userId:'@id'}); + User.get({userId:123}, function(u, getResponseHeaders){ + u.abc = true; + u.$save(function(u, putResponseHeaders) { + //u => saved user object + //putResponseHeaders => $http header getter + }); + }); + ``` + * + * You can also access the raw `$http` promise via the `$promise` property on the object returned + * + ``` + var User = $resource('/user/:userId', {userId:'@id'}); + User.get({userId:123}) + .$promise.then(function(user) { + $scope.user = user; + }); + ``` + + * # Creating a custom 'PUT' request + * In this example we create a custom method on our resource to make a PUT request + * ```js + * var app = angular.module('app', ['ngResource', 'ngRoute']); + * + * // Some APIs expect a PUT request in the format URL/object/ID + * // Here we are creating an 'update' method + * app.factory('Notes', ['$resource', function($resource) { + * return $resource('/notes/:id', null, + * { + * 'update': { method:'PUT' } + * }); + * }]); + * + * // In our controller we get the ID from the URL using ngRoute and $routeParams + * // We pass in $routeParams and our Notes factory along with $scope + * app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes', + function($scope, $routeParams, Notes) { + * // First get a note object from the factory + * var note = Notes.get({ id:$routeParams.id }); + * $id = note.id; + * + * // Now call update passing in the ID first then the object you are updating + * Notes.update({ id:$id }, note); + * + * // This will PUT /notes/ID with the note object in the request payload + * }]); + * ``` + */ +angular.module('ngResource', ['ng']). + provider('$resource', function() { + var provider = this; + + this.defaults = { + // Strip slashes by default + stripTrailingSlashes: true, + + // Default actions configuration + actions: { + 'get': {method: 'GET'}, + 'save': {method: 'POST'}, + 'query': {method: 'GET', isArray: true}, + 'remove': {method: 'DELETE'}, + 'delete': {method: 'DELETE'} + } + }; + + this.$get = ['$http', '$q', function($http, $q) { + + var noop = angular.noop, + forEach = angular.forEach, + extend = angular.extend, + copy = angular.copy, + isFunction = angular.isFunction; + + /** + * We need our custom method because encodeURIComponent is too aggressive and doesn't follow + * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set + * (pchar) allowed in path segments: + * segment = *pchar + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * pct-encoded = "%" HEXDIG HEXDIG + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ + function encodeUriSegment(val) { + return encodeUriQuery(val, true). + replace(/%26/gi, '&'). + replace(/%3D/gi, '='). + replace(/%2B/gi, '+'); + } + + + /** + * This method is intended for encoding *key* or *value* parts of query component. We need a + * custom method because encodeURIComponent is too aggressive and encodes stuff that doesn't + * have to be encoded per http://tools.ietf.org/html/rfc3986: + * query = *( pchar / "/" / "?" ) + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * pct-encoded = "%" HEXDIG HEXDIG + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ + function encodeUriQuery(val, pctEncodeSpaces) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); + } + + function Route(template, defaults) { + this.template = template; + this.defaults = extend({}, provider.defaults, defaults); + this.urlParams = {}; + } + + Route.prototype = { + setUrlParams: function(config, params, actionUrl) { + var self = this, + url = actionUrl || self.template, + val, + encodedVal; + + var urlParams = self.urlParams = {}; + forEach(url.split(/\W/), function(param) { + if (param === 'hasOwnProperty') { + throw $resourceMinErr('badname', "hasOwnProperty is not a valid parameter name."); + } + if (!(new RegExp("^\\d+$").test(param)) && param && + (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) { + urlParams[param] = true; + } + }); + url = url.replace(/\\:/g, ':'); + + params = params || {}; + forEach(self.urlParams, function(_, urlParam) { + val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam]; + if (angular.isDefined(val) && val !== null) { + encodedVal = encodeUriSegment(val); + url = url.replace(new RegExp(":" + urlParam + "(\\W|$)", "g"), function(match, p1) { + return encodedVal + p1; + }); + } else { + url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W|$)", "g"), function(match, + leadingSlashes, tail) { + if (tail.charAt(0) == '/') { + return tail; + } else { + return leadingSlashes + tail; + } + }); + } + }); + + // strip trailing slashes and set the url (unless this behavior is specifically disabled) + if (self.defaults.stripTrailingSlashes) { + url = url.replace(/\/+$/, '') || '/'; + } + + // then replace collapse `/.` if found in the last URL path segment before the query + // E.g. `http://url.com/id./format?q=x` becomes `http://url.com/id.format?q=x` + url = url.replace(/\/\.(?=\w+($|\?))/, '.'); + // replace escaped `/\.` with `/.` + config.url = url.replace(/\/\\\./, '/.'); + + + // set params - delegate param encoding to $http + forEach(params, function(value, key) { + if (!self.urlParams[key]) { + config.params = config.params || {}; + config.params[key] = value; + } + }); + } + }; + + + function resourceFactory(url, paramDefaults, actions, options) { + var route = new Route(url, options); + + actions = extend({}, provider.defaults.actions, actions); + + function extractParams(data, actionParams) { + var ids = {}; + actionParams = extend({}, paramDefaults, actionParams); + forEach(actionParams, function(value, key) { + if (isFunction(value)) { value = value(); } + ids[key] = value && value.charAt && value.charAt(0) == '@' ? + lookupDottedPath(data, value.substr(1)) : value; + }); + return ids; + } + + function defaultResponseInterceptor(response) { + return response.resource; + } + + function Resource(value) { + shallowClearAndCopy(value || {}, this); + } + + Resource.prototype.toJSON = function() { + var data = extend({}, this); + delete data.$promise; + delete data.$resolved; + return data; + }; + + forEach(actions, function(action, name) { + var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method); + + Resource[name] = function(a1, a2, a3, a4) { + var params = {}, data, success, error; + + /* jshint -W086 */ /* (purposefully fall through case statements) */ + switch (arguments.length) { + case 4: + error = a4; + success = a3; + //fallthrough + case 3: + case 2: + if (isFunction(a2)) { + if (isFunction(a1)) { + success = a1; + error = a2; + break; + } + + success = a2; + error = a3; + //fallthrough + } else { + params = a1; + data = a2; + success = a3; + break; + } + case 1: + if (isFunction(a1)) success = a1; + else if (hasBody) data = a1; + else params = a1; + break; + case 0: break; + default: + throw $resourceMinErr('badargs', + "Expected up to 4 arguments [params, data, success, error], got {0} arguments", + arguments.length); + } + /* jshint +W086 */ /* (purposefully fall through case statements) */ + + var isInstanceCall = this instanceof Resource; + var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data)); + var httpConfig = {}; + var responseInterceptor = action.interceptor && action.interceptor.response || + defaultResponseInterceptor; + var responseErrorInterceptor = action.interceptor && action.interceptor.responseError || + undefined; + + forEach(action, function(value, key) { + if (key != 'params' && key != 'isArray' && key != 'interceptor') { + httpConfig[key] = copy(value); + } + }); + + if (hasBody) httpConfig.data = data; + route.setUrlParams(httpConfig, + extend({}, extractParams(data, action.params || {}), params), + action.url); + + var promise = $http(httpConfig).then(function(response) { + var data = response.data, + promise = value.$promise; + + if (data) { + // Need to convert action.isArray to boolean in case it is undefined + // jshint -W018 + if (angular.isArray(data) !== (!!action.isArray)) { + throw $resourceMinErr('badcfg', + 'Error in resource configuration for action `{0}`. Expected response to ' + + 'contain an {1} but got an {2} (Request: {3} {4})', name, action.isArray ? 'array' : 'object', + angular.isArray(data) ? 'array' : 'object', httpConfig.method, httpConfig.url); + } + // jshint +W018 + if (action.isArray) { + value.length = 0; + forEach(data, function(item) { + if (typeof item === "object") { + value.push(new Resource(item)); + } else { + // Valid JSON values may be string literals, and these should not be converted + // into objects. These items will not have access to the Resource prototype + // methods, but unfortunately there + value.push(item); + } + }); + } else { + shallowClearAndCopy(data, value); + value.$promise = promise; + } + } + + value.$resolved = true; + + response.resource = value; + + return response; + }, function(response) { + value.$resolved = true; + + (error || noop)(response); + + return $q.reject(response); + }); + + promise = promise.then( + function(response) { + var value = responseInterceptor(response); + (success || noop)(value, response.headers); + return value; + }, + responseErrorInterceptor); + + if (!isInstanceCall) { + // we are creating instance / collection + // - set the initial promise + // - return the instance / collection + value.$promise = promise; + value.$resolved = false; + + return value; + } + + // instance call + return promise; + }; + + + Resource.prototype['$' + name] = function(params, success, error) { + if (isFunction(params)) { + error = success; success = params; params = {}; + } + var result = Resource[name].call(this, params, this, success, error); + return result.$promise || result; + }; + }); + + Resource.bind = function(additionalParamDefaults) { + return resourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions); + }; + + return Resource; + } + + return resourceFactory; + }]; + }); + + +})(window, window.angular); diff --git a/www/lib/ionic/js/angular/angular-resource.min.js b/www/lib/ionic/js/angular/angular-resource.min.js new file mode 100644 index 0000000..0798117 --- /dev/null +++ b/www/lib/ionic/js/angular/angular-resource.min.js @@ -0,0 +1,13 @@ +/* + AngularJS v1.4.3 + (c) 2010-2015 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(I,d,B){'use strict';function D(f,q){q=q||{};d.forEach(q,function(d,h){delete q[h]});for(var h in f)!f.hasOwnProperty(h)||"$"===h.charAt(0)&&"$"===h.charAt(1)||(q[h]=f[h]);return q}var x=d.$$minErr("$resource"),C=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;d.module("ngResource",["ng"]).provider("$resource",function(){var f=this;this.defaults={stripTrailingSlashes:!0,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}}; +this.$get=["$http","$q",function(q,h){function u(d,g){this.template=d;this.defaults=s({},f.defaults,g);this.urlParams={}}function w(y,g,l,m){function c(b,k){var c={};k=s({},g,k);r(k,function(a,k){v(a)&&(a=a());var d;if(a&&a.charAt&&"@"==a.charAt(0)){d=b;var e=a.substr(1);if(null==e||""===e||"hasOwnProperty"===e||!C.test("."+e))throw x("badmember",e);for(var e=e.split("."),n=0,g=e.length;n + * + * See {@link ngSanitize.$sanitize `$sanitize`} for usage. + */ + +/* + * HTML Parser By Misko Hevery (misko@hevery.com) + * based on: HTML Parser By John Resig (ejohn.org) + * Original code by Erik Arvidsson, Mozilla Public License + * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js + * + * // Use like so: + * htmlParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + */ + + +/** + * @ngdoc service + * @name $sanitize + * @kind function + * + * @description + * The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are + * then serialized back to properly escaped html string. This means that no unsafe input can make + * it into the returned string, however, since our parser is more strict than a typical browser + * parser, it's possible that some obscure input, which would be recognized as valid HTML by a + * browser, won't make it through the sanitizer. The input may also contain SVG markup. + * The whitelist is configured using the functions `aHrefSanitizationWhitelist` and + * `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider `$compileProvider`}. + * + * @param {string} html HTML input. + * @returns {string} Sanitized HTML. + * + * @example + + + +
    + Snippet: + + + + + + + + + + + + + + + + + + + + + + + + + +
    DirectiveHowSourceRendered
    ng-bind-htmlAutomatically uses $sanitize
    <div ng-bind-html="snippet">
    </div>
    ng-bind-htmlBypass $sanitize by explicitly trusting the dangerous value +
    <div ng-bind-html="deliberatelyTrustDangerousSnippet()">
    +</div>
    +
    ng-bindAutomatically escapes
    <div ng-bind="snippet">
    </div>
    +
    +
    + + it('should sanitize the html snippet by default', function() { + expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). + toBe('

    an html\nclick here\nsnippet

    '); + }); + + it('should inline raw snippet if bound to a trusted value', function() { + expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()). + toBe("

    an html\n" + + "click here\n" + + "snippet

    "); + }); + + it('should escape snippet without any filter', function() { + expect(element(by.css('#bind-default div')).getInnerHtml()). + toBe("<p style=\"color:blue\">an html\n" + + "<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" + + "snippet</p>"); + }); + + it('should update', function() { + element(by.model('snippet')).clear(); + element(by.model('snippet')).sendKeys('new text'); + expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). + toBe('new text'); + expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).toBe( + 'new text'); + expect(element(by.css('#bind-default div')).getInnerHtml()).toBe( + "new <b onclick=\"alert(1)\">text</b>"); + }); +
    +
    + */ +function $SanitizeProvider() { + this.$get = ['$$sanitizeUri', function($$sanitizeUri) { + return function(html) { + var buf = []; + htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) { + return !/^unsafe/.test($$sanitizeUri(uri, isImage)); + })); + return buf.join(''); + }; + }]; +} + +function sanitizeText(chars) { + var buf = []; + var writer = htmlSanitizeWriter(buf, angular.noop); + writer.chars(chars); + return buf.join(''); +} + + +// Regular Expressions for parsing tags and attributes +var START_TAG_REGEXP = + /^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/, + END_TAG_REGEXP = /^<\/\s*([\w:-]+)[^>]*>/, + ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g, + BEGIN_TAG_REGEXP = /^/g, + DOCTYPE_REGEXP = /]*?)>/i, + CDATA_REGEXP = //g, + SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + // Match everything outside of normal chars and " (quote character) + NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; + + +// Good source of info about elements and attributes +// http://dev.w3.org/html5/spec/Overview.html#semantics +// http://simon.html5.org/html-elements + +// Safe Void Elements - HTML5 +// http://dev.w3.org/html5/spec/Overview.html#void-elements +var voidElements = makeMap("area,br,col,hr,img,wbr"); + +// Elements that you can, intentionally, leave open (and which close themselves) +// http://dev.w3.org/html5/spec/Overview.html#optional-tags +var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), + optionalEndTagInlineElements = makeMap("rp,rt"), + optionalEndTagElements = angular.extend({}, + optionalEndTagInlineElements, + optionalEndTagBlockElements); + +// Safe Block Elements - HTML5 +var blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap("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")); + +// Inline Elements - HTML5 +var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("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")); + +// SVG Elements +// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements +// Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted. +// They can potentially allow for arbitrary javascript to be executed. See #11290 +var svgElements = makeMap("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"); + +// Special Elements (can contain anything) +var specialElements = makeMap("script,style"); + +var validElements = angular.extend({}, + voidElements, + blockElements, + inlineElements, + optionalEndTagElements, + svgElements); + +//Attributes that have href and hence need to be sanitized +var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap,xlink:href"); + +var htmlAttrs = makeMap('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'); + +// SVG attributes (without "id" and "name" attributes) +// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes +var svgAttrs = makeMap('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', true); + +var validAttrs = angular.extend({}, + uriAttrs, + svgAttrs, + htmlAttrs); + +function makeMap(str, lowercaseKeys) { + var obj = {}, items = str.split(','), i; + for (i = 0; i < items.length; i++) { + obj[lowercaseKeys ? angular.lowercase(items[i]) : items[i]] = true; + } + return obj; +} + + +/** + * @example + * htmlParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * @param {string} html string + * @param {object} handler + */ +function htmlParser(html, handler) { + if (typeof html !== 'string') { + if (html === null || typeof html === 'undefined') { + html = ''; + } else { + html = '' + html; + } + } + var index, chars, match, stack = [], last = html, text; + stack.last = function() { return stack[stack.length - 1]; }; + + while (html) { + text = ''; + chars = true; + + // Make sure we're not in a script or style element + if (!stack.last() || !specialElements[stack.last()]) { + + // Comment + if (html.indexOf("", index) === index) { + if (handler.comment) handler.comment(html.substring(4, index)); + html = html.substring(index + 3); + chars = false; + } + // DOCTYPE + } else if (DOCTYPE_REGEXP.test(html)) { + match = html.match(DOCTYPE_REGEXP); + + if (match) { + html = html.replace(match[0], ''); + chars = false; + } + // end tag + } else if (BEGING_END_TAGE_REGEXP.test(html)) { + match = html.match(END_TAG_REGEXP); + + if (match) { + html = html.substring(match[0].length); + match[0].replace(END_TAG_REGEXP, parseEndTag); + chars = false; + } + + // start tag + } else if (BEGIN_TAG_REGEXP.test(html)) { + match = html.match(START_TAG_REGEXP); + + if (match) { + // We only have a valid start-tag if there is a '>'. + if (match[4]) { + html = html.substring(match[0].length); + match[0].replace(START_TAG_REGEXP, parseStartTag); + } + chars = false; + } else { + // no ending tag found --- this piece should be encoded as an entity. + text += '<'; + html = html.substring(1); + } + } + + if (chars) { + index = html.indexOf("<"); + + text += index < 0 ? html : html.substring(0, index); + html = index < 0 ? "" : html.substring(index); + + if (handler.chars) handler.chars(decodeEntities(text)); + } + + } else { + // IE versions 9 and 10 do not understand the regex '[^]', so using a workaround with [\W\w]. + html = html.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'), + function(all, text) { + text = text.replace(COMMENT_REGEXP, "$1").replace(CDATA_REGEXP, "$1"); + + if (handler.chars) handler.chars(decodeEntities(text)); + + return ""; + }); + + parseEndTag("", stack.last()); + } + + if (html == last) { + throw $sanitizeMinErr('badparse', "The sanitizer was unable to parse the following block " + + "of html: {0}", html); + } + last = html; + } + + // Clean up any remaining tags + parseEndTag(); + + function parseStartTag(tag, tagName, rest, unary) { + tagName = angular.lowercase(tagName); + if (blockElements[tagName]) { + while (stack.last() && inlineElements[stack.last()]) { + parseEndTag("", stack.last()); + } + } + + if (optionalEndTagElements[tagName] && stack.last() == tagName) { + parseEndTag("", tagName); + } + + unary = voidElements[tagName] || !!unary; + + if (!unary) { + stack.push(tagName); + } + + var attrs = {}; + + rest.replace(ATTR_REGEXP, + function(match, name, doubleQuotedValue, singleQuotedValue, unquotedValue) { + var value = doubleQuotedValue + || singleQuotedValue + || unquotedValue + || ''; + + attrs[name] = decodeEntities(value); + }); + if (handler.start) handler.start(tagName, attrs, unary); + } + + function parseEndTag(tag, tagName) { + var pos = 0, i; + tagName = angular.lowercase(tagName); + if (tagName) { + // Find the closest opened tag of the same type + for (pos = stack.length - 1; pos >= 0; pos--) { + if (stack[pos] == tagName) break; + } + } + + if (pos >= 0) { + // Close all the open elements, up the stack + for (i = stack.length - 1; i >= pos; i--) + if (handler.end) handler.end(stack[i]); + + // Remove the open elements from the stack + stack.length = pos; + } + } +} + +var hiddenPre=document.createElement("pre"); +/** + * decodes all entities into regular string + * @param value + * @returns {string} A string with decoded entities. + */ +function decodeEntities(value) { + if (!value) { return ''; } + + hiddenPre.innerHTML = value.replace(//g, '>'); +} + +/** + * create an HTML/XML writer which writes to buffer + * @param {Array} buf use buf.jain('') to get out sanitized html string + * @returns {object} in the form of { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * } + */ +function htmlSanitizeWriter(buf, uriValidator) { + var ignore = false; + var out = angular.bind(buf, buf.push); + return { + start: function(tag, attrs, unary) { + tag = angular.lowercase(tag); + if (!ignore && specialElements[tag]) { + ignore = tag; + } + if (!ignore && validElements[tag] === true) { + out('<'); + out(tag); + angular.forEach(attrs, function(value, key) { + var lkey=angular.lowercase(key); + var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background'); + if (validAttrs[lkey] === true && + (uriAttrs[lkey] !== true || uriValidator(value, isImage))) { + out(' '); + out(key); + out('="'); + out(encodeEntities(value)); + out('"'); + } + }); + out(unary ? '/>' : '>'); + } + }, + end: function(tag) { + tag = angular.lowercase(tag); + if (!ignore && validElements[tag] === true) { + out(''); + } + if (tag == ignore) { + ignore = false; + } + }, + chars: function(chars) { + if (!ignore) { + out(encodeEntities(chars)); + } + } + }; +} + + +// define ngSanitize module and register $sanitize service +angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider); + +/* global sanitizeText: false */ + +/** + * @ngdoc filter + * @name linky + * @kind function + * + * @description + * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and + * plain email address links. + * + * Requires the {@link ngSanitize `ngSanitize`} module to be installed. + * + * @param {string} text Input text. + * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in. + * @returns {string} Html-linkified text. + * + * @usage + + * + * @example + + + +
    + Snippet: + + + + + + + + + + + + + + + + + + + + + +
    FilterSourceRendered
    linky filter +
    <div ng-bind-html="snippet | linky">
    </div>
    +
    +
    +
    linky target +
    <div ng-bind-html="snippetWithTarget | linky:'_blank'">
    </div>
    +
    +
    +
    no filter
    <div ng-bind="snippet">
    </div>
    + + + it('should linkify the snippet with urls', function() { + expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). + toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' + + 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); + expect(element.all(by.css('#linky-filter a')).count()).toEqual(4); + }); + + it('should not linkify snippet without the linky filter', function() { + expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()). + toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' + + 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); + expect(element.all(by.css('#escaped-html a')).count()).toEqual(0); + }); + + it('should update', function() { + element(by.model('snippet')).clear(); + element(by.model('snippet')).sendKeys('new http://link.'); + expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). + toBe('new http://link.'); + expect(element.all(by.css('#linky-filter a')).count()).toEqual(1); + expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()) + .toBe('new http://link.'); + }); + + it('should work with the target property', function() { + expect(element(by.id('linky-target')). + element(by.binding("snippetWithTarget | linky:'_blank'")).getText()). + toBe('http://angularjs.org/'); + expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank'); + }); + + + */ +angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) { + var LINKY_URL_REGEXP = + /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"”’]/i, + MAILTO_REGEXP = /^mailto:/i; + + return function(text, target) { + if (!text) return text; + var match; + var raw = text; + var html = []; + var url; + var i; + while ((match = raw.match(LINKY_URL_REGEXP))) { + // We can not end in these as they are sometimes found at the end of the sentence + url = match[0]; + // if we did not match ftp/http/www/mailto then assume mailto + if (!match[2] && !match[4]) { + url = (match[3] ? 'http://' : 'mailto:') + url; + } + i = match.index; + addText(raw.substr(0, i)); + addLink(url, match[0].replace(MAILTO_REGEXP, '')); + raw = raw.substring(i + match[0].length); + } + addText(raw); + return $sanitize(html.join('')); + + function addText(text) { + if (!text) { + return; + } + html.push(sanitizeText(text)); + } + + function addLink(url, text) { + html.push(''); + addText(text); + html.push(''); + } + }; +}]); + + +})(window, window.angular); diff --git a/www/lib/ionic/js/angular/angular-sanitize.min.js b/www/lib/ionic/js/angular/angular-sanitize.min.js new file mode 100644 index 0000000..e8c4226 --- /dev/null +++ b/www/lib/ionic/js/angular/angular-sanitize.min.js @@ -0,0 +1,16 @@ +/* + AngularJS v1.4.3 + (c) 2010-2015 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(n,h,p){'use strict';function E(a){var f=[];r(f,h.noop).chars(a);return f.join("")}function g(a,f){var d={},c=a.split(","),b;for(b=0;b=c;d--)f.end&&f.end(e[d]);e.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,k,e=[],m=a,l;for(e.last=function(){return e[e.length-1]};a;){l="";k=!0;if(e.last()&&w[e.last()])a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+e.last()+"[^>]*>","i"),function(a,b){b=b.replace(H,"$1").replace(I,"$1");f.chars&&f.chars(q(b));return""}),c("",e.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e", +b)===b&&(f.comment&&f.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(x.test(a)){if(b=a.match(x))a=a.replace(b[0],""),k=!1}else if(J.test(a)){if(b=a.match(y))a=a.substring(b[0].length),b[0].replace(y,c),k=!1}else K.test(a)&&((b=a.match(z))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(z,d)),k=!1):(l+="<",a=a.substring(1)));k&&(b=a.indexOf("<"),l+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),f.chars&&f.chars(q(l)))}if(a==m)throw L("badparse",a);m=a}c()}function q(a){if(!a)return"";A.innerHTML= +a.replace(//g,">")}function r(a,f){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,e){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(k,function(d,e){var k=h.lowercase(e),g="img"===a&&"src"===k|| +"background"===k;!0!==O[k]||!0===D[k]&&!f(d,g)||(c(" "),c(e),c('="'),c(B(d)),c('"'))}),c(e?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c(""));a==d&&(d=!1)},chars:function(a){d||c(B(a))}}}var L=h.$$minErr("$sanitize"),z=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,y=/^<\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^]*?)>/i, +I=/"\u201d\u2019]/i,d=/^mailto:/i;return function(c,b){function k(a){a&&g.push(E(a))}function e(a, +c){g.push("');k(c);g.push("")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(f);)n=m[0],m[2]||m[4]||(n=(m[3]?"http://":"mailto:")+n),p=m.index,k(l.substr(0,p)),e(n,m[0].replace(d,"")),l=l.substring(p+m[0].length);k(l);return a(g.join(""))}}])})(window,window.angular); +//# sourceMappingURL=angular-sanitize.min.js.map diff --git a/www/lib/ionic/js/angular/angular.js b/www/lib/ionic/js/angular/angular.js new file mode 100644 index 0000000..f7442c0 --- /dev/null +++ b/www/lib/ionic/js/angular/angular.js @@ -0,0 +1,28364 @@ +/** + * @license AngularJS v1.4.3 + * (c) 2010-2015 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, document, undefined) {'use strict'; + +/** + * @description + * + * This object provides a utility for producing rich Error messages within + * Angular. It can be called as follows: + * + * var exampleMinErr = minErr('example'); + * throw exampleMinErr('one', 'This {0} is {1}', foo, bar); + * + * The above creates an instance of minErr in the example namespace. The + * resulting error will have a namespaced error code of example.one. The + * resulting error will replace {0} with the value of foo, and {1} with the + * value of bar. The object is not restricted in the number of arguments it can + * take. + * + * If fewer arguments are specified than necessary for interpolation, the extra + * interpolation markers will be preserved in the final string. + * + * Since data will be parsed statically during a build step, some restrictions + * are applied with respect to how minErr instances are created and called. + * Instances should have names of the form namespaceMinErr for a minErr created + * using minErr('namespace') . Error codes, namespaces and template strings + * should all be static strings, not variables or general expressions. + * + * @param {string} module The namespace to use for the new minErr instance. + * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning + * error from returned function, for cases when a particular type of error is useful. + * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance + */ + +function minErr(module, ErrorConstructor) { + ErrorConstructor = ErrorConstructor || Error; + return function() { + var SKIP_INDEXES = 2; + + var templateArgs = arguments, + code = templateArgs[0], + message = '[' + (module ? module + ':' : '') + code + '] ', + template = templateArgs[1], + paramPrefix, i; + + message += template.replace(/\{\d+\}/g, function(match) { + var index = +match.slice(1, -1), + shiftedIndex = index + SKIP_INDEXES; + + if (shiftedIndex < templateArgs.length) { + return toDebugString(templateArgs[shiftedIndex]); + } + + return match; + }); + + message += '\nhttp://errors.angularjs.org/1.4.3/' + + (module ? module + '/' : '') + code; + + for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') { + message += paramPrefix + 'p' + (i - SKIP_INDEXES) + '=' + + encodeURIComponent(toDebugString(templateArgs[i])); + } + + return new ErrorConstructor(message); + }; +} + +/* We need to tell jshint what variables are being exported */ +/* global angular: true, + msie: true, + jqLite: true, + jQuery: true, + slice: true, + splice: true, + push: true, + toString: true, + ngMinErr: true, + angularModule: true, + uid: true, + REGEX_STRING_REGEXP: true, + VALIDITY_STATE_PROPERTY: true, + + lowercase: true, + uppercase: true, + manualLowercase: true, + manualUppercase: true, + nodeName_: true, + isArrayLike: true, + forEach: true, + forEachSorted: true, + reverseParams: true, + nextUid: true, + setHashKey: true, + extend: true, + toInt: true, + inherit: true, + merge: true, + noop: true, + identity: true, + valueFn: true, + isUndefined: true, + isDefined: true, + isObject: true, + isBlankObject: true, + isString: true, + isNumber: true, + isDate: true, + isArray: true, + isFunction: true, + isRegExp: true, + isWindow: true, + isScope: true, + isFile: true, + isFormData: true, + isBlob: true, + isBoolean: true, + isPromiseLike: true, + trim: true, + escapeForRegexp: true, + isElement: true, + makeMap: true, + includes: true, + arrayRemove: true, + copy: true, + shallowCopy: true, + equals: true, + csp: true, + jq: true, + concat: true, + sliceArgs: true, + bind: true, + toJsonReplacer: true, + toJson: true, + fromJson: true, + convertTimezoneToLocal: true, + timezoneToOffset: true, + startingTag: true, + tryDecodeURIComponent: true, + parseKeyValue: true, + toKeyValue: true, + encodeUriSegment: true, + encodeUriQuery: true, + angularInit: true, + bootstrap: true, + getTestability: true, + snake_case: true, + bindJQuery: true, + assertArg: true, + assertArgFn: true, + assertNotHasOwnProperty: true, + getter: true, + getBlockNodes: true, + hasOwnProperty: true, + createMap: true, + + NODE_TYPE_ELEMENT: true, + NODE_TYPE_ATTRIBUTE: true, + NODE_TYPE_TEXT: true, + NODE_TYPE_COMMENT: true, + NODE_TYPE_DOCUMENT: true, + NODE_TYPE_DOCUMENT_FRAGMENT: true, +*/ + +//////////////////////////////////// + +/** + * @ngdoc module + * @name ng + * @module ng + * @description + * + * # ng (core module) + * The ng module is loaded by default when an AngularJS application is started. The module itself + * contains the essential components for an AngularJS application to function. The table below + * lists a high level breakdown of each of the services/factories, filters, directives and testing + * components available within this core module. + * + *
    + */ + +var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/; + +// The name of a form control's ValidityState property. +// This is used so that it's possible for internal tests to create mock ValidityStates. +var VALIDITY_STATE_PROPERTY = 'validity'; + +/** + * @ngdoc function + * @name angular.lowercase + * @module ng + * @kind function + * + * @description Converts the specified string to lowercase. + * @param {string} string String to be converted to lowercase. + * @returns {string} Lowercased string. + */ +var lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;}; +var hasOwnProperty = Object.prototype.hasOwnProperty; + +/** + * @ngdoc function + * @name angular.uppercase + * @module ng + * @kind function + * + * @description Converts the specified string to uppercase. + * @param {string} string String to be converted to uppercase. + * @returns {string} Uppercased string. + */ +var uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;}; + + +var manualLowercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);}) + : s; +}; +var manualUppercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);}) + : s; +}; + + +// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish +// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods +// with correct but slower alternatives. +if ('i' !== 'I'.toLowerCase()) { + lowercase = manualLowercase; + uppercase = manualUppercase; +} + + +var + msie, // holds major version number for IE, or NaN if UA is not IE. + jqLite, // delay binding since jQuery could be loaded after us. + jQuery, // delay binding + slice = [].slice, + splice = [].splice, + push = [].push, + toString = Object.prototype.toString, + getPrototypeOf = Object.getPrototypeOf, + ngMinErr = minErr('ng'), + + /** @name angular */ + angular = window.angular || (window.angular = {}), + angularModule, + uid = 0; + +/** + * documentMode is an IE-only property + * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx + */ +msie = document.documentMode; + + +/** + * @private + * @param {*} obj + * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, + * String ...) + */ +function isArrayLike(obj) { + if (obj == null || isWindow(obj)) { + return false; + } + + // Support: iOS 8.2 (not reproducible in simulator) + // "length" in obj used to prevent JIT error (gh-11508) + var length = "length" in Object(obj) && obj.length; + + if (obj.nodeType === NODE_TYPE_ELEMENT && length) { + return true; + } + + return isString(obj) || isArray(obj) || length === 0 || + typeof length === 'number' && length > 0 && (length - 1) in obj; +} + +/** + * @ngdoc function + * @name angular.forEach + * @module ng + * @kind function + * + * @description + * Invokes the `iterator` function once for each item in `obj` collection, which can be either an + * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value` + * is the value of an object property or an array element, `key` is the object property key or + * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional. + * + * It is worth noting that `.forEach` does not iterate over inherited properties because it filters + * using the `hasOwnProperty` method. + * + * Unlike ES262's + * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18), + * Providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just + * return the value provided. + * + ```js + var values = {name: 'misko', gender: 'male'}; + var log = []; + angular.forEach(values, function(value, key) { + this.push(key + ': ' + value); + }, log); + expect(log).toEqual(['name: misko', 'gender: male']); + ``` + * + * @param {Object|Array} obj Object to iterate over. + * @param {Function} iterator Iterator function. + * @param {Object=} context Object to become context (`this`) for the iterator function. + * @returns {Object|Array} Reference to `obj`. + */ + +function forEach(obj, iterator, context) { + var key, length; + if (obj) { + if (isFunction(obj)) { + for (key in obj) { + // Need to check if hasOwnProperty exists, + // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function + if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { + iterator.call(context, obj[key], key, obj); + } + } + } else if (isArray(obj) || isArrayLike(obj)) { + var isPrimitive = typeof obj !== 'object'; + for (key = 0, length = obj.length; key < length; key++) { + if (isPrimitive || key in obj) { + iterator.call(context, obj[key], key, obj); + } + } + } else if (obj.forEach && obj.forEach !== forEach) { + obj.forEach(iterator, context, obj); + } else if (isBlankObject(obj)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in obj) { + iterator.call(context, obj[key], key, obj); + } + } else if (typeof obj.hasOwnProperty === 'function') { + // Slow path for objects inheriting Object.prototype, hasOwnProperty check needed + for (key in obj) { + if (obj.hasOwnProperty(key)) { + iterator.call(context, obj[key], key, obj); + } + } + } else { + // Slow path for objects which do not have a method `hasOwnProperty` + for (key in obj) { + if (hasOwnProperty.call(obj, key)) { + iterator.call(context, obj[key], key, obj); + } + } + } + } + return obj; +} + +function forEachSorted(obj, iterator, context) { + var keys = Object.keys(obj).sort(); + for (var i = 0; i < keys.length; i++) { + iterator.call(context, obj[keys[i]], keys[i]); + } + return keys; +} + + +/** + * when using forEach the params are value, key, but it is often useful to have key, value. + * @param {function(string, *)} iteratorFn + * @returns {function(*, string)} + */ +function reverseParams(iteratorFn) { + return function(value, key) { iteratorFn(key, value); }; +} + +/** + * A consistent way of creating unique IDs in angular. + * + * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before + * we hit number precision issues in JavaScript. + * + * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M + * + * @returns {number} an unique alpha-numeric string + */ +function nextUid() { + return ++uid; +} + + +/** + * Set or clear the hashkey for an object. + * @param obj object + * @param h the hashkey (!truthy to delete the hashkey) + */ +function setHashKey(obj, h) { + if (h) { + obj.$$hashKey = h; + } else { + delete obj.$$hashKey; + } +} + + +function baseExtend(dst, objs, deep) { + var h = dst.$$hashKey; + + for (var i = 0, ii = objs.length; i < ii; ++i) { + var obj = objs[i]; + if (!isObject(obj) && !isFunction(obj)) continue; + var keys = Object.keys(obj); + for (var j = 0, jj = keys.length; j < jj; j++) { + var key = keys[j]; + var src = obj[key]; + + if (deep && isObject(src)) { + if (isDate(src)) { + dst[key] = new Date(src.valueOf()); + } else { + if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {}; + baseExtend(dst[key], [src], true); + } + } else { + dst[key] = src; + } + } + } + + setHashKey(dst, h); + return dst; +} + +/** + * @ngdoc function + * @name angular.extend + * @module ng + * @kind function + * + * @description + * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s) + * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so + * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`. + * + * **Note:** Keep in mind that `angular.extend` does not support recursive merge (deep copy). Use + * {@link angular.merge} for this. + * + * @param {Object} dst Destination object. + * @param {...Object} src Source object(s). + * @returns {Object} Reference to `dst`. + */ +function extend(dst) { + return baseExtend(dst, slice.call(arguments, 1), false); +} + + +/** +* @ngdoc function +* @name angular.merge +* @module ng +* @kind function +* +* @description +* Deeply extends the destination object `dst` by copying own enumerable properties from the `src` object(s) +* to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so +* by passing an empty object as the target: `var object = angular.merge({}, object1, object2)`. +* +* Unlike {@link angular.extend extend()}, `merge()` recursively descends into object properties of source +* objects, performing a deep copy. +* +* @param {Object} dst Destination object. +* @param {...Object} src Source object(s). +* @returns {Object} Reference to `dst`. +*/ +function merge(dst) { + return baseExtend(dst, slice.call(arguments, 1), true); +} + + + +function toInt(str) { + return parseInt(str, 10); +} + + +function inherit(parent, extra) { + return extend(Object.create(parent), extra); +} + +/** + * @ngdoc function + * @name angular.noop + * @module ng + * @kind function + * + * @description + * A function that performs no operations. This function can be useful when writing code in the + * functional style. + ```js + function foo(callback) { + var result = calculateResult(); + (callback || angular.noop)(result); + } + ``` + */ +function noop() {} +noop.$inject = []; + + +/** + * @ngdoc function + * @name angular.identity + * @module ng + * @kind function + * + * @description + * A function that returns its first argument. This function is useful when writing code in the + * functional style. + * + ```js + function transformer(transformationFn, value) { + return (transformationFn || angular.identity)(value); + }; + ``` + * @param {*} value to be returned. + * @returns {*} the value passed in. + */ +function identity($) {return $;} +identity.$inject = []; + + +function valueFn(value) {return function() {return value;};} + +function hasCustomToString(obj) { + return isFunction(obj.toString) && obj.toString !== Object.prototype.toString; +} + + +/** + * @ngdoc function + * @name angular.isUndefined + * @module ng + * @kind function + * + * @description + * Determines if a reference is undefined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is undefined. + */ +function isUndefined(value) {return typeof value === 'undefined';} + + +/** + * @ngdoc function + * @name angular.isDefined + * @module ng + * @kind function + * + * @description + * Determines if a reference is defined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is defined. + */ +function isDefined(value) {return typeof value !== 'undefined';} + + +/** + * @ngdoc function + * @name angular.isObject + * @module ng + * @kind function + * + * @description + * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not + * considered to be objects. Note that JavaScript arrays are objects. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Object` but not `null`. + */ +function isObject(value) { + // http://jsperf.com/isobject4 + return value !== null && typeof value === 'object'; +} + + +/** + * Determine if a value is an object with a null prototype + * + * @returns {boolean} True if `value` is an `Object` with a null prototype + */ +function isBlankObject(value) { + return value !== null && typeof value === 'object' && !getPrototypeOf(value); +} + + +/** + * @ngdoc function + * @name angular.isString + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `String`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `String`. + */ +function isString(value) {return typeof value === 'string';} + + +/** + * @ngdoc function + * @name angular.isNumber + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `Number`. + * + * This includes the "special" numbers `NaN`, `+Infinity` and `-Infinity`. + * + * If you wish to exclude these then you can use the native + * [`isFinite'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite) + * method. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Number`. + */ +function isNumber(value) {return typeof value === 'number';} + + +/** + * @ngdoc function + * @name angular.isDate + * @module ng + * @kind function + * + * @description + * Determines if a value is a date. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Date`. + */ +function isDate(value) { + return toString.call(value) === '[object Date]'; +} + + +/** + * @ngdoc function + * @name angular.isArray + * @module ng + * @kind function + * + * @description + * Determines if a reference is an `Array`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Array`. + */ +var isArray = Array.isArray; + +/** + * @ngdoc function + * @name angular.isFunction + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `Function`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Function`. + */ +function isFunction(value) {return typeof value === 'function';} + + +/** + * Determines if a value is a regular expression object. + * + * @private + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `RegExp`. + */ +function isRegExp(value) { + return toString.call(value) === '[object RegExp]'; +} + + +/** + * Checks if `obj` is a window object. + * + * @private + * @param {*} obj Object to check + * @returns {boolean} True if `obj` is a window obj. + */ +function isWindow(obj) { + return obj && obj.window === obj; +} + + +function isScope(obj) { + return obj && obj.$evalAsync && obj.$watch; +} + + +function isFile(obj) { + return toString.call(obj) === '[object File]'; +} + + +function isFormData(obj) { + return toString.call(obj) === '[object FormData]'; +} + + +function isBlob(obj) { + return toString.call(obj) === '[object Blob]'; +} + + +function isBoolean(value) { + return typeof value === 'boolean'; +} + + +function isPromiseLike(obj) { + return obj && isFunction(obj.then); +} + + +var TYPED_ARRAY_REGEXP = /^\[object (Uint8(Clamped)?)|(Uint16)|(Uint32)|(Int8)|(Int16)|(Int32)|(Float(32)|(64))Array\]$/; +function isTypedArray(value) { + return TYPED_ARRAY_REGEXP.test(toString.call(value)); +} + + +var trim = function(value) { + return isString(value) ? value.trim() : value; +}; + +// Copied from: +// http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021 +// Prereq: s is a string. +var escapeForRegexp = function(s) { + return s.replace(/([-()\[\]{}+?*.$\^|,:#= 0) { + array.splice(index, 1); + } + return index; +} + +/** + * @ngdoc function + * @name angular.copy + * @module ng + * @kind function + * + * @description + * Creates a deep copy of `source`, which should be an object or an array. + * + * * If no destination is supplied, a copy of the object or array is created. + * * If a destination is provided, all of its elements (for arrays) or properties (for objects) + * are deleted and then all elements/properties from the source are copied to it. + * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned. + * * If `source` is identical to 'destination' an exception will be thrown. + * + * @param {*} source The source that will be used to make a copy. + * Can be any type, including primitives, `null`, and `undefined`. + * @param {(Object|Array)=} destination Destination into which the source is copied. If + * provided, must be of the same type as `source`. + * @returns {*} The copy or updated `destination`, if `destination` was specified. + * + * @example + + +
    +
    + Name:
    + E-mail:
    + Gender: male + female
    + + +
    +
    form = {{user | json}}
    +
    master = {{master | json}}
    +
    + + +
    +
    + */ +function copy(source, destination, stackSource, stackDest) { + if (isWindow(source) || isScope(source)) { + throw ngMinErr('cpws', + "Can't copy! Making copies of Window or Scope instances is not supported."); + } + if (isTypedArray(destination)) { + throw ngMinErr('cpta', + "Can't copy! TypedArray destination cannot be mutated."); + } + + if (!destination) { + destination = source; + if (isObject(source)) { + var index; + if (stackSource && (index = stackSource.indexOf(source)) !== -1) { + return stackDest[index]; + } + + // TypedArray, Date and RegExp have specific copy functionality and must be + // pushed onto the stack before returning. + // Array and other objects create the base object and recurse to copy child + // objects. The array/object will be pushed onto the stack when recursed. + if (isArray(source)) { + return copy(source, [], stackSource, stackDest); + } else if (isTypedArray(source)) { + destination = new source.constructor(source); + } else if (isDate(source)) { + destination = new Date(source.getTime()); + } else if (isRegExp(source)) { + destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); + destination.lastIndex = source.lastIndex; + } else { + var emptyObject = Object.create(getPrototypeOf(source)); + return copy(source, emptyObject, stackSource, stackDest); + } + + if (stackDest) { + stackSource.push(source); + stackDest.push(destination); + } + } + } else { + if (source === destination) throw ngMinErr('cpi', + "Can't copy! Source and destination are identical."); + + stackSource = stackSource || []; + stackDest = stackDest || []; + + if (isObject(source)) { + stackSource.push(source); + stackDest.push(destination); + } + + var result, key; + if (isArray(source)) { + destination.length = 0; + for (var i = 0; i < source.length; i++) { + destination.push(copy(source[i], null, stackSource, stackDest)); + } + } else { + var h = destination.$$hashKey; + if (isArray(destination)) { + destination.length = 0; + } else { + forEach(destination, function(value, key) { + delete destination[key]; + }); + } + if (isBlankObject(source)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in source) { + destination[key] = copy(source[key], null, stackSource, stackDest); + } + } else if (source && typeof source.hasOwnProperty === 'function') { + // Slow path, which must rely on hasOwnProperty + for (key in source) { + if (source.hasOwnProperty(key)) { + destination[key] = copy(source[key], null, stackSource, stackDest); + } + } + } else { + // Slowest path --- hasOwnProperty can't be called as a method + for (key in source) { + if (hasOwnProperty.call(source, key)) { + destination[key] = copy(source[key], null, stackSource, stackDest); + } + } + } + setHashKey(destination,h); + } + } + return destination; +} + +/** + * Creates a shallow copy of an object, an array or a primitive. + * + * Assumes that there are no proto properties for objects. + */ +function shallowCopy(src, dst) { + if (isArray(src)) { + dst = dst || []; + + for (var i = 0, ii = src.length; i < ii; i++) { + dst[i] = src[i]; + } + } else if (isObject(src)) { + dst = dst || {}; + + for (var key in src) { + if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) { + dst[key] = src[key]; + } + } + } + + return dst || src; +} + + +/** + * @ngdoc function + * @name angular.equals + * @module ng + * @kind function + * + * @description + * Determines if two objects or two values are equivalent. Supports value types, regular + * expressions, arrays and objects. + * + * Two objects or values are considered equivalent if at least one of the following is true: + * + * * Both objects or values pass `===` comparison. + * * Both objects or values are of the same type and all of their properties are equal by + * comparing them with `angular.equals`. + * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal) + * * Both values represent the same regular expression (In JavaScript, + * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual + * representation matches). + * + * During a property comparison, properties of `function` type and properties with names + * that begin with `$` are ignored. + * + * Scope and DOMWindow objects are being compared only by identify (`===`). + * + * @param {*} o1 Object or value to compare. + * @param {*} o2 Object or value to compare. + * @returns {boolean} True if arguments are equal. + */ +function equals(o1, o2) { + if (o1 === o2) return true; + if (o1 === null || o2 === null) return false; + if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN + var t1 = typeof o1, t2 = typeof o2, length, key, keySet; + if (t1 == t2) { + if (t1 == 'object') { + if (isArray(o1)) { + if (!isArray(o2)) return false; + if ((length = o1.length) == o2.length) { + for (key = 0; key < length; key++) { + if (!equals(o1[key], o2[key])) return false; + } + return true; + } + } else if (isDate(o1)) { + if (!isDate(o2)) return false; + return equals(o1.getTime(), o2.getTime()); + } else if (isRegExp(o1)) { + return isRegExp(o2) ? o1.toString() == o2.toString() : false; + } else { + if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || + isArray(o2) || isDate(o2) || isRegExp(o2)) return false; + keySet = createMap(); + for (key in o1) { + if (key.charAt(0) === '$' || isFunction(o1[key])) continue; + if (!equals(o1[key], o2[key])) return false; + keySet[key] = true; + } + for (key in o2) { + if (!(key in keySet) && + key.charAt(0) !== '$' && + o2[key] !== undefined && + !isFunction(o2[key])) return false; + } + return true; + } + } + } + return false; +} + +var csp = function() { + if (isDefined(csp.isActive_)) return csp.isActive_; + + var active = !!(document.querySelector('[ng-csp]') || + document.querySelector('[data-ng-csp]')); + + if (!active) { + try { + /* jshint -W031, -W054 */ + new Function(''); + /* jshint +W031, +W054 */ + } catch (e) { + active = true; + } + } + + return (csp.isActive_ = active); +}; + +/** + * @ngdoc directive + * @module ng + * @name ngJq + * + * @element ANY + * @param {string=} ngJq the name of the library available under `window` + * to be used for angular.element + * @description + * Use this directive to force the angular.element library. This should be + * used to force either jqLite by leaving ng-jq blank or setting the name of + * the jquery variable under window (eg. jQuery). + * + * Since angular looks for this directive when it is loaded (doesn't wait for the + * DOMContentLoaded event), it must be placed on an element that comes before the script + * which loads angular. Also, only the first instance of `ng-jq` will be used and all + * others ignored. + * + * @example + * This example shows how to force jqLite using the `ngJq` directive to the `html` tag. + ```html + + + ... + ... + + ``` + * @example + * This example shows how to use a jQuery based library of a different name. + * The library name must be available at the top most 'window'. + ```html + + + ... + ... + + ``` + */ +var jq = function() { + if (isDefined(jq.name_)) return jq.name_; + var el; + var i, ii = ngAttrPrefixes.length, prefix, name; + for (i = 0; i < ii; ++i) { + prefix = ngAttrPrefixes[i]; + if (el = document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]')) { + name = el.getAttribute(prefix + 'jq'); + break; + } + } + + return (jq.name_ = name); +}; + +function concat(array1, array2, index) { + return array1.concat(slice.call(array2, index)); +} + +function sliceArgs(args, startIndex) { + return slice.call(args, startIndex || 0); +} + + +/* jshint -W101 */ +/** + * @ngdoc function + * @name angular.bind + * @module ng + * @kind function + * + * @description + * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for + * `fn`). You can supply optional `args` that are prebound to the function. This feature is also + * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as + * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application). + * + * @param {Object} self Context which `fn` should be evaluated in. + * @param {function()} fn Function to be bound. + * @param {...*} args Optional arguments to be prebound to the `fn` function call. + * @returns {function()} Function that wraps the `fn` with all the specified bindings. + */ +/* jshint +W101 */ +function bind(self, fn) { + var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : []; + if (isFunction(fn) && !(fn instanceof RegExp)) { + return curryArgs.length + ? function() { + return arguments.length + ? fn.apply(self, concat(curryArgs, arguments, 0)) + : fn.apply(self, curryArgs); + } + : function() { + return arguments.length + ? fn.apply(self, arguments) + : fn.call(self); + }; + } else { + // in IE, native methods are not functions so they cannot be bound (note: they don't need to be) + return fn; + } +} + + +function toJsonReplacer(key, value) { + var val = value; + + if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') { + val = undefined; + } else if (isWindow(value)) { + val = '$WINDOW'; + } else if (value && document === value) { + val = '$DOCUMENT'; + } else if (isScope(value)) { + val = '$SCOPE'; + } + + return val; +} + + +/** + * @ngdoc function + * @name angular.toJson + * @module ng + * @kind function + * + * @description + * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be + * stripped since angular uses this notation internally. + * + * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. + * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace. + * If set to an integer, the JSON output will contain that many spaces per indentation. + * @returns {string|undefined} JSON-ified string representing `obj`. + */ +function toJson(obj, pretty) { + if (typeof obj === 'undefined') return undefined; + if (!isNumber(pretty)) { + pretty = pretty ? 2 : null; + } + return JSON.stringify(obj, toJsonReplacer, pretty); +} + + +/** + * @ngdoc function + * @name angular.fromJson + * @module ng + * @kind function + * + * @description + * Deserializes a JSON string. + * + * @param {string} json JSON string to deserialize. + * @returns {Object|Array|string|number} Deserialized JSON string. + */ +function fromJson(json) { + return isString(json) + ? JSON.parse(json) + : json; +} + + +function timezoneToOffset(timezone, fallback) { + var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000; + return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset; +} + + +function addDateMinutes(date, minutes) { + date = new Date(date.getTime()); + date.setMinutes(date.getMinutes() + minutes); + return date; +} + + +function convertTimezoneToLocal(date, timezone, reverse) { + reverse = reverse ? -1 : 1; + var timezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset()); + return addDateMinutes(date, reverse * (timezoneOffset - date.getTimezoneOffset())); +} + + +/** + * @returns {string} Returns the string representation of the element. + */ +function startingTag(element) { + element = jqLite(element).clone(); + try { + // turns out IE does not let you set .html() on elements which + // are not allowed to have children. So we just ignore it. + element.empty(); + } catch (e) {} + var elemHtml = jqLite('
    ').append(element).html(); + try { + return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) : + elemHtml. + match(/^(<[^>]+>)/)[1]. + replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); }); + } catch (e) { + return lowercase(elemHtml); + } + +} + + +///////////////////////////////////////////////// + +/** + * Tries to decode the URI component without throwing an exception. + * + * @private + * @param str value potential URI component to check. + * @returns {boolean} True if `value` can be decoded + * with the decodeURIComponent function. + */ +function tryDecodeURIComponent(value) { + try { + return decodeURIComponent(value); + } catch (e) { + // Ignore any invalid uri component + } +} + + +/** + * Parses an escaped url query string into key-value pairs. + * @returns {Object.} + */ +function parseKeyValue(/**string*/keyValue) { + var obj = {}, key_value, key; + forEach((keyValue || "").split('&'), function(keyValue) { + if (keyValue) { + key_value = keyValue.replace(/\+/g,'%20').split('='); + key = tryDecodeURIComponent(key_value[0]); + if (isDefined(key)) { + var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true; + if (!hasOwnProperty.call(obj, key)) { + obj[key] = val; + } else if (isArray(obj[key])) { + obj[key].push(val); + } else { + obj[key] = [obj[key],val]; + } + } + } + }); + return obj; +} + +function toKeyValue(obj) { + var parts = []; + forEach(obj, function(value, key) { + if (isArray(value)) { + forEach(value, function(arrayValue) { + parts.push(encodeUriQuery(key, true) + + (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true))); + }); + } else { + parts.push(encodeUriQuery(key, true) + + (value === true ? '' : '=' + encodeUriQuery(value, true))); + } + }); + return parts.length ? parts.join('&') : ''; +} + + +/** + * We need our custom method because encodeURIComponent is too aggressive and doesn't follow + * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path + * segments: + * segment = *pchar + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * pct-encoded = "%" HEXDIG HEXDIG + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriSegment(val) { + return encodeUriQuery(val, true). + replace(/%26/gi, '&'). + replace(/%3D/gi, '='). + replace(/%2B/gi, '+'); +} + + +/** + * This method is intended for encoding *key* or *value* parts of query component. We need a custom + * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be + * encoded per http://tools.ietf.org/html/rfc3986: + * query = *( pchar / "/" / "?" ) + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * pct-encoded = "%" HEXDIG HEXDIG + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriQuery(val, pctEncodeSpaces) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%3B/gi, ';'). + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); +} + +var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-']; + +function getNgAttribute(element, ngAttr) { + var attr, i, ii = ngAttrPrefixes.length; + for (i = 0; i < ii; ++i) { + attr = ngAttrPrefixes[i] + ngAttr; + if (isString(attr = element.getAttribute(attr))) { + return attr; + } + } + return null; +} + +/** + * @ngdoc directive + * @name ngApp + * @module ng + * + * @element ANY + * @param {angular.Module} ngApp an optional application + * {@link angular.module module} name to load. + * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be + * created in "strict-di" mode. This means that the application will fail to invoke functions which + * do not use explicit function annotation (and are thus unsuitable for minification), as described + * in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in + * tracking down the root of these bugs. + * + * @description + * + * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive + * designates the **root element** of the application and is typically placed near the root element + * of the page - e.g. on the `` or `` tags. + * + * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp` + * found in the document will be used to define the root element to auto-bootstrap as an + * application. To run multiple applications in an HTML document you must manually bootstrap them using + * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other. + * + * You can specify an **AngularJS module** to be used as the root module for the application. This + * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It + * should contain the application code needed or have dependencies on other modules that will + * contain the code. See {@link angular.module} for more information. + * + * In the example below if the `ngApp` directive were not placed on the `html` element then the + * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}` + * would not be resolved to `3`. + * + * `ngApp` is the easiest, and most common way to bootstrap an application. + * + + +
    + I can add: {{a}} + {{b}} = {{ a+b }} +
    +
    + + angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) { + $scope.a = 1; + $scope.b = 2; + }); + +
    + * + * Using `ngStrictDi`, you would see something like this: + * + + +
    +
    + I can add: {{a}} + {{b}} = {{ a+b }} + +

    This renders because the controller does not fail to + instantiate, by using explicit annotation style (see + script.js for details) +

    +
    + +
    + Name:
    + Hello, {{name}}! + +

    This renders because the controller does not fail to + instantiate, by using explicit annotation style + (see script.js for details) +

    +
    + +
    + I can add: {{a}} + {{b}} = {{ a+b }} + +

    The controller could not be instantiated, due to relying + on automatic function annotations (which are disabled in + strict mode). As such, the content of this section is not + interpolated, and there should be an error in your web console. +

    +
    +
    +
    + + angular.module('ngAppStrictDemo', []) + // BadController will fail to instantiate, due to relying on automatic function annotation, + // rather than an explicit annotation + .controller('BadController', function($scope) { + $scope.a = 1; + $scope.b = 2; + }) + // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated, + // due to using explicit annotations using the array style and $inject property, respectively. + .controller('GoodController1', ['$scope', function($scope) { + $scope.a = 1; + $scope.b = 2; + }]) + .controller('GoodController2', GoodController2); + function GoodController2($scope) { + $scope.name = "World"; + } + GoodController2.$inject = ['$scope']; + + + div[ng-controller] { + margin-bottom: 1em; + -webkit-border-radius: 4px; + border-radius: 4px; + border: 1px solid; + padding: .5em; + } + div[ng-controller^=Good] { + border-color: #d6e9c6; + background-color: #dff0d8; + color: #3c763d; + } + div[ng-controller^=Bad] { + border-color: #ebccd1; + background-color: #f2dede; + color: #a94442; + margin-bottom: 0; + } + +
    + */ +function angularInit(element, bootstrap) { + var appElement, + module, + config = {}; + + // The element `element` has priority over any other element + forEach(ngAttrPrefixes, function(prefix) { + var name = prefix + 'app'; + + if (!appElement && element.hasAttribute && element.hasAttribute(name)) { + appElement = element; + module = element.getAttribute(name); + } + }); + forEach(ngAttrPrefixes, function(prefix) { + var name = prefix + 'app'; + var candidate; + + if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) { + appElement = candidate; + module = candidate.getAttribute(name); + } + }); + if (appElement) { + config.strictDi = getNgAttribute(appElement, "strict-di") !== null; + bootstrap(appElement, module ? [module] : [], config); + } +} + +/** + * @ngdoc function + * @name angular.bootstrap + * @module ng + * @description + * Use this function to manually start up angular application. + * + * See: {@link guide/bootstrap Bootstrap} + * + * Note that Protractor based end-to-end tests cannot use this function to bootstrap manually. + * They must use {@link ng.directive:ngApp ngApp}. + * + * Angular will detect if it has been loaded into the browser more than once and only allow the + * first loaded script to be bootstrapped and will report a warning to the browser console for + * each of the subsequent scripts. This prevents strange results in applications, where otherwise + * multiple instances of Angular try to work on the DOM. + * + * ```html + * + * + * + *
    + * {{greeting}} + *
    + * + * + * + * + * + * ``` + * + * @param {DOMElement} element DOM element which is the root of angular application. + * @param {Array=} modules an array of modules to load into the application. + * Each item in the array should be the name of a predefined module or a (DI annotated) + * function that will be invoked by the injector as a `config` block. + * See: {@link angular.module modules} + * @param {Object=} config an object for defining configuration options for the application. The + * following keys are supported: + * + * * `strictDi` - disable automatic function annotation for the application. This is meant to + * assist in finding bugs which break minified code. Defaults to `false`. + * + * @returns {auto.$injector} Returns the newly created injector for this app. + */ +function bootstrap(element, modules, config) { + if (!isObject(config)) config = {}; + var defaultConfig = { + strictDi: false + }; + config = extend(defaultConfig, config); + var doBootstrap = function() { + element = jqLite(element); + + if (element.injector()) { + var tag = (element[0] === document) ? 'document' : startingTag(element); + //Encode angle brackets to prevent input from being sanitized to empty string #8683 + throw ngMinErr( + 'btstrpd', + "App Already Bootstrapped with this Element '{0}'", + tag.replace(//,'>')); + } + + modules = modules || []; + modules.unshift(['$provide', function($provide) { + $provide.value('$rootElement', element); + }]); + + if (config.debugInfoEnabled) { + // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`. + modules.push(['$compileProvider', function($compileProvider) { + $compileProvider.debugInfoEnabled(true); + }]); + } + + modules.unshift('ng'); + var injector = createInjector(modules, config.strictDi); + injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', + function bootstrapApply(scope, element, compile, injector) { + scope.$apply(function() { + element.data('$injector', injector); + compile(element)(scope); + }); + }] + ); + return injector; + }; + + var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/; + var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; + + if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) { + config.debugInfoEnabled = true; + window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, ''); + } + + if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { + return doBootstrap(); + } + + window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ''); + angular.resumeBootstrap = function(extraModules) { + forEach(extraModules, function(module) { + modules.push(module); + }); + return doBootstrap(); + }; + + if (isFunction(angular.resumeDeferredBootstrap)) { + angular.resumeDeferredBootstrap(); + } +} + +/** + * @ngdoc function + * @name angular.reloadWithDebugInfo + * @module ng + * @description + * Use this function to reload the current application with debug information turned on. + * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`. + * + * See {@link ng.$compileProvider#debugInfoEnabled} for more. + */ +function reloadWithDebugInfo() { + window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name; + window.location.reload(); +} + +/** + * @name angular.getTestability + * @module ng + * @description + * Get the testability service for the instance of Angular on the given + * element. + * @param {DOMElement} element DOM element which is the root of angular application. + */ +function getTestability(rootElement) { + var injector = angular.element(rootElement).injector(); + if (!injector) { + throw ngMinErr('test', + 'no injector found for element argument to getTestability'); + } + return injector.get('$$testability'); +} + +var SNAKE_CASE_REGEXP = /[A-Z]/g; +function snake_case(name, separator) { + separator = separator || '_'; + return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); +} + +var bindJQueryFired = false; +var skipDestroyOnNextJQueryCleanData; +function bindJQuery() { + var originalCleanData; + + if (bindJQueryFired) { + return; + } + + // bind to jQuery if present; + var jqName = jq(); + jQuery = window.jQuery; // use default jQuery. + if (isDefined(jqName)) { // `ngJq` present + jQuery = jqName === null ? undefined : window[jqName]; // if empty; use jqLite. if not empty, use jQuery specified by `ngJq`. + } + + // Use jQuery if it exists with proper functionality, otherwise default to us. + // Angular 1.2+ requires jQuery 1.7+ for on()/off() support. + // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older + // versions. It will not work for sure with jQuery <1.7, though. + if (jQuery && jQuery.fn.on) { + jqLite = jQuery; + extend(jQuery.fn, { + scope: JQLitePrototype.scope, + isolateScope: JQLitePrototype.isolateScope, + controller: JQLitePrototype.controller, + injector: JQLitePrototype.injector, + inheritedData: JQLitePrototype.inheritedData + }); + + // All nodes removed from the DOM via various jQuery APIs like .remove() + // are passed through jQuery.cleanData. Monkey-patch this method to fire + // the $destroy event on all removed nodes. + originalCleanData = jQuery.cleanData; + jQuery.cleanData = function(elems) { + var events; + if (!skipDestroyOnNextJQueryCleanData) { + for (var i = 0, elem; (elem = elems[i]) != null; i++) { + events = jQuery._data(elem, "events"); + if (events && events.$destroy) { + jQuery(elem).triggerHandler('$destroy'); + } + } + } else { + skipDestroyOnNextJQueryCleanData = false; + } + originalCleanData(elems); + }; + } else { + jqLite = JQLite; + } + + angular.element = jqLite; + + // Prevent double-proxying. + bindJQueryFired = true; +} + +/** + * throw error if the argument is falsy. + */ +function assertArg(arg, name, reason) { + if (!arg) { + throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); + } + return arg; +} + +function assertArgFn(arg, name, acceptArrayAnnotation) { + if (acceptArrayAnnotation && isArray(arg)) { + arg = arg[arg.length - 1]; + } + + assertArg(isFunction(arg), name, 'not a function, got ' + + (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg)); + return arg; +} + +/** + * throw error if the name given is hasOwnProperty + * @param {String} name the name to test + * @param {String} context the context in which the name is used, such as module or directive + */ +function assertNotHasOwnProperty(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context); + } +} + +/** + * Return the value accessible from the object by path. Any undefined traversals are ignored + * @param {Object} obj starting object + * @param {String} path path to traverse + * @param {boolean} [bindFnToScope=true] + * @returns {Object} value as accessible by path + */ +//TODO(misko): this function needs to be removed +function getter(obj, path, bindFnToScope) { + if (!path) return obj; + var keys = path.split('.'); + var key; + var lastInstance = obj; + var len = keys.length; + + for (var i = 0; i < len; i++) { + key = keys[i]; + if (obj) { + obj = (lastInstance = obj)[key]; + } + } + if (!bindFnToScope && isFunction(obj)) { + return bind(lastInstance, obj); + } + return obj; +} + +/** + * Return the DOM siblings between the first and last node in the given array. + * @param {Array} array like object + * @returns {jqLite} jqLite collection containing the nodes + */ +function getBlockNodes(nodes) { + // TODO(perf): just check if all items in `nodes` are siblings and if they are return the original + // collection, otherwise update the original collection. + var node = nodes[0]; + var endNode = nodes[nodes.length - 1]; + var blockNodes = [node]; + + do { + node = node.nextSibling; + if (!node) break; + blockNodes.push(node); + } while (node !== endNode); + + return jqLite(blockNodes); +} + + +/** + * Creates a new object without a prototype. This object is useful for lookup without having to + * guard against prototypically inherited properties via hasOwnProperty. + * + * Related micro-benchmarks: + * - http://jsperf.com/object-create2 + * - http://jsperf.com/proto-map-lookup/2 + * - http://jsperf.com/for-in-vs-object-keys2 + * + * @returns {Object} + */ +function createMap() { + return Object.create(null); +} + +var NODE_TYPE_ELEMENT = 1; +var NODE_TYPE_ATTRIBUTE = 2; +var NODE_TYPE_TEXT = 3; +var NODE_TYPE_COMMENT = 8; +var NODE_TYPE_DOCUMENT = 9; +var NODE_TYPE_DOCUMENT_FRAGMENT = 11; + +/** + * @ngdoc type + * @name angular.Module + * @module ng + * @description + * + * Interface for configuring angular {@link angular.module modules}. + */ + +function setupModuleLoader(window) { + + var $injectorMinErr = minErr('$injector'); + var ngMinErr = minErr('ng'); + + function ensure(obj, name, factory) { + return obj[name] || (obj[name] = factory()); + } + + var angular = ensure(window, 'angular', Object); + + // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap + angular.$$minErr = angular.$$minErr || minErr; + + return ensure(angular, 'module', function() { + /** @type {Object.} */ + var modules = {}; + + /** + * @ngdoc function + * @name angular.module + * @module ng + * @description + * + * The `angular.module` is a global place for creating, registering and retrieving Angular + * modules. + * All modules (angular core or 3rd party) that should be available to an application must be + * registered using this mechanism. + * + * When passed two or more arguments, a new module is created. If passed only one argument, an + * existing module (the name passed as the first argument to `module`) is retrieved. + * + * + * # Module + * + * A module is a collection of services, directives, controllers, filters, and configuration information. + * `angular.module` is used to configure the {@link auto.$injector $injector}. + * + * ```js + * // Create a new module + * var myModule = angular.module('myModule', []); + * + * // register a new service + * myModule.value('appName', 'MyCoolApp'); + * + * // configure existing services inside initialization blocks. + * myModule.config(['$locationProvider', function($locationProvider) { + * // Configure existing providers + * $locationProvider.hashPrefix('!'); + * }]); + * ``` + * + * Then you can create an injector and load your modules like this: + * + * ```js + * var injector = angular.injector(['ng', 'myModule']) + * ``` + * + * However it's more likely that you'll just use + * {@link ng.directive:ngApp ngApp} or + * {@link angular.bootstrap} to simplify this process for you. + * + * @param {!string} name The name of the module to create or retrieve. + * @param {!Array.=} requires If specified then new module is being created. If + * unspecified then the module is being retrieved for further configuration. + * @param {Function=} configFn Optional configuration function for the module. Same as + * {@link angular.Module#config Module#config()}. + * @returns {module} new module with the {@link angular.Module} api. + */ + return function module(name, requires, configFn) { + var assertNotHasOwnProperty = function(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); + } + }; + + assertNotHasOwnProperty(name, 'module'); + if (requires && modules.hasOwnProperty(name)) { + modules[name] = null; + } + return ensure(modules, name, function() { + if (!requires) { + throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + + "the module name or forgot to load it. If registering a module ensure that you " + + "specify the dependencies as the second argument.", name); + } + + /** @type {!Array.>} */ + var invokeQueue = []; + + /** @type {!Array.} */ + var configBlocks = []; + + /** @type {!Array.} */ + var runBlocks = []; + + var config = invokeLater('$injector', 'invoke', 'push', configBlocks); + + /** @type {angular.Module} */ + var moduleInstance = { + // Private state + _invokeQueue: invokeQueue, + _configBlocks: configBlocks, + _runBlocks: runBlocks, + + /** + * @ngdoc property + * @name angular.Module#requires + * @module ng + * + * @description + * Holds the list of modules which the injector will load before the current module is + * loaded. + */ + requires: requires, + + /** + * @ngdoc property + * @name angular.Module#name + * @module ng + * + * @description + * Name of the module. + */ + name: name, + + + /** + * @ngdoc method + * @name angular.Module#provider + * @module ng + * @param {string} name service name + * @param {Function} providerType Construction function for creating new instance of the + * service. + * @description + * See {@link auto.$provide#provider $provide.provider()}. + */ + provider: invokeLaterAndSetModuleName('$provide', 'provider'), + + /** + * @ngdoc method + * @name angular.Module#factory + * @module ng + * @param {string} name service name + * @param {Function} providerFunction Function for creating new instance of the service. + * @description + * See {@link auto.$provide#factory $provide.factory()}. + */ + factory: invokeLaterAndSetModuleName('$provide', 'factory'), + + /** + * @ngdoc method + * @name angular.Module#service + * @module ng + * @param {string} name service name + * @param {Function} constructor A constructor function that will be instantiated. + * @description + * See {@link auto.$provide#service $provide.service()}. + */ + service: invokeLaterAndSetModuleName('$provide', 'service'), + + /** + * @ngdoc method + * @name angular.Module#value + * @module ng + * @param {string} name service name + * @param {*} object Service instance object. + * @description + * See {@link auto.$provide#value $provide.value()}. + */ + value: invokeLater('$provide', 'value'), + + /** + * @ngdoc method + * @name angular.Module#constant + * @module ng + * @param {string} name constant name + * @param {*} object Constant value. + * @description + * Because the constant are fixed, they get applied before other provide methods. + * See {@link auto.$provide#constant $provide.constant()}. + */ + constant: invokeLater('$provide', 'constant', 'unshift'), + + /** + * @ngdoc method + * @name angular.Module#decorator + * @module ng + * @param {string} The name of the service to decorate. + * @param {Function} This function will be invoked when the service needs to be + * instantiated and should return the decorated service instance. + * @description + * See {@link auto.$provide#decorator $provide.decorator()}. + */ + decorator: invokeLaterAndSetModuleName('$provide', 'decorator'), + + /** + * @ngdoc method + * @name angular.Module#animation + * @module ng + * @param {string} name animation name + * @param {Function} animationFactory Factory function for creating new instance of an + * animation. + * @description + * + * **NOTE**: animations take effect only if the **ngAnimate** module is loaded. + * + * + * Defines an animation hook that can be later used with + * {@link $animate $animate} service and directives that use this service. + * + * ```js + * module.animation('.animation-name', function($inject1, $inject2) { + * return { + * eventName : function(element, done) { + * //code to run the animation + * //once complete, then run done() + * return function cancellationFunction(element) { + * //code to cancel the animation + * } + * } + * } + * }) + * ``` + * + * See {@link ng.$animateProvider#register $animateProvider.register()} and + * {@link ngAnimate ngAnimate module} for more information. + */ + animation: invokeLaterAndSetModuleName('$animateProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#filter + * @module ng + * @param {string} name Filter name - this must be a valid angular expression identifier + * @param {Function} filterFactory Factory function for creating new instance of filter. + * @description + * See {@link ng.$filterProvider#register $filterProvider.register()}. + * + *
    + * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
    + */ + filter: invokeLaterAndSetModuleName('$filterProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#controller + * @module ng + * @param {string|Object} name Controller name, or an object map of controllers where the + * keys are the names and the values are the constructors. + * @param {Function} constructor Controller constructor function. + * @description + * See {@link ng.$controllerProvider#register $controllerProvider.register()}. + */ + controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#directive + * @module ng + * @param {string|Object} name Directive name, or an object map of directives where the + * keys are the names and the values are the factories. + * @param {Function} directiveFactory Factory function for creating new instance of + * directives. + * @description + * See {@link ng.$compileProvider#directive $compileProvider.directive()}. + */ + directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'), + + /** + * @ngdoc method + * @name angular.Module#config + * @module ng + * @param {Function} configFn Execute this function on module load. Useful for service + * configuration. + * @description + * Use this method to register work which needs to be performed on module loading. + * For more about how to configure services, see + * {@link providers#provider-recipe Provider Recipe}. + */ + config: config, + + /** + * @ngdoc method + * @name angular.Module#run + * @module ng + * @param {Function} initializationFn Execute this function after injector creation. + * Useful for application initialization. + * @description + * Use this method to register work which should be performed when the injector is done + * loading all modules. + */ + run: function(block) { + runBlocks.push(block); + return this; + } + }; + + if (configFn) { + config(configFn); + } + + return moduleInstance; + + /** + * @param {string} provider + * @param {string} method + * @param {String=} insertMethod + * @returns {angular.Module} + */ + function invokeLater(provider, method, insertMethod, queue) { + if (!queue) queue = invokeQueue; + return function() { + queue[insertMethod || 'push']([provider, method, arguments]); + return moduleInstance; + }; + } + + /** + * @param {string} provider + * @param {string} method + * @returns {angular.Module} + */ + function invokeLaterAndSetModuleName(provider, method) { + return function(recipeName, factoryFunction) { + if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name; + invokeQueue.push([provider, method, arguments]); + return moduleInstance; + }; + } + }); + }; + }); + +} + +/* global: toDebugString: true */ + +function serializeObject(obj) { + var seen = []; + + return JSON.stringify(obj, function(key, val) { + val = toJsonReplacer(key, val); + if (isObject(val)) { + + if (seen.indexOf(val) >= 0) return '<>'; + + seen.push(val); + } + return val; + }); +} + +function toDebugString(obj) { + if (typeof obj === 'function') { + return obj.toString().replace(/ \{[\s\S]*$/, ''); + } else if (typeof obj === 'undefined') { + return 'undefined'; + } else if (typeof obj !== 'string') { + return serializeObject(obj); + } + return obj; +} + +/* global angularModule: true, + version: true, + + $LocaleProvider, + $CompileProvider, + + htmlAnchorDirective, + inputDirective, + inputDirective, + formDirective, + scriptDirective, + selectDirective, + styleDirective, + optionDirective, + ngBindDirective, + ngBindHtmlDirective, + ngBindTemplateDirective, + ngClassDirective, + ngClassEvenDirective, + ngClassOddDirective, + ngCspDirective, + ngCloakDirective, + ngControllerDirective, + ngFormDirective, + ngHideDirective, + ngIfDirective, + ngIncludeDirective, + ngIncludeFillContentDirective, + ngInitDirective, + ngNonBindableDirective, + ngPluralizeDirective, + ngRepeatDirective, + ngShowDirective, + ngStyleDirective, + ngSwitchDirective, + ngSwitchWhenDirective, + ngSwitchDefaultDirective, + ngOptionsDirective, + ngTranscludeDirective, + ngModelDirective, + ngListDirective, + ngChangeDirective, + patternDirective, + patternDirective, + requiredDirective, + requiredDirective, + minlengthDirective, + minlengthDirective, + maxlengthDirective, + maxlengthDirective, + ngValueDirective, + ngModelOptionsDirective, + ngAttributeAliasDirectives, + ngEventDirectives, + + $AnchorScrollProvider, + $AnimateProvider, + $$CoreAnimateQueueProvider, + $$CoreAnimateRunnerProvider, + $BrowserProvider, + $CacheFactoryProvider, + $ControllerProvider, + $DocumentProvider, + $ExceptionHandlerProvider, + $FilterProvider, + $InterpolateProvider, + $IntervalProvider, + $$HashMapProvider, + $HttpProvider, + $HttpParamSerializerProvider, + $HttpParamSerializerJQLikeProvider, + $HttpBackendProvider, + $LocationProvider, + $LogProvider, + $ParseProvider, + $RootScopeProvider, + $QProvider, + $$QProvider, + $$SanitizeUriProvider, + $SceProvider, + $SceDelegateProvider, + $SnifferProvider, + $TemplateCacheProvider, + $TemplateRequestProvider, + $$TestabilityProvider, + $TimeoutProvider, + $$RAFProvider, + $WindowProvider, + $$jqLiteProvider, + $$CookieReaderProvider +*/ + + +/** + * @ngdoc object + * @name angular.version + * @module ng + * @description + * An object that contains information about the current AngularJS version. This object has the + * following properties: + * + * - `full` – `{string}` – Full version string, such as "0.9.18". + * - `major` – `{number}` – Major version number, such as "0". + * - `minor` – `{number}` – Minor version number, such as "9". + * - `dot` – `{number}` – Dot version number, such as "18". + * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". + */ +var version = { + full: '1.4.3', // all of these placeholder strings will be replaced by grunt's + major: 1, // package task + minor: 4, + dot: 3, + codeName: 'foam-acceleration' +}; + + +function publishExternalAPI(angular) { + extend(angular, { + 'bootstrap': bootstrap, + 'copy': copy, + 'extend': extend, + 'merge': merge, + 'equals': equals, + 'element': jqLite, + 'forEach': forEach, + 'injector': createInjector, + 'noop': noop, + 'bind': bind, + 'toJson': toJson, + 'fromJson': fromJson, + 'identity': identity, + 'isUndefined': isUndefined, + 'isDefined': isDefined, + 'isString': isString, + 'isFunction': isFunction, + 'isObject': isObject, + 'isNumber': isNumber, + 'isElement': isElement, + 'isArray': isArray, + 'version': version, + 'isDate': isDate, + 'lowercase': lowercase, + 'uppercase': uppercase, + 'callbacks': {counter: 0}, + 'getTestability': getTestability, + '$$minErr': minErr, + '$$csp': csp, + 'reloadWithDebugInfo': reloadWithDebugInfo + }); + + angularModule = setupModuleLoader(window); + try { + angularModule('ngLocale'); + } catch (e) { + angularModule('ngLocale', []).provider('$locale', $LocaleProvider); + } + + angularModule('ng', ['ngLocale'], ['$provide', + function ngModule($provide) { + // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it. + $provide.provider({ + $$sanitizeUri: $$SanitizeUriProvider + }); + $provide.provider('$compile', $CompileProvider). + directive({ + a: htmlAnchorDirective, + input: inputDirective, + textarea: inputDirective, + form: formDirective, + script: scriptDirective, + select: selectDirective, + style: styleDirective, + option: optionDirective, + ngBind: ngBindDirective, + ngBindHtml: ngBindHtmlDirective, + ngBindTemplate: ngBindTemplateDirective, + ngClass: ngClassDirective, + ngClassEven: ngClassEvenDirective, + ngClassOdd: ngClassOddDirective, + ngCloak: ngCloakDirective, + ngController: ngControllerDirective, + ngForm: ngFormDirective, + ngHide: ngHideDirective, + ngIf: ngIfDirective, + ngInclude: ngIncludeDirective, + ngInit: ngInitDirective, + ngNonBindable: ngNonBindableDirective, + ngPluralize: ngPluralizeDirective, + ngRepeat: ngRepeatDirective, + ngShow: ngShowDirective, + ngStyle: ngStyleDirective, + ngSwitch: ngSwitchDirective, + ngSwitchWhen: ngSwitchWhenDirective, + ngSwitchDefault: ngSwitchDefaultDirective, + ngOptions: ngOptionsDirective, + ngTransclude: ngTranscludeDirective, + ngModel: ngModelDirective, + ngList: ngListDirective, + ngChange: ngChangeDirective, + pattern: patternDirective, + ngPattern: patternDirective, + required: requiredDirective, + ngRequired: requiredDirective, + minlength: minlengthDirective, + ngMinlength: minlengthDirective, + maxlength: maxlengthDirective, + ngMaxlength: maxlengthDirective, + ngValue: ngValueDirective, + ngModelOptions: ngModelOptionsDirective + }). + directive({ + ngInclude: ngIncludeFillContentDirective + }). + directive(ngAttributeAliasDirectives). + directive(ngEventDirectives); + $provide.provider({ + $anchorScroll: $AnchorScrollProvider, + $animate: $AnimateProvider, + $$animateQueue: $$CoreAnimateQueueProvider, + $$AnimateRunner: $$CoreAnimateRunnerProvider, + $browser: $BrowserProvider, + $cacheFactory: $CacheFactoryProvider, + $controller: $ControllerProvider, + $document: $DocumentProvider, + $exceptionHandler: $ExceptionHandlerProvider, + $filter: $FilterProvider, + $interpolate: $InterpolateProvider, + $interval: $IntervalProvider, + $http: $HttpProvider, + $httpParamSerializer: $HttpParamSerializerProvider, + $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider, + $httpBackend: $HttpBackendProvider, + $location: $LocationProvider, + $log: $LogProvider, + $parse: $ParseProvider, + $rootScope: $RootScopeProvider, + $q: $QProvider, + $$q: $$QProvider, + $sce: $SceProvider, + $sceDelegate: $SceDelegateProvider, + $sniffer: $SnifferProvider, + $templateCache: $TemplateCacheProvider, + $templateRequest: $TemplateRequestProvider, + $$testability: $$TestabilityProvider, + $timeout: $TimeoutProvider, + $window: $WindowProvider, + $$rAF: $$RAFProvider, + $$jqLite: $$jqLiteProvider, + $$HashMap: $$HashMapProvider, + $$cookieReader: $$CookieReaderProvider + }); + } + ]); +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* global JQLitePrototype: true, + addEventListenerFn: true, + removeEventListenerFn: true, + BOOLEAN_ATTR: true, + ALIASED_ATTR: true, +*/ + +////////////////////////////////// +//JQLite +////////////////////////////////// + +/** + * @ngdoc function + * @name angular.element + * @module ng + * @kind function + * + * @description + * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. + * + * If jQuery is available, `angular.element` is an alias for the + * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element` + * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite." + * + *
    jqLite is a tiny, API-compatible subset of jQuery that allows + * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most + * commonly needed functionality with the goal of having a very small footprint.
    + * + * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. + * + *
    **Note:** all element references in Angular are always wrapped with jQuery or + * jqLite; they are never raw DOM references.
    + * + * ## Angular's jqLite + * jqLite provides only the following jQuery methods: + * + * - [`addClass()`](http://api.jquery.com/addClass/) + * - [`after()`](http://api.jquery.com/after/) + * - [`append()`](http://api.jquery.com/append/) + * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters + * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData + * - [`children()`](http://api.jquery.com/children/) - Does not support selectors + * - [`clone()`](http://api.jquery.com/clone/) + * - [`contents()`](http://api.jquery.com/contents/) + * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`. As a setter, does not convert numbers to strings or append 'px'. + * - [`data()`](http://api.jquery.com/data/) + * - [`detach()`](http://api.jquery.com/detach/) + * - [`empty()`](http://api.jquery.com/empty/) + * - [`eq()`](http://api.jquery.com/eq/) + * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name + * - [`hasClass()`](http://api.jquery.com/hasClass/) + * - [`html()`](http://api.jquery.com/html/) + * - [`next()`](http://api.jquery.com/next/) - Does not support selectors + * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData + * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors + * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors + * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors + * - [`prepend()`](http://api.jquery.com/prepend/) + * - [`prop()`](http://api.jquery.com/prop/) + * - [`ready()`](http://api.jquery.com/ready/) + * - [`remove()`](http://api.jquery.com/remove/) + * - [`removeAttr()`](http://api.jquery.com/removeAttr/) + * - [`removeClass()`](http://api.jquery.com/removeClass/) + * - [`removeData()`](http://api.jquery.com/removeData/) + * - [`replaceWith()`](http://api.jquery.com/replaceWith/) + * - [`text()`](http://api.jquery.com/text/) + * - [`toggleClass()`](http://api.jquery.com/toggleClass/) + * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers. + * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces + * - [`val()`](http://api.jquery.com/val/) + * - [`wrap()`](http://api.jquery.com/wrap/) + * + * ## jQuery/jqLite Extras + * Angular also provides the following additional methods and events to both jQuery and jqLite: + * + * ### Events + * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event + * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM + * element before it is removed. + * + * ### Methods + * - `controller(name)` - retrieves the controller of the current element or its parent. By default + * retrieves controller associated with the `ngController` directive. If `name` is provided as + * camelCase directive name, then the controller for this directive will be retrieved (e.g. + * `'ngModel'`). + * - `injector()` - retrieves the injector of the current element or its parent. + * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current + * element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to + * be enabled. + * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the + * current element. This getter should be used only on elements that contain a directive which starts a new isolate + * scope. Calling `scope()` on this element always returns the original non-isolate scope. + * Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled. + * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top + * parent element is reached. + * + * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. + * @returns {Object} jQuery object. + */ + +JQLite.expando = 'ng339'; + +var jqCache = JQLite.cache = {}, + jqId = 1, + addEventListenerFn = function(element, type, fn) { + element.addEventListener(type, fn, false); + }, + removeEventListenerFn = function(element, type, fn) { + element.removeEventListener(type, fn, false); + }; + +/* + * !!! This is an undocumented "private" function !!! + */ +JQLite._data = function(node) { + //jQuery always returns an object on cache miss + return this.cache[node[this.expando]] || {}; +}; + +function jqNextId() { return ++jqId; } + + +var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; +var MOZ_HACK_REGEXP = /^moz([A-Z])/; +var MOUSE_EVENT_MAP= { mouseleave: "mouseout", mouseenter: "mouseover"}; +var jqLiteMinErr = minErr('jqLite'); + +/** + * Converts snake_case to camelCase. + * Also there is special case for Moz prefix starting with upper case letter. + * @param name Name to normalize + */ +function camelCase(name) { + return name. + replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { + return offset ? letter.toUpperCase() : letter; + }). + replace(MOZ_HACK_REGEXP, 'Moz$1'); +} + +var SINGLE_TAG_REGEXP = /^<(\w+)\s*\/?>(?:<\/\1>|)$/; +var HTML_REGEXP = /<|&#?\w+;/; +var TAG_NAME_REGEXP = /<([\w:]+)/; +var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi; + +var wrapMap = { + 'option': [1, ''], + + 'thead': [1, '', '
    '], + 'col': [2, '', '
    '], + 'tr': [2, '', '
    '], + 'td': [3, '', '
    '], + '_default': [0, "", ""] +}; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function jqLiteIsTextNode(html) { + return !HTML_REGEXP.test(html); +} + +function jqLiteAcceptsData(node) { + // The window object can accept data but has no nodeType + // Otherwise we are only interested in elements (1) and documents (9) + var nodeType = node.nodeType; + return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT; +} + +function jqLiteHasData(node) { + for (var key in jqCache[node.ng339]) { + return true; + } + return false; +} + +function jqLiteBuildFragment(html, context) { + var tmp, tag, wrap, + fragment = context.createDocumentFragment(), + nodes = [], i; + + if (jqLiteIsTextNode(html)) { + // Convert non-html into a text node + nodes.push(context.createTextNode(html)); + } else { + // Convert html into DOM nodes + tmp = tmp || fragment.appendChild(context.createElement("div")); + tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); + wrap = wrapMap[tag] || wrapMap._default; + tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1>") + wrap[2]; + + // Descend through wrappers to the right content + i = wrap[0]; + while (i--) { + tmp = tmp.lastChild; + } + + nodes = concat(nodes, tmp.childNodes); + + tmp = fragment.firstChild; + tmp.textContent = ""; + } + + // Remove wrapper from fragment + fragment.textContent = ""; + fragment.innerHTML = ""; // Clear inner HTML + forEach(nodes, function(node) { + fragment.appendChild(node); + }); + + return fragment; +} + +function jqLiteParseHTML(html, context) { + context = context || document; + var parsed; + + if ((parsed = SINGLE_TAG_REGEXP.exec(html))) { + return [context.createElement(parsed[1])]; + } + + if ((parsed = jqLiteBuildFragment(html, context))) { + return parsed.childNodes; + } + + return []; +} + +///////////////////////////////////////////// +function JQLite(element) { + if (element instanceof JQLite) { + return element; + } + + var argIsString; + + if (isString(element)) { + element = trim(element); + argIsString = true; + } + if (!(this instanceof JQLite)) { + if (argIsString && element.charAt(0) != '<') { + throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element'); + } + return new JQLite(element); + } + + if (argIsString) { + jqLiteAddNodes(this, jqLiteParseHTML(element)); + } else { + jqLiteAddNodes(this, element); + } +} + +function jqLiteClone(element) { + return element.cloneNode(true); +} + +function jqLiteDealoc(element, onlyDescendants) { + if (!onlyDescendants) jqLiteRemoveData(element); + + if (element.querySelectorAll) { + var descendants = element.querySelectorAll('*'); + for (var i = 0, l = descendants.length; i < l; i++) { + jqLiteRemoveData(descendants[i]); + } + } +} + +function jqLiteOff(element, type, fn, unsupported) { + if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument'); + + var expandoStore = jqLiteExpandoStore(element); + var events = expandoStore && expandoStore.events; + var handle = expandoStore && expandoStore.handle; + + if (!handle) return; //no listeners registered + + if (!type) { + for (type in events) { + if (type !== '$destroy') { + removeEventListenerFn(element, type, handle); + } + delete events[type]; + } + } else { + forEach(type.split(' '), function(type) { + if (isDefined(fn)) { + var listenerFns = events[type]; + arrayRemove(listenerFns || [], fn); + if (listenerFns && listenerFns.length > 0) { + return; + } + } + + removeEventListenerFn(element, type, handle); + delete events[type]; + }); + } +} + +function jqLiteRemoveData(element, name) { + var expandoId = element.ng339; + var expandoStore = expandoId && jqCache[expandoId]; + + if (expandoStore) { + if (name) { + delete expandoStore.data[name]; + return; + } + + if (expandoStore.handle) { + if (expandoStore.events.$destroy) { + expandoStore.handle({}, '$destroy'); + } + jqLiteOff(element); + } + delete jqCache[expandoId]; + element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it + } +} + + +function jqLiteExpandoStore(element, createIfNecessary) { + var expandoId = element.ng339, + expandoStore = expandoId && jqCache[expandoId]; + + if (createIfNecessary && !expandoStore) { + element.ng339 = expandoId = jqNextId(); + expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined}; + } + + return expandoStore; +} + + +function jqLiteData(element, key, value) { + if (jqLiteAcceptsData(element)) { + + var isSimpleSetter = isDefined(value); + var isSimpleGetter = !isSimpleSetter && key && !isObject(key); + var massGetter = !key; + var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter); + var data = expandoStore && expandoStore.data; + + if (isSimpleSetter) { // data('key', value) + data[key] = value; + } else { + if (massGetter) { // data() + return data; + } else { + if (isSimpleGetter) { // data('key') + // don't force creation of expandoStore if it doesn't exist yet + return data && data[key]; + } else { // mass-setter: data({key1: val1, key2: val2}) + extend(data, key); + } + } + } + } +} + +function jqLiteHasClass(element, selector) { + if (!element.getAttribute) return false; + return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). + indexOf(" " + selector + " ") > -1); +} + +function jqLiteRemoveClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + forEach(cssClasses.split(' '), function(cssClass) { + element.setAttribute('class', trim( + (" " + (element.getAttribute('class') || '') + " ") + .replace(/[\n\t]/g, " ") + .replace(" " + trim(cssClass) + " ", " ")) + ); + }); + } +} + +function jqLiteAddClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') + .replace(/[\n\t]/g, " "); + + forEach(cssClasses.split(' '), function(cssClass) { + cssClass = trim(cssClass); + if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) { + existingClasses += cssClass + ' '; + } + }); + + element.setAttribute('class', trim(existingClasses)); + } +} + + +function jqLiteAddNodes(root, elements) { + // THIS CODE IS VERY HOT. Don't make changes without benchmarking. + + if (elements) { + + // if a Node (the most common case) + if (elements.nodeType) { + root[root.length++] = elements; + } else { + var length = elements.length; + + // if an Array or NodeList and not a Window + if (typeof length === 'number' && elements.window !== elements) { + if (length) { + for (var i = 0; i < length; i++) { + root[root.length++] = elements[i]; + } + } + } else { + root[root.length++] = elements; + } + } + } +} + + +function jqLiteController(element, name) { + return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller'); +} + +function jqLiteInheritedData(element, name, value) { + // if element is the document object work with the html element instead + // this makes $(document).scope() possible + if (element.nodeType == NODE_TYPE_DOCUMENT) { + element = element.documentElement; + } + var names = isArray(name) ? name : [name]; + + while (element) { + for (var i = 0, ii = names.length; i < ii; i++) { + if ((value = jqLite.data(element, names[i])) !== undefined) return value; + } + + // If dealing with a document fragment node with a host element, and no parent, use the host + // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM + // to lookup parent controllers. + element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host); + } +} + +function jqLiteEmpty(element) { + jqLiteDealoc(element, true); + while (element.firstChild) { + element.removeChild(element.firstChild); + } +} + +function jqLiteRemove(element, keepData) { + if (!keepData) jqLiteDealoc(element); + var parent = element.parentNode; + if (parent) parent.removeChild(element); +} + + +function jqLiteDocumentLoaded(action, win) { + win = win || window; + if (win.document.readyState === 'complete') { + // Force the action to be run async for consistent behaviour + // from the action's point of view + // i.e. it will definitely not be in a $apply + win.setTimeout(action); + } else { + // No need to unbind this handler as load is only ever called once + jqLite(win).on('load', action); + } +} + +////////////////////////////////////////// +// Functions which are declared directly. +////////////////////////////////////////// +var JQLitePrototype = JQLite.prototype = { + ready: function(fn) { + var fired = false; + + function trigger() { + if (fired) return; + fired = true; + fn(); + } + + // check if document is already loaded + if (document.readyState === 'complete') { + setTimeout(trigger); + } else { + this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 + // we can not use jqLite since we are not done loading and jQuery could be loaded later. + // jshint -W064 + JQLite(window).on('load', trigger); // fallback to window.onload for others + // jshint +W064 + } + }, + toString: function() { + var value = []; + forEach(this, function(e) { value.push('' + e);}); + return '[' + value.join(', ') + ']'; + }, + + eq: function(index) { + return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); + }, + + length: 0, + push: push, + sort: [].sort, + splice: [].splice +}; + +////////////////////////////////////////// +// Functions iterating getter/setters. +// these functions return self on setter and +// value on get. +////////////////////////////////////////// +var BOOLEAN_ATTR = {}; +forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) { + BOOLEAN_ATTR[lowercase(value)] = value; +}); +var BOOLEAN_ELEMENTS = {}; +forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { + BOOLEAN_ELEMENTS[value] = true; +}); +var ALIASED_ATTR = { + 'ngMinlength': 'minlength', + 'ngMaxlength': 'maxlength', + 'ngMin': 'min', + 'ngMax': 'max', + 'ngPattern': 'pattern' +}; + +function getBooleanAttrName(element, name) { + // check dom last since we will most likely fail on name + var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; + + // booleanAttr is here twice to minimize DOM access + return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr; +} + +function getAliasedAttrName(element, name) { + var nodeName = element.nodeName; + return (nodeName === 'INPUT' || nodeName === 'TEXTAREA') && ALIASED_ATTR[name]; +} + +forEach({ + data: jqLiteData, + removeData: jqLiteRemoveData, + hasData: jqLiteHasData +}, function(fn, name) { + JQLite[name] = fn; +}); + +forEach({ + data: jqLiteData, + inheritedData: jqLiteInheritedData, + + scope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']); + }, + + isolateScope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate'); + }, + + controller: jqLiteController, + + injector: function(element) { + return jqLiteInheritedData(element, '$injector'); + }, + + removeAttr: function(element, name) { + element.removeAttribute(name); + }, + + hasClass: jqLiteHasClass, + + css: function(element, name, value) { + name = camelCase(name); + + if (isDefined(value)) { + element.style[name] = value; + } else { + return element.style[name]; + } + }, + + attr: function(element, name, value) { + var nodeType = element.nodeType; + if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT) { + return; + } + var lowercasedName = lowercase(name); + if (BOOLEAN_ATTR[lowercasedName]) { + if (isDefined(value)) { + if (!!value) { + element[name] = true; + element.setAttribute(name, lowercasedName); + } else { + element[name] = false; + element.removeAttribute(lowercasedName); + } + } else { + return (element[name] || + (element.attributes.getNamedItem(name) || noop).specified) + ? lowercasedName + : undefined; + } + } else if (isDefined(value)) { + element.setAttribute(name, value); + } else if (element.getAttribute) { + // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code + // some elements (e.g. Document) don't have get attribute, so return undefined + var ret = element.getAttribute(name, 2); + // normalize non-existing attributes to undefined (as jQuery) + return ret === null ? undefined : ret; + } + }, + + prop: function(element, name, value) { + if (isDefined(value)) { + element[name] = value; + } else { + return element[name]; + } + }, + + text: (function() { + getText.$dv = ''; + return getText; + + function getText(element, value) { + if (isUndefined(value)) { + var nodeType = element.nodeType; + return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : ''; + } + element.textContent = value; + } + })(), + + val: function(element, value) { + if (isUndefined(value)) { + if (element.multiple && nodeName_(element) === 'select') { + var result = []; + forEach(element.options, function(option) { + if (option.selected) { + result.push(option.value || option.text); + } + }); + return result.length === 0 ? null : result; + } + return element.value; + } + element.value = value; + }, + + html: function(element, value) { + if (isUndefined(value)) { + return element.innerHTML; + } + jqLiteDealoc(element, true); + element.innerHTML = value; + }, + + empty: jqLiteEmpty +}, function(fn, name) { + /** + * Properties: writes return selection, reads return first value + */ + JQLite.prototype[name] = function(arg1, arg2) { + var i, key; + var nodeCount = this.length; + + // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it + // in a way that survives minification. + // jqLiteEmpty takes no arguments but is a setter. + if (fn !== jqLiteEmpty && + (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) { + if (isObject(arg1)) { + + // we are a write, but the object properties are the key/values + for (i = 0; i < nodeCount; i++) { + if (fn === jqLiteData) { + // data() takes the whole object in jQuery + fn(this[i], arg1); + } else { + for (key in arg1) { + fn(this[i], key, arg1[key]); + } + } + } + // return self for chaining + return this; + } else { + // we are a read, so read the first child. + // TODO: do we still need this? + var value = fn.$dv; + // Only if we have $dv do we iterate over all, otherwise it is just the first element. + var jj = (value === undefined) ? Math.min(nodeCount, 1) : nodeCount; + for (var j = 0; j < jj; j++) { + var nodeValue = fn(this[j], arg1, arg2); + value = value ? value + nodeValue : nodeValue; + } + return value; + } + } else { + // we are a write, so apply to all children + for (i = 0; i < nodeCount; i++) { + fn(this[i], arg1, arg2); + } + // return self for chaining + return this; + } + }; +}); + +function createEventHandler(element, events) { + var eventHandler = function(event, type) { + // jQuery specific api + event.isDefaultPrevented = function() { + return event.defaultPrevented; + }; + + var eventFns = events[type || event.type]; + var eventFnsLength = eventFns ? eventFns.length : 0; + + if (!eventFnsLength) return; + + if (isUndefined(event.immediatePropagationStopped)) { + var originalStopImmediatePropagation = event.stopImmediatePropagation; + event.stopImmediatePropagation = function() { + event.immediatePropagationStopped = true; + + if (event.stopPropagation) { + event.stopPropagation(); + } + + if (originalStopImmediatePropagation) { + originalStopImmediatePropagation.call(event); + } + }; + } + + event.isImmediatePropagationStopped = function() { + return event.immediatePropagationStopped === true; + }; + + // Copy event handlers in case event handlers array is modified during execution. + if ((eventFnsLength > 1)) { + eventFns = shallowCopy(eventFns); + } + + for (var i = 0; i < eventFnsLength; i++) { + if (!event.isImmediatePropagationStopped()) { + eventFns[i].call(element, event); + } + } + }; + + // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all + // events on `element` + eventHandler.elem = element; + return eventHandler; +} + +////////////////////////////////////////// +// Functions iterating traversal. +// These functions chain results into a single +// selector. +////////////////////////////////////////// +forEach({ + removeData: jqLiteRemoveData, + + on: function jqLiteOn(element, type, fn, unsupported) { + if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters'); + + // Do not add event handlers to non-elements because they will not be cleaned up. + if (!jqLiteAcceptsData(element)) { + return; + } + + var expandoStore = jqLiteExpandoStore(element, true); + var events = expandoStore.events; + var handle = expandoStore.handle; + + if (!handle) { + handle = expandoStore.handle = createEventHandler(element, events); + } + + // http://jsperf.com/string-indexof-vs-split + var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type]; + var i = types.length; + + while (i--) { + type = types[i]; + var eventFns = events[type]; + + if (!eventFns) { + events[type] = []; + + if (type === 'mouseenter' || type === 'mouseleave') { + // Refer to jQuery's implementation of mouseenter & mouseleave + // Read about mouseenter and mouseleave: + // http://www.quirksmode.org/js/events_mouse.html#link8 + + jqLiteOn(element, MOUSE_EVENT_MAP[type], function(event) { + var target = this, related = event.relatedTarget; + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if (!related || (related !== target && !target.contains(related))) { + handle(event, type); + } + }); + + } else { + if (type !== '$destroy') { + addEventListenerFn(element, type, handle); + } + } + eventFns = events[type]; + } + eventFns.push(fn); + } + }, + + off: jqLiteOff, + + one: function(element, type, fn) { + element = jqLite(element); + + //add the listener twice so that when it is called + //you can remove the original function and still be + //able to call element.off(ev, fn) normally + element.on(type, function onFn() { + element.off(type, fn); + element.off(type, onFn); + }); + element.on(type, fn); + }, + + replaceWith: function(element, replaceNode) { + var index, parent = element.parentNode; + jqLiteDealoc(element); + forEach(new JQLite(replaceNode), function(node) { + if (index) { + parent.insertBefore(node, index.nextSibling); + } else { + parent.replaceChild(node, element); + } + index = node; + }); + }, + + children: function(element) { + var children = []; + forEach(element.childNodes, function(element) { + if (element.nodeType === NODE_TYPE_ELEMENT) { + children.push(element); + } + }); + return children; + }, + + contents: function(element) { + return element.contentDocument || element.childNodes || []; + }, + + append: function(element, node) { + var nodeType = element.nodeType; + if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return; + + node = new JQLite(node); + + for (var i = 0, ii = node.length; i < ii; i++) { + var child = node[i]; + element.appendChild(child); + } + }, + + prepend: function(element, node) { + if (element.nodeType === NODE_TYPE_ELEMENT) { + var index = element.firstChild; + forEach(new JQLite(node), function(child) { + element.insertBefore(child, index); + }); + } + }, + + wrap: function(element, wrapNode) { + wrapNode = jqLite(wrapNode).eq(0).clone()[0]; + var parent = element.parentNode; + if (parent) { + parent.replaceChild(wrapNode, element); + } + wrapNode.appendChild(element); + }, + + remove: jqLiteRemove, + + detach: function(element) { + jqLiteRemove(element, true); + }, + + after: function(element, newElement) { + var index = element, parent = element.parentNode; + newElement = new JQLite(newElement); + + for (var i = 0, ii = newElement.length; i < ii; i++) { + var node = newElement[i]; + parent.insertBefore(node, index.nextSibling); + index = node; + } + }, + + addClass: jqLiteAddClass, + removeClass: jqLiteRemoveClass, + + toggleClass: function(element, selector, condition) { + if (selector) { + forEach(selector.split(' '), function(className) { + var classCondition = condition; + if (isUndefined(classCondition)) { + classCondition = !jqLiteHasClass(element, className); + } + (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className); + }); + } + }, + + parent: function(element) { + var parent = element.parentNode; + return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null; + }, + + next: function(element) { + return element.nextElementSibling; + }, + + find: function(element, selector) { + if (element.getElementsByTagName) { + return element.getElementsByTagName(selector); + } else { + return []; + } + }, + + clone: jqLiteClone, + + triggerHandler: function(element, event, extraParameters) { + + var dummyEvent, eventFnsCopy, handlerArgs; + var eventName = event.type || event; + var expandoStore = jqLiteExpandoStore(element); + var events = expandoStore && expandoStore.events; + var eventFns = events && events[eventName]; + + if (eventFns) { + // Create a dummy event to pass to the handlers + dummyEvent = { + preventDefault: function() { this.defaultPrevented = true; }, + isDefaultPrevented: function() { return this.defaultPrevented === true; }, + stopImmediatePropagation: function() { this.immediatePropagationStopped = true; }, + isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; }, + stopPropagation: noop, + type: eventName, + target: element + }; + + // If a custom event was provided then extend our dummy event with it + if (event.type) { + dummyEvent = extend(dummyEvent, event); + } + + // Copy event handlers in case event handlers array is modified during execution. + eventFnsCopy = shallowCopy(eventFns); + handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent]; + + forEach(eventFnsCopy, function(fn) { + if (!dummyEvent.isImmediatePropagationStopped()) { + fn.apply(element, handlerArgs); + } + }); + } + } +}, function(fn, name) { + /** + * chaining functions + */ + JQLite.prototype[name] = function(arg1, arg2, arg3) { + var value; + + for (var i = 0, ii = this.length; i < ii; i++) { + if (isUndefined(value)) { + value = fn(this[i], arg1, arg2, arg3); + if (isDefined(value)) { + // any function which returns a value needs to be wrapped + value = jqLite(value); + } + } else { + jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); + } + } + return isDefined(value) ? value : this; + }; + + // bind legacy bind/unbind to on/off + JQLite.prototype.bind = JQLite.prototype.on; + JQLite.prototype.unbind = JQLite.prototype.off; +}); + + +// Provider for private $$jqLite service +function $$jqLiteProvider() { + this.$get = function $$jqLite() { + return extend(JQLite, { + hasClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteHasClass(node, classes); + }, + addClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteAddClass(node, classes); + }, + removeClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteRemoveClass(node, classes); + } + }); + }; +} + +/** + * Computes a hash of an 'obj'. + * Hash of a: + * string is string + * number is number as string + * object is either result of calling $$hashKey function on the object or uniquely generated id, + * that is also assigned to the $$hashKey property of the object. + * + * @param obj + * @returns {string} hash string such that the same input will have the same hash string. + * The resulting string key is in 'type:hashKey' format. + */ +function hashKey(obj, nextUidFn) { + var key = obj && obj.$$hashKey; + + if (key) { + if (typeof key === 'function') { + key = obj.$$hashKey(); + } + return key; + } + + var objType = typeof obj; + if (objType == 'function' || (objType == 'object' && obj !== null)) { + key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)(); + } else { + key = objType + ':' + obj; + } + + return key; +} + +/** + * HashMap which can use objects as keys + */ +function HashMap(array, isolatedUid) { + if (isolatedUid) { + var uid = 0; + this.nextUid = function() { + return ++uid; + }; + } + forEach(array, this.put, this); +} +HashMap.prototype = { + /** + * Store key value pair + * @param key key to store can be any type + * @param value value to store can be any type + */ + put: function(key, value) { + this[hashKey(key, this.nextUid)] = value; + }, + + /** + * @param key + * @returns {Object} the value for the key + */ + get: function(key) { + return this[hashKey(key, this.nextUid)]; + }, + + /** + * Remove the key/value pair + * @param key + */ + remove: function(key) { + var value = this[key = hashKey(key, this.nextUid)]; + delete this[key]; + return value; + } +}; + +var $$HashMapProvider = [function() { + this.$get = [function() { + return HashMap; + }]; +}]; + +/** + * @ngdoc function + * @module ng + * @name angular.injector + * @kind function + * + * @description + * Creates an injector object that can be used for retrieving services as well as for + * dependency injection (see {@link guide/di dependency injection}). + * + * @param {Array.} modules A list of module functions or their aliases. See + * {@link angular.module}. The `ng` module must be explicitly added. + * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which + * disallows argument name annotation inference. + * @returns {injector} Injector object. See {@link auto.$injector $injector}. + * + * @example + * Typical usage + * ```js + * // create an injector + * var $injector = angular.injector(['ng']); + * + * // use the injector to kick off your application + * // use the type inference to auto inject arguments, or use implicit injection + * $injector.invoke(function($rootScope, $compile, $document) { + * $compile($document)($rootScope); + * $rootScope.$digest(); + * }); + * ``` + * + * Sometimes you want to get access to the injector of a currently running Angular app + * from outside Angular. Perhaps, you want to inject and compile some markup after the + * application has been bootstrapped. You can do this using the extra `injector()` added + * to JQuery/jqLite elements. See {@link angular.element}. + * + * *This is fairly rare but could be the case if a third party library is injecting the + * markup.* + * + * In the following example a new block of HTML containing a `ng-controller` + * directive is added to the end of the document body by JQuery. We then compile and link + * it into the current AngularJS scope. + * + * ```js + * var $div = $('
    {{content.label}}
    '); + * $(document.body).append($div); + * + * angular.element(document).injector().invoke(function($compile) { + * var scope = angular.element($div).scope(); + * $compile($div)(scope); + * }); + * ``` + */ + + +/** + * @ngdoc module + * @name auto + * @description + * + * Implicit module which gets automatically added to each {@link auto.$injector $injector}. + */ + +var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; +var FN_ARG_SPLIT = /,/; +var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; +var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; +var $injectorMinErr = minErr('$injector'); + +function anonFn(fn) { + // For anonymous functions, showing at the very least the function signature can help in + // debugging. + var fnText = fn.toString().replace(STRIP_COMMENTS, ''), + args = fnText.match(FN_ARGS); + if (args) { + return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')'; + } + return 'fn'; +} + +function annotate(fn, strictDi, name) { + var $inject, + fnText, + argDecl, + last; + + if (typeof fn === 'function') { + if (!($inject = fn.$inject)) { + $inject = []; + if (fn.length) { + if (strictDi) { + if (!isString(name) || !name) { + name = fn.name || anonFn(fn); + } + throw $injectorMinErr('strictdi', + '{0} is not using explicit annotation and cannot be invoked in strict mode', name); + } + fnText = fn.toString().replace(STRIP_COMMENTS, ''); + argDecl = fnText.match(FN_ARGS); + forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { + arg.replace(FN_ARG, function(all, underscore, name) { + $inject.push(name); + }); + }); + } + fn.$inject = $inject; + } + } else if (isArray(fn)) { + last = fn.length - 1; + assertArgFn(fn[last], 'fn'); + $inject = fn.slice(0, last); + } else { + assertArgFn(fn, 'fn', true); + } + return $inject; +} + +/////////////////////////////////////// + +/** + * @ngdoc service + * @name $injector + * + * @description + * + * `$injector` is used to retrieve object instances as defined by + * {@link auto.$provide provider}, instantiate types, invoke methods, + * and load modules. + * + * The following always holds true: + * + * ```js + * var $injector = angular.injector(); + * expect($injector.get('$injector')).toBe($injector); + * expect($injector.invoke(function($injector) { + * return $injector; + * })).toBe($injector); + * ``` + * + * # Injection Function Annotation + * + * JavaScript does not have annotations, and annotations are needed for dependency injection. The + * following are all valid ways of annotating function with injection arguments and are equivalent. + * + * ```js + * // inferred (only works if code not minified/obfuscated) + * $injector.invoke(function(serviceA){}); + * + * // annotated + * function explicit(serviceA) {}; + * explicit.$inject = ['serviceA']; + * $injector.invoke(explicit); + * + * // inline + * $injector.invoke(['serviceA', function(serviceA){}]); + * ``` + * + * ## Inference + * + * In JavaScript calling `toString()` on a function returns the function definition. The definition + * can then be parsed and the function arguments can be extracted. This method of discovering + * annotations is disallowed when the injector is in strict mode. + * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the + * argument names. + * + * ## `$inject` Annotation + * By adding an `$inject` property onto a function the injection parameters can be specified. + * + * ## Inline + * As an array of injection names, where the last item in the array is the function to call. + */ + +/** + * @ngdoc method + * @name $injector#get + * + * @description + * Return an instance of the service. + * + * @param {string} name The name of the instance to retrieve. + * @param {string=} caller An optional string to provide the origin of the function call for error messages. + * @return {*} The instance. + */ + +/** + * @ngdoc method + * @name $injector#invoke + * + * @description + * Invoke the method and supply the method arguments from the `$injector`. + * + * @param {Function|Array.} fn The injectable function to invoke. Function parameters are + * injected according to the {@link guide/di $inject Annotation} rules. + * @param {Object=} self The `this` for the invoked method. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {*} the value returned by the invoked `fn` function. + */ + +/** + * @ngdoc method + * @name $injector#has + * + * @description + * Allows the user to query if the particular service exists. + * + * @param {string} name Name of the service to query. + * @returns {boolean} `true` if injector has given service. + */ + +/** + * @ngdoc method + * @name $injector#instantiate + * @description + * Create a new instance of JS type. The method takes a constructor function, invokes the new + * operator, and supplies all of the arguments to the constructor function as specified by the + * constructor annotation. + * + * @param {Function} Type Annotated constructor function. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {Object} new instance of `Type`. + */ + +/** + * @ngdoc method + * @name $injector#annotate + * + * @description + * Returns an array of service names which the function is requesting for injection. This API is + * used by the injector to determine which services need to be injected into the function when the + * function is invoked. There are three ways in which the function can be annotated with the needed + * dependencies. + * + * # Argument names + * + * The simplest form is to extract the dependencies from the arguments of the function. This is done + * by converting the function into a string using `toString()` method and extracting the argument + * names. + * ```js + * // Given + * function MyController($scope, $route) { + * // ... + * } + * + * // Then + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); + * ``` + * + * You can disallow this method by using strict injection mode. + * + * This method does not work with code minification / obfuscation. For this reason the following + * annotation strategies are supported. + * + * # The `$inject` property + * + * If a function has an `$inject` property and its value is an array of strings, then the strings + * represent names of services to be injected into the function. + * ```js + * // Given + * var MyController = function(obfuscatedScope, obfuscatedRoute) { + * // ... + * } + * // Define function dependencies + * MyController['$inject'] = ['$scope', '$route']; + * + * // Then + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); + * ``` + * + * # The array notation + * + * It is often desirable to inline Injected functions and that's when setting the `$inject` property + * is very inconvenient. In these situations using the array notation to specify the dependencies in + * a way that survives minification is a better choice: + * + * ```js + * // We wish to write this (not minification / obfuscation safe) + * injector.invoke(function($compile, $rootScope) { + * // ... + * }); + * + * // We are forced to write break inlining + * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) { + * // ... + * }; + * tmpFn.$inject = ['$compile', '$rootScope']; + * injector.invoke(tmpFn); + * + * // To better support inline function the inline annotation is supported + * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) { + * // ... + * }]); + * + * // Therefore + * expect(injector.annotate( + * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}]) + * ).toEqual(['$compile', '$rootScope']); + * ``` + * + * @param {Function|Array.} fn Function for which dependent service names need to + * be retrieved as described above. + * + * @param {boolean=} [strictDi=false] Disallow argument name annotation inference. + * + * @returns {Array.} The names of the services which the function requires. + */ + + + + +/** + * @ngdoc service + * @name $provide + * + * @description + * + * The {@link auto.$provide $provide} service has a number of methods for registering components + * with the {@link auto.$injector $injector}. Many of these functions are also exposed on + * {@link angular.Module}. + * + * An Angular **service** is a singleton object created by a **service factory**. These **service + * factories** are functions which, in turn, are created by a **service provider**. + * The **service providers** are constructor functions. When instantiated they must contain a + * property called `$get`, which holds the **service factory** function. + * + * When you request a service, the {@link auto.$injector $injector} is responsible for finding the + * correct **service provider**, instantiating it and then calling its `$get` **service factory** + * function to get the instance of the **service**. + * + * Often services have no configuration options and there is no need to add methods to the service + * provider. The provider will be no more than a constructor function with a `$get` property. For + * these cases the {@link auto.$provide $provide} service has additional helper methods to register + * services without specifying a provider. + * + * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the + * {@link auto.$injector $injector} + * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by + * providers and services. + * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by + * services, not providers. + * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`, + * that will be wrapped in a **service provider** object, whose `$get` property will contain the + * given factory function. + * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class` + * that will be wrapped in a **service provider** object, whose `$get` property will instantiate + * a new object using the given constructor function. + * + * See the individual methods for more information and examples. + */ + +/** + * @ngdoc method + * @name $provide#provider + * @description + * + * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions + * are constructor functions, whose instances are responsible for "providing" a factory for a + * service. + * + * Service provider names start with the name of the service they provide followed by `Provider`. + * For example, the {@link ng.$log $log} service has a provider called + * {@link ng.$logProvider $logProvider}. + * + * Service provider objects can have additional methods which allow configuration of the provider + * and its service. Importantly, you can configure what kind of service is created by the `$get` + * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a + * method {@link ng.$logProvider#debugEnabled debugEnabled} + * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the + * console or not. + * + * @param {string} name The name of the instance. NOTE: the provider will be available under `name + + 'Provider'` key. + * @param {(Object|function())} provider If the provider is: + * + * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using + * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created. + * - `Constructor`: a new instance of the provider will be created using + * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`. + * + * @returns {Object} registered provider instance + + * @example + * + * The following example shows how to create a simple event tracking service and register it using + * {@link auto.$provide#provider $provide.provider()}. + * + * ```js + * // Define the eventTracker provider + * function EventTrackerProvider() { + * var trackingUrl = '/track'; + * + * // A provider method for configuring where the tracked events should been saved + * this.setTrackingUrl = function(url) { + * trackingUrl = url; + * }; + * + * // The service factory function + * this.$get = ['$http', function($http) { + * var trackedEvents = {}; + * return { + * // Call this to track an event + * event: function(event) { + * var count = trackedEvents[event] || 0; + * count += 1; + * trackedEvents[event] = count; + * return count; + * }, + * // Call this to save the tracked events to the trackingUrl + * save: function() { + * $http.post(trackingUrl, trackedEvents); + * } + * }; + * }]; + * } + * + * describe('eventTracker', function() { + * var postSpy; + * + * beforeEach(module(function($provide) { + * // Register the eventTracker provider + * $provide.provider('eventTracker', EventTrackerProvider); + * })); + * + * beforeEach(module(function(eventTrackerProvider) { + * // Configure eventTracker provider + * eventTrackerProvider.setTrackingUrl('/custom-track'); + * })); + * + * it('tracks events', inject(function(eventTracker) { + * expect(eventTracker.event('login')).toEqual(1); + * expect(eventTracker.event('login')).toEqual(2); + * })); + * + * it('saves to the tracking url', inject(function(eventTracker, $http) { + * postSpy = spyOn($http, 'post'); + * eventTracker.event('login'); + * eventTracker.save(); + * expect(postSpy).toHaveBeenCalled(); + * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track'); + * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track'); + * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 }); + * })); + * }); + * ``` + */ + +/** + * @ngdoc method + * @name $provide#factory + * @description + * + * Register a **service factory**, which will be called to return the service instance. + * This is short for registering a service where its provider consists of only a `$get` property, + * which is the given service factory function. + * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to + * configure your service in a provider. + * + * @param {string} name The name of the instance. + * @param {Function|Array.} $getFn The injectable $getFn for the instance creation. + * Internally this is a short hand for `$provide.provider(name, {$get: $getFn})`. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service + * ```js + * $provide.factory('ping', ['$http', function($http) { + * return function ping() { + * return $http.send('/ping'); + * }; + * }]); + * ``` + * You would then inject and use this service like this: + * ```js + * someModule.controller('Ctrl', ['ping', function(ping) { + * ping(); + * }]); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#service + * @description + * + * Register a **service constructor**, which will be invoked with `new` to create the service + * instance. + * This is short for registering a service where its provider's `$get` property is the service + * constructor function that will be used to instantiate the service instance. + * + * You should use {@link auto.$provide#service $provide.service(class)} if you define your service + * as a type/class. + * + * @param {string} name The name of the instance. + * @param {Function|Array.} constructor An injectable class (constructor function) + * that will be instantiated. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service using + * {@link auto.$provide#service $provide.service(class)}. + * ```js + * var Ping = function($http) { + * this.$http = $http; + * }; + * + * Ping.$inject = ['$http']; + * + * Ping.prototype.send = function() { + * return this.$http.get('/ping'); + * }; + * $provide.service('ping', Ping); + * ``` + * You would then inject and use this service like this: + * ```js + * someModule.controller('Ctrl', ['ping', function(ping) { + * ping.send(); + * }]); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#value + * @description + * + * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a + * number, an array, an object or a function. This is short for registering a service where its + * provider's `$get` property is a factory function that takes no arguments and returns the **value + * service**. + * + * Value services are similar to constant services, except that they cannot be injected into a + * module configuration function (see {@link angular.Module#config}) but they can be overridden by + * an Angular + * {@link auto.$provide#decorator decorator}. + * + * @param {string} name The name of the instance. + * @param {*} value The value. + * @returns {Object} registered provider instance + * + * @example + * Here are some examples of creating value services. + * ```js + * $provide.value('ADMIN_USER', 'admin'); + * + * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 }); + * + * $provide.value('halfOf', function(value) { + * return value / 2; + * }); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#constant + * @description + * + * Register a **constant service**, such as a string, a number, an array, an object or a function, + * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be + * injected into a module configuration function (see {@link angular.Module#config}) and it cannot + * be overridden by an Angular {@link auto.$provide#decorator decorator}. + * + * @param {string} name The name of the constant. + * @param {*} value The constant value. + * @returns {Object} registered instance + * + * @example + * Here a some examples of creating constants: + * ```js + * $provide.constant('SHARD_HEIGHT', 306); + * + * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']); + * + * $provide.constant('double', function(value) { + * return value * 2; + * }); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#decorator + * @description + * + * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator + * intercepts the creation of a service, allowing it to override or modify the behaviour of the + * service. The object returned by the decorator may be the original service, or a new service + * object which replaces or wraps and delegates to the original service. + * + * @param {string} name The name of the service to decorate. + * @param {Function|Array.} decorator This function will be invoked when the service needs to be + * instantiated and should return the decorated service instance. The function is called using + * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable. + * Local injection arguments: + * + * * `$delegate` - The original service instance, which can be monkey patched, configured, + * decorated or delegated to. + * + * @example + * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting + * calls to {@link ng.$log#error $log.warn()}. + * ```js + * $provide.decorator('$log', ['$delegate', function($delegate) { + * $delegate.warn = $delegate.error; + * return $delegate; + * }]); + * ``` + */ + + +function createInjector(modulesToLoad, strictDi) { + strictDi = (strictDi === true); + var INSTANTIATING = {}, + providerSuffix = 'Provider', + path = [], + loadedModules = new HashMap([], true), + providerCache = { + $provide: { + provider: supportObject(provider), + factory: supportObject(factory), + service: supportObject(service), + value: supportObject(value), + constant: supportObject(constant), + decorator: decorator + } + }, + providerInjector = (providerCache.$injector = + createInternalInjector(providerCache, function(serviceName, caller) { + if (angular.isString(caller)) { + path.push(caller); + } + throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')); + })), + instanceCache = {}, + instanceInjector = (instanceCache.$injector = + createInternalInjector(instanceCache, function(serviceName, caller) { + var provider = providerInjector.get(serviceName + providerSuffix, caller); + return instanceInjector.invoke(provider.$get, provider, undefined, serviceName); + })); + + + forEach(loadModules(modulesToLoad), function(fn) { if (fn) instanceInjector.invoke(fn); }); + + return instanceInjector; + + //////////////////////////////////// + // $provider + //////////////////////////////////// + + function supportObject(delegate) { + return function(key, value) { + if (isObject(key)) { + forEach(key, reverseParams(delegate)); + } else { + return delegate(key, value); + } + }; + } + + function provider(name, provider_) { + assertNotHasOwnProperty(name, 'service'); + if (isFunction(provider_) || isArray(provider_)) { + provider_ = providerInjector.instantiate(provider_); + } + if (!provider_.$get) { + throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); + } + return providerCache[name + providerSuffix] = provider_; + } + + function enforceReturnValue(name, factory) { + return function enforcedReturnValue() { + var result = instanceInjector.invoke(factory, this); + if (isUndefined(result)) { + throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name); + } + return result; + }; + } + + function factory(name, factoryFn, enforce) { + return provider(name, { + $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn + }); + } + + function service(name, constructor) { + return factory(name, ['$injector', function($injector) { + return $injector.instantiate(constructor); + }]); + } + + function value(name, val) { return factory(name, valueFn(val), false); } + + function constant(name, value) { + assertNotHasOwnProperty(name, 'constant'); + providerCache[name] = value; + instanceCache[name] = value; + } + + function decorator(serviceName, decorFn) { + var origProvider = providerInjector.get(serviceName + providerSuffix), + orig$get = origProvider.$get; + + origProvider.$get = function() { + var origInstance = instanceInjector.invoke(orig$get, origProvider); + return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); + }; + } + + //////////////////////////////////// + // Module Loading + //////////////////////////////////// + function loadModules(modulesToLoad) { + var runBlocks = [], moduleFn; + forEach(modulesToLoad, function(module) { + if (loadedModules.get(module)) return; + loadedModules.put(module, true); + + function runInvokeQueue(queue) { + var i, ii; + for (i = 0, ii = queue.length; i < ii; i++) { + var invokeArgs = queue[i], + provider = providerInjector.get(invokeArgs[0]); + + provider[invokeArgs[1]].apply(provider, invokeArgs[2]); + } + } + + try { + if (isString(module)) { + moduleFn = angularModule(module); + runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); + runInvokeQueue(moduleFn._invokeQueue); + runInvokeQueue(moduleFn._configBlocks); + } else if (isFunction(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else if (isArray(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else { + assertArgFn(module, 'module'); + } + } catch (e) { + if (isArray(module)) { + module = module[module.length - 1]; + } + if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { + // Safari & FF's stack traces don't contain error.message content + // unlike those of Chrome and IE + // So if stack doesn't contain message, we create a new string that contains both. + // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here. + /* jshint -W022 */ + e = e.message + '\n' + e.stack; + } + throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", + module, e.stack || e.message || e); + } + }); + return runBlocks; + } + + //////////////////////////////////// + // internal Injector + //////////////////////////////////// + + function createInternalInjector(cache, factory) { + + function getService(serviceName, caller) { + if (cache.hasOwnProperty(serviceName)) { + if (cache[serviceName] === INSTANTIATING) { + throw $injectorMinErr('cdep', 'Circular dependency found: {0}', + serviceName + ' <- ' + path.join(' <- ')); + } + return cache[serviceName]; + } else { + try { + path.unshift(serviceName); + cache[serviceName] = INSTANTIATING; + return cache[serviceName] = factory(serviceName, caller); + } catch (err) { + if (cache[serviceName] === INSTANTIATING) { + delete cache[serviceName]; + } + throw err; + } finally { + path.shift(); + } + } + } + + function invoke(fn, self, locals, serviceName) { + if (typeof locals === 'string') { + serviceName = locals; + locals = null; + } + + var args = [], + $inject = createInjector.$$annotate(fn, strictDi, serviceName), + length, i, + key; + + for (i = 0, length = $inject.length; i < length; i++) { + key = $inject[i]; + if (typeof key !== 'string') { + throw $injectorMinErr('itkn', + 'Incorrect injection token! Expected service name as string, got {0}', key); + } + args.push( + locals && locals.hasOwnProperty(key) + ? locals[key] + : getService(key, serviceName) + ); + } + if (isArray(fn)) { + fn = fn[length]; + } + + // http://jsperf.com/angularjs-invoke-apply-vs-switch + // #5388 + return fn.apply(self, args); + } + + function instantiate(Type, locals, serviceName) { + // Check if Type is annotated and use just the given function at n-1 as parameter + // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); + // Object creation: http://jsperf.com/create-constructor/2 + var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype || null); + var returnedValue = invoke(Type, instance, locals, serviceName); + + return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance; + } + + return { + invoke: invoke, + instantiate: instantiate, + get: getService, + annotate: createInjector.$$annotate, + has: function(name) { + return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); + } + }; + } +} + +createInjector.$$annotate = annotate; + +/** + * @ngdoc provider + * @name $anchorScrollProvider + * + * @description + * Use `$anchorScrollProvider` to disable automatic scrolling whenever + * {@link ng.$location#hash $location.hash()} changes. + */ +function $AnchorScrollProvider() { + + var autoScrollingEnabled = true; + + /** + * @ngdoc method + * @name $anchorScrollProvider#disableAutoScrolling + * + * @description + * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to + * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.
    + * Use this method to disable automatic scrolling. + * + * If automatic scrolling is disabled, one must explicitly call + * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the + * current hash. + */ + this.disableAutoScrolling = function() { + autoScrollingEnabled = false; + }; + + /** + * @ngdoc service + * @name $anchorScroll + * @kind function + * @requires $window + * @requires $location + * @requires $rootScope + * + * @description + * When called, it scrolls to the element related to the specified `hash` or (if omitted) to the + * current value of {@link ng.$location#hash $location.hash()}, according to the rules specified + * in the + * [HTML5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document). + * + * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to + * match any anchor whenever it changes. This can be disabled by calling + * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}. + * + * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a + * vertical scroll-offset (either fixed or dynamic). + * + * @param {string=} hash The hash specifying the element to scroll to. If omitted, the value of + * {@link ng.$location#hash $location.hash()} will be used. + * + * @property {(number|function|jqLite)} yOffset + * If set, specifies a vertical scroll-offset. This is often useful when there are fixed + * positioned elements at the top of the page, such as navbars, headers etc. + * + * `yOffset` can be specified in various ways: + * - **number**: A fixed number of pixels to be used as offset.

    + * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return + * a number representing the offset (in pixels).

    + * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from + * the top of the page to the element's bottom will be used as offset.
    + * **Note**: The element will be taken into account only as long as its `position` is set to + * `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust + * their height and/or positioning according to the viewport's size. + * + *
    + *
    + * In order for `yOffset` to work properly, scrolling should take place on the document's root and + * not some child element. + *
    + * + * @example + + +
    + Go to bottom + You're at the bottom! +
    +
    + + angular.module('anchorScrollExample', []) + .controller('ScrollController', ['$scope', '$location', '$anchorScroll', + function ($scope, $location, $anchorScroll) { + $scope.gotoBottom = function() { + // set the location.hash to the id of + // the element you wish to scroll to. + $location.hash('bottom'); + + // call $anchorScroll() + $anchorScroll(); + }; + }]); + + + #scrollArea { + height: 280px; + overflow: auto; + } + + #bottom { + display: block; + margin-top: 2000px; + } + +
    + * + *
    + * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value). + * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details. + * + * @example + + + +
    + Anchor {{x}} of 5 +
    +
    + + angular.module('anchorScrollOffsetExample', []) + .run(['$anchorScroll', function($anchorScroll) { + $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels + }]) + .controller('headerCtrl', ['$anchorScroll', '$location', '$scope', + function ($anchorScroll, $location, $scope) { + $scope.gotoAnchor = function(x) { + var newHash = 'anchor' + x; + if ($location.hash() !== newHash) { + // set the $location.hash to `newHash` and + // $anchorScroll will automatically scroll to it + $location.hash('anchor' + x); + } else { + // call $anchorScroll() explicitly, + // since $location.hash hasn't changed + $anchorScroll(); + } + }; + } + ]); + + + body { + padding-top: 50px; + } + + .anchor { + border: 2px dashed DarkOrchid; + padding: 10px 10px 200px 10px; + } + + .fixed-header { + background-color: rgba(0, 0, 0, 0.2); + height: 50px; + position: fixed; + top: 0; left: 0; right: 0; + } + + .fixed-header > a { + display: inline-block; + margin: 5px 15px; + } + +
    + */ + this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { + var document = $window.document; + + // Helper function to get first anchor from a NodeList + // (using `Array#some()` instead of `angular#forEach()` since it's more performant + // and working in all supported browsers.) + function getFirstAnchor(list) { + var result = null; + Array.prototype.some.call(list, function(element) { + if (nodeName_(element) === 'a') { + result = element; + return true; + } + }); + return result; + } + + function getYOffset() { + + var offset = scroll.yOffset; + + if (isFunction(offset)) { + offset = offset(); + } else if (isElement(offset)) { + var elem = offset[0]; + var style = $window.getComputedStyle(elem); + if (style.position !== 'fixed') { + offset = 0; + } else { + offset = elem.getBoundingClientRect().bottom; + } + } else if (!isNumber(offset)) { + offset = 0; + } + + return offset; + } + + function scrollTo(elem) { + if (elem) { + elem.scrollIntoView(); + + var offset = getYOffset(); + + if (offset) { + // `offset` is the number of pixels we should scroll UP in order to align `elem` properly. + // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the + // top of the viewport. + // + // IF the number of pixels from the top of `elem` to the end of the page's content is less + // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some + // way down the page. + // + // This is often the case for elements near the bottom of the page. + // + // In such cases we do not need to scroll the whole `offset` up, just the difference between + // the top of the element and the offset, which is enough to align the top of `elem` at the + // desired position. + var elemTop = elem.getBoundingClientRect().top; + $window.scrollBy(0, elemTop - offset); + } + } else { + $window.scrollTo(0, 0); + } + } + + function scroll(hash) { + hash = isString(hash) ? hash : $location.hash(); + var elm; + + // empty hash, scroll to the top of the page + if (!hash) scrollTo(null); + + // element with given id + else if ((elm = document.getElementById(hash))) scrollTo(elm); + + // first anchor with given name :-D + else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm); + + // no element and hash == 'top', scroll to the top of the page + else if (hash === 'top') scrollTo(null); + } + + // does not scroll when user clicks on anchor link that is currently on + // (no url change, no $location.hash() change), browser native does scroll + if (autoScrollingEnabled) { + $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, + function autoScrollWatchAction(newVal, oldVal) { + // skip the initial scroll if $location.hash is empty + if (newVal === oldVal && newVal === '') return; + + jqLiteDocumentLoaded(function() { + $rootScope.$evalAsync(scroll); + }); + }); + } + + return scroll; + }]; +} + +var $animateMinErr = minErr('$animate'); +var ELEMENT_NODE = 1; +var NG_ANIMATE_CLASSNAME = 'ng-animate'; + +function mergeClasses(a,b) { + if (!a && !b) return ''; + if (!a) return b; + if (!b) return a; + if (isArray(a)) a = a.join(' '); + if (isArray(b)) b = b.join(' '); + return a + ' ' + b; +} + +function extractElementNode(element) { + for (var i = 0; i < element.length; i++) { + var elm = element[i]; + if (elm.nodeType === ELEMENT_NODE) { + return elm; + } + } +} + +function splitClasses(classes) { + if (isString(classes)) { + classes = classes.split(' '); + } + + // Use createMap() to prevent class assumptions involving property names in + // Object.prototype + var obj = createMap(); + forEach(classes, function(klass) { + // sometimes the split leaves empty string values + // incase extra spaces were applied to the options + if (klass.length) { + obj[klass] = true; + } + }); + return obj; +} + +// if any other type of options value besides an Object value is +// passed into the $animate.method() animation then this helper code +// will be run which will ignore it. While this patch is not the +// greatest solution to this, a lot of existing plugins depend on +// $animate to either call the callback (< 1.2) or return a promise +// that can be changed. This helper function ensures that the options +// are wiped clean incase a callback function is provided. +function prepareAnimateOptions(options) { + return isObject(options) + ? options + : {}; +} + +var $$CoreAnimateRunnerProvider = function() { + this.$get = ['$q', '$$rAF', function($q, $$rAF) { + function AnimateRunner() {} + AnimateRunner.all = noop; + AnimateRunner.chain = noop; + AnimateRunner.prototype = { + end: noop, + cancel: noop, + resume: noop, + pause: noop, + complete: noop, + then: function(pass, fail) { + return $q(function(resolve) { + $$rAF(function() { + resolve(); + }); + }).then(pass, fail); + } + }; + return AnimateRunner; + }]; +}; + +// this is prefixed with Core since it conflicts with +// the animateQueueProvider defined in ngAnimate/animateQueue.js +var $$CoreAnimateQueueProvider = function() { + var postDigestQueue = new HashMap(); + var postDigestElements = []; + + this.$get = ['$$AnimateRunner', '$rootScope', + function($$AnimateRunner, $rootScope) { + return { + enabled: noop, + on: noop, + off: noop, + pin: noop, + + push: function(element, event, options, domOperation) { + domOperation && domOperation(); + + options = options || {}; + options.from && element.css(options.from); + options.to && element.css(options.to); + + if (options.addClass || options.removeClass) { + addRemoveClassesPostDigest(element, options.addClass, options.removeClass); + } + + return new $$AnimateRunner(); // jshint ignore:line + } + }; + + function addRemoveClassesPostDigest(element, add, remove) { + var data = postDigestQueue.get(element); + var classVal; + + if (!data) { + postDigestQueue.put(element, data = {}); + postDigestElements.push(element); + } + + if (add) { + forEach(add.split(' '), function(className) { + if (className) { + data[className] = true; + } + }); + } + + if (remove) { + forEach(remove.split(' '), function(className) { + if (className) { + data[className] = false; + } + }); + } + + if (postDigestElements.length > 1) return; + + $rootScope.$$postDigest(function() { + forEach(postDigestElements, function(element) { + var data = postDigestQueue.get(element); + if (data) { + var existing = splitClasses(element.attr('class')); + var toAdd = ''; + var toRemove = ''; + forEach(data, function(status, className) { + var hasClass = !!existing[className]; + if (status !== hasClass) { + if (status) { + toAdd += (toAdd.length ? ' ' : '') + className; + } else { + toRemove += (toRemove.length ? ' ' : '') + className; + } + } + }); + + forEach(element, function(elm) { + toAdd && jqLiteAddClass(elm, toAdd); + toRemove && jqLiteRemoveClass(elm, toRemove); + }); + postDigestQueue.remove(element); + } + }); + + postDigestElements.length = 0; + }); + } + }]; +}; + +/** + * @ngdoc provider + * @name $animateProvider + * + * @description + * Default implementation of $animate that doesn't perform any animations, instead just + * synchronously performs DOM updates and resolves the returned runner promise. + * + * In order to enable animations the `ngAnimate` module has to be loaded. + * + * To see the functional implementation check out `src/ngAnimate/animate.js`. + */ +var $AnimateProvider = ['$provide', function($provide) { + var provider = this; + + this.$$registeredAnimations = Object.create(null); + + /** + * @ngdoc method + * @name $animateProvider#register + * + * @description + * Registers a new injectable animation factory function. The factory function produces the + * animation object which contains callback functions for each event that is expected to be + * animated. + * + * * `eventFn`: `function(element, ... , doneFunction, options)` + * The element to animate, the `doneFunction` and the options fed into the animation. Depending + * on the type of animation additional arguments will be injected into the animation function. The + * list below explains the function signatures for the different animation methods: + * + * - setClass: function(element, addedClasses, removedClasses, doneFunction, options) + * - addClass: function(element, addedClasses, doneFunction, options) + * - removeClass: function(element, removedClasses, doneFunction, options) + * - enter, leave, move: function(element, doneFunction, options) + * - animate: function(element, fromStyles, toStyles, doneFunction, options) + * + * Make sure to trigger the `doneFunction` once the animation is fully complete. + * + * ```js + * return { + * //enter, leave, move signature + * eventFn : function(element, done, options) { + * //code to run the animation + * //once complete, then run done() + * return function endFunction(wasCancelled) { + * //code to cancel the animation + * } + * } + * } + * ``` + * + * @param {string} name The name of the animation (this is what the class-based CSS value will be compared to). + * @param {Function} factory The factory function that will be executed to return the animation + * object. + */ + this.register = function(name, factory) { + if (name && name.charAt(0) !== '.') { + throw $animateMinErr('notcsel', "Expecting class selector starting with '.' got '{0}'.", name); + } + + var key = name + '-animation'; + provider.$$registeredAnimations[name.substr(1)] = key; + $provide.factory(key, factory); + }; + + /** + * @ngdoc method + * @name $animateProvider#classNameFilter + * + * @description + * Sets and/or returns the CSS class regular expression that is checked when performing + * an animation. Upon bootstrap the classNameFilter value is not set at all and will + * therefore enable $animate to attempt to perform an animation on any element that is triggered. + * When setting the `classNameFilter` value, animations will only be performed on elements + * that successfully match the filter expression. This in turn can boost performance + * for low-powered devices as well as applications containing a lot of structural operations. + * @param {RegExp=} expression The className expression which will be checked against all animations + * @return {RegExp} The current CSS className expression value. If null then there is no expression value + */ + this.classNameFilter = function(expression) { + if (arguments.length === 1) { + this.$$classNameFilter = (expression instanceof RegExp) ? expression : null; + if (this.$$classNameFilter) { + var reservedRegex = new RegExp("(\\s+|\\/)" + NG_ANIMATE_CLASSNAME + "(\\s+|\\/)"); + if (reservedRegex.test(this.$$classNameFilter.toString())) { + throw $animateMinErr('nongcls','$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.', NG_ANIMATE_CLASSNAME); + + } + } + } + return this.$$classNameFilter; + }; + + this.$get = ['$$animateQueue', function($$animateQueue) { + function domInsert(element, parentElement, afterElement) { + // if for some reason the previous element was removed + // from the dom sometime before this code runs then let's + // just stick to using the parent element as the anchor + if (afterElement) { + var afterNode = extractElementNode(afterElement); + if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) { + afterElement = null; + } + } + afterElement ? afterElement.after(element) : parentElement.prepend(element); + } + + /** + * @ngdoc service + * @name $animate + * @description The $animate service exposes a series of DOM utility methods that provide support + * for animation hooks. The default behavior is the application of DOM operations, however, + * when an animation is detected (and animations are enabled), $animate will do the heavy lifting + * to ensure that animation runs with the triggered DOM operation. + * + * By default $animate doesn't trigger an animations. This is because the `ngAnimate` module isn't + * included and only when it is active then the animation hooks that `$animate` triggers will be + * functional. Once active then all structural `ng-` directives will trigger animations as they perform + * their DOM-related operations (enter, leave and move). Other directives such as `ngClass`, + * `ngShow`, `ngHide` and `ngMessages` also provide support for animations. + * + * It is recommended that the`$animate` service is always used when executing DOM-related procedures within directives. + * + * To learn more about enabling animation support, click here to visit the + * {@link ngAnimate ngAnimate module page}. + */ + return { + // we don't call it directly since non-existant arguments may + // be interpreted as null within the sub enabled function + + /** + * + * @ngdoc method + * @name $animate#on + * @kind function + * @description Sets up an event listener to fire whenever the animation event (enter, leave, move, etc...) + * has fired on the given element or among any of its children. Once the listener is fired, the provided callback + * is fired with the following params: + * + * ```js + * $animate.on('enter', container, + * function callback(element, phase) { + * // cool we detected an enter animation within the container + * } + * ); + * ``` + * + * @param {string} event the animation event that will be captured (e.g. enter, leave, move, addClass, removeClass, etc...) + * @param {DOMElement} container the container element that will capture each of the animation events that are fired on itself + * as well as among its children + * @param {Function} callback the callback function that will be fired when the listener is triggered + * + * The arguments present in the callback function are: + * * `element` - The captured DOM element that the animation was fired on. + * * `phase` - The phase of the animation. The two possible phases are **start** (when the animation starts) and **close** (when it ends). + */ + on: $$animateQueue.on, + + /** + * + * @ngdoc method + * @name $animate#off + * @kind function + * @description Deregisters an event listener based on the event which has been associated with the provided element. This method + * can be used in three different ways depending on the arguments: + * + * ```js + * // remove all the animation event listeners listening for `enter` + * $animate.off('enter'); + * + * // remove all the animation event listeners listening for `enter` on the given element and its children + * $animate.off('enter', container); + * + * // remove the event listener function provided by `listenerFn` that is set + * // to listen for `enter` on the given `element` as well as its children + * $animate.off('enter', container, callback); + * ``` + * + * @param {string} event the animation event (e.g. enter, leave, move, addClass, removeClass, etc...) + * @param {DOMElement=} container the container element the event listener was placed on + * @param {Function=} callback the callback function that was registered as the listener + */ + off: $$animateQueue.off, + + /** + * @ngdoc method + * @name $animate#pin + * @kind function + * @description Associates the provided element with a host parent element to allow the element to be animated even if it exists + * outside of the DOM structure of the Angular application. By doing so, any animation triggered via `$animate` can be issued on the + * element despite being outside the realm of the application or within another application. Say for example if the application + * was bootstrapped on an element that is somewhere inside of the `` tag, but we wanted to allow for an element to be situated + * as a direct child of `document.body`, then this can be achieved by pinning the element via `$animate.pin(element)`. Keep in mind + * that calling `$animate.pin(element, parentElement)` will not actually insert into the DOM anywhere; it will just create the association. + * + * Note that this feature is only active when the `ngAnimate` module is used. + * + * @param {DOMElement} element the external element that will be pinned + * @param {DOMElement} parentElement the host parent element that will be associated with the external element + */ + pin: $$animateQueue.pin, + + /** + * + * @ngdoc method + * @name $animate#enabled + * @kind function + * @description Used to get and set whether animations are enabled or not on the entire application or on an element and its children. This + * function can be called in four ways: + * + * ```js + * // returns true or false + * $animate.enabled(); + * + * // changes the enabled state for all animations + * $animate.enabled(false); + * $animate.enabled(true); + * + * // returns true or false if animations are enabled for an element + * $animate.enabled(element); + * + * // changes the enabled state for an element and its children + * $animate.enabled(element, true); + * $animate.enabled(element, false); + * ``` + * + * @param {DOMElement=} element the element that will be considered for checking/setting the enabled state + * @param {boolean=} enabled whether or not the animations will be enabled for the element + * + * @return {boolean} whether or not animations are enabled + */ + enabled: $$animateQueue.enabled, + + /** + * @ngdoc method + * @name $animate#cancel + * @kind function + * @description Cancels the provided animation. + * + * @param {Promise} animationPromise The animation promise that is returned when an animation is started. + */ + cancel: function(runner) { + runner.end && runner.end(); + }, + + /** + * + * @ngdoc method + * @name $animate#enter + * @kind function + * @description Inserts the element into the DOM either after the `after` element (if provided) or + * as the first child within the `parent` element and then triggers an animation. + * A promise is returned that will be resolved during the next digest once the animation + * has completed. + * + * @param {DOMElement} element the element which will be inserted into the DOM + * @param {DOMElement} parent the parent element which will append the element as + * a child (so long as the after element is not present) + * @param {DOMElement=} after the sibling element after which the element will be appended + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + enter: function(element, parent, after, options) { + parent = parent && jqLite(parent); + after = after && jqLite(after); + parent = parent || after.parent(); + domInsert(element, parent, after); + return $$animateQueue.push(element, 'enter', prepareAnimateOptions(options)); + }, + + /** + * + * @ngdoc method + * @name $animate#move + * @kind function + * @description Inserts (moves) the element into its new position in the DOM either after + * the `after` element (if provided) or as the first child within the `parent` element + * and then triggers an animation. A promise is returned that will be resolved + * during the next digest once the animation has completed. + * + * @param {DOMElement} element the element which will be moved into the new DOM position + * @param {DOMElement} parent the parent element which will append the element as + * a child (so long as the after element is not present) + * @param {DOMElement=} after the sibling element after which the element will be appended + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + move: function(element, parent, after, options) { + parent = parent && jqLite(parent); + after = after && jqLite(after); + parent = parent || after.parent(); + domInsert(element, parent, after); + return $$animateQueue.push(element, 'move', prepareAnimateOptions(options)); + }, + + /** + * @ngdoc method + * @name $animate#leave + * @kind function + * @description Triggers an animation and then removes the element from the DOM. + * When the function is called a promise is returned that will be resolved during the next + * digest once the animation has completed. + * + * @param {DOMElement} element the element which will be removed from the DOM + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + leave: function(element, options) { + return $$animateQueue.push(element, 'leave', prepareAnimateOptions(options), function() { + element.remove(); + }); + }, + + /** + * @ngdoc method + * @name $animate#addClass + * @kind function + * + * @description Triggers an addClass animation surrounding the addition of the provided CSS class(es). Upon + * execution, the addClass operation will only be handled after the next digest and it will not trigger an + * animation if element already contains the CSS class or if the class is removed at a later step. + * Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} className the CSS class(es) that will be added (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + addClass: function(element, className, options) { + options = prepareAnimateOptions(options); + options.addClass = mergeClasses(options.addclass, className); + return $$animateQueue.push(element, 'addClass', options); + }, + + /** + * @ngdoc method + * @name $animate#removeClass + * @kind function + * + * @description Triggers a removeClass animation surrounding the removal of the provided CSS class(es). Upon + * execution, the removeClass operation will only be handled after the next digest and it will not trigger an + * animation if element does not contain the CSS class or if the class is added at a later step. + * Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} className the CSS class(es) that will be removed (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + removeClass: function(element, className, options) { + options = prepareAnimateOptions(options); + options.removeClass = mergeClasses(options.removeClass, className); + return $$animateQueue.push(element, 'removeClass', options); + }, + + /** + * @ngdoc method + * @name $animate#setClass + * @kind function + * + * @description Performs both the addition and removal of a CSS classes on an element and (during the process) + * triggers an animation surrounding the class addition/removal. Much like `$animate.addClass` and + * `$animate.removeClass`, `setClass` will only evaluate the classes being added/removed once a digest has + * passed. Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} add the CSS class(es) that will be added (multiple classes are separated via spaces) + * @param {string} remove the CSS class(es) that will be removed (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + setClass: function(element, add, remove, options) { + options = prepareAnimateOptions(options); + options.addClass = mergeClasses(options.addClass, add); + options.removeClass = mergeClasses(options.removeClass, remove); + return $$animateQueue.push(element, 'setClass', options); + }, + + /** + * @ngdoc method + * @name $animate#animate + * @kind function + * + * @description Performs an inline animation on the element which applies the provided to and from CSS styles to the element. + * If any detected CSS transition, keyframe or JavaScript matches the provided className value then the animation will take + * on the provided styles. For example, if a transition animation is set for the given className then the provided from and + * to styles will be applied alongside the given transition. If a JavaScript animation is detected then the provided styles + * will be given in as function paramters into the `animate` method (or as apart of the `options` parameter). + * + * @param {DOMElement} element the element which the CSS styles will be applied to + * @param {object} from the from (starting) CSS styles that will be applied to the element and across the animation. + * @param {object} to the to (destination) CSS styles that will be applied to the element and across the animation. + * @param {string=} className an optional CSS class that will be applied to the element for the duration of the animation. If + * this value is left as empty then a CSS class of `ng-inline-animate` will be applied to the element. + * (Note that if no animation is detected then this value will not be appplied to the element.) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + animate: function(element, from, to, className, options) { + options = prepareAnimateOptions(options); + options.from = options.from ? extend(options.from, from) : from; + options.to = options.to ? extend(options.to, to) : to; + + className = className || 'ng-inline-animate'; + options.tempClasses = mergeClasses(options.tempClasses, className); + return $$animateQueue.push(element, 'animate', options); + } + }; + }]; +}]; + +function $$AsyncCallbackProvider() { + this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) { + return $$rAF.supported + ? function(fn) { return $$rAF(fn); } + : function(fn) { + return $timeout(fn, 0, false); + }; + }]; +} + +/* global stripHash: true */ + +/** + * ! This is a private undocumented service ! + * + * @name $browser + * @requires $log + * @description + * This object has two goals: + * + * - hide all the global state in the browser caused by the window object + * - abstract away all the browser specific features and inconsistencies + * + * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` + * service, which can be used for convenient testing of the application without the interaction with + * the real browser apis. + */ +/** + * @param {object} window The global window object. + * @param {object} document jQuery wrapped document. + * @param {object} $log window.console or an object with the same interface. + * @param {object} $sniffer $sniffer service + */ +function Browser(window, document, $log, $sniffer) { + var self = this, + rawDocument = document[0], + location = window.location, + history = window.history, + setTimeout = window.setTimeout, + clearTimeout = window.clearTimeout, + pendingDeferIds = {}; + + self.isMock = false; + + var outstandingRequestCount = 0; + var outstandingRequestCallbacks = []; + + // TODO(vojta): remove this temporary api + self.$$completeOutstandingRequest = completeOutstandingRequest; + self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; + + /** + * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` + * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. + */ + function completeOutstandingRequest(fn) { + try { + fn.apply(null, sliceArgs(arguments, 1)); + } finally { + outstandingRequestCount--; + if (outstandingRequestCount === 0) { + while (outstandingRequestCallbacks.length) { + try { + outstandingRequestCallbacks.pop()(); + } catch (e) { + $log.error(e); + } + } + } + } + } + + function getHash(url) { + var index = url.indexOf('#'); + return index === -1 ? '' : url.substr(index); + } + + /** + * @private + * Note: this method is used only by scenario runner + * TODO(vojta): prefix this method with $$ ? + * @param {function()} callback Function that will be called when no outstanding request + */ + self.notifyWhenNoOutstandingRequests = function(callback) { + if (outstandingRequestCount === 0) { + callback(); + } else { + outstandingRequestCallbacks.push(callback); + } + }; + + ////////////////////////////////////////////////////////////// + // URL API + ////////////////////////////////////////////////////////////// + + var cachedState, lastHistoryState, + lastBrowserUrl = location.href, + baseElement = document.find('base'), + reloadLocation = null; + + cacheState(); + lastHistoryState = cachedState; + + /** + * @name $browser#url + * + * @description + * GETTER: + * Without any argument, this method just returns current value of location.href. + * + * SETTER: + * With at least one argument, this method sets url to new value. + * If html5 history api supported, pushState/replaceState is used, otherwise + * location.href/location.replace is used. + * Returns its own instance to allow chaining + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to change url. + * + * @param {string} url New url (when used as setter) + * @param {boolean=} replace Should new url replace current history record? + * @param {object=} state object to use with pushState/replaceState + */ + self.url = function(url, replace, state) { + // In modern browsers `history.state` is `null` by default; treating it separately + // from `undefined` would cause `$browser.url('/foo')` to change `history.state` + // to undefined via `pushState`. Instead, let's change `undefined` to `null` here. + if (isUndefined(state)) { + state = null; + } + + // Android Browser BFCache causes location, history reference to become stale. + if (location !== window.location) location = window.location; + if (history !== window.history) history = window.history; + + // setter + if (url) { + var sameState = lastHistoryState === state; + + // Don't change anything if previous and current URLs and states match. This also prevents + // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode. + // See https://github.com/angular/angular.js/commit/ffb2701 + if (lastBrowserUrl === url && (!$sniffer.history || sameState)) { + return self; + } + var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url); + lastBrowserUrl = url; + lastHistoryState = state; + // Don't use history API if only the hash changed + // due to a bug in IE10/IE11 which leads + // to not firing a `hashchange` nor `popstate` event + // in some cases (see #9143). + if ($sniffer.history && (!sameBase || !sameState)) { + history[replace ? 'replaceState' : 'pushState'](state, '', url); + cacheState(); + // Do the assignment again so that those two variables are referentially identical. + lastHistoryState = cachedState; + } else { + if (!sameBase || reloadLocation) { + reloadLocation = url; + } + if (replace) { + location.replace(url); + } else if (!sameBase) { + location.href = url; + } else { + location.hash = getHash(url); + } + } + return self; + // getter + } else { + // - reloadLocation is needed as browsers don't allow to read out + // the new location.href if a reload happened. + // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 + return reloadLocation || location.href.replace(/%27/g,"'"); + } + }; + + /** + * @name $browser#state + * + * @description + * This method is a getter. + * + * Return history.state or null if history.state is undefined. + * + * @returns {object} state + */ + self.state = function() { + return cachedState; + }; + + var urlChangeListeners = [], + urlChangeInit = false; + + function cacheStateAndFireUrlChange() { + cacheState(); + fireUrlChange(); + } + + function getCurrentState() { + try { + return history.state; + } catch (e) { + // MSIE can reportedly throw when there is no state (UNCONFIRMED). + } + } + + // This variable should be used *only* inside the cacheState function. + var lastCachedState = null; + function cacheState() { + // This should be the only place in $browser where `history.state` is read. + cachedState = getCurrentState(); + cachedState = isUndefined(cachedState) ? null : cachedState; + + // Prevent callbacks fo fire twice if both hashchange & popstate were fired. + if (equals(cachedState, lastCachedState)) { + cachedState = lastCachedState; + } + lastCachedState = cachedState; + } + + function fireUrlChange() { + if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) { + return; + } + + lastBrowserUrl = self.url(); + lastHistoryState = cachedState; + forEach(urlChangeListeners, function(listener) { + listener(self.url(), cachedState); + }); + } + + /** + * @name $browser#onUrlChange + * + * @description + * Register callback function that will be called, when url changes. + * + * It's only called when the url is changed from outside of angular: + * - user types different url into address bar + * - user clicks on history (forward/back) button + * - user clicks on a link + * + * It's not called when url is changed by $browser.url() method + * + * The listener gets called with new url as parameter. + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to monitor url changes in angular apps. + * + * @param {function(string)} listener Listener function to be called when url changes. + * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. + */ + self.onUrlChange = function(callback) { + // TODO(vojta): refactor to use node's syntax for events + if (!urlChangeInit) { + // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) + // don't fire popstate when user change the address bar and don't fire hashchange when url + // changed by push/replaceState + + // html5 history api - popstate event + if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange); + // hashchange event + jqLite(window).on('hashchange', cacheStateAndFireUrlChange); + + urlChangeInit = true; + } + + urlChangeListeners.push(callback); + return callback; + }; + + /** + * @private + * Remove popstate and hashchange handler from window. + * + * NOTE: this api is intended for use only by $rootScope. + */ + self.$$applicationDestroyed = function() { + jqLite(window).off('hashchange popstate', cacheStateAndFireUrlChange); + }; + + /** + * Checks whether the url has changed outside of Angular. + * Needs to be exported to be able to check for changes that have been done in sync, + * as hashchange/popstate events fire in async. + */ + self.$$checkUrlChange = fireUrlChange; + + ////////////////////////////////////////////////////////////// + // Misc API + ////////////////////////////////////////////////////////////// + + /** + * @name $browser#baseHref + * + * @description + * Returns current + * (always relative - without domain) + * + * @returns {string} The current base href + */ + self.baseHref = function() { + var href = baseElement.attr('href'); + return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : ''; + }; + + /** + * @name $browser#defer + * @param {function()} fn A function, who's execution should be deferred. + * @param {number=} [delay=0] of milliseconds to defer the function execution. + * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. + * + * @description + * Executes a fn asynchronously via `setTimeout(fn, delay)`. + * + * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using + * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed + * via `$browser.defer.flush()`. + * + */ + self.defer = function(fn, delay) { + var timeoutId; + outstandingRequestCount++; + timeoutId = setTimeout(function() { + delete pendingDeferIds[timeoutId]; + completeOutstandingRequest(fn); + }, delay || 0); + pendingDeferIds[timeoutId] = true; + return timeoutId; + }; + + + /** + * @name $browser#defer.cancel + * + * @description + * Cancels a deferred task identified with `deferId`. + * + * @param {*} deferId Token returned by the `$browser.defer` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + self.defer.cancel = function(deferId) { + if (pendingDeferIds[deferId]) { + delete pendingDeferIds[deferId]; + clearTimeout(deferId); + completeOutstandingRequest(noop); + return true; + } + return false; + }; + +} + +function $BrowserProvider() { + this.$get = ['$window', '$log', '$sniffer', '$document', + function($window, $log, $sniffer, $document) { + return new Browser($window, $document, $log, $sniffer); + }]; +} + +/** + * @ngdoc service + * @name $cacheFactory + * + * @description + * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to + * them. + * + * ```js + * + * var cache = $cacheFactory('cacheId'); + * expect($cacheFactory.get('cacheId')).toBe(cache); + * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined(); + * + * cache.put("key", "value"); + * cache.put("another key", "another value"); + * + * // We've specified no options on creation + * expect(cache.info()).toEqual({id: 'cacheId', size: 2}); + * + * ``` + * + * + * @param {string} cacheId Name or id of the newly created cache. + * @param {object=} options Options object that specifies the cache behavior. Properties: + * + * - `{number=}` `capacity` — turns the cache into LRU cache. + * + * @returns {object} Newly created cache object with the following set of methods: + * + * - `{object}` `info()` — Returns id, size, and options of cache. + * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns + * it. + * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. + * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. + * - `{void}` `removeAll()` — Removes all cached values. + * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. + * + * @example + + +
    + + + + +

    Cached Values

    +
    + + : + +
    + +

    Cache Info

    +
    + + : + +
    +
    +
    + + angular.module('cacheExampleApp', []). + controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) { + $scope.keys = []; + $scope.cache = $cacheFactory('cacheId'); + $scope.put = function(key, value) { + if ($scope.cache.get(key) === undefined) { + $scope.keys.push(key); + } + $scope.cache.put(key, value === undefined ? null : value); + }; + }]); + + + p { + margin: 10px 0 3px; + } + +
    + */ +function $CacheFactoryProvider() { + + this.$get = function() { + var caches = {}; + + function cacheFactory(cacheId, options) { + if (cacheId in caches) { + throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId); + } + + var size = 0, + stats = extend({}, options, {id: cacheId}), + data = {}, + capacity = (options && options.capacity) || Number.MAX_VALUE, + lruHash = {}, + freshEnd = null, + staleEnd = null; + + /** + * @ngdoc type + * @name $cacheFactory.Cache + * + * @description + * A cache object used to store and retrieve data, primarily used by + * {@link $http $http} and the {@link ng.directive:script script} directive to cache + * templates and other data. + * + * ```js + * angular.module('superCache') + * .factory('superCache', ['$cacheFactory', function($cacheFactory) { + * return $cacheFactory('super-cache'); + * }]); + * ``` + * + * Example test: + * + * ```js + * it('should behave like a cache', inject(function(superCache) { + * superCache.put('key', 'value'); + * superCache.put('another key', 'another value'); + * + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 2 + * }); + * + * superCache.remove('another key'); + * expect(superCache.get('another key')).toBeUndefined(); + * + * superCache.removeAll(); + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 0 + * }); + * })); + * ``` + */ + return caches[cacheId] = { + + /** + * @ngdoc method + * @name $cacheFactory.Cache#put + * @kind function + * + * @description + * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be + * retrieved later, and incrementing the size of the cache if the key was not already + * present in the cache. If behaving like an LRU cache, it will also remove stale + * entries from the set. + * + * It will not insert undefined values into the cache. + * + * @param {string} key the key under which the cached data is stored. + * @param {*} value the value to store alongside the key. If it is undefined, the key + * will not be stored. + * @returns {*} the value stored. + */ + put: function(key, value) { + if (isUndefined(value)) return; + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); + + refresh(lruEntry); + } + + if (!(key in data)) size++; + data[key] = value; + + if (size > capacity) { + this.remove(staleEnd.key); + } + + return value; + }, + + /** + * @ngdoc method + * @name $cacheFactory.Cache#get + * @kind function + * + * @description + * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the data to be retrieved + * @returns {*} the value stored. + */ + get: function(key) { + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + refresh(lruEntry); + } + + return data[key]; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#remove + * @kind function + * + * @description + * Removes an entry from the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the entry to be removed + */ + remove: function(key) { + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + if (lruEntry == freshEnd) freshEnd = lruEntry.p; + if (lruEntry == staleEnd) staleEnd = lruEntry.n; + link(lruEntry.n,lruEntry.p); + + delete lruHash[key]; + } + + delete data[key]; + size--; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#removeAll + * @kind function + * + * @description + * Clears the cache object of any entries. + */ + removeAll: function() { + data = {}; + size = 0; + lruHash = {}; + freshEnd = staleEnd = null; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#destroy + * @kind function + * + * @description + * Destroys the {@link $cacheFactory.Cache Cache} object entirely, + * removing it from the {@link $cacheFactory $cacheFactory} set. + */ + destroy: function() { + data = null; + stats = null; + lruHash = null; + delete caches[cacheId]; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#info + * @kind function + * + * @description + * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}. + * + * @returns {object} an object with the following properties: + *
      + *
    • **id**: the id of the cache instance
    • + *
    • **size**: the number of entries kept in the cache instance
    • + *
    • **...**: any additional properties from the options object when creating the + * cache.
    • + *
    + */ + info: function() { + return extend({}, stats, {size: size}); + } + }; + + + /** + * makes the `entry` the freshEnd of the LRU linked list + */ + function refresh(entry) { + if (entry != freshEnd) { + if (!staleEnd) { + staleEnd = entry; + } else if (staleEnd == entry) { + staleEnd = entry.n; + } + + link(entry.n, entry.p); + link(entry, freshEnd); + freshEnd = entry; + freshEnd.n = null; + } + } + + + /** + * bidirectionally links two entries of the LRU linked list + */ + function link(nextEntry, prevEntry) { + if (nextEntry != prevEntry) { + if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify + if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify + } + } + } + + + /** + * @ngdoc method + * @name $cacheFactory#info + * + * @description + * Get information about all the caches that have been created + * + * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info` + */ + cacheFactory.info = function() { + var info = {}; + forEach(caches, function(cache, cacheId) { + info[cacheId] = cache.info(); + }); + return info; + }; + + + /** + * @ngdoc method + * @name $cacheFactory#get + * + * @description + * Get access to a cache object by the `cacheId` used when it was created. + * + * @param {string} cacheId Name or id of a cache to access. + * @returns {object} Cache object identified by the cacheId or undefined if no such cache. + */ + cacheFactory.get = function(cacheId) { + return caches[cacheId]; + }; + + + return cacheFactory; + }; +} + +/** + * @ngdoc service + * @name $templateCache + * + * @description + * The first time a template is used, it is loaded in the template cache for quick retrieval. You + * can load templates directly into the cache in a `script` tag, or by consuming the + * `$templateCache` service directly. + * + * Adding via the `script` tag: + * + * ```html + * + * ``` + * + * **Note:** the `script` tag containing the template does not need to be included in the `head` of + * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE, + * element with ng-app attribute), otherwise the template will be ignored. + * + * Adding via the `$templateCache` service: + * + * ```js + * var myApp = angular.module('myApp', []); + * myApp.run(function($templateCache) { + * $templateCache.put('templateId.html', 'This is the content of the template'); + * }); + * ``` + * + * To retrieve the template later, simply use it in your HTML: + * ```html + *
    + * ``` + * + * or get it via Javascript: + * ```js + * $templateCache.get('templateId.html') + * ``` + * + * See {@link ng.$cacheFactory $cacheFactory}. + * + */ +function $TemplateCacheProvider() { + this.$get = ['$cacheFactory', function($cacheFactory) { + return $cacheFactory('templates'); + }]; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! + * + * DOM-related variables: + * + * - "node" - DOM Node + * - "element" - DOM Element or Node + * - "$node" or "$element" - jqLite-wrapped node or element + * + * + * Compiler related stuff: + * + * - "linkFn" - linking fn of a single directive + * - "nodeLinkFn" - function that aggregates all linking fns for a particular node + * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node + * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) + */ + + +/** + * @ngdoc service + * @name $compile + * @kind function + * + * @description + * Compiles an HTML string or DOM into a template and produces a template function, which + * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together. + * + * The compilation is a process of walking the DOM tree and matching DOM elements to + * {@link ng.$compileProvider#directive directives}. + * + *
    + * **Note:** This document is an in-depth reference of all directive options. + * For a gentle introduction to directives with examples of common use cases, + * see the {@link guide/directive directive guide}. + *
    + * + * ## Comprehensive Directive API + * + * There are many different options for a directive. + * + * The difference resides in the return value of the factory function. + * You can either return a "Directive Definition Object" (see below) that defines the directive properties, + * or just the `postLink` function (all other properties will have the default values). + * + *
    + * **Best Practice:** It's recommended to use the "directive definition object" form. + *
    + * + * Here's an example directive declared with a Directive Definition Object: + * + * ```js + * var myModule = angular.module(...); + * + * myModule.directive('directiveName', function factory(injectables) { + * var directiveDefinitionObject = { + * priority: 0, + * template: '
    ', // or // function(tElement, tAttrs) { ... }, + * // or + * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... }, + * transclude: false, + * restrict: 'A', + * templateNamespace: 'html', + * scope: false, + * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, + * controllerAs: 'stringIdentifier', + * bindToController: false, + * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], + * compile: function compile(tElement, tAttrs, transclude) { + * return { + * pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * post: function postLink(scope, iElement, iAttrs, controller) { ... } + * } + * // or + * // return function postLink( ... ) { ... } + * }, + * // or + * // link: { + * // pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * // post: function postLink(scope, iElement, iAttrs, controller) { ... } + * // } + * // or + * // link: function postLink( ... ) { ... } + * }; + * return directiveDefinitionObject; + * }); + * ``` + * + *
    + * **Note:** Any unspecified options will use the default value. You can see the default values below. + *
    + * + * Therefore the above can be simplified as: + * + * ```js + * var myModule = angular.module(...); + * + * myModule.directive('directiveName', function factory(injectables) { + * var directiveDefinitionObject = { + * link: function postLink(scope, iElement, iAttrs) { ... } + * }; + * return directiveDefinitionObject; + * // or + * // return function postLink(scope, iElement, iAttrs) { ... } + * }); + * ``` + * + * + * + * ### Directive Definition Object + * + * The directive definition object provides instructions to the {@link ng.$compile + * compiler}. The attributes are: + * + * #### `multiElement` + * When this property is set to true, the HTML compiler will collect DOM nodes between + * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them + * together as the directive elements. It is recommended that this feature be used on directives + * which are not strictly behavioural (such as {@link ngClick}), and which + * do not manipulate or replace child nodes (such as {@link ngInclude}). + * + * #### `priority` + * When there are multiple directives defined on a single DOM element, sometimes it + * is necessary to specify the order in which the directives are applied. The `priority` is used + * to sort the directives before their `compile` functions get called. Priority is defined as a + * number. Directives with greater numerical `priority` are compiled first. Pre-link functions + * are also run in priority order, but post-link functions are run in reverse order. The order + * of directives with the same priority is undefined. The default priority is `0`. + * + * #### `terminal` + * If set to true then the current `priority` will be the last set of directives + * which will execute (any directives at the current priority will still execute + * as the order of execution on same `priority` is undefined). Note that expressions + * and other directives used in the directive's template will also be excluded from execution. + * + * #### `scope` + * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the + * same element request a new scope, only one new scope is created. The new scope rule does not + * apply for the root of the template since the root of the template always gets a new scope. + * + * **If set to `{}` (object hash),** then a new "isolate" scope is created. The 'isolate' scope differs from + * normal scope in that it does not prototypically inherit from the parent scope. This is useful + * when creating reusable components, which should not accidentally read or modify data in the + * parent scope. + * + * The 'isolate' scope takes an object hash which defines a set of local scope properties + * derived from the parent scope. These local properties are useful for aliasing values for + * templates. Locals definition is a hash of local scope property to its source: + * + * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is + * always a string since DOM attributes are strings. If no `attr` name is specified then the + * attribute name is assumed to be the same as the local name. + * Given `` and widget definition + * of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect + * the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the + * `localName` property on the widget scope. The `name` is read from the parent scope (not + * component scope). + * + * * `=` or `=attr` - set up bi-directional binding between a local scope property and the + * parent scope property of name defined via the value of the `attr` attribute. If no `attr` + * name is specified then the attribute name is assumed to be the same as the local name. + * Given `` and widget definition of + * `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the + * value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected + * in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent + * scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You + * can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional. If + * you want to shallow watch for changes (i.e. $watchCollection instead of $watch) you can use + * `=*` or `=*attr` (`=*?` or `=*?attr` if the property is optional). + * + * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope. + * If no `attr` name is specified then the attribute name is assumed to be the same as the + * local name. Given `` and widget definition of + * `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to + * a function wrapper for the `count = count + value` expression. Often it's desirable to + * pass data from the isolated scope via an expression to the parent scope, this can be + * done by passing a map of local variable names and values into the expression wrapper fn. + * For example, if the expression is `increment(amount)` then we can specify the amount value + * by calling the `localFn` as `localFn({amount: 22})`. + * + * + * #### `bindToController` + * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController: true` will + * allow a component to have its properties bound to the controller, rather than to scope. When the controller + * is instantiated, the initial values of the isolate scope bindings are already available. + * + * #### `controller` + * Controller constructor function. The controller is instantiated before the + * pre-linking phase and it is shared with other directives (see + * `require` attribute). This allows the directives to communicate with each other and augment + * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals: + * + * * `$scope` - Current scope associated with the element + * * `$element` - Current element + * * `$attrs` - Current attributes object for the element + * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope: + * `function([scope], cloneLinkingFn, futureParentElement)`. + * * `scope`: optional argument to override the scope. + * * `cloneLinkingFn`: optional argument to create clones of the original transcluded content. + * * `futureParentElement`: + * * defines the parent to which the `cloneLinkingFn` will add the cloned elements. + * * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`. + * * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements) + * and when the `cloneLinkinFn` is passed, + * as those elements need to created and cloned in a special way when they are defined outside their + * usual containers (e.g. like ``). + * * See also the `directive.templateNamespace` property. + * + * + * #### `require` + * Require another directive and inject its controller as the fourth argument to the linking function. The + * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the + * injected argument will be an array in corresponding order. If no such directive can be + * found, or if the directive does not have a controller, then an error is raised (unless no link function + * is specified, in which case error checking is skipped). The name can be prefixed with: + * + * * (no prefix) - Locate the required controller on the current element. Throw an error if not found. + * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found. + * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found. + * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found. + * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass + * `null` to the `link` fn if not found. + * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass + * `null` to the `link` fn if not found. + * + * + * #### `controllerAs` + * Identifier name for a reference to the controller in the directive's scope. + * This allows the controller to be referenced from the directive template. The directive + * needs to define a scope for this configuration to be used. Useful in the case when + * directive is used as component. + * + * + * #### `restrict` + * String of subset of `EACM` which restricts the directive to a specific directive + * declaration style. If omitted, the defaults (elements and attributes) are used. + * + * * `E` - Element name (default): `` + * * `A` - Attribute (default): `
    ` + * * `C` - Class: `
    ` + * * `M` - Comment: `` + * + * + * #### `templateNamespace` + * String representing the document type used by the markup in the template. + * AngularJS needs this information as those elements need to be created and cloned + * in a special way when they are defined outside their usual containers like `` and ``. + * + * * `html` - All root nodes in the template are HTML. Root nodes may also be + * top-level elements such as `` or ``. + * * `svg` - The root nodes in the template are SVG elements (excluding ``). + * * `math` - The root nodes in the template are MathML elements (excluding ``). + * + * If no `templateNamespace` is specified, then the namespace is considered to be `html`. + * + * #### `template` + * HTML markup that may: + * * Replace the contents of the directive's element (default). + * * Replace the directive's element itself (if `replace` is true - DEPRECATED). + * * Wrap the contents of the directive's element (if `transclude` is true). + * + * Value may be: + * + * * A string. For example `
    {{delete_str}}
    `. + * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile` + * function api below) and returns a string value. + * + * + * #### `templateUrl` + * This is similar to `template` but the template is loaded from the specified URL, asynchronously. + * + * Because template loading is asynchronous the compiler will suspend compilation of directives on that element + * for later when the template has been resolved. In the meantime it will continue to compile and link + * sibling and parent elements as though this element had not contained any directives. + * + * The compiler does not suspend the entire compilation to wait for templates to be loaded because this + * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the + * case when only one deeply nested directive has `templateUrl`. + * + * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache} + * + * You can specify `templateUrl` as a string representing the URL or as a function which takes two + * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns + * a string value representing the url. In either case, the template URL is passed through {@link + * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}. + * + * + * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0) + * specify what the template should replace. Defaults to `false`. + * + * * `true` - the template will replace the directive's element. + * * `false` - the template will replace the contents of the directive's element. + * + * The replacement process migrates all of the attributes / classes from the old element to the new + * one. See the {@link guide/directive#template-expanding-directive + * Directives Guide} for an example. + * + * There are very few scenarios where element replacement is required for the application function, + * the main one being reusable custom components that are used within SVG contexts + * (because SVG doesn't work with custom elements in the DOM tree). + * + * #### `transclude` + * Extract the contents of the element where the directive appears and make it available to the directive. + * The contents are compiled and provided to the directive as a **transclusion function**. See the + * {@link $compile#transclusion Transclusion} section below. + * + * There are two kinds of transclusion depending upon whether you want to transclude just the contents of the + * directive's element or the entire element: + * + * * `true` - transclude the content (i.e. the child nodes) of the directive's element. + * * `'element'` - transclude the whole of the directive's element including any directives on this + * element that defined at a lower priority than this directive. When used, the `template` + * property is ignored. + * + * + * #### `compile` + * + * ```js + * function compile(tElement, tAttrs, transclude) { ... } + * ``` + * + * The compile function deals with transforming the template DOM. Since most directives do not do + * template transformation, it is not used often. The compile function takes the following arguments: + * + * * `tElement` - template element - The element where the directive has been declared. It is + * safe to do template transformation on the element and child elements only. + * + * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared + * between all directive compile functions. + * + * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)` + * + *
    + * **Note:** The template instance and the link instance may be different objects if the template has + * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that + * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration + * should be done in a linking function rather than in a compile function. + *
    + + *
    + * **Note:** The compile function cannot handle directives that recursively use themselves in their + * own templates or compile functions. Compiling these directives results in an infinite loop and a + * stack overflow errors. + * + * This can be avoided by manually using $compile in the postLink function to imperatively compile + * a directive's template instead of relying on automatic template compilation via `template` or + * `templateUrl` declaration or manual compilation inside the compile function. + *
    + * + *
    + * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it + * e.g. does not know about the right outer scope. Please use the transclude function that is passed + * to the link function instead. + *
    + + * A compile function can have a return value which can be either a function or an object. + * + * * returning a (post-link) function - is equivalent to registering the linking function via the + * `link` property of the config object when the compile function is empty. + * + * * returning an object with function(s) registered via `pre` and `post` properties - allows you to + * control when a linking function should be called during the linking phase. See info about + * pre-linking and post-linking functions below. + * + * + * #### `link` + * This property is used only if the `compile` property is not defined. + * + * ```js + * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... } + * ``` + * + * The link function is responsible for registering DOM listeners as well as updating the DOM. It is + * executed after the template has been cloned. This is where most of the directive logic will be + * put. + * + * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the + * directive for registering {@link ng.$rootScope.Scope#$watch watches}. + * + * * `iElement` - instance element - The element where the directive is to be used. It is safe to + * manipulate the children of the element only in `postLink` function since the children have + * already been linked. + * + * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared + * between all directive linking functions. + * + * * `controller` - the directive's required controller instance(s) - Instances are shared + * among all directives, which allows the directives to use the controllers as a communication + * channel. The exact value depends on the directive's `require` property: + * * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one + * * `string`: the controller instance + * * `array`: array of controller instances + * + * If a required controller cannot be found, and it is optional, the instance is `null`, + * otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown. + * + * Note that you can also require the directive's own controller - it will be made available like + * like any other controller. + * + * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope. + * This is the same as the `$transclude` + * parameter of directive controllers, see there for details. + * `function([scope], cloneLinkingFn, futureParentElement)`. + * + * #### Pre-linking function + * + * Executed before the child elements are linked. Not safe to do DOM transformation since the + * compiler linking function will fail to locate the correct elements for linking. + * + * #### Post-linking function + * + * Executed after the child elements are linked. + * + * Note that child elements that contain `templateUrl` directives will not have been compiled + * and linked since they are waiting for their template to load asynchronously and their own + * compilation and linking has been suspended until that occurs. + * + * It is safe to do DOM transformation in the post-linking function on elements that are not waiting + * for their async templates to be resolved. + * + * + * ### Transclusion + * + * Transclusion is the process of extracting a collection of DOM element from one part of the DOM and + * copying them to another part of the DOM, while maintaining their connection to the original AngularJS + * scope from where they were taken. + * + * Transclusion is used (often with {@link ngTransclude}) to insert the + * original contents of a directive's element into a specified place in the template of the directive. + * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded + * content has access to the properties on the scope from which it was taken, even if the directive + * has isolated scope. + * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}. + * + * This makes it possible for the widget to have private state for its template, while the transcluded + * content has access to its originating scope. + * + *
    + * **Note:** When testing an element transclude directive you must not place the directive at the root of the + * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives + * Testing Transclusion Directives}. + *
    + * + * #### Transclusion Functions + * + * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion + * function** to the directive's `link` function and `controller`. This transclusion function is a special + * **linking function** that will return the compiled contents linked to a new transclusion scope. + * + *
    + * If you are just using {@link ngTransclude} then you don't need to worry about this function, since + * ngTransclude will deal with it for us. + *
    + * + * If you want to manually control the insertion and removal of the transcluded content in your directive + * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery + * object that contains the compiled DOM, which is linked to the correct transclusion scope. + * + * When you call a transclusion function you can pass in a **clone attach function**. This function accepts + * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded + * content and the `scope` is the newly created transclusion scope, to which the clone is bound. + * + *
    + * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a translude function + * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope. + *
    + * + * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone + * attach function**: + * + * ```js + * var transcludedContent, transclusionScope; + * + * $transclude(function(clone, scope) { + * element.append(clone); + * transcludedContent = clone; + * transclusionScope = scope; + * }); + * ``` + * + * Later, if you want to remove the transcluded content from your DOM then you should also destroy the + * associated transclusion scope: + * + * ```js + * transcludedContent.remove(); + * transclusionScope.$destroy(); + * ``` + * + *
    + * **Best Practice**: if you intend to add and remove transcluded content manually in your directive + * (by calling the transclude function to get the DOM and calling `element.remove()` to remove it), + * then you are also responsible for calling `$destroy` on the transclusion scope. + *
    + * + * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat} + * automatically destroy their transluded clones as necessary so you do not need to worry about this if + * you are simply using {@link ngTransclude} to inject the transclusion into your directive. + * + * + * #### Transclusion Scopes + * + * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion + * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed + * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it + * was taken. + * + * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look + * like this: + * + * ```html + *
    + *
    + *
    + *
    + *
    + *
    + * ``` + * + * The `$parent` scope hierarchy will look like this: + * + * ``` + * - $rootScope + * - isolate + * - transclusion + * ``` + * + * but the scopes will inherit prototypically from different scopes to their `$parent`. + * + * ``` + * - $rootScope + * - transclusion + * - isolate + * ``` + * + * + * ### Attributes + * + * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the + * `link()` or `compile()` functions. It has a variety of uses. + * + * accessing *Normalized attribute names:* + * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'. + * the attributes object allows for normalized access to + * the attributes. + * + * * *Directive inter-communication:* All directives share the same instance of the attributes + * object which allows the directives to use the attributes object as inter directive + * communication. + * + * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object + * allowing other directives to read the interpolated value. + * + * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes + * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also + * the only way to easily get the actual value because during the linking phase the interpolation + * hasn't been evaluated yet and so the value is at this time set to `undefined`. + * + * ```js + * function linkingFn(scope, elm, attrs, ctrl) { + * // get the attribute value + * console.log(attrs.ngModel); + * + * // change the attribute + * attrs.$set('ngModel', 'new value'); + * + * // observe changes to interpolated attribute + * attrs.$observe('ngModel', function(value) { + * console.log('ngModel has changed value to ' + value); + * }); + * } + * ``` + * + * ## Example + * + *
    + * **Note**: Typically directives are registered with `module.directive`. The example below is + * to illustrate how `$compile` works. + *
    + * + + + +
    +
    +
    +
    +
    +
    + + it('should auto compile', function() { + var textarea = $('textarea'); + var output = $('div[compile]'); + // The initial state reads 'Hello Angular'. + expect(output.getText()).toBe('Hello Angular'); + textarea.clear(); + textarea.sendKeys('{{name}}!'); + expect(output.getText()).toBe('Angular!'); + }); + +
    + + * + * + * @param {string|DOMElement} element Element or HTML string to compile into a template function. + * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED. + * + *
    + * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it + * e.g. will not use the right outer scope. Please pass the transclude function as a + * `parentBoundTranscludeFn` to the link function instead. + *
    + * + * @param {number} maxPriority only apply directives lower than given priority (Only effects the + * root element(s), not their children) + * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template + * (a DOM element/tree) to a scope. Where: + * + * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. + * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the + * `template` and call the `cloneAttachFn` function allowing the caller to attach the + * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is + * called as:
    `cloneAttachFn(clonedElement, scope)` where: + * + * * `clonedElement` - is a clone of the original `element` passed into the compiler. + * * `scope` - is the current scope with which the linking function is working with. + * + * * `options` - An optional object hash with linking options. If `options` is provided, then the following + * keys may be used to control linking behavior: + * + * * `parentBoundTranscludeFn` - the transclude function made available to + * directives; if given, it will be passed through to the link functions of + * directives found in `element` during compilation. + * * `transcludeControllers` - an object hash with keys that map controller names + * to controller instances; if given, it will make the controllers + * available to directives. + * * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add + * the cloned elements; only needed for transcludes that are allowed to contain non html + * elements (e.g. SVG elements). See also the directive.controller property. + * + * Calling the linking function returns the element of the template. It is either the original + * element passed in, or the clone of the element if the `cloneAttachFn` is provided. + * + * After linking the view is not updated until after a call to $digest which typically is done by + * Angular automatically. + * + * If you need access to the bound view, there are two ways to do it: + * + * - If you are not asking the linking function to clone the template, create the DOM element(s) + * before you send them to the compiler and keep this reference around. + * ```js + * var element = $compile('

    {{total}}

    ')(scope); + * ``` + * + * - if on the other hand, you need the element to be cloned, the view reference from the original + * example would not point to the clone, but rather to the original template that was cloned. In + * this case, you can access the clone via the cloneAttachFn: + * ```js + * var templateElement = angular.element('

    {{total}}

    '), + * scope = ....; + * + * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) { + * //attach the clone to DOM document at the right place + * }); + * + * //now we have reference to the cloned DOM via `clonedElement` + * ``` + * + * + * For information on how the compiler works, see the + * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. + */ + +var $compileMinErr = minErr('$compile'); + +/** + * @ngdoc provider + * @name $compileProvider + * + * @description + */ +$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; +function $CompileProvider($provide, $$sanitizeUriProvider) { + var hasDirectives = {}, + Suffix = 'Directive', + COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\w\-]+)\s+(.*)$/, + CLASS_DIRECTIVE_REGEXP = /(([\w\-]+)(?:\:([^;]+))?;?)/, + ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'), + REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/; + + // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes + // The assumption is that future DOM event attribute names will begin with + // 'on' and be composed of only English letters. + var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; + + function parseIsolateBindings(scope, directiveName, isController) { + var LOCAL_REGEXP = /^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/; + + var bindings = {}; + + forEach(scope, function(definition, scopeName) { + var match = definition.match(LOCAL_REGEXP); + + if (!match) { + throw $compileMinErr('iscp', + "Invalid {3} for directive '{0}'." + + " Definition: {... {1}: '{2}' ...}", + directiveName, scopeName, definition, + (isController ? "controller bindings definition" : + "isolate scope definition")); + } + + bindings[scopeName] = { + mode: match[1][0], + collection: match[2] === '*', + optional: match[3] === '?', + attrName: match[4] || scopeName + }; + }); + + return bindings; + } + + function parseDirectiveBindings(directive, directiveName) { + var bindings = { + isolateScope: null, + bindToController: null + }; + if (isObject(directive.scope)) { + if (directive.bindToController === true) { + bindings.bindToController = parseIsolateBindings(directive.scope, + directiveName, true); + bindings.isolateScope = {}; + } else { + bindings.isolateScope = parseIsolateBindings(directive.scope, + directiveName, false); + } + } + if (isObject(directive.bindToController)) { + bindings.bindToController = + parseIsolateBindings(directive.bindToController, directiveName, true); + } + if (isObject(bindings.bindToController)) { + var controller = directive.controller; + var controllerAs = directive.controllerAs; + if (!controller) { + // There is no controller, there may or may not be a controllerAs property + throw $compileMinErr('noctrl', + "Cannot bind to controller without directive '{0}'s controller.", + directiveName); + } else if (!identifierForController(controller, controllerAs)) { + // There is a controller, but no identifier or controllerAs property + throw $compileMinErr('noident', + "Cannot bind to controller without identifier for directive '{0}'.", + directiveName); + } + } + return bindings; + } + + function assertValidDirectiveName(name) { + var letter = name.charAt(0); + if (!letter || letter !== lowercase(letter)) { + throw $compileMinErr('baddir', "Directive name '{0}' is invalid. The first character must be a lowercase letter", name); + } + if (name !== name.trim()) { + throw $compileMinErr('baddir', + "Directive name '{0}' is invalid. The name should not contain leading or trailing whitespaces", + name); + } + } + + /** + * @ngdoc method + * @name $compileProvider#directive + * @kind function + * + * @description + * Register a new directive with the compiler. + * + * @param {string|Object} name Name of the directive in camel-case (i.e. ngBind which + * will match as ng-bind), or an object map of directives where the keys are the + * names and the values are the factories. + * @param {Function|Array} directiveFactory An injectable directive factory function. See + * {@link guide/directive} for more info. + * @returns {ng.$compileProvider} Self for chaining. + */ + this.directive = function registerDirective(name, directiveFactory) { + assertNotHasOwnProperty(name, 'directive'); + if (isString(name)) { + assertValidDirectiveName(name); + assertArg(directiveFactory, 'directiveFactory'); + if (!hasDirectives.hasOwnProperty(name)) { + hasDirectives[name] = []; + $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', + function($injector, $exceptionHandler) { + var directives = []; + forEach(hasDirectives[name], function(directiveFactory, index) { + try { + var directive = $injector.invoke(directiveFactory); + if (isFunction(directive)) { + directive = { compile: valueFn(directive) }; + } else if (!directive.compile && directive.link) { + directive.compile = valueFn(directive.link); + } + directive.priority = directive.priority || 0; + directive.index = index; + directive.name = directive.name || name; + directive.require = directive.require || (directive.controller && directive.name); + directive.restrict = directive.restrict || 'EA'; + var bindings = directive.$$bindings = + parseDirectiveBindings(directive, directive.name); + if (isObject(bindings.isolateScope)) { + directive.$$isolateBindings = bindings.isolateScope; + } + directive.$$moduleName = directiveFactory.$$moduleName; + directives.push(directive); + } catch (e) { + $exceptionHandler(e); + } + }); + return directives; + }]); + } + hasDirectives[name].push(directiveFactory); + } else { + forEach(name, reverseParams(registerDirective)); + } + return this; + }; + + + /** + * @ngdoc method + * @name $compileProvider#aHrefSanitizationWhitelist + * @kind function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at preventing XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.aHrefSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.aHrefSanitizationWhitelist(); + } + }; + + + /** + * @ngdoc method + * @name $compileProvider#imgSrcSanitizationWhitelist + * @kind function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during img[src] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.imgSrcSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.imgSrcSanitizationWhitelist(); + } + }; + + /** + * @ngdoc method + * @name $compileProvider#debugInfoEnabled + * + * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the + * current debugInfoEnabled state + * @returns {*} current value if used as getter or itself (chaining) if used as setter + * + * @kind function + * + * @description + * Call this method to enable/disable various debug runtime information in the compiler such as adding + * binding information and a reference to the current scope on to DOM elements. + * If enabled, the compiler will add the following to DOM elements that have been bound to the scope + * * `ng-binding` CSS class + * * `$binding` data property containing an array of the binding expressions + * + * You may want to disable this in production for a significant performance boost. See + * {@link guide/production#disabling-debug-data Disabling Debug Data} for more. + * + * The default value is true. + */ + var debugInfoEnabled = true; + this.debugInfoEnabled = function(enabled) { + if (isDefined(enabled)) { + debugInfoEnabled = enabled; + return this; + } + return debugInfoEnabled; + }; + + this.$get = [ + '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse', + '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri', + function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse, + $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) { + + var Attributes = function(element, attributesToCopy) { + if (attributesToCopy) { + var keys = Object.keys(attributesToCopy); + var i, l, key; + + for (i = 0, l = keys.length; i < l; i++) { + key = keys[i]; + this[key] = attributesToCopy[key]; + } + } else { + this.$attr = {}; + } + + this.$$element = element; + }; + + Attributes.prototype = { + /** + * @ngdoc method + * @name $compile.directive.Attributes#$normalize + * @kind function + * + * @description + * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or + * `data-`) to its normalized, camelCase form. + * + * Also there is special case for Moz prefix starting with upper case letter. + * + * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} + * + * @param {string} name Name to normalize + */ + $normalize: directiveNormalize, + + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$addClass + * @kind function + * + * @description + * Adds the CSS class value specified by the classVal parameter to the element. If animations + * are enabled then an animation will be triggered for the class addition. + * + * @param {string} classVal The className value that will be added to the element + */ + $addClass: function(classVal) { + if (classVal && classVal.length > 0) { + $animate.addClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$removeClass + * @kind function + * + * @description + * Removes the CSS class value specified by the classVal parameter from the element. If + * animations are enabled then an animation will be triggered for the class removal. + * + * @param {string} classVal The className value that will be removed from the element + */ + $removeClass: function(classVal) { + if (classVal && classVal.length > 0) { + $animate.removeClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$updateClass + * @kind function + * + * @description + * Adds and removes the appropriate CSS class values to the element based on the difference + * between the new and old CSS class values (specified as newClasses and oldClasses). + * + * @param {string} newClasses The current CSS className value + * @param {string} oldClasses The former CSS className value + */ + $updateClass: function(newClasses, oldClasses) { + var toAdd = tokenDifference(newClasses, oldClasses); + if (toAdd && toAdd.length) { + $animate.addClass(this.$$element, toAdd); + } + + var toRemove = tokenDifference(oldClasses, newClasses); + if (toRemove && toRemove.length) { + $animate.removeClass(this.$$element, toRemove); + } + }, + + /** + * Set a normalized attribute on the element in a way such that all directives + * can share the attribute. This function properly handles boolean attributes. + * @param {string} key Normalized key. (ie ngAttribute) + * @param {string|boolean} value The value to set. If `null` attribute will be deleted. + * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. + * Defaults to true. + * @param {string=} attrName Optional none normalized name. Defaults to key. + */ + $set: function(key, value, writeAttr, attrName) { + // TODO: decide whether or not to throw an error if "class" + //is set through this function since it may cause $updateClass to + //become unstable. + + var node = this.$$element[0], + booleanKey = getBooleanAttrName(node, key), + aliasedKey = getAliasedAttrName(node, key), + observer = key, + nodeName; + + if (booleanKey) { + this.$$element.prop(key, value); + attrName = booleanKey; + } else if (aliasedKey) { + this[aliasedKey] = value; + observer = aliasedKey; + } + + this[key] = value; + + // translate normalized key to actual key + if (attrName) { + this.$attr[key] = attrName; + } else { + attrName = this.$attr[key]; + if (!attrName) { + this.$attr[key] = attrName = snake_case(key, '-'); + } + } + + nodeName = nodeName_(this.$$element); + + if ((nodeName === 'a' && key === 'href') || + (nodeName === 'img' && key === 'src')) { + // sanitize a[href] and img[src] values + this[key] = value = $$sanitizeUri(value, key === 'src'); + } else if (nodeName === 'img' && key === 'srcset') { + // sanitize img[srcset] values + var result = ""; + + // first check if there are spaces because it's not the same pattern + var trimmedSrcset = trim(value); + // ( 999x ,| 999w ,| ,|, ) + var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/; + var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/; + + // split srcset into tuple of uri and descriptor except for the last item + var rawUris = trimmedSrcset.split(pattern); + + // for each tuples + var nbrUrisWith2parts = Math.floor(rawUris.length / 2); + for (var i = 0; i < nbrUrisWith2parts; i++) { + var innerIdx = i * 2; + // sanitize the uri + result += $$sanitizeUri(trim(rawUris[innerIdx]), true); + // add the descriptor + result += (" " + trim(rawUris[innerIdx + 1])); + } + + // split the last item into uri and descriptor + var lastTuple = trim(rawUris[i * 2]).split(/\s/); + + // sanitize the last uri + result += $$sanitizeUri(trim(lastTuple[0]), true); + + // and add the last descriptor if any + if (lastTuple.length === 2) { + result += (" " + trim(lastTuple[1])); + } + this[key] = value = result; + } + + if (writeAttr !== false) { + if (value === null || value === undefined) { + this.$$element.removeAttr(attrName); + } else { + this.$$element.attr(attrName, value); + } + } + + // fire observers + var $$observers = this.$$observers; + $$observers && forEach($$observers[observer], function(fn) { + try { + fn(value); + } catch (e) { + $exceptionHandler(e); + } + }); + }, + + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$observe + * @kind function + * + * @description + * Observes an interpolated attribute. + * + * The observer function will be invoked once during the next `$digest` following + * compilation. The observer is then invoked whenever the interpolated value + * changes. + * + * @param {string} key Normalized key. (ie ngAttribute) . + * @param {function(interpolatedValue)} fn Function that will be called whenever + the interpolated value of the attribute changes. + * See the {@link guide/directive#text-and-attribute-bindings Directives} guide for more info. + * @returns {function()} Returns a deregistration function for this observer. + */ + $observe: function(key, fn) { + var attrs = this, + $$observers = (attrs.$$observers || (attrs.$$observers = createMap())), + listeners = ($$observers[key] || ($$observers[key] = [])); + + listeners.push(fn); + $rootScope.$evalAsync(function() { + if (!listeners.$$inter && attrs.hasOwnProperty(key)) { + // no one registered attribute interpolation function, so lets call it manually + fn(attrs[key]); + } + }); + + return function() { + arrayRemove(listeners, fn); + }; + } + }; + + + function safeAddClass($element, className) { + try { + $element.addClass(className); + } catch (e) { + // ignore, since it means that we are trying to set class on + // SVG element, where class name is read-only. + } + } + + + var startSymbol = $interpolate.startSymbol(), + endSymbol = $interpolate.endSymbol(), + denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}') + ? identity + : function denormalizeTemplate(template) { + return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); + }, + NG_ATTR_BINDING = /^ngAttr[A-Z]/; + + compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) { + var bindings = $element.data('$binding') || []; + + if (isArray(binding)) { + bindings = bindings.concat(binding); + } else { + bindings.push(binding); + } + + $element.data('$binding', bindings); + } : noop; + + compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) { + safeAddClass($element, 'ng-binding'); + } : noop; + + compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) { + var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope'; + $element.data(dataName, scope); + } : noop; + + compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) { + safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope'); + } : noop; + + return compile; + + //================================ + + function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, + previousCompileContext) { + if (!($compileNodes instanceof jqLite)) { + // jquery always rewraps, whereas we need to preserve the original selector so that we can + // modify it. + $compileNodes = jqLite($compileNodes); + } + // We can not compile top level text elements since text nodes can be merged and we will + // not be able to attach scope data to them, so we will wrap them in + forEach($compileNodes, function(node, index) { + if (node.nodeType == NODE_TYPE_TEXT && node.nodeValue.match(/\S+/) /* non-empty */ ) { + $compileNodes[index] = jqLite(node).wrap('').parent()[0]; + } + }); + var compositeLinkFn = + compileNodes($compileNodes, transcludeFn, $compileNodes, + maxPriority, ignoreDirective, previousCompileContext); + compile.$$addScopeClass($compileNodes); + var namespace = null; + return function publicLinkFn(scope, cloneConnectFn, options) { + assertArg(scope, 'scope'); + + options = options || {}; + var parentBoundTranscludeFn = options.parentBoundTranscludeFn, + transcludeControllers = options.transcludeControllers, + futureParentElement = options.futureParentElement; + + // When `parentBoundTranscludeFn` is passed, it is a + // `controllersBoundTransclude` function (it was previously passed + // as `transclude` to directive.link) so we must unwrap it to get + // its `boundTranscludeFn` + if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) { + parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude; + } + + if (!namespace) { + namespace = detectNamespaceForChildElements(futureParentElement); + } + var $linkNode; + if (namespace !== 'html') { + // When using a directive with replace:true and templateUrl the $compileNodes + // (or a child element inside of them) + // might change, so we need to recreate the namespace adapted compileNodes + // for call to the link function. + // Note: This will already clone the nodes... + $linkNode = jqLite( + wrapTemplate(namespace, jqLite('
    ').append($compileNodes).html()) + ); + } else if (cloneConnectFn) { + // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart + // and sometimes changes the structure of the DOM. + $linkNode = JQLitePrototype.clone.call($compileNodes); + } else { + $linkNode = $compileNodes; + } + + if (transcludeControllers) { + for (var controllerName in transcludeControllers) { + $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance); + } + } + + compile.$$addScopeInfo($linkNode, scope); + + if (cloneConnectFn) cloneConnectFn($linkNode, scope); + if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn); + return $linkNode; + }; + } + + function detectNamespaceForChildElements(parentElement) { + // TODO: Make this detect MathML as well... + var node = parentElement && parentElement[0]; + if (!node) { + return 'html'; + } else { + return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg' : 'html'; + } + } + + /** + * Compile function matches each node in nodeList against the directives. Once all directives + * for a particular node are collected their compile functions are executed. The compile + * functions return values - the linking functions - are combined into a composite linking + * function, which is the a linking function for the node. + * + * @param {NodeList} nodeList an array of nodes or NodeList to compile + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the + * scope argument is auto-generated to the new child of the transcluded parent scope. + * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then + * the rootElement must be set the jqLite collection of the compile root. This is + * needed so that the jqLite collection items can be replaced with widgets. + * @param {number=} maxPriority Max directive priority. + * @returns {Function} A composite linking function of all of the matched directives or null. + */ + function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, + previousCompileContext) { + var linkFns = [], + attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound; + + for (var i = 0; i < nodeList.length; i++) { + attrs = new Attributes(); + + // we must always refer to nodeList[i] since the nodes can be replaced underneath us. + directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined, + ignoreDirective); + + nodeLinkFn = (directives.length) + ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement, + null, [], [], previousCompileContext) + : null; + + if (nodeLinkFn && nodeLinkFn.scope) { + compile.$$addScopeClass(attrs.$$element); + } + + childLinkFn = (nodeLinkFn && nodeLinkFn.terminal || + !(childNodes = nodeList[i].childNodes) || + !childNodes.length) + ? null + : compileNodes(childNodes, + nodeLinkFn ? ( + (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement) + && nodeLinkFn.transclude) : transcludeFn); + + if (nodeLinkFn || childLinkFn) { + linkFns.push(i, nodeLinkFn, childLinkFn); + linkFnFound = true; + nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn; + } + + //use the previous context only for the first element in the virtual group + previousCompileContext = null; + } + + // return a linking function if we have found anything, null otherwise + return linkFnFound ? compositeLinkFn : null; + + function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) { + var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn; + var stableNodeList; + + + if (nodeLinkFnFound) { + // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our + // offsets don't get screwed up + var nodeListLength = nodeList.length; + stableNodeList = new Array(nodeListLength); + + // create a sparse array by only copying the elements which have a linkFn + for (i = 0; i < linkFns.length; i+=3) { + idx = linkFns[i]; + stableNodeList[idx] = nodeList[idx]; + } + } else { + stableNodeList = nodeList; + } + + for (i = 0, ii = linkFns.length; i < ii;) { + node = stableNodeList[linkFns[i++]]; + nodeLinkFn = linkFns[i++]; + childLinkFn = linkFns[i++]; + + if (nodeLinkFn) { + if (nodeLinkFn.scope) { + childScope = scope.$new(); + compile.$$addScopeInfo(jqLite(node), childScope); + var destroyBindings = nodeLinkFn.$$destroyBindings; + if (destroyBindings) { + nodeLinkFn.$$destroyBindings = null; + childScope.$on('$destroyed', destroyBindings); + } + } else { + childScope = scope; + } + + if (nodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn( + scope, nodeLinkFn.transclude, parentBoundTranscludeFn); + + } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) { + childBoundTranscludeFn = parentBoundTranscludeFn; + + } else if (!parentBoundTranscludeFn && transcludeFn) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn); + + } else { + childBoundTranscludeFn = null; + } + + nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn, + nodeLinkFn); + + } else if (childLinkFn) { + childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn); + } + } + } + } + + function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) { + + var boundTranscludeFn = function(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) { + + if (!transcludedScope) { + transcludedScope = scope.$new(false, containingScope); + transcludedScope.$$transcluded = true; + } + + return transcludeFn(transcludedScope, cloneFn, { + parentBoundTranscludeFn: previousBoundTranscludeFn, + transcludeControllers: controllers, + futureParentElement: futureParentElement + }); + }; + + return boundTranscludeFn; + } + + /** + * Looks for directives on the given node and adds them to the directive collection which is + * sorted. + * + * @param node Node to search. + * @param directives An array to which the directives are added to. This array is sorted before + * the function returns. + * @param attrs The shared attrs object which is used to populate the normalized attributes. + * @param {number=} maxPriority Max directive priority. + */ + function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) { + var nodeType = node.nodeType, + attrsMap = attrs.$attr, + match, + className; + + switch (nodeType) { + case NODE_TYPE_ELEMENT: /* Element */ + // use the node name: + addDirective(directives, + directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective); + + // iterate over the attributes + for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes, + j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { + var attrStartName = false; + var attrEndName = false; + + attr = nAttrs[j]; + name = attr.name; + value = trim(attr.value); + + // support ngAttr attribute binding + ngAttrName = directiveNormalize(name); + if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) { + name = name.replace(PREFIX_REGEXP, '') + .substr(8).replace(/_(.)/g, function(match, letter) { + return letter.toUpperCase(); + }); + } + + var directiveNName = ngAttrName.replace(/(Start|End)$/, ''); + if (directiveIsMultiElement(directiveNName)) { + if (ngAttrName === directiveNName + 'Start') { + attrStartName = name; + attrEndName = name.substr(0, name.length - 5) + 'end'; + name = name.substr(0, name.length - 6); + } + } + + nName = directiveNormalize(name.toLowerCase()); + attrsMap[nName] = name; + if (isNgAttr || !attrs.hasOwnProperty(nName)) { + attrs[nName] = value; + if (getBooleanAttrName(node, nName)) { + attrs[nName] = true; // presence means true + } + } + addAttrInterpolateDirective(node, directives, value, nName, isNgAttr); + addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, + attrEndName); + } + + // use class as directive + className = node.className; + if (isObject(className)) { + // Maybe SVGAnimatedString + className = className.animVal; + } + if (isString(className) && className !== '') { + while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { + nName = directiveNormalize(match[2]); + if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[3]); + } + className = className.substr(match.index + match[0].length); + } + } + break; + case NODE_TYPE_TEXT: /* Text Node */ + if (msie === 11) { + // Workaround for #11781 + while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) { + node.nodeValue = node.nodeValue + node.nextSibling.nodeValue; + node.parentNode.removeChild(node.nextSibling); + } + } + addTextInterpolateDirective(directives, node.nodeValue); + break; + case NODE_TYPE_COMMENT: /* Comment */ + try { + match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); + if (match) { + nName = directiveNormalize(match[1]); + if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[2]); + } + } + } catch (e) { + // turns out that under some circumstances IE9 throws errors when one attempts to read + // comment's node value. + // Just ignore it and continue. (Can't seem to reproduce in test case.) + } + break; + } + + directives.sort(byPriority); + return directives; + } + + /** + * Given a node with an directive-start it collects all of the siblings until it finds + * directive-end. + * @param node + * @param attrStart + * @param attrEnd + * @returns {*} + */ + function groupScan(node, attrStart, attrEnd) { + var nodes = []; + var depth = 0; + if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { + do { + if (!node) { + throw $compileMinErr('uterdir', + "Unterminated attribute, found '{0}' but no matching '{1}' found.", + attrStart, attrEnd); + } + if (node.nodeType == NODE_TYPE_ELEMENT) { + if (node.hasAttribute(attrStart)) depth++; + if (node.hasAttribute(attrEnd)) depth--; + } + nodes.push(node); + node = node.nextSibling; + } while (depth > 0); + } else { + nodes.push(node); + } + + return jqLite(nodes); + } + + /** + * Wrapper for linking function which converts normal linking function into a grouped + * linking function. + * @param linkFn + * @param attrStart + * @param attrEnd + * @returns {Function} + */ + function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) { + return function(scope, element, attrs, controllers, transcludeFn) { + element = groupScan(element[0], attrStart, attrEnd); + return linkFn(scope, element, attrs, controllers, transcludeFn); + }; + } + + /** + * Once the directives have been collected, their compile functions are executed. This method + * is responsible for inlining directive templates as well as terminating the application + * of the directives if the terminal directive has been reached. + * + * @param {Array} directives Array of collected directives to execute their compile function. + * this needs to be pre-sorted by priority order. + * @param {Node} compileNode The raw DOM node to apply the compile functions to + * @param {Object} templateAttrs The shared attribute function + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the + * scope argument is auto-generated to the new + * child of the transcluded parent scope. + * @param {JQLite} jqCollection If we are working on the root of the compile tree then this + * argument has the root jqLite array so that we can replace nodes + * on it. + * @param {Object=} originalReplaceDirective An optional directive that will be ignored when + * compiling the transclusion. + * @param {Array.} preLinkFns + * @param {Array.} postLinkFns + * @param {Object} previousCompileContext Context used for previous compilation of the current + * node + * @returns {Function} linkFn + */ + function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, + jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, + previousCompileContext) { + previousCompileContext = previousCompileContext || {}; + + var terminalPriority = -Number.MAX_VALUE, + newScopeDirective = previousCompileContext.newScopeDirective, + controllerDirectives = previousCompileContext.controllerDirectives, + newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, + templateDirective = previousCompileContext.templateDirective, + nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, + hasTranscludeDirective = false, + hasTemplate = false, + hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective, + $compileNode = templateAttrs.$$element = jqLite(compileNode), + directive, + directiveName, + $template, + replaceDirective = originalReplaceDirective, + childTranscludeFn = transcludeFn, + linkFn, + directiveValue; + + // executes all directives on the current element + for (var i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + var attrStart = directive.$$start; + var attrEnd = directive.$$end; + + // collect multiblock sections + if (attrStart) { + $compileNode = groupScan(compileNode, attrStart, attrEnd); + } + $template = undefined; + + if (terminalPriority > directive.priority) { + break; // prevent further processing of directives + } + + if (directiveValue = directive.scope) { + + // skip the check for directives with async templates, we'll check the derived sync + // directive when the template arrives + if (!directive.templateUrl) { + if (isObject(directiveValue)) { + // This directive is trying to add an isolated scope. + // Check that there is no scope of any kind already + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective, + directive, $compileNode); + newIsolateScopeDirective = directive; + } else { + // This directive is trying to add a child scope. + // Check that there is no isolated scope already + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive, + $compileNode); + } + } + + newScopeDirective = newScopeDirective || directive; + } + + directiveName = directive.name; + + if (!directive.templateUrl && directive.controller) { + directiveValue = directive.controller; + controllerDirectives = controllerDirectives || createMap(); + assertNoDuplicate("'" + directiveName + "' controller", + controllerDirectives[directiveName], directive, $compileNode); + controllerDirectives[directiveName] = directive; + } + + if (directiveValue = directive.transclude) { + hasTranscludeDirective = true; + + // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion. + // This option should only be used by directives that know how to safely handle element transclusion, + // where the transcluded nodes are added or replaced after linking. + if (!directive.$$tlb) { + assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode); + nonTlbTranscludeDirective = directive; + } + + if (directiveValue == 'element') { + hasElementTranscludeDirective = true; + terminalPriority = directive.priority; + $template = $compileNode; + $compileNode = templateAttrs.$$element = + jqLite(document.createComment(' ' + directiveName + ': ' + + templateAttrs[directiveName] + ' ')); + compileNode = $compileNode[0]; + replaceWith(jqCollection, sliceArgs($template), compileNode); + + childTranscludeFn = compile($template, transcludeFn, terminalPriority, + replaceDirective && replaceDirective.name, { + // Don't pass in: + // - controllerDirectives - otherwise we'll create duplicates controllers + // - newIsolateScopeDirective or templateDirective - combining templates with + // element transclusion doesn't make sense. + // + // We need only nonTlbTranscludeDirective so that we prevent putting transclusion + // on the same element more than once. + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + } else { + $template = jqLite(jqLiteClone(compileNode)).contents(); + $compileNode.empty(); // clear contents + childTranscludeFn = compile($template, transcludeFn); + } + } + + if (directive.template) { + hasTemplate = true; + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + directiveValue = (isFunction(directive.template)) + ? directive.template($compileNode, templateAttrs) + : directive.template; + + directiveValue = denormalizeTemplate(directiveValue); + + if (directive.replace) { + replaceDirective = directive; + if (jqLiteIsTextNode(directiveValue)) { + $template = []; + } else { + $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue))); + } + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + directiveName, ''); + } + + replaceWith(jqCollection, $compileNode, compileNode); + + var newTemplateAttrs = {$attr: {}}; + + // combine directives from the original node and from the template: + // - take the array of directives for this element + // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed) + // - collect directives from the template and sort them by priority + // - combine directives as: processed + template + unprocessed + var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs); + var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); + + if (newIsolateScopeDirective) { + markDirectivesAsIsolate(templateDirectives); + } + directives = directives.concat(templateDirectives).concat(unprocessedDirectives); + mergeTemplateAttributes(templateAttrs, newTemplateAttrs); + + ii = directives.length; + } else { + $compileNode.html(directiveValue); + } + } + + if (directive.templateUrl) { + hasTemplate = true; + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + if (directive.replace) { + replaceDirective = directive; + } + + nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode, + templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, { + controllerDirectives: controllerDirectives, + newScopeDirective: (newScopeDirective !== directive) && newScopeDirective, + newIsolateScopeDirective: newIsolateScopeDirective, + templateDirective: templateDirective, + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + ii = directives.length; + } else if (directive.compile) { + try { + linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); + if (isFunction(linkFn)) { + addLinkFns(null, linkFn, attrStart, attrEnd); + } else if (linkFn) { + addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd); + } + } catch (e) { + $exceptionHandler(e, startingTag($compileNode)); + } + } + + if (directive.terminal) { + nodeLinkFn.terminal = true; + terminalPriority = Math.max(terminalPriority, directive.priority); + } + + } + + nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; + nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; + nodeLinkFn.templateOnThisElement = hasTemplate; + nodeLinkFn.transclude = childTranscludeFn; + + previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; + + // might be normal or delayed nodeLinkFn depending on if templateUrl is present + return nodeLinkFn; + + //////////////////// + + function addLinkFns(pre, post, attrStart, attrEnd) { + if (pre) { + if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd); + pre.require = directive.require; + pre.directiveName = directiveName; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + pre = cloneAndAnnotateFn(pre, {isolateScope: true}); + } + preLinkFns.push(pre); + } + if (post) { + if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd); + post.require = directive.require; + post.directiveName = directiveName; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + post = cloneAndAnnotateFn(post, {isolateScope: true}); + } + postLinkFns.push(post); + } + } + + + function getControllers(directiveName, require, $element, elementControllers) { + var value; + + if (isString(require)) { + var match = require.match(REQUIRE_PREFIX_REGEXP); + var name = require.substring(match[0].length); + var inheritType = match[1] || match[3]; + var optional = match[2] === '?'; + + //If only parents then start at the parent element + if (inheritType === '^^') { + $element = $element.parent(); + //Otherwise attempt getting the controller from elementControllers in case + //the element is transcluded (and has no data) and to avoid .data if possible + } else { + value = elementControllers && elementControllers[name]; + value = value && value.instance; + } + + if (!value) { + var dataName = '$' + name + 'Controller'; + value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName); + } + + if (!value && !optional) { + throw $compileMinErr('ctreq', + "Controller '{0}', required by directive '{1}', can't be found!", + name, directiveName); + } + } else if (isArray(require)) { + value = []; + for (var i = 0, ii = require.length; i < ii; i++) { + value[i] = getControllers(directiveName, require[i], $element, elementControllers); + } + } + + return value || null; + } + + function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope) { + var elementControllers = createMap(); + for (var controllerKey in controllerDirectives) { + var directive = controllerDirectives[controllerKey]; + var locals = { + $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, + $element: $element, + $attrs: attrs, + $transclude: transcludeFn + }; + + var controller = directive.controller; + if (controller == '@') { + controller = attrs[directive.name]; + } + + var controllerInstance = $controller(controller, locals, true, directive.controllerAs); + + // For directives with element transclusion the element is a comment, + // but jQuery .data doesn't support attaching data to comment nodes as it's hard to + // clean up (http://bugs.jquery.com/ticket/8335). + // Instead, we save the controllers for the element in a local hash and attach to .data + // later, once we have the actual element. + elementControllers[directive.name] = controllerInstance; + if (!hasElementTranscludeDirective) { + $element.data('$' + directive.name + 'Controller', controllerInstance.instance); + } + } + return elementControllers; + } + + function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn, + thisLinkFn) { + var i, ii, linkFn, controller, isolateScope, elementControllers, transcludeFn, $element, + attrs; + + if (compileNode === linkNode) { + attrs = templateAttrs; + $element = templateAttrs.$$element; + } else { + $element = jqLite(linkNode); + attrs = new Attributes($element, templateAttrs); + } + + if (newIsolateScopeDirective) { + isolateScope = scope.$new(true); + } + + if (boundTranscludeFn) { + // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn` + // is later passed as `parentBoundTranscludeFn` to `publicLinkFn` + transcludeFn = controllersBoundTransclude; + transcludeFn.$$boundTransclude = boundTranscludeFn; + } + + if (controllerDirectives) { + elementControllers = setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope); + } + + if (newIsolateScopeDirective) { + // Initialize isolate scope bindings for new isolate scope directive. + compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective || + templateDirective === newIsolateScopeDirective.$$originalDirective))); + compile.$$addScopeClass($element, true); + isolateScope.$$isolateBindings = + newIsolateScopeDirective.$$isolateBindings; + initializeDirectiveBindings(scope, attrs, isolateScope, + isolateScope.$$isolateBindings, + newIsolateScopeDirective, isolateScope); + } + if (elementControllers) { + // Initialize bindToController bindings for new/isolate scopes + var scopeDirective = newIsolateScopeDirective || newScopeDirective; + var bindings; + var controllerForBindings; + if (scopeDirective && elementControllers[scopeDirective.name]) { + bindings = scopeDirective.$$bindings.bindToController; + controller = elementControllers[scopeDirective.name]; + + if (controller && controller.identifier && bindings) { + controllerForBindings = controller; + thisLinkFn.$$destroyBindings = + initializeDirectiveBindings(scope, attrs, controller.instance, + bindings, scopeDirective); + } + } + for (i in elementControllers) { + controller = elementControllers[i]; + var controllerResult = controller(); + + if (controllerResult !== controller.instance) { + // If the controller constructor has a return value, overwrite the instance + // from setupControllers and update the element data + controller.instance = controllerResult; + $element.data('$' + i + 'Controller', controllerResult); + if (controller === controllerForBindings) { + // Remove and re-install bindToController bindings + thisLinkFn.$$destroyBindings(); + thisLinkFn.$$destroyBindings = + initializeDirectiveBindings(scope, attrs, controllerResult, bindings, scopeDirective); + } + } + } + } + + // PRELINKING + for (i = 0, ii = preLinkFns.length; i < ii; i++) { + linkFn = preLinkFns[i]; + invokeLinkFn(linkFn, + linkFn.isolateScope ? isolateScope : scope, + $element, + attrs, + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), + transcludeFn + ); + } + + // RECURSION + // We only pass the isolate scope, if the isolate directive has a template, + // otherwise the child elements do not belong to the isolate directive. + var scopeToChild = scope; + if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) { + scopeToChild = isolateScope; + } + childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn); + + // POSTLINKING + for (i = postLinkFns.length - 1; i >= 0; i--) { + linkFn = postLinkFns[i]; + invokeLinkFn(linkFn, + linkFn.isolateScope ? isolateScope : scope, + $element, + attrs, + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), + transcludeFn + ); + } + + // This is the function that is injected as `$transclude`. + // Note: all arguments are optional! + function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement) { + var transcludeControllers; + + // No scope passed in: + if (!isScope(scope)) { + futureParentElement = cloneAttachFn; + cloneAttachFn = scope; + scope = undefined; + } + + if (hasElementTranscludeDirective) { + transcludeControllers = elementControllers; + } + if (!futureParentElement) { + futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element; + } + return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); + } + } + } + + function markDirectivesAsIsolate(directives) { + // mark all directives as needing isolate scope. + for (var j = 0, jj = directives.length; j < jj; j++) { + directives[j] = inherit(directives[j], {$$isolateScope: true}); + } + } + + /** + * looks up the directive and decorates it with exception handling and proper parameters. We + * call this the boundDirective. + * + * @param {string} name name of the directive to look up. + * @param {string} location The directive must be found in specific format. + * String containing any of theses characters: + * + * * `E`: element name + * * `A': attribute + * * `C`: class + * * `M`: comment + * @returns {boolean} true if directive was added. + */ + function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, + endAttrName) { + if (name === ignoreDirective) return null; + var match = null; + if (hasDirectives.hasOwnProperty(name)) { + for (var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i < ii; i++) { + try { + directive = directives[i]; + if ((maxPriority === undefined || maxPriority > directive.priority) && + directive.restrict.indexOf(location) != -1) { + if (startAttrName) { + directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); + } + tDirectives.push(directive); + match = directive; + } + } catch (e) { $exceptionHandler(e); } + } + } + return match; + } + + + /** + * looks up the directive and returns true if it is a multi-element directive, + * and therefore requires DOM nodes between -start and -end markers to be grouped + * together. + * + * @param {string} name name of the directive to look up. + * @returns true if directive was registered as multi-element. + */ + function directiveIsMultiElement(name) { + if (hasDirectives.hasOwnProperty(name)) { + for (var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + if (directive.multiElement) { + return true; + } + } + } + return false; + } + + /** + * When the element is replaced with HTML template then the new attributes + * on the template need to be merged with the existing attributes in the DOM. + * The desired effect is to have both of the attributes present. + * + * @param {object} dst destination attributes (original DOM) + * @param {object} src source attributes (from the directive template) + */ + function mergeTemplateAttributes(dst, src) { + var srcAttr = src.$attr, + dstAttr = dst.$attr, + $element = dst.$$element; + + // reapply the old attributes to the new element + forEach(dst, function(value, key) { + if (key.charAt(0) != '$') { + if (src[key] && src[key] !== value) { + value += (key === 'style' ? ';' : ' ') + src[key]; + } + dst.$set(key, value, true, srcAttr[key]); + } + }); + + // copy the new attributes on the old attrs object + forEach(src, function(value, key) { + if (key == 'class') { + safeAddClass($element, value); + dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value; + } else if (key == 'style') { + $element.attr('style', $element.attr('style') + ';' + value); + dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value; + // `dst` will never contain hasOwnProperty as DOM parser won't let it. + // You will get an "InvalidCharacterError: DOM Exception 5" error if you + // have an attribute like "has-own-property" or "data-has-own-property", etc. + } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { + dst[key] = value; + dstAttr[key] = srcAttr[key]; + } + }); + } + + + function compileTemplateUrl(directives, $compileNode, tAttrs, + $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { + var linkQueue = [], + afterTemplateNodeLinkFn, + afterTemplateChildLinkFn, + beforeTemplateCompileNode = $compileNode[0], + origAsyncDirective = directives.shift(), + derivedSyncDirective = inherit(origAsyncDirective, { + templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective + }), + templateUrl = (isFunction(origAsyncDirective.templateUrl)) + ? origAsyncDirective.templateUrl($compileNode, tAttrs) + : origAsyncDirective.templateUrl, + templateNamespace = origAsyncDirective.templateNamespace; + + $compileNode.empty(); + + $templateRequest(templateUrl) + .then(function(content) { + var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; + + content = denormalizeTemplate(content); + + if (origAsyncDirective.replace) { + if (jqLiteIsTextNode(content)) { + $template = []; + } else { + $template = removeComments(wrapTemplate(templateNamespace, trim(content))); + } + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + origAsyncDirective.name, templateUrl); + } + + tempTemplateAttrs = {$attr: {}}; + replaceWith($rootElement, $compileNode, compileNode); + var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); + + if (isObject(origAsyncDirective.scope)) { + markDirectivesAsIsolate(templateDirectives); + } + directives = templateDirectives.concat(directives); + mergeTemplateAttributes(tAttrs, tempTemplateAttrs); + } else { + compileNode = beforeTemplateCompileNode; + $compileNode.html(content); + } + + directives.unshift(derivedSyncDirective); + + afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, + childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, + previousCompileContext); + forEach($rootElement, function(node, i) { + if (node == compileNode) { + $rootElement[i] = $compileNode[0]; + } + }); + afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); + + while (linkQueue.length) { + var scope = linkQueue.shift(), + beforeTemplateLinkNode = linkQueue.shift(), + linkRootElement = linkQueue.shift(), + boundTranscludeFn = linkQueue.shift(), + linkNode = $compileNode[0]; + + if (scope.$$destroyed) continue; + + if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { + var oldClasses = beforeTemplateLinkNode.className; + + if (!(previousCompileContext.hasElementTranscludeDirective && + origAsyncDirective.replace)) { + // it was cloned therefore we have to clone as well. + linkNode = jqLiteClone(compileNode); + } + replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); + + // Copy in CSS classes from original node + safeAddClass(jqLite(linkNode), oldClasses); + } + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); + } else { + childBoundTranscludeFn = boundTranscludeFn; + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, + childBoundTranscludeFn, afterTemplateNodeLinkFn); + } + linkQueue = null; + }); + + return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { + var childBoundTranscludeFn = boundTranscludeFn; + if (scope.$$destroyed) return; + if (linkQueue) { + linkQueue.push(scope, + node, + rootElement, + childBoundTranscludeFn); + } else { + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn, + afterTemplateNodeLinkFn); + } + }; + } + + + /** + * Sorting function for bound directives. + */ + function byPriority(a, b) { + var diff = b.priority - a.priority; + if (diff !== 0) return diff; + if (a.name !== b.name) return (a.name < b.name) ? -1 : 1; + return a.index - b.index; + } + + function assertNoDuplicate(what, previousDirective, directive, element) { + + function wrapModuleNameIfDefined(moduleName) { + return moduleName ? + (' (module: ' + moduleName + ')') : + ''; + } + + if (previousDirective) { + throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}', + previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName), + directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element)); + } + } + + + function addTextInterpolateDirective(directives, text) { + var interpolateFn = $interpolate(text, true); + if (interpolateFn) { + directives.push({ + priority: 0, + compile: function textInterpolateCompileFn(templateNode) { + var templateNodeParent = templateNode.parent(), + hasCompileParent = !!templateNodeParent.length; + + // When transcluding a template that has bindings in the root + // we don't have a parent and thus need to add the class during linking fn. + if (hasCompileParent) compile.$$addBindingClass(templateNodeParent); + + return function textInterpolateLinkFn(scope, node) { + var parent = node.parent(); + if (!hasCompileParent) compile.$$addBindingClass(parent); + compile.$$addBindingInfo(parent, interpolateFn.expressions); + scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { + node[0].nodeValue = value; + }); + }; + } + }); + } + } + + + function wrapTemplate(type, template) { + type = lowercase(type || 'html'); + switch (type) { + case 'svg': + case 'math': + var wrapper = document.createElement('div'); + wrapper.innerHTML = '<' + type + '>' + template + ''; + return wrapper.childNodes[0].childNodes; + default: + return template; + } + } + + + function getTrustedContext(node, attrNormalizedName) { + if (attrNormalizedName == "srcdoc") { + return $sce.HTML; + } + var tag = nodeName_(node); + // maction[xlink:href] can source SVG. It's not limited to . + if (attrNormalizedName == "xlinkHref" || + (tag == "form" && attrNormalizedName == "action") || + (tag != "img" && (attrNormalizedName == "src" || + attrNormalizedName == "ngSrc"))) { + return $sce.RESOURCE_URL; + } + } + + + function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) { + var trustedContext = getTrustedContext(node, name); + allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing; + + var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing); + + // no interpolation found -> ignore + if (!interpolateFn) return; + + + if (name === "multiple" && nodeName_(node) === "select") { + throw $compileMinErr("selmulti", + "Binding to the 'multiple' attribute is not supported. Element: {0}", + startingTag(node)); + } + + directives.push({ + priority: 100, + compile: function() { + return { + pre: function attrInterpolatePreLinkFn(scope, element, attr) { + var $$observers = (attr.$$observers || (attr.$$observers = {})); + + if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { + throw $compileMinErr('nodomevents', + "Interpolations for HTML DOM event attributes are disallowed. Please use the " + + "ng- versions (such as ng-click instead of onclick) instead."); + } + + // If the attribute has changed since last $interpolate()ed + var newValue = attr[name]; + if (newValue !== value) { + // we need to interpolate again since the attribute value has been updated + // (e.g. by another directive's compile function) + // ensure unset/empty values make interpolateFn falsy + interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing); + value = newValue; + } + + // if attribute was updated so that there is no interpolation going on we don't want to + // register any observers + if (!interpolateFn) return; + + // initialize attr object so that it's ready in case we need the value for isolate + // scope initialization, otherwise the value would not be available from isolate + // directive's linking fn during linking phase + attr[name] = interpolateFn(scope); + + ($$observers[name] || ($$observers[name] = [])).$$inter = true; + (attr.$$observers && attr.$$observers[name].$$scope || scope). + $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) { + //special case for class attribute addition + removal + //so that class changes can tap into the animation + //hooks provided by the $animate service. Be sure to + //skip animations when the first digest occurs (when + //both the new and the old values are the same) since + //the CSS classes are the non-interpolated values + if (name === 'class' && newValue != oldValue) { + attr.$updateClass(newValue, oldValue); + } else { + attr.$set(name, newValue); + } + }); + } + }; + } + }); + } + + + /** + * This is a special jqLite.replaceWith, which can replace items which + * have no parents, provided that the containing jqLite collection is provided. + * + * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes + * in the root of the tree. + * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep + * the shell, but replace its DOM node reference. + * @param {Node} newNode The new DOM node. + */ + function replaceWith($rootElement, elementsToRemove, newNode) { + var firstElementToRemove = elementsToRemove[0], + removeCount = elementsToRemove.length, + parent = firstElementToRemove.parentNode, + i, ii; + + if ($rootElement) { + for (i = 0, ii = $rootElement.length; i < ii; i++) { + if ($rootElement[i] == firstElementToRemove) { + $rootElement[i++] = newNode; + for (var j = i, j2 = j + removeCount - 1, + jj = $rootElement.length; + j < jj; j++, j2++) { + if (j2 < jj) { + $rootElement[j] = $rootElement[j2]; + } else { + delete $rootElement[j]; + } + } + $rootElement.length -= removeCount - 1; + + // If the replaced element is also the jQuery .context then replace it + // .context is a deprecated jQuery api, so we should set it only when jQuery set it + // http://api.jquery.com/context/ + if ($rootElement.context === firstElementToRemove) { + $rootElement.context = newNode; + } + break; + } + } + } + + if (parent) { + parent.replaceChild(newNode, firstElementToRemove); + } + + // TODO(perf): what's this document fragment for? is it needed? can we at least reuse it? + var fragment = document.createDocumentFragment(); + fragment.appendChild(firstElementToRemove); + + if (jqLite.hasData(firstElementToRemove)) { + // Copy over user data (that includes Angular's $scope etc.). Don't copy private + // data here because there's no public interface in jQuery to do that and copying over + // event listeners (which is the main use of private data) wouldn't work anyway. + jqLite(newNode).data(jqLite(firstElementToRemove).data()); + + // Remove data of the replaced element. We cannot just call .remove() + // on the element it since that would deallocate scope that is needed + // for the new node. Instead, remove the data "manually". + if (!jQuery) { + delete jqLite.cache[firstElementToRemove[jqLite.expando]]; + } else { + // jQuery 2.x doesn't expose the data storage. Use jQuery.cleanData to clean up after + // the replaced element. The cleanData version monkey-patched by Angular would cause + // the scope to be trashed and we do need the very same scope to work with the new + // element. However, we cannot just cache the non-patched version and use it here as + // that would break if another library patches the method after Angular does (one + // example is jQuery UI). Instead, set a flag indicating scope destroying should be + // skipped this one time. + skipDestroyOnNextJQueryCleanData = true; + jQuery.cleanData([firstElementToRemove]); + } + } + + for (var k = 1, kk = elementsToRemove.length; k < kk; k++) { + var element = elementsToRemove[k]; + jqLite(element).remove(); // must do this way to clean up expando + fragment.appendChild(element); + delete elementsToRemove[k]; + } + + elementsToRemove[0] = newNode; + elementsToRemove.length = 1; + } + + + function cloneAndAnnotateFn(fn, annotation) { + return extend(function() { return fn.apply(null, arguments); }, fn, annotation); + } + + + function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) { + try { + linkFn(scope, $element, attrs, controllers, transcludeFn); + } catch (e) { + $exceptionHandler(e, startingTag($element)); + } + } + + + // Set up $watches for isolate scope and controller bindings. This process + // only occurs for isolate scopes and new scopes with controllerAs. + function initializeDirectiveBindings(scope, attrs, destination, bindings, + directive, newScope) { + var onNewScopeDestroyed; + forEach(bindings, function(definition, scopeName) { + var attrName = definition.attrName, + optional = definition.optional, + mode = definition.mode, // @, =, or & + lastValue, + parentGet, parentSet, compare; + + if (!hasOwnProperty.call(attrs, attrName)) { + // In the case of user defined a binding with the same name as a method in Object.prototype but didn't set + // the corresponding attribute. We need to make sure subsequent code won't access to the prototype function + attrs[attrName] = undefined; + } + + switch (mode) { + + case '@': + if (!attrs[attrName] && !optional) { + destination[scopeName] = undefined; + } + + attrs.$observe(attrName, function(value) { + destination[scopeName] = value; + }); + attrs.$$observers[attrName].$$scope = scope; + if (attrs[attrName]) { + // If the attribute has been provided then we trigger an interpolation to ensure + // the value is there for use in the link fn + destination[scopeName] = $interpolate(attrs[attrName])(scope); + } + break; + + case '=': + if (optional && !attrs[attrName]) { + return; + } + parentGet = $parse(attrs[attrName]); + + if (parentGet.literal) { + compare = equals; + } else { + compare = function(a, b) { return a === b || (a !== a && b !== b); }; + } + parentSet = parentGet.assign || function() { + // reset the change, or we will throw this exception on every $digest + lastValue = destination[scopeName] = parentGet(scope); + throw $compileMinErr('nonassign', + "Expression '{0}' used with directive '{1}' is non-assignable!", + attrs[attrName], directive.name); + }; + lastValue = destination[scopeName] = parentGet(scope); + var parentValueWatch = function parentValueWatch(parentValue) { + if (!compare(parentValue, destination[scopeName])) { + // we are out of sync and need to copy + if (!compare(parentValue, lastValue)) { + // parent changed and it has precedence + destination[scopeName] = parentValue; + } else { + // if the parent can be assigned then do so + parentSet(scope, parentValue = destination[scopeName]); + } + } + return lastValue = parentValue; + }; + parentValueWatch.$stateful = true; + var unwatch; + if (definition.collection) { + unwatch = scope.$watchCollection(attrs[attrName], parentValueWatch); + } else { + unwatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); + } + onNewScopeDestroyed = (onNewScopeDestroyed || []); + onNewScopeDestroyed.push(unwatch); + break; + + case '&': + parentGet = $parse(attrs[attrName]); + + // Don't assign noop to destination if expression is not valid + if (parentGet === noop && optional) break; + + destination[scopeName] = function(locals) { + return parentGet(scope, locals); + }; + break; + } + }); + var destroyBindings = onNewScopeDestroyed ? function destroyBindings() { + for (var i = 0, ii = onNewScopeDestroyed.length; i < ii; ++i) { + onNewScopeDestroyed[i](); + } + } : noop; + if (newScope && destroyBindings !== noop) { + newScope.$on('$destroy', destroyBindings); + return noop; + } + return destroyBindings; + } + }]; +} + +var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i; +/** + * Converts all accepted directives format into proper directive name. + * @param name Name to normalize + */ +function directiveNormalize(name) { + return camelCase(name.replace(PREFIX_REGEXP, '')); +} + +/** + * @ngdoc type + * @name $compile.directive.Attributes + * + * @description + * A shared object between directive compile / linking functions which contains normalized DOM + * element attributes. The values reflect current binding state `{{ }}`. The normalization is + * needed since all of these are treated as equivalent in Angular: + * + * ``` + * + * ``` + */ + +/** + * @ngdoc property + * @name $compile.directive.Attributes#$attr + * + * @description + * A map of DOM element attribute names to the normalized name. This is + * needed to do reverse lookup from normalized name back to actual name. + */ + + +/** + * @ngdoc method + * @name $compile.directive.Attributes#$set + * @kind function + * + * @description + * Set DOM element attribute value. + * + * + * @param {string} name Normalized element attribute name of the property to modify. The name is + * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr} + * property to the original name. + * @param {string} value Value to set the attribute to. The value can be an interpolated string. + */ + + + +/** + * Closure compiler type information + */ + +function nodesetLinkingFn( + /* angular.Scope */ scope, + /* NodeList */ nodeList, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +) {} + +function directiveLinkingFn( + /* nodesetLinkingFn */ nodesetLinkingFn, + /* angular.Scope */ scope, + /* Node */ node, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +) {} + +function tokenDifference(str1, str2) { + var values = '', + tokens1 = str1.split(/\s+/), + tokens2 = str2.split(/\s+/); + + outer: + for (var i = 0; i < tokens1.length; i++) { + var token = tokens1[i]; + for (var j = 0; j < tokens2.length; j++) { + if (token == tokens2[j]) continue outer; + } + values += (values.length > 0 ? ' ' : '') + token; + } + return values; +} + +function removeComments(jqNodes) { + jqNodes = jqLite(jqNodes); + var i = jqNodes.length; + + if (i <= 1) { + return jqNodes; + } + + while (i--) { + var node = jqNodes[i]; + if (node.nodeType === NODE_TYPE_COMMENT) { + splice.call(jqNodes, i, 1); + } + } + return jqNodes; +} + +var $controllerMinErr = minErr('$controller'); + + +var CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/; +function identifierForController(controller, ident) { + if (ident && isString(ident)) return ident; + if (isString(controller)) { + var match = CNTRL_REG.exec(controller); + if (match) return match[3]; + } +} + + +/** + * @ngdoc provider + * @name $controllerProvider + * @description + * The {@link ng.$controller $controller service} is used by Angular to create new + * controllers. + * + * This provider allows controller registration via the + * {@link ng.$controllerProvider#register register} method. + */ +function $ControllerProvider() { + var controllers = {}, + globals = false; + + /** + * @ngdoc method + * @name $controllerProvider#register + * @param {string|Object} name Controller name, or an object map of controllers where the keys are + * the names and the values are the constructors. + * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI + * annotations in the array notation). + */ + this.register = function(name, constructor) { + assertNotHasOwnProperty(name, 'controller'); + if (isObject(name)) { + extend(controllers, name); + } else { + controllers[name] = constructor; + } + }; + + /** + * @ngdoc method + * @name $controllerProvider#allowGlobals + * @description If called, allows `$controller` to find controller constructors on `window` + */ + this.allowGlobals = function() { + globals = true; + }; + + + this.$get = ['$injector', '$window', function($injector, $window) { + + /** + * @ngdoc service + * @name $controller + * @requires $injector + * + * @param {Function|string} constructor If called with a function then it's considered to be the + * controller constructor function. Otherwise it's considered to be a string which is used + * to retrieve the controller constructor using the following steps: + * + * * check if a controller with given name is registered via `$controllerProvider` + * * check if evaluating the string on the current scope returns a constructor + * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global + * `window` object (not recommended) + * + * The string can use the `controller as property` syntax, where the controller instance is published + * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this + * to work correctly. + * + * @param {Object} locals Injection locals for Controller. + * @return {Object} Instance of given controller. + * + * @description + * `$controller` service is responsible for instantiating controllers. + * + * It's just a simple call to {@link auto.$injector $injector}, but extracted into + * a service, so that one can override this service with [BC version](https://gist.github.com/1649788). + */ + return function(expression, locals, later, ident) { + // PRIVATE API: + // param `later` --- indicates that the controller's constructor is invoked at a later time. + // If true, $controller will allocate the object with the correct + // prototype chain, but will not invoke the controller until a returned + // callback is invoked. + // param `ident` --- An optional label which overrides the label parsed from the controller + // expression, if any. + var instance, match, constructor, identifier; + later = later === true; + if (ident && isString(ident)) { + identifier = ident; + } + + if (isString(expression)) { + match = expression.match(CNTRL_REG); + if (!match) { + throw $controllerMinErr('ctrlfmt', + "Badly formed controller string '{0}'. " + + "Must match `__name__ as __id__` or `__name__`.", expression); + } + constructor = match[1], + identifier = identifier || match[3]; + expression = controllers.hasOwnProperty(constructor) + ? controllers[constructor] + : getter(locals.$scope, constructor, true) || + (globals ? getter($window, constructor, true) : undefined); + + assertArgFn(expression, constructor, true); + } + + if (later) { + // Instantiate controller later: + // This machinery is used to create an instance of the object before calling the + // controller's constructor itself. + // + // This allows properties to be added to the controller before the constructor is + // invoked. Primarily, this is used for isolate scope bindings in $compile. + // + // This feature is not intended for use by applications, and is thus not documented + // publicly. + // Object creation: http://jsperf.com/create-constructor/2 + var controllerPrototype = (isArray(expression) ? + expression[expression.length - 1] : expression).prototype; + instance = Object.create(controllerPrototype || null); + + if (identifier) { + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + + var instantiate; + return instantiate = extend(function() { + var result = $injector.invoke(expression, instance, locals, constructor); + if (result !== instance && (isObject(result) || isFunction(result))) { + instance = result; + if (identifier) { + // If result changed, re-assign controllerAs value to scope. + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + } + return instance; + }, { + instance: instance, + identifier: identifier + }); + } + + instance = $injector.instantiate(expression, locals, constructor); + + if (identifier) { + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + + return instance; + }; + + function addIdentifier(locals, identifier, instance, name) { + if (!(locals && isObject(locals.$scope))) { + throw minErr('$controller')('noscp', + "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", + name, identifier); + } + + locals.$scope[identifier] = instance; + } + }]; +} + +/** + * @ngdoc service + * @name $document + * @requires $window + * + * @description + * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. + * + * @example + + +
    +

    $document title:

    +

    window.document title:

    +
    +
    + + angular.module('documentExample', []) + .controller('ExampleController', ['$scope', '$document', function($scope, $document) { + $scope.title = $document[0].title; + $scope.windowTitle = angular.element(window.document)[0].title; + }]); + +
    + */ +function $DocumentProvider() { + this.$get = ['$window', function(window) { + return jqLite(window.document); + }]; +} + +/** + * @ngdoc service + * @name $exceptionHandler + * @requires ng.$log + * + * @description + * Any uncaught exception in angular expressions is delegated to this service. + * The default implementation simply delegates to `$log.error` which logs it into + * the browser console. + * + * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by + * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. + * + * ## Example: + * + * ```js + * angular.module('exceptionOverride', []).factory('$exceptionHandler', function() { + * return function(exception, cause) { + * exception.message += ' (caused by "' + cause + '")'; + * throw exception; + * }; + * }); + * ``` + * + * This example will override the normal action of `$exceptionHandler`, to make angular + * exceptions fail hard when they happen, instead of just logging to the console. + * + *
    + * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind` + * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler} + * (unless executed during a digest). + * + * If you wish, you can manually delegate exceptions, e.g. + * `try { ... } catch(e) { $exceptionHandler(e); }` + * + * @param {Error} exception Exception associated with the error. + * @param {string=} cause optional information about the context in which + * the error was thrown. + * + */ +function $ExceptionHandlerProvider() { + this.$get = ['$log', function($log) { + return function(exception, cause) { + $log.error.apply($log, arguments); + }; + }]; +} + +var APPLICATION_JSON = 'application/json'; +var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'}; +var JSON_START = /^\[|^\{(?!\{)/; +var JSON_ENDS = { + '[': /]$/, + '{': /}$/ +}; +var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/; + +function serializeValue(v) { + if (isObject(v)) { + return isDate(v) ? v.toISOString() : toJson(v); + } + return v; +} + + +function $HttpParamSerializerProvider() { + /** + * @ngdoc service + * @name $httpParamSerializer + * @description + * + * Default {@link $http `$http`} params serializer that converts objects to strings + * according to the following rules: + * + * * `{'foo': 'bar'}` results in `foo=bar` + * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object) + * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element) + * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D"` (stringified and encoded representation of an object) + * + * Note that serializer will sort the request parameters alphabetically. + * */ + + this.$get = function() { + return function ngParamSerializer(params) { + if (!params) return ''; + var parts = []; + forEachSorted(params, function(value, key) { + if (value === null || isUndefined(value)) return; + if (isArray(value)) { + forEach(value, function(v, k) { + parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(v))); + }); + } else { + parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value))); + } + }); + + return parts.join('&'); + }; + }; +} + +function $HttpParamSerializerJQLikeProvider() { + /** + * @ngdoc service + * @name $httpParamSerializerJQLike + * @description + * + * Alternative {@link $http `$http`} params serializer that follows + * jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic. + * The serializer will also sort the params alphabetically. + * + * To use it for serializing `$http` request parameters, set it as the `paramSerializer` property: + * + * ```js + * $http({ + * url: myUrl, + * method: 'GET', + * params: myParams, + * paramSerializer: '$httpParamSerializerJQLike' + * }); + * ``` + * + * It is also possible to set it as the default `paramSerializer` in the + * {@link $httpProvider#defaults `$httpProvider`}. + * + * Additionally, you can inject the serializer and use it explicitly, for example to serialize + * form data for submission: + * + * ```js + * .controller(function($http, $httpParamSerializerJQLike) { + * //... + * + * $http({ + * url: myUrl, + * method: 'POST', + * data: $httpParamSerializerJQLike(myData), + * headers: { + * 'Content-Type': 'application/x-www-form-urlencoded' + * } + * }); + * + * }); + * ``` + * + * */ + this.$get = function() { + return function jQueryLikeParamSerializer(params) { + if (!params) return ''; + var parts = []; + serialize(params, '', true); + return parts.join('&'); + + function serialize(toSerialize, prefix, topLevel) { + if (toSerialize === null || isUndefined(toSerialize)) return; + if (isArray(toSerialize)) { + forEach(toSerialize, function(value) { + serialize(value, prefix + '[]'); + }); + } else if (isObject(toSerialize) && !isDate(toSerialize)) { + forEachSorted(toSerialize, function(value, key) { + serialize(value, prefix + + (topLevel ? '' : '[') + + key + + (topLevel ? '' : ']')); + }); + } else { + parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize))); + } + } + }; + }; +} + +function defaultHttpResponseTransform(data, headers) { + if (isString(data)) { + // Strip json vulnerability protection prefix and trim whitespace + var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim(); + + if (tempData) { + var contentType = headers('Content-Type'); + if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) { + data = fromJson(tempData); + } + } + } + + return data; +} + +function isJsonLike(str) { + var jsonStart = str.match(JSON_START); + return jsonStart && JSON_ENDS[jsonStart[0]].test(str); +} + +/** + * Parse headers into key value object + * + * @param {string} headers Raw headers as a string + * @returns {Object} Parsed headers as key value object + */ +function parseHeaders(headers) { + var parsed = createMap(), i; + + function fillInParsed(key, val) { + if (key) { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + + if (isString(headers)) { + forEach(headers.split('\n'), function(line) { + i = line.indexOf(':'); + fillInParsed(lowercase(trim(line.substr(0, i))), trim(line.substr(i + 1))); + }); + } else if (isObject(headers)) { + forEach(headers, function(headerVal, headerKey) { + fillInParsed(lowercase(headerKey), trim(headerVal)); + }); + } + + return parsed; +} + + +/** + * Returns a function that provides access to parsed headers. + * + * Headers are lazy parsed when first requested. + * @see parseHeaders + * + * @param {(string|Object)} headers Headers to provide access to. + * @returns {function(string=)} Returns a getter function which if called with: + * + * - if called with single an argument returns a single header value or null + * - if called with no arguments returns an object containing all headers. + */ +function headersGetter(headers) { + var headersObj; + + return function(name) { + if (!headersObj) headersObj = parseHeaders(headers); + + if (name) { + var value = headersObj[lowercase(name)]; + if (value === void 0) { + value = null; + } + return value; + } + + return headersObj; + }; +} + + +/** + * Chain all given functions + * + * This function is used for both request and response transforming + * + * @param {*} data Data to transform. + * @param {function(string=)} headers HTTP headers getter fn. + * @param {number} status HTTP status code of the response. + * @param {(Function|Array.)} fns Function or an array of functions. + * @returns {*} Transformed data. + */ +function transformData(data, headers, status, fns) { + if (isFunction(fns)) { + return fns(data, headers, status); + } + + forEach(fns, function(fn) { + data = fn(data, headers, status); + }); + + return data; +} + + +function isSuccess(status) { + return 200 <= status && status < 300; +} + + +/** + * @ngdoc provider + * @name $httpProvider + * @description + * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service. + * */ +function $HttpProvider() { + /** + * @ngdoc property + * @name $httpProvider#defaults + * @description + * + * Object containing default values for all {@link ng.$http $http} requests. + * + * - **`defaults.cache`** - {Object} - an object built with {@link ng.$cacheFactory `$cacheFactory`} + * that will provide the cache for all requests who set their `cache` property to `true`. + * If you set the `defaults.cache = false` then only requests that specify their own custom + * cache object will be cached. See {@link $http#caching $http Caching} for more information. + * + * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token. + * Defaults value is `'XSRF-TOKEN'`. + * + * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the + * XSRF token. Defaults value is `'X-XSRF-TOKEN'`. + * + * - **`defaults.headers`** - {Object} - Default headers for all $http requests. + * Refer to {@link ng.$http#setting-http-headers $http} for documentation on + * setting default headers. + * - **`defaults.headers.common`** + * - **`defaults.headers.post`** + * - **`defaults.headers.put`** + * - **`defaults.headers.patch`** + * + * + * - **`defaults.paramSerializer`** - `{string|function(Object):string}` - A function + * used to the prepare string representation of request parameters (specified as an object). + * If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}. + * Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}. + * + **/ + var defaults = this.defaults = { + // transform incoming response data + transformResponse: [defaultHttpResponseTransform], + + // transform outgoing request data + transformRequest: [function(d) { + return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d; + }], + + // default headers + headers: { + common: { + 'Accept': 'application/json, text/plain, */*' + }, + post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), + put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), + patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON) + }, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + paramSerializer: '$httpParamSerializer' + }; + + var useApplyAsync = false; + /** + * @ngdoc method + * @name $httpProvider#useApplyAsync + * @description + * + * Configure $http service to combine processing of multiple http responses received at around + * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in + * significant performance improvement for bigger applications that make many HTTP requests + * concurrently (common during application bootstrap). + * + * Defaults to false. If no value is specified, returns the current configured value. + * + * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred + * "apply" on the next tick, giving time for subsequent requests in a roughly ~10ms window + * to load and share the same digest cycle. + * + * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. + * otherwise, returns the current configured value. + **/ + this.useApplyAsync = function(value) { + if (isDefined(value)) { + useApplyAsync = !!value; + return this; + } + return useApplyAsync; + }; + + /** + * @ngdoc property + * @name $httpProvider#interceptors + * @description + * + * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http} + * pre-processing of request or postprocessing of responses. + * + * These service factories are ordered by request, i.e. they are applied in the same order as the + * array, on request, but reverse order, on response. + * + * {@link ng.$http#interceptors Interceptors detailed info} + **/ + var interceptorFactories = this.interceptors = []; + + this.$get = ['$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', + function($httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector) { + + var defaultCache = $cacheFactory('$http'); + + /** + * Make sure that default param serializer is exposed as a function + */ + defaults.paramSerializer = isString(defaults.paramSerializer) ? + $injector.get(defaults.paramSerializer) : defaults.paramSerializer; + + /** + * Interceptors stored in reverse order. Inner interceptors before outer interceptors. + * The reversal is needed so that we can build up the interception chain around the + * server request. + */ + var reversedInterceptors = []; + + forEach(interceptorFactories, function(interceptorFactory) { + reversedInterceptors.unshift(isString(interceptorFactory) + ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)); + }); + + /** + * @ngdoc service + * @kind function + * @name $http + * @requires ng.$httpBackend + * @requires $cacheFactory + * @requires $rootScope + * @requires $q + * @requires $injector + * + * @description + * The `$http` service is a core Angular service that facilitates communication with the remote + * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest) + * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP). + * + * For unit testing applications that use `$http` service, see + * {@link ngMock.$httpBackend $httpBackend mock}. + * + * For a higher level of abstraction, please check out the {@link ngResource.$resource + * $resource} service. + * + * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by + * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage + * it is important to familiarize yourself with these APIs and the guarantees they provide. + * + * + * ## General usage + * The `$http` service is a function which takes a single argument — a configuration object — + * that is used to generate an HTTP request and returns a {@link ng.$q promise} + * with two $http specific methods: `success` and `error`. + * + * ```js + * // Simple GET request example : + * $http.get('/someUrl'). + * success(function(data, status, headers, config) { + * // this callback will be called asynchronously + * // when the response is available + * }). + * error(function(data, status, headers, config) { + * // called asynchronously if an error occurs + * // or server returns response with an error status. + * }); + * ``` + * + * ```js + * // Simple POST request example (passing data) : + * $http.post('/someUrl', {msg:'hello word!'}). + * success(function(data, status, headers, config) { + * // this callback will be called asynchronously + * // when the response is available + * }). + * error(function(data, status, headers, config) { + * // called asynchronously if an error occurs + * // or server returns response with an error status. + * }); + * ``` + * + * + * Since the returned value of calling the $http function is a `promise`, you can also use + * the `then` method to register callbacks, and these callbacks will receive a single argument – + * an object representing the response. See the API signature and type info below for more + * details. + * + * A response status code between 200 and 299 is considered a success status and + * will result in the success callback being called. Note that if the response is a redirect, + * XMLHttpRequest will transparently follow it, meaning that the error callback will not be + * called for such responses. + * + * ## Writing Unit Tests that use $http + * When unit testing (using {@link ngMock ngMock}), it is necessary to call + * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending + * request using trained responses. + * + * ``` + * $httpBackend.expectGET(...); + * $http.get(...); + * $httpBackend.flush(); + * ``` + * + * ## Shortcut methods + * + * Shortcut methods are also available. All shortcut methods require passing in the URL, and + * request data must be passed in for POST/PUT requests. + * + * ```js + * $http.get('/someUrl').success(successCallback); + * $http.post('/someUrl', data).success(successCallback); + * ``` + * + * Complete list of shortcut methods: + * + * - {@link ng.$http#get $http.get} + * - {@link ng.$http#head $http.head} + * - {@link ng.$http#post $http.post} + * - {@link ng.$http#put $http.put} + * - {@link ng.$http#delete $http.delete} + * - {@link ng.$http#jsonp $http.jsonp} + * - {@link ng.$http#patch $http.patch} + * + * + * ## Setting HTTP Headers + * + * The $http service will automatically add certain HTTP headers to all requests. These defaults + * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration + * object, which currently contains this default configuration: + * + * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): + * - `Accept: application/json, text/plain, * / *` + * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests) + * - `Content-Type: application/json` + * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests) + * - `Content-Type: application/json` + * + * To add or overwrite these defaults, simply add or remove a property from these configuration + * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object + * with the lowercased HTTP method name as the key, e.g. + * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }`. + * + * The defaults can also be set at runtime via the `$http.defaults` object in the same + * fashion. For example: + * + * ``` + * module.run(function($http) { + * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w' + * }); + * ``` + * + * In addition, you can supply a `headers` property in the config object passed when + * calling `$http(config)`, which overrides the defaults without changing them globally. + * + * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis, + * Use the `headers` property, setting the desired header to `undefined`. For example: + * + * ```js + * var req = { + * method: 'POST', + * url: 'http://example.com', + * headers: { + * 'Content-Type': undefined + * }, + * data: { test: 'test' } + * } + * + * $http(req).success(function(){...}).error(function(){...}); + * ``` + * + * ## Transforming Requests and Responses + * + * Both requests and responses can be transformed using transformation functions: `transformRequest` + * and `transformResponse`. These properties can be a single function that returns + * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions, + * which allows you to `push` or `unshift` a new transformation function into the transformation chain. + * + * ### Default Transformations + * + * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and + * `defaults.transformResponse` properties. If a request does not provide its own transformations + * then these will be applied. + * + * You can augment or replace the default transformations by modifying these properties by adding to or + * replacing the array. + * + * Angular provides the following default transformations: + * + * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`): + * + * - If the `data` property of the request configuration object contains an object, serialize it + * into JSON format. + * + * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`): + * + * - If XSRF prefix is detected, strip it (see Security Considerations section below). + * - If JSON response is detected, deserialize it using a JSON parser. + * + * + * ### Overriding the Default Transformations Per Request + * + * If you wish override the request/response transformations only for a single request then provide + * `transformRequest` and/or `transformResponse` properties on the configuration object passed + * into `$http`. + * + * Note that if you provide these properties on the config object the default transformations will be + * overwritten. If you wish to augment the default transformations then you must include them in your + * local transformation array. + * + * The following code demonstrates adding a new response transformation to be run after the default response + * transformations have been run. + * + * ```js + * function appendTransform(defaults, transform) { + * + * // We can't guarantee that the default transformation is an array + * defaults = angular.isArray(defaults) ? defaults : [defaults]; + * + * // Append the new transformation to the defaults + * return defaults.concat(transform); + * } + * + * $http({ + * url: '...', + * method: 'GET', + * transformResponse: appendTransform($http.defaults.transformResponse, function(value) { + * return doTransform(value); + * }) + * }); + * ``` + * + * + * ## Caching + * + * To enable caching, set the request configuration `cache` property to `true` (to use default + * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}). + * When the cache is enabled, `$http` stores the response from the server in the specified + * cache. The next time the same request is made, the response is served from the cache without + * sending a request to the server. + * + * Note that even if the response is served from cache, delivery of the data is asynchronous in + * the same way that real requests are. + * + * If there are multiple GET requests for the same URL that should be cached using the same + * cache, but the cache is not populated yet, only one request to the server will be made and + * the remaining requests will be fulfilled using the response from the first request. + * + * You can change the default cache to a new object (built with + * {@link ng.$cacheFactory `$cacheFactory`}) by updating the + * {@link ng.$http#defaults `$http.defaults.cache`} property. All requests who set + * their `cache` property to `true` will now use this cache object. + * + * If you set the default cache to `false` then only requests that specify their own custom + * cache object will be cached. + * + * ## Interceptors + * + * Before you start creating interceptors, be sure to understand the + * {@link ng.$q $q and deferred/promise APIs}. + * + * For purposes of global error handling, authentication, or any kind of synchronous or + * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be + * able to intercept requests before they are handed to the server and + * responses before they are handed over to the application code that + * initiated these requests. The interceptors leverage the {@link ng.$q + * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing. + * + * The interceptors are service factories that are registered with the `$httpProvider` by + * adding them to the `$httpProvider.interceptors` array. The factory is called and + * injected with dependencies (if specified) and returns the interceptor. + * + * There are two kinds of interceptors (and two kinds of rejection interceptors): + * + * * `request`: interceptors get called with a http `config` object. The function is free to + * modify the `config` object or create a new one. The function needs to return the `config` + * object directly, or a promise containing the `config` or a new `config` object. + * * `requestError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * * `response`: interceptors get called with http `response` object. The function is free to + * modify the `response` object or create a new one. The function needs to return the `response` + * object directly, or as a promise containing the `response` or a new `response` object. + * * `responseError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * + * + * ```js + * // register the interceptor as a service + * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { + * return { + * // optional method + * 'request': function(config) { + * // do something on success + * return config; + * }, + * + * // optional method + * 'requestError': function(rejection) { + * // do something on error + * if (canRecover(rejection)) { + * return responseOrNewPromise + * } + * return $q.reject(rejection); + * }, + * + * + * + * // optional method + * 'response': function(response) { + * // do something on success + * return response; + * }, + * + * // optional method + * 'responseError': function(rejection) { + * // do something on error + * if (canRecover(rejection)) { + * return responseOrNewPromise + * } + * return $q.reject(rejection); + * } + * }; + * }); + * + * $httpProvider.interceptors.push('myHttpInterceptor'); + * + * + * // alternatively, register the interceptor via an anonymous factory + * $httpProvider.interceptors.push(function($q, dependency1, dependency2) { + * return { + * 'request': function(config) { + * // same as above + * }, + * + * 'response': function(response) { + * // same as above + * } + * }; + * }); + * ``` + * + * ## Security Considerations + * + * When designing web applications, consider security threats from: + * + * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) + * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) + * + * Both server and the client must cooperate in order to eliminate these threats. Angular comes + * pre-configured with strategies that address these issues, but for this to work backend server + * cooperation is required. + * + * ### JSON Vulnerability Protection + * + * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) + * allows third party website to turn your JSON resource URL into + * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To + * counter this your server can prefix all JSON requests with following string `")]}',\n"`. + * Angular will automatically strip the prefix before processing it as JSON. + * + * For example if your server needs to return: + * ```js + * ['one','two'] + * ``` + * + * which is vulnerable to attack, your server can return: + * ```js + * )]}', + * ['one','two'] + * ``` + * + * Angular will strip the prefix, before processing the JSON. + * + * + * ### Cross Site Request Forgery (XSRF) Protection + * + * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is a technique by which + * an unauthorized site can gain your user's private data. Angular provides a mechanism + * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie + * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only + * JavaScript that runs on your domain could read the cookie, your server can be assured that + * the XHR came from JavaScript running on your domain. The header will not be set for + * cross-domain requests. + * + * To take advantage of this, your server needs to set a token in a JavaScript readable session + * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the + * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure + * that only JavaScript running on your domain could have sent the request. The token must be + * unique for each user and must be verifiable by the server (to prevent the JavaScript from + * making up its own tokens). We recommend that the token is a digest of your site's + * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography)) + * for added security. + * + * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName + * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, + * or the per-request config object. + * + * In order to prevent collisions in environments where multiple Angular apps share the + * same domain or subdomain, we recommend that each application uses unique cookie name. + * + * + * @param {object} config Object describing the request to be made and how it should be + * processed. The object has following properties: + * + * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) + * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. + * - **params** – `{Object.}` – Map of strings or objects which will be serialized + * with the `paramSerializer` and appended as GET parameters. + * - **data** – `{string|Object}` – Data to be sent as the request message data. + * - **headers** – `{Object}` – Map of strings or functions which return strings representing + * HTTP headers to send to the server. If the return value of a function is null, the + * header will not be sent. Functions accept a config object as an argument. + * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. + * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. + * - **transformRequest** – + * `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * request body and headers and returns its transformed (typically serialized) version. + * See {@link ng.$http#overriding-the-default-transformations-per-request + * Overriding the Default Transformations} + * - **transformResponse** – + * `{function(data, headersGetter, status)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * response body, headers and status and returns its transformed (typically deserialized) version. + * See {@link ng.$http#overriding-the-default-transformations-per-request + * Overriding the Default TransformationjqLiks} + * - **paramSerializer** - `{string|function(Object):string}` - A function used to + * prepare the string representation of request parameters (specified as an object). + * If specified as string, it is interpreted as function registered with the + * {@link $injector $injector}, which means you can create your own serializer + * by registering it as a {@link auto.$provide#service service}. + * The default serializer is the {@link $httpParamSerializer $httpParamSerializer}; + * alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike} + * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the + * GET request, otherwise if a cache instance built with + * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for + * caching. + * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} + * that should abort the request when resolved. + * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the + * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) + * for more information. + * - **responseType** - `{string}` - see + * [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype). + * + * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the + * standard `then` method and two http specific methods: `success` and `error`. The `then` + * method takes two arguments a success and an error callback which will be called with a + * response object. The `success` and `error` methods take a single argument - a function that + * will be called when the request succeeds or fails respectively. The arguments passed into + * these functions are destructured representation of the response object passed into the + * `then` method. The response object has these properties: + * + * - **data** – `{string|Object}` – The response body transformed with the transform + * functions. + * - **status** – `{number}` – HTTP status code of the response. + * - **headers** – `{function([headerName])}` – Header getter function. + * - **config** – `{Object}` – The configuration object that was used to generate the request. + * - **statusText** – `{string}` – HTTP status text of the response. + * + * @property {Array.} pendingRequests Array of config objects for currently pending + * requests. This is primarily meant to be used for debugging purposes. + * + * + * @example + + +
    + + +
    + + + +
    http status code: {{status}}
    +
    http response data: {{data}}
    +
    +
    + + angular.module('httpExample', []) + .controller('FetchController', ['$scope', '$http', '$templateCache', + function($scope, $http, $templateCache) { + $scope.method = 'GET'; + $scope.url = 'http-hello.html'; + + $scope.fetch = function() { + $scope.code = null; + $scope.response = null; + + $http({method: $scope.method, url: $scope.url, cache: $templateCache}). + success(function(data, status) { + $scope.status = status; + $scope.data = data; + }). + error(function(data, status) { + $scope.data = data || "Request failed"; + $scope.status = status; + }); + }; + + $scope.updateModel = function(method, url) { + $scope.method = method; + $scope.url = url; + }; + }]); + + + Hello, $http! + + + var status = element(by.binding('status')); + var data = element(by.binding('data')); + var fetchBtn = element(by.id('fetchbtn')); + var sampleGetBtn = element(by.id('samplegetbtn')); + var sampleJsonpBtn = element(by.id('samplejsonpbtn')); + var invalidJsonpBtn = element(by.id('invalidjsonpbtn')); + + it('should make an xhr GET request', function() { + sampleGetBtn.click(); + fetchBtn.click(); + expect(status.getText()).toMatch('200'); + expect(data.getText()).toMatch(/Hello, \$http!/); + }); + +// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185 +// it('should make a JSONP request to angularjs.org', function() { +// sampleJsonpBtn.click(); +// fetchBtn.click(); +// expect(status.getText()).toMatch('200'); +// expect(data.getText()).toMatch(/Super Hero!/); +// }); + + it('should make JSONP request to invalid URL and invoke the error handler', + function() { + invalidJsonpBtn.click(); + fetchBtn.click(); + expect(status.getText()).toMatch('0'); + expect(data.getText()).toMatch('Request failed'); + }); + +
    + */ + function $http(requestConfig) { + + if (!angular.isObject(requestConfig)) { + throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig); + } + + var config = extend({ + method: 'get', + transformRequest: defaults.transformRequest, + transformResponse: defaults.transformResponse, + paramSerializer: defaults.paramSerializer + }, requestConfig); + + config.headers = mergeHeaders(requestConfig); + config.method = uppercase(config.method); + config.paramSerializer = isString(config.paramSerializer) ? + $injector.get(config.paramSerializer) : config.paramSerializer; + + var serverRequest = function(config) { + var headers = config.headers; + var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest); + + // strip content-type if data is undefined + if (isUndefined(reqData)) { + forEach(headers, function(value, header) { + if (lowercase(header) === 'content-type') { + delete headers[header]; + } + }); + } + + if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { + config.withCredentials = defaults.withCredentials; + } + + // send request + return sendReq(config, reqData).then(transformResponse, transformResponse); + }; + + var chain = [serverRequest, undefined]; + var promise = $q.when(config); + + // apply interceptors + forEach(reversedInterceptors, function(interceptor) { + if (interceptor.request || interceptor.requestError) { + chain.unshift(interceptor.request, interceptor.requestError); + } + if (interceptor.response || interceptor.responseError) { + chain.push(interceptor.response, interceptor.responseError); + } + }); + + while (chain.length) { + var thenFn = chain.shift(); + var rejectFn = chain.shift(); + + promise = promise.then(thenFn, rejectFn); + } + + promise.success = function(fn) { + assertArgFn(fn, 'fn'); + + promise.then(function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + promise.error = function(fn) { + assertArgFn(fn, 'fn'); + + promise.then(null, function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + return promise; + + function transformResponse(response) { + // make a copy since the response must be cacheable + var resp = extend({}, response); + if (!response.data) { + resp.data = response.data; + } else { + resp.data = transformData(response.data, response.headers, response.status, config.transformResponse); + } + return (isSuccess(response.status)) + ? resp + : $q.reject(resp); + } + + function executeHeaderFns(headers, config) { + var headerContent, processedHeaders = {}; + + forEach(headers, function(headerFn, header) { + if (isFunction(headerFn)) { + headerContent = headerFn(config); + if (headerContent != null) { + processedHeaders[header] = headerContent; + } + } else { + processedHeaders[header] = headerFn; + } + }); + + return processedHeaders; + } + + function mergeHeaders(config) { + var defHeaders = defaults.headers, + reqHeaders = extend({}, config.headers), + defHeaderName, lowercaseDefHeaderName, reqHeaderName; + + defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); + + // using for-in instead of forEach to avoid unecessary iteration after header has been found + defaultHeadersIteration: + for (defHeaderName in defHeaders) { + lowercaseDefHeaderName = lowercase(defHeaderName); + + for (reqHeaderName in reqHeaders) { + if (lowercase(reqHeaderName) === lowercaseDefHeaderName) { + continue defaultHeadersIteration; + } + } + + reqHeaders[defHeaderName] = defHeaders[defHeaderName]; + } + + // execute if header value is a function for merged headers + return executeHeaderFns(reqHeaders, shallowCopy(config)); + } + } + + $http.pendingRequests = []; + + /** + * @ngdoc method + * @name $http#get + * + * @description + * Shortcut method to perform `GET` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#delete + * + * @description + * Shortcut method to perform `DELETE` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#head + * + * @description + * Shortcut method to perform `HEAD` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#jsonp + * + * @description + * Shortcut method to perform `JSONP` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request. + * The name of the callback should be the string `JSON_CALLBACK`. + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethods('get', 'delete', 'head', 'jsonp'); + + /** + * @ngdoc method + * @name $http#post + * + * @description + * Shortcut method to perform `POST` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#put + * + * @description + * Shortcut method to perform `PUT` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#patch + * + * @description + * Shortcut method to perform `PATCH` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethodsWithData('post', 'put', 'patch'); + + /** + * @ngdoc property + * @name $http#defaults + * + * @description + * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of + * default headers, withCredentials as well as request and response transformations. + * + * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. + */ + $http.defaults = defaults; + + + return $http; + + + function createShortMethods(names) { + forEach(arguments, function(name) { + $http[name] = function(url, config) { + return $http(extend({}, config || {}, { + method: name, + url: url + })); + }; + }); + } + + + function createShortMethodsWithData(name) { + forEach(arguments, function(name) { + $http[name] = function(url, data, config) { + return $http(extend({}, config || {}, { + method: name, + url: url, + data: data + })); + }; + }); + } + + + /** + * Makes the request. + * + * !!! ACCESSES CLOSURE VARS: + * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests + */ + function sendReq(config, reqData) { + var deferred = $q.defer(), + promise = deferred.promise, + cache, + cachedResp, + reqHeaders = config.headers, + url = buildUrl(config.url, config.paramSerializer(config.params)); + + $http.pendingRequests.push(config); + promise.then(removePendingReq, removePendingReq); + + + if ((config.cache || defaults.cache) && config.cache !== false && + (config.method === 'GET' || config.method === 'JSONP')) { + cache = isObject(config.cache) ? config.cache + : isObject(defaults.cache) ? defaults.cache + : defaultCache; + } + + if (cache) { + cachedResp = cache.get(url); + if (isDefined(cachedResp)) { + if (isPromiseLike(cachedResp)) { + // cached request has already been sent, but there is no response yet + cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult); + } else { + // serving from cache + if (isArray(cachedResp)) { + resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]); + } else { + resolvePromise(cachedResp, 200, {}, 'OK'); + } + } + } else { + // put the promise for the non-transformed response into cache as a placeholder + cache.put(url, promise); + } + } + + + // if we won't have the response in cache, set the xsrf headers and + // send the request to the backend + if (isUndefined(cachedResp)) { + var xsrfValue = urlIsSameOrigin(config.url) + ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName] + : undefined; + if (xsrfValue) { + reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; + } + + $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, + config.withCredentials, config.responseType); + } + + return promise; + + + /** + * Callback registered to $httpBackend(): + * - caches the response if desired + * - resolves the raw $http promise + * - calls $apply + */ + function done(status, response, headersString, statusText) { + if (cache) { + if (isSuccess(status)) { + cache.put(url, [status, response, parseHeaders(headersString), statusText]); + } else { + // remove promise from the cache + cache.remove(url); + } + } + + function resolveHttpPromise() { + resolvePromise(response, status, headersString, statusText); + } + + if (useApplyAsync) { + $rootScope.$applyAsync(resolveHttpPromise); + } else { + resolveHttpPromise(); + if (!$rootScope.$$phase) $rootScope.$apply(); + } + } + + + /** + * Resolves the raw $http promise. + */ + function resolvePromise(response, status, headers, statusText) { + // normalize internal statuses to 0 + status = Math.max(status, 0); + + (isSuccess(status) ? deferred.resolve : deferred.reject)({ + data: response, + status: status, + headers: headersGetter(headers), + config: config, + statusText: statusText + }); + } + + function resolvePromiseWithResult(result) { + resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText); + } + + function removePendingReq() { + var idx = $http.pendingRequests.indexOf(config); + if (idx !== -1) $http.pendingRequests.splice(idx, 1); + } + } + + + function buildUrl(url, serializedParams) { + if (serializedParams.length > 0) { + url += ((url.indexOf('?') == -1) ? '?' : '&') + serializedParams; + } + return url; + } + }]; +} + +function createXhr() { + return new window.XMLHttpRequest(); +} + +/** + * @ngdoc service + * @name $httpBackend + * @requires $window + * @requires $document + * + * @description + * HTTP backend used by the {@link ng.$http service} that delegates to + * XMLHttpRequest object or JSONP and deals with browser incompatibilities. + * + * You should never need to use this service directly, instead use the higher-level abstractions: + * {@link ng.$http $http} or {@link ngResource.$resource $resource}. + * + * During testing this implementation is swapped with {@link ngMock.$httpBackend mock + * $httpBackend} which can be trained with responses. + */ +function $HttpBackendProvider() { + this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) { + return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]); + }]; +} + +function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { + // TODO(vojta): fix the signature + return function(method, url, post, callback, headers, timeout, withCredentials, responseType) { + $browser.$$incOutstandingRequestCount(); + url = url || $browser.url(); + + if (lowercase(method) == 'jsonp') { + var callbackId = '_' + (callbacks.counter++).toString(36); + callbacks[callbackId] = function(data) { + callbacks[callbackId].data = data; + callbacks[callbackId].called = true; + }; + + var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), + callbackId, function(status, text) { + completeRequest(callback, status, callbacks[callbackId].data, "", text); + callbacks[callbackId] = noop; + }); + } else { + + var xhr = createXhr(); + + xhr.open(method, url, true); + forEach(headers, function(value, key) { + if (isDefined(value)) { + xhr.setRequestHeader(key, value); + } + }); + + xhr.onload = function requestLoaded() { + var statusText = xhr.statusText || ''; + + // responseText is the old-school way of retrieving response (supported by IE8 & 9) + // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) + var response = ('response' in xhr) ? xhr.response : xhr.responseText; + + // normalize IE9 bug (http://bugs.jquery.com/ticket/1450) + var status = xhr.status === 1223 ? 204 : xhr.status; + + // fix status code when it is 0 (0 status is undocumented). + // Occurs when accessing file resources or on Android 4.1 stock browser + // while retrieving files from application cache. + if (status === 0) { + status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0; + } + + completeRequest(callback, + status, + response, + xhr.getAllResponseHeaders(), + statusText); + }; + + var requestError = function() { + // The response is always empty + // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error + completeRequest(callback, -1, null, null, ''); + }; + + xhr.onerror = requestError; + xhr.onabort = requestError; + + if (withCredentials) { + xhr.withCredentials = true; + } + + if (responseType) { + try { + xhr.responseType = responseType; + } catch (e) { + // WebKit added support for the json responseType value on 09/03/2013 + // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are + // known to throw when setting the value "json" as the response type. Other older + // browsers implementing the responseType + // + // The json response type can be ignored if not supported, because JSON payloads are + // parsed on the client-side regardless. + if (responseType !== 'json') { + throw e; + } + } + } + + xhr.send(post); + } + + if (timeout > 0) { + var timeoutId = $browserDefer(timeoutRequest, timeout); + } else if (isPromiseLike(timeout)) { + timeout.then(timeoutRequest); + } + + + function timeoutRequest() { + jsonpDone && jsonpDone(); + xhr && xhr.abort(); + } + + function completeRequest(callback, status, response, headersString, statusText) { + // cancel timeout and subsequent timeout promise resolution + if (timeoutId !== undefined) { + $browserDefer.cancel(timeoutId); + } + jsonpDone = xhr = null; + + callback(status, response, headersString, statusText); + $browser.$$completeOutstandingRequest(noop); + } + }; + + function jsonpReq(url, callbackId, done) { + // we can't use jQuery/jqLite here because jQuery does crazy stuff with script elements, e.g.: + // - fetches local scripts via XHR and evals them + // - adds and immediately removes script elements from the document + var script = rawDocument.createElement('script'), callback = null; + script.type = "text/javascript"; + script.src = url; + script.async = true; + + callback = function(event) { + removeEventListenerFn(script, "load", callback); + removeEventListenerFn(script, "error", callback); + rawDocument.body.removeChild(script); + script = null; + var status = -1; + var text = "unknown"; + + if (event) { + if (event.type === "load" && !callbacks[callbackId].called) { + event = { type: "error" }; + } + text = event.type; + status = event.type === "error" ? 404 : 200; + } + + if (done) { + done(status, text); + } + }; + + addEventListenerFn(script, "load", callback); + addEventListenerFn(script, "error", callback); + rawDocument.body.appendChild(script); + return callback; + } +} + +var $interpolateMinErr = angular.$interpolateMinErr = minErr('$interpolate'); +$interpolateMinErr.throwNoconcat = function(text) { + throw $interpolateMinErr('noconcat', + "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + + "interpolations that concatenate multiple expressions when a trusted value is " + + "required. See http://docs.angularjs.org/api/ng.$sce", text); +}; + +$interpolateMinErr.interr = function(text, err) { + return $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, err.toString()); +}; + +/** + * @ngdoc provider + * @name $interpolateProvider + * + * @description + * + * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. + * + * @example + + + +
    + //demo.label// +
    +
    + + it('should interpolate binding with custom symbols', function() { + expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.'); + }); + +
    + */ +function $InterpolateProvider() { + var startSymbol = '{{'; + var endSymbol = '}}'; + + /** + * @ngdoc method + * @name $interpolateProvider#startSymbol + * @description + * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. + * + * @param {string=} value new value to set the starting symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.startSymbol = function(value) { + if (value) { + startSymbol = value; + return this; + } else { + return startSymbol; + } + }; + + /** + * @ngdoc method + * @name $interpolateProvider#endSymbol + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * @param {string=} value new value to set the ending symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.endSymbol = function(value) { + if (value) { + endSymbol = value; + return this; + } else { + return endSymbol; + } + }; + + + this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) { + var startSymbolLength = startSymbol.length, + endSymbolLength = endSymbol.length, + escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'), + escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g'); + + function escape(ch) { + return '\\\\\\' + ch; + } + + function unescapeText(text) { + return text.replace(escapedStartRegexp, startSymbol). + replace(escapedEndRegexp, endSymbol); + } + + function stringify(value) { + if (value == null) { // null || undefined + return ''; + } + switch (typeof value) { + case 'string': + break; + case 'number': + value = '' + value; + break; + default: + value = toJson(value); + } + + return value; + } + + /** + * @ngdoc service + * @name $interpolate + * @kind function + * + * @requires $parse + * @requires $sce + * + * @description + * + * Compiles a string with markup into an interpolation function. This service is used by the + * HTML {@link ng.$compile $compile} service for data binding. See + * {@link ng.$interpolateProvider $interpolateProvider} for configuring the + * interpolation markup. + * + * + * ```js + * var $interpolate = ...; // injected + * var exp = $interpolate('Hello {{name | uppercase}}!'); + * expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!'); + * ``` + * + * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is + * `true`, the interpolation function will return `undefined` unless all embedded expressions + * evaluate to a value other than `undefined`. + * + * ```js + * var $interpolate = ...; // injected + * var context = {greeting: 'Hello', name: undefined }; + * + * // default "forgiving" mode + * var exp = $interpolate('{{greeting}} {{name}}!'); + * expect(exp(context)).toEqual('Hello !'); + * + * // "allOrNothing" mode + * exp = $interpolate('{{greeting}} {{name}}!', false, null, true); + * expect(exp(context)).toBeUndefined(); + * context.name = 'Angular'; + * expect(exp(context)).toEqual('Hello Angular!'); + * ``` + * + * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior. + * + * ####Escaped Interpolation + * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers + * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash). + * It will be rendered as a regular start/end marker, and will not be interpreted as an expression + * or binding. + * + * This enables web-servers to prevent script injection attacks and defacing attacks, to some + * degree, while also enabling code examples to work without relying on the + * {@link ng.directive:ngNonBindable ngNonBindable} directive. + * + * **For security purposes, it is strongly encouraged that web servers escape user-supplied data, + * replacing angle brackets (<, >) with &lt; and &gt; respectively, and replacing all + * interpolation start/end markers with their escaped counterparts.** + * + * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered + * output when the $interpolate service processes the text. So, for HTML elements interpolated + * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter + * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such, + * this is typically useful only when user-data is used in rendering a template from the server, or + * when otherwise untrusted data is used by a directive. + * + * + * + *
    + *

    {{apptitle}}: \{\{ username = "defaced value"; \}\} + *

    + *

    {{username}} attempts to inject code which will deface the + * application, but fails to accomplish their task, because the server has correctly + * escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash) + * characters.

    + *

    Instead, the result of the attempted script injection is visible, and can be removed + * from the database by an administrator.

    + *
    + *
    + *
    + * + * @param {string} text The text with markup to interpolate. + * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have + * embedded expression in order to return an interpolation function. Strings with no + * embedded expression will return null for the interpolation function. + * @param {string=} trustedContext when provided, the returned function passes the interpolated + * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult, + * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that + * provides Strict Contextual Escaping for details. + * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined + * unless all embedded expressions evaluate to a value other than `undefined`. + * @returns {function(context)} an interpolation function which is used to compute the + * interpolated string. The function has these parameters: + * + * - `context`: evaluation context for all expressions embedded in the interpolated text + */ + function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) { + allOrNothing = !!allOrNothing; + var startIndex, + endIndex, + index = 0, + expressions = [], + parseFns = [], + textLength = text.length, + exp, + concat = [], + expressionPositions = []; + + while (index < textLength) { + if (((startIndex = text.indexOf(startSymbol, index)) != -1) && + ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) { + if (index !== startIndex) { + concat.push(unescapeText(text.substring(index, startIndex))); + } + exp = text.substring(startIndex + startSymbolLength, endIndex); + expressions.push(exp); + parseFns.push($parse(exp, parseStringifyInterceptor)); + index = endIndex + endSymbolLength; + expressionPositions.push(concat.length); + concat.push(''); + } else { + // we did not find an interpolation, so we have to add the remainder to the separators array + if (index !== textLength) { + concat.push(unescapeText(text.substring(index))); + } + break; + } + } + + // Concatenating expressions makes it hard to reason about whether some combination of + // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a + // single expression be used for iframe[src], object[src], etc., we ensure that the value + // that's used is assigned or constructed by some JS code somewhere that is more testable or + // make it obvious that you bound the value to some user controlled value. This helps reduce + // the load when auditing for XSS issues. + if (trustedContext && concat.length > 1) { + $interpolateMinErr.throwNoconcat(text); + } + + if (!mustHaveExpression || expressions.length) { + var compute = function(values) { + for (var i = 0, ii = expressions.length; i < ii; i++) { + if (allOrNothing && isUndefined(values[i])) return; + concat[expressionPositions[i]] = values[i]; + } + return concat.join(''); + }; + + var getValue = function(value) { + return trustedContext ? + $sce.getTrusted(trustedContext, value) : + $sce.valueOf(value); + }; + + return extend(function interpolationFn(context) { + var i = 0; + var ii = expressions.length; + var values = new Array(ii); + + try { + for (; i < ii; i++) { + values[i] = parseFns[i](context); + } + + return compute(values); + } catch (err) { + $exceptionHandler($interpolateMinErr.interr(text, err)); + } + + }, { + // all of these properties are undocumented for now + exp: text, //just for compatibility with regular watchers created via $watch + expressions: expressions, + $$watchDelegate: function(scope, listener) { + var lastValue; + return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) { + var currValue = compute(values); + if (isFunction(listener)) { + listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope); + } + lastValue = currValue; + }); + } + }); + } + + function parseStringifyInterceptor(value) { + try { + value = getValue(value); + return allOrNothing && !isDefined(value) ? value : stringify(value); + } catch (err) { + $exceptionHandler($interpolateMinErr.interr(text, err)); + } + } + } + + + /** + * @ngdoc method + * @name $interpolate#startSymbol + * @description + * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`. + * + * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change + * the symbol. + * + * @returns {string} start symbol. + */ + $interpolate.startSymbol = function() { + return startSymbol; + }; + + + /** + * @ngdoc method + * @name $interpolate#endSymbol + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change + * the symbol. + * + * @returns {string} end symbol. + */ + $interpolate.endSymbol = function() { + return endSymbol; + }; + + return $interpolate; + }]; +} + +function $IntervalProvider() { + this.$get = ['$rootScope', '$window', '$q', '$$q', + function($rootScope, $window, $q, $$q) { + var intervals = {}; + + + /** + * @ngdoc service + * @name $interval + * + * @description + * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay` + * milliseconds. + * + * The return value of registering an interval function is a promise. This promise will be + * notified upon each tick of the interval, and will be resolved after `count` iterations, or + * run indefinitely if `count` is not defined. The value of the notification will be the + * number of iterations that have run. + * To cancel an interval, call `$interval.cancel(promise)`. + * + * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to + * move forward by `millis` milliseconds and trigger any functions scheduled to run in that + * time. + * + *
    + * **Note**: Intervals created by this service must be explicitly destroyed when you are finished + * with them. In particular they are not automatically destroyed when a controller's scope or a + * directive's element are destroyed. + * You should take this into consideration and make sure to always cancel the interval at the + * appropriate moment. See the example below for more details on how and when to do this. + *
    + * + * @param {function()} fn A function that should be called repeatedly. + * @param {number} delay Number of milliseconds between each function call. + * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat + * indefinitely. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. + * @param {...*=} Pass additional parameters to the executed function. + * @returns {promise} A promise which will be notified on each iteration. + * + * @example + * + * + * + * + *
    + *
    + *
    + * Current time is: + *
    + * Blood 1 : {{blood_1}} + * Blood 2 : {{blood_2}} + * + * + * + *
    + *
    + * + *
    + *
    + */ + function interval(fn, delay, count, invokeApply) { + var hasParams = arguments.length > 4, + args = hasParams ? sliceArgs(arguments, 4) : [], + setInterval = $window.setInterval, + clearInterval = $window.clearInterval, + iteration = 0, + skipApply = (isDefined(invokeApply) && !invokeApply), + deferred = (skipApply ? $$q : $q).defer(), + promise = deferred.promise; + + count = isDefined(count) ? count : 0; + + promise.then(null, null, (!hasParams) ? fn : function() { + fn.apply(null, args); + }); + + promise.$$intervalId = setInterval(function tick() { + deferred.notify(iteration++); + + if (count > 0 && iteration >= count) { + deferred.resolve(iteration); + clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + } + + if (!skipApply) $rootScope.$apply(); + + }, delay); + + intervals[promise.$$intervalId] = deferred; + + return promise; + } + + + /** + * @ngdoc method + * @name $interval#cancel + * + * @description + * Cancels a task associated with the `promise`. + * + * @param {promise} promise returned by the `$interval` function. + * @returns {boolean} Returns `true` if the task was successfully canceled. + */ + interval.cancel = function(promise) { + if (promise && promise.$$intervalId in intervals) { + intervals[promise.$$intervalId].reject('canceled'); + $window.clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + return true; + } + return false; + }; + + return interval; + }]; +} + +/** + * @ngdoc service + * @name $locale + * + * @description + * $locale service provides localization rules for various Angular components. As of right now the + * only public api is: + * + * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) + */ +function $LocaleProvider() { + this.$get = function() { + return { + id: 'en-us', + + NUMBER_FORMATS: { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PATTERNS: [ + { // Decimal Pattern + minInt: 1, + minFrac: 0, + maxFrac: 3, + posPre: '', + posSuf: '', + negPre: '-', + negSuf: '', + gSize: 3, + lgSize: 3 + },{ //Currency Pattern + minInt: 1, + minFrac: 2, + maxFrac: 2, + posPre: '\u00A4', + posSuf: '', + negPre: '(\u00A4', + negSuf: ')', + gSize: 3, + lgSize: 3 + } + ], + CURRENCY_SYM: '$' + }, + + DATETIME_FORMATS: { + MONTH: + 'January,February,March,April,May,June,July,August,September,October,November,December' + .split(','), + SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','), + DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','), + SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','), + AMPMS: ['AM','PM'], + medium: 'MMM d, y h:mm:ss a', + 'short': 'M/d/yy h:mm a', + fullDate: 'EEEE, MMMM d, y', + longDate: 'MMMM d, y', + mediumDate: 'MMM d, y', + shortDate: 'M/d/yy', + mediumTime: 'h:mm:ss a', + shortTime: 'h:mm a', + ERANAMES: [ + "Before Christ", + "Anno Domini" + ], + ERAS: [ + "BC", + "AD" + ] + }, + + pluralCat: function(num) { + if (num === 1) { + return 'one'; + } + return 'other'; + } + }; + }; +} + +var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, + DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21}; +var $locationMinErr = minErr('$location'); + + +/** + * Encode path using encodeUriSegment, ignoring forward slashes + * + * @param {string} path Path to encode + * @returns {string} + */ +function encodePath(path) { + var segments = path.split('/'), + i = segments.length; + + while (i--) { + segments[i] = encodeUriSegment(segments[i]); + } + + return segments.join('/'); +} + +function parseAbsoluteUrl(absoluteUrl, locationObj) { + var parsedUrl = urlResolve(absoluteUrl); + + locationObj.$$protocol = parsedUrl.protocol; + locationObj.$$host = parsedUrl.hostname; + locationObj.$$port = toInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null; +} + + +function parseAppUrl(relativeUrl, locationObj) { + var prefixed = (relativeUrl.charAt(0) !== '/'); + if (prefixed) { + relativeUrl = '/' + relativeUrl; + } + var match = urlResolve(relativeUrl); + locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ? + match.pathname.substring(1) : match.pathname); + locationObj.$$search = parseKeyValue(match.search); + locationObj.$$hash = decodeURIComponent(match.hash); + + // make sure path starts with '/'; + if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') { + locationObj.$$path = '/' + locationObj.$$path; + } +} + + +/** + * + * @param {string} begin + * @param {string} whole + * @returns {string} returns text from whole after begin or undefined if it does not begin with + * expected string. + */ +function beginsWith(begin, whole) { + if (whole.indexOf(begin) === 0) { + return whole.substr(begin.length); + } +} + + +function stripHash(url) { + var index = url.indexOf('#'); + return index == -1 ? url : url.substr(0, index); +} + +function trimEmptyHash(url) { + return url.replace(/(#.+)|#$/, '$1'); +} + + +function stripFile(url) { + return url.substr(0, stripHash(url).lastIndexOf('/') + 1); +} + +/* return the server only (scheme://host:port) */ +function serverBase(url) { + return url.substring(0, url.indexOf('/', url.indexOf('//') + 2)); +} + + +/** + * LocationHtml5Url represents an url + * This object is exposed as $location service when HTML5 mode is enabled and supported + * + * @constructor + * @param {string} appBase application base URL + * @param {string} basePrefix url path prefix + */ +function LocationHtml5Url(appBase, basePrefix) { + this.$$html5 = true; + basePrefix = basePrefix || ''; + var appBaseNoFile = stripFile(appBase); + parseAbsoluteUrl(appBase, this); + + + /** + * Parse given html5 (regular) url string into properties + * @param {string} url HTML5 url + * @private + */ + this.$$parse = function(url) { + var pathUrl = beginsWith(appBaseNoFile, url); + if (!isString(pathUrl)) { + throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, + appBaseNoFile); + } + + parseAppUrl(pathUrl, this); + + if (!this.$$path) { + this.$$path = '/'; + } + + this.$$compose(); + }; + + /** + * Compose url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/' + }; + + this.$$parseLinkUrl = function(url, relHref) { + if (relHref && relHref[0] === '#') { + // special case for links to hash fragments: + // keep the old url and only replace the hash fragment + this.hash(relHref.slice(1)); + return true; + } + var appUrl, prevAppUrl; + var rewrittenUrl; + + if ((appUrl = beginsWith(appBase, url)) !== undefined) { + prevAppUrl = appUrl; + if ((appUrl = beginsWith(basePrefix, appUrl)) !== undefined) { + rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl); + } else { + rewrittenUrl = appBase + prevAppUrl; + } + } else if ((appUrl = beginsWith(appBaseNoFile, url)) !== undefined) { + rewrittenUrl = appBaseNoFile + appUrl; + } else if (appBaseNoFile == url + '/') { + rewrittenUrl = appBaseNoFile; + } + if (rewrittenUrl) { + this.$$parse(rewrittenUrl); + } + return !!rewrittenUrl; + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when developer doesn't opt into html5 mode. + * It also serves as the base class for html5 mode fallback on legacy browsers. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangUrl(appBase, hashPrefix) { + var appBaseNoFile = stripFile(appBase); + + parseAbsoluteUrl(appBase, this); + + + /** + * Parse given hashbang url into properties + * @param {string} url Hashbang url + * @private + */ + this.$$parse = function(url) { + var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url); + var withoutHashUrl; + + if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') { + + // The rest of the url starts with a hash so we have + // got either a hashbang path or a plain hash fragment + withoutHashUrl = beginsWith(hashPrefix, withoutBaseUrl); + if (isUndefined(withoutHashUrl)) { + // There was no hashbang prefix so we just have a hash fragment + withoutHashUrl = withoutBaseUrl; + } + + } else { + // There was no hashbang path nor hash fragment: + // If we are in HTML5 mode we use what is left as the path; + // Otherwise we ignore what is left + if (this.$$html5) { + withoutHashUrl = withoutBaseUrl; + } else { + withoutHashUrl = ''; + if (isUndefined(withoutBaseUrl)) { + appBase = url; + this.replace(); + } + } + } + + parseAppUrl(withoutHashUrl, this); + + this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase); + + this.$$compose(); + + /* + * In Windows, on an anchor node on documents loaded from + * the filesystem, the browser will return a pathname + * prefixed with the drive name ('/C:/path') when a + * pathname without a drive is set: + * * a.setAttribute('href', '/foo') + * * a.pathname === '/C:/foo' //true + * + * Inside of Angular, we're always using pathnames that + * do not include drive names for routing. + */ + function removeWindowsDriveName(path, url, base) { + /* + Matches paths for file protocol on windows, + such as /C:/foo/bar, and captures only /foo/bar. + */ + var windowsFilePathExp = /^\/[A-Z]:(\/.*)/; + + var firstPathSegmentMatch; + + //Get the relative path from the input URL. + if (url.indexOf(base) === 0) { + url = url.replace(base, ''); + } + + // The input URL intentionally contains a first path segment that ends with a colon. + if (windowsFilePathExp.exec(url)) { + return path; + } + + firstPathSegmentMatch = windowsFilePathExp.exec(path); + return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path; + } + }; + + /** + * Compose hashbang url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : ''); + }; + + this.$$parseLinkUrl = function(url, relHref) { + if (stripHash(appBase) == stripHash(url)) { + this.$$parse(url); + return true; + } + return false; + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when html5 history api is enabled but the browser + * does not support it. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangInHtml5Url(appBase, hashPrefix) { + this.$$html5 = true; + LocationHashbangUrl.apply(this, arguments); + + var appBaseNoFile = stripFile(appBase); + + this.$$parseLinkUrl = function(url, relHref) { + if (relHref && relHref[0] === '#') { + // special case for links to hash fragments: + // keep the old url and only replace the hash fragment + this.hash(relHref.slice(1)); + return true; + } + + var rewrittenUrl; + var appUrl; + + if (appBase == stripHash(url)) { + rewrittenUrl = url; + } else if ((appUrl = beginsWith(appBaseNoFile, url))) { + rewrittenUrl = appBase + hashPrefix + appUrl; + } else if (appBaseNoFile === url + '/') { + rewrittenUrl = appBaseNoFile; + } + if (rewrittenUrl) { + this.$$parse(rewrittenUrl); + } + return !!rewrittenUrl; + }; + + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#' + this.$$absUrl = appBase + hashPrefix + this.$$url; + }; + +} + + +var locationPrototype = { + + /** + * Are we in html5 mode? + * @private + */ + $$html5: false, + + /** + * Has any change been replacing? + * @private + */ + $$replace: false, + + /** + * @ngdoc method + * @name $location#absUrl + * + * @description + * This method is getter only. + * + * Return full url representation with all segments encoded according to rules specified in + * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt). + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var absUrl = $location.absUrl(); + * // => "http://example.com/#/some/path?foo=bar&baz=xoxo" + * ``` + * + * @return {string} full url + */ + absUrl: locationGetter('$$absUrl'), + + /** + * @ngdoc method + * @name $location#url + * + * @description + * This method is getter / setter. + * + * Return url (e.g. `/path?a=b#hash`) when called without any parameter. + * + * Change path, search and hash, when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var url = $location.url(); + * // => "/some/path?foo=bar&baz=xoxo" + * ``` + * + * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) + * @return {string} url + */ + url: function(url) { + if (isUndefined(url)) { + return this.$$url; + } + + var match = PATH_MATCH.exec(url); + if (match[1] || url === '') this.path(decodeURIComponent(match[1])); + if (match[2] || match[1] || url === '') this.search(match[3] || ''); + this.hash(match[5] || ''); + + return this; + }, + + /** + * @ngdoc method + * @name $location#protocol + * + * @description + * This method is getter only. + * + * Return protocol of current url. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var protocol = $location.protocol(); + * // => "http" + * ``` + * + * @return {string} protocol of current url + */ + protocol: locationGetter('$$protocol'), + + /** + * @ngdoc method + * @name $location#host + * + * @description + * This method is getter only. + * + * Return host of current url. + * + * Note: compared to the non-angular version `location.host` which returns `hostname:port`, this returns the `hostname` portion only. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var host = $location.host(); + * // => "example.com" + * + * // given url http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo + * host = $location.host(); + * // => "example.com" + * host = location.host; + * // => "example.com:8080" + * ``` + * + * @return {string} host of current url. + */ + host: locationGetter('$$host'), + + /** + * @ngdoc method + * @name $location#port + * + * @description + * This method is getter only. + * + * Return port of current url. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var port = $location.port(); + * // => 80 + * ``` + * + * @return {Number} port + */ + port: locationGetter('$$port'), + + /** + * @ngdoc method + * @name $location#path + * + * @description + * This method is getter / setter. + * + * Return path of current url when called without any parameter. + * + * Change path when called with parameter and return `$location`. + * + * Note: Path should always begin with forward slash (/), this method will add the forward slash + * if it is missing. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var path = $location.path(); + * // => "/some/path" + * ``` + * + * @param {(string|number)=} path New path + * @return {string} path + */ + path: locationGetterSetter('$$path', function(path) { + path = path !== null ? path.toString() : ''; + return path.charAt(0) == '/' ? path : '/' + path; + }), + + /** + * @ngdoc method + * @name $location#search + * + * @description + * This method is getter / setter. + * + * Return search part (as object) of current url when called without any parameter. + * + * Change search part when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var searchObject = $location.search(); + * // => {foo: 'bar', baz: 'xoxo'} + * + * // set foo to 'yipee' + * $location.search('foo', 'yipee'); + * // $location.search() => {foo: 'yipee', baz: 'xoxo'} + * ``` + * + * @param {string|Object.|Object.>} search New search params - string or + * hash object. + * + * When called with a single argument the method acts as a setter, setting the `search` component + * of `$location` to the specified value. + * + * If the argument is a hash object containing an array of values, these values will be encoded + * as duplicate search parameters in the url. + * + * @param {(string|Number|Array|boolean)=} paramValue If `search` is a string or number, then `paramValue` + * will override only a single search property. + * + * If `paramValue` is an array, it will override the property of the `search` component of + * `$location` specified via the first argument. + * + * If `paramValue` is `null`, the property specified via the first argument will be deleted. + * + * If `paramValue` is `true`, the property specified via the first argument will be added with no + * value nor trailing equal sign. + * + * @return {Object} If called with no arguments returns the parsed `search` object. If called with + * one or more arguments returns `$location` object itself. + */ + search: function(search, paramValue) { + switch (arguments.length) { + case 0: + return this.$$search; + case 1: + if (isString(search) || isNumber(search)) { + search = search.toString(); + this.$$search = parseKeyValue(search); + } else if (isObject(search)) { + search = copy(search, {}); + // remove object undefined or null properties + forEach(search, function(value, key) { + if (value == null) delete search[key]; + }); + + this.$$search = search; + } else { + throw $locationMinErr('isrcharg', + 'The first argument of the `$location#search()` call must be a string or an object.'); + } + break; + default: + if (isUndefined(paramValue) || paramValue === null) { + delete this.$$search[search]; + } else { + this.$$search[search] = paramValue; + } + } + + this.$$compose(); + return this; + }, + + /** + * @ngdoc method + * @name $location#hash + * + * @description + * This method is getter / setter. + * + * Return hash fragment when called without any parameter. + * + * Change hash fragment when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue + * var hash = $location.hash(); + * // => "hashValue" + * ``` + * + * @param {(string|number)=} hash New hash fragment + * @return {string} hash + */ + hash: locationGetterSetter('$$hash', function(hash) { + return hash !== null ? hash.toString() : ''; + }), + + /** + * @ngdoc method + * @name $location#replace + * + * @description + * If called, all changes to $location during current `$digest` will be replacing current history + * record, instead of adding new one. + */ + replace: function() { + this.$$replace = true; + return this; + } +}; + +forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) { + Location.prototype = Object.create(locationPrototype); + + /** + * @ngdoc method + * @name $location#state + * + * @description + * This method is getter / setter. + * + * Return the history state object when called without any parameter. + * + * Change the history state object when called with one parameter and return `$location`. + * The state object is later passed to `pushState` or `replaceState`. + * + * NOTE: This method is supported only in HTML5 mode and only in browsers supporting + * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support + * older browsers (like IE9 or Android < 4.0), don't use this method. + * + * @param {object=} state State object for pushState or replaceState + * @return {object} state + */ + Location.prototype.state = function(state) { + if (!arguments.length) { + return this.$$state; + } + + if (Location !== LocationHtml5Url || !this.$$html5) { + throw $locationMinErr('nostate', 'History API state support is available only ' + + 'in HTML5 mode and only in browsers supporting HTML5 History API'); + } + // The user might modify `stateObject` after invoking `$location.state(stateObject)` + // but we're changing the $$state reference to $browser.state() during the $digest + // so the modification window is narrow. + this.$$state = isUndefined(state) ? null : state; + + return this; + }; +}); + + +function locationGetter(property) { + return function() { + return this[property]; + }; +} + + +function locationGetterSetter(property, preprocess) { + return function(value) { + if (isUndefined(value)) { + return this[property]; + } + + this[property] = preprocess(value); + this.$$compose(); + + return this; + }; +} + + +/** + * @ngdoc service + * @name $location + * + * @requires $rootElement + * + * @description + * The $location service parses the URL in the browser address bar (based on the + * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL + * available to your application. Changes to the URL in the address bar are reflected into + * $location service and changes to $location are reflected into the browser address bar. + * + * **The $location service:** + * + * - Exposes the current URL in the browser address bar, so you can + * - Watch and observe the URL. + * - Change the URL. + * - Synchronizes the URL with the browser when the user + * - Changes the address bar. + * - Clicks the back or forward button (or clicks a History link). + * - Clicks on a link. + * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). + * + * For more information see {@link guide/$location Developer Guide: Using $location} + */ + +/** + * @ngdoc provider + * @name $locationProvider + * @description + * Use the `$locationProvider` to configure how the application deep linking paths are stored. + */ +function $LocationProvider() { + var hashPrefix = '', + html5Mode = { + enabled: false, + requireBase: true, + rewriteLinks: true + }; + + /** + * @ngdoc method + * @name $locationProvider#hashPrefix + * @description + * @param {string=} prefix Prefix for hash part (containing path and search) + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.hashPrefix = function(prefix) { + if (isDefined(prefix)) { + hashPrefix = prefix; + return this; + } else { + return hashPrefix; + } + }; + + /** + * @ngdoc method + * @name $locationProvider#html5Mode + * @description + * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value. + * If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported + * properties: + * - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to + * change urls where supported. Will fall back to hash-prefixed paths in browsers that do not + * support `pushState`. + * - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies + * whether or not a tag is required to be present. If `enabled` and `requireBase` are + * true, and a base tag is not present, an error will be thrown when `$location` is injected. + * See the {@link guide/$location $location guide for more information} + * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled, + * enables/disables url rewriting for relative links. + * + * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter + */ + this.html5Mode = function(mode) { + if (isBoolean(mode)) { + html5Mode.enabled = mode; + return this; + } else if (isObject(mode)) { + + if (isBoolean(mode.enabled)) { + html5Mode.enabled = mode.enabled; + } + + if (isBoolean(mode.requireBase)) { + html5Mode.requireBase = mode.requireBase; + } + + if (isBoolean(mode.rewriteLinks)) { + html5Mode.rewriteLinks = mode.rewriteLinks; + } + + return this; + } else { + return html5Mode; + } + }; + + /** + * @ngdoc event + * @name $location#$locationChangeStart + * @eventType broadcast on root scope + * @description + * Broadcasted before a URL will change. + * + * This change can be prevented by calling + * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more + * details about event object. Upon successful change + * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired. + * + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when + * the browser supports the HTML5 History API. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + * @param {string=} newState New history state object + * @param {string=} oldState History state object that was before it was changed. + */ + + /** + * @ngdoc event + * @name $location#$locationChangeSuccess + * @eventType broadcast on root scope + * @description + * Broadcasted after a URL was changed. + * + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when + * the browser supports the HTML5 History API. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + * @param {string=} newState New history state object + * @param {string=} oldState History state object that was before it was changed. + */ + + this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window', + function($rootScope, $browser, $sniffer, $rootElement, $window) { + var $location, + LocationMode, + baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to '' + initialUrl = $browser.url(), + appBase; + + if (html5Mode.enabled) { + if (!baseHref && html5Mode.requireBase) { + throw $locationMinErr('nobase', + "$location in HTML5 mode requires a tag to be present!"); + } + appBase = serverBase(initialUrl) + (baseHref || '/'); + LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; + } else { + appBase = stripHash(initialUrl); + LocationMode = LocationHashbangUrl; + } + $location = new LocationMode(appBase, '#' + hashPrefix); + $location.$$parseLinkUrl(initialUrl, initialUrl); + + $location.$$state = $browser.state(); + + var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i; + + function setBrowserUrlWithFallback(url, replace, state) { + var oldUrl = $location.url(); + var oldState = $location.$$state; + try { + $browser.url(url, replace, state); + + // Make sure $location.state() returns referentially identical (not just deeply equal) + // state object; this makes possible quick checking if the state changed in the digest + // loop. Checking deep equality would be too expensive. + $location.$$state = $browser.state(); + } catch (e) { + // Restore old values if pushState fails + $location.url(oldUrl); + $location.$$state = oldState; + + throw e; + } + } + + $rootElement.on('click', function(event) { + // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) + // currently we open nice url link and redirect then + + if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return; + + var elm = jqLite(event.target); + + // traverse the DOM up to find first A tag + while (nodeName_(elm[0]) !== 'a') { + // ignore rewriting if no A tag (reached root element, or no parent - removed from document) + if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; + } + + var absHref = elm.prop('href'); + // get the actual href attribute - see + // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx + var relHref = elm.attr('href') || elm.attr('xlink:href'); + + if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') { + // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during + // an animation. + absHref = urlResolve(absHref.animVal).href; + } + + // Ignore when url is started with javascript: or mailto: + if (IGNORE_URI_REGEXP.test(absHref)) return; + + if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) { + if ($location.$$parseLinkUrl(absHref, relHref)) { + // We do a preventDefault for all urls that are part of the angular application, + // in html5mode and also without, so that we are able to abort navigation without + // getting double entries in the location history. + event.preventDefault(); + // update location manually + if ($location.absUrl() != $browser.url()) { + $rootScope.$apply(); + // hack to work around FF6 bug 684208 when scenario runner clicks on links + $window.angular['ff-684208-preventDefault'] = true; + } + } + } + }); + + + // rewrite hashbang url <> html5 url + if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) { + $browser.url($location.absUrl(), true); + } + + var initializing = true; + + // update $location when $browser url changes + $browser.onUrlChange(function(newUrl, newState) { + $rootScope.$evalAsync(function() { + var oldUrl = $location.absUrl(); + var oldState = $location.$$state; + var defaultPrevented; + + $location.$$parse(newUrl); + $location.$$state = newState; + + defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, + newState, oldState).defaultPrevented; + + // if the location was changed by a `$locationChangeStart` handler then stop + // processing this location change + if ($location.absUrl() !== newUrl) return; + + if (defaultPrevented) { + $location.$$parse(oldUrl); + $location.$$state = oldState; + setBrowserUrlWithFallback(oldUrl, false, oldState); + } else { + initializing = false; + afterLocationChange(oldUrl, oldState); + } + }); + if (!$rootScope.$$phase) $rootScope.$digest(); + }); + + // update browser + $rootScope.$watch(function $locationWatch() { + var oldUrl = trimEmptyHash($browser.url()); + var newUrl = trimEmptyHash($location.absUrl()); + var oldState = $browser.state(); + var currentReplace = $location.$$replace; + var urlOrStateChanged = oldUrl !== newUrl || + ($location.$$html5 && $sniffer.history && oldState !== $location.$$state); + + if (initializing || urlOrStateChanged) { + initializing = false; + + $rootScope.$evalAsync(function() { + var newUrl = $location.absUrl(); + var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, + $location.$$state, oldState).defaultPrevented; + + // if the location was changed by a `$locationChangeStart` handler then stop + // processing this location change + if ($location.absUrl() !== newUrl) return; + + if (defaultPrevented) { + $location.$$parse(oldUrl); + $location.$$state = oldState; + } else { + if (urlOrStateChanged) { + setBrowserUrlWithFallback(newUrl, currentReplace, + oldState === $location.$$state ? null : $location.$$state); + } + afterLocationChange(oldUrl, oldState); + } + }); + } + + $location.$$replace = false; + + // we don't need to return anything because $evalAsync will make the digest loop dirty when + // there is a change + }); + + return $location; + + function afterLocationChange(oldUrl, oldState) { + $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl, + $location.$$state, oldState); + } +}]; +} + +/** + * @ngdoc service + * @name $log + * @requires $window + * + * @description + * Simple service for logging. Default implementation safely writes the message + * into the browser's console (if present). + * + * The main purpose of this service is to simplify debugging and troubleshooting. + * + * The default is to log `debug` messages. You can use + * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this. + * + * @example + + + angular.module('logExample', []) + .controller('LogController', ['$scope', '$log', function($scope, $log) { + $scope.$log = $log; + $scope.message = 'Hello World!'; + }]); + + +
    +

    Reload this page with open console, enter text and hit the log button...

    + + + + + + +
    +
    +
    + */ + +/** + * @ngdoc provider + * @name $logProvider + * @description + * Use the `$logProvider` to configure how the application logs messages + */ +function $LogProvider() { + var debug = true, + self = this; + + /** + * @ngdoc method + * @name $logProvider#debugEnabled + * @description + * @param {boolean=} flag enable or disable debug level messages + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.debugEnabled = function(flag) { + if (isDefined(flag)) { + debug = flag; + return this; + } else { + return debug; + } + }; + + this.$get = ['$window', function($window) { + return { + /** + * @ngdoc method + * @name $log#log + * + * @description + * Write a log message + */ + log: consoleLog('log'), + + /** + * @ngdoc method + * @name $log#info + * + * @description + * Write an information message + */ + info: consoleLog('info'), + + /** + * @ngdoc method + * @name $log#warn + * + * @description + * Write a warning message + */ + warn: consoleLog('warn'), + + /** + * @ngdoc method + * @name $log#error + * + * @description + * Write an error message + */ + error: consoleLog('error'), + + /** + * @ngdoc method + * @name $log#debug + * + * @description + * Write a debug message + */ + debug: (function() { + var fn = consoleLog('debug'); + + return function() { + if (debug) { + fn.apply(self, arguments); + } + }; + }()) + }; + + function formatError(arg) { + if (arg instanceof Error) { + if (arg.stack) { + arg = (arg.message && arg.stack.indexOf(arg.message) === -1) + ? 'Error: ' + arg.message + '\n' + arg.stack + : arg.stack; + } else if (arg.sourceURL) { + arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; + } + } + return arg; + } + + function consoleLog(type) { + var console = $window.console || {}, + logFn = console[type] || console.log || noop, + hasApply = false; + + // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. + // The reason behind this is that console.log has type "object" in IE8... + try { + hasApply = !!logFn.apply; + } catch (e) {} + + if (hasApply) { + return function() { + var args = []; + forEach(arguments, function(arg) { + args.push(formatError(arg)); + }); + return logFn.apply(console, args); + }; + } + + // we are IE which either doesn't have window.console => this is noop and we do nothing, + // or we are IE where console.log doesn't have apply so we log at least first 2 args + return function(arg1, arg2) { + logFn(arg1, arg2 == null ? '' : arg2); + }; + } + }]; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $parseMinErr = minErr('$parse'); + +// Sandboxing Angular Expressions +// ------------------------------ +// Angular expressions are generally considered safe because these expressions only have direct +// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by +// obtaining a reference to native JS functions such as the Function constructor. +// +// As an example, consider the following Angular expression: +// +// {}.toString.constructor('alert("evil JS code")') +// +// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits +// against the expression language, but not to prevent exploits that were enabled by exposing +// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good +// practice and therefore we are not even trying to protect against interaction with an object +// explicitly exposed in this way. +// +// In general, it is not possible to access a Window object from an angular expression unless a +// window or some DOM object that has a reference to window is published onto a Scope. +// Similarly we prevent invocations of function known to be dangerous, as well as assignments to +// native objects. +// +// See https://docs.angularjs.org/guide/security + + +function ensureSafeMemberName(name, fullExpression) { + if (name === "__defineGetter__" || name === "__defineSetter__" + || name === "__lookupGetter__" || name === "__lookupSetter__" + || name === "__proto__") { + throw $parseMinErr('isecfld', + 'Attempting to access a disallowed field in Angular expressions! ' + + 'Expression: {0}', fullExpression); + } + return name; +} + +function ensureSafeObject(obj, fullExpression) { + // nifty check if obj is Function that is fast and works across iframes and other contexts + if (obj) { + if (obj.constructor === obj) { + throw $parseMinErr('isecfn', + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isWindow(obj) + obj.window === obj) { + throw $parseMinErr('isecwindow', + 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isElement(obj) + obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) { + throw $parseMinErr('isecdom', + 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// block Object so that we can't get hold of dangerous Object.* methods + obj === Object) { + throw $parseMinErr('isecobj', + 'Referencing Object in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + } + return obj; +} + +var CALL = Function.prototype.call; +var APPLY = Function.prototype.apply; +var BIND = Function.prototype.bind; + +function ensureSafeFunction(obj, fullExpression) { + if (obj) { + if (obj.constructor === obj) { + throw $parseMinErr('isecfn', + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (obj === CALL || obj === APPLY || obj === BIND) { + throw $parseMinErr('isecff', + 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + } +} + +var OPERATORS = createMap(); +forEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; }); +var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; + + +///////////////////////////////////////// + + +/** + * @constructor + */ +var Lexer = function(options) { + this.options = options; +}; + +Lexer.prototype = { + constructor: Lexer, + + lex: function(text) { + this.text = text; + this.index = 0; + this.tokens = []; + + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + if (ch === '"' || ch === "'") { + this.readString(ch); + } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) { + this.readNumber(); + } else if (this.isIdent(ch)) { + this.readIdent(); + } else if (this.is(ch, '(){}[].,;:?')) { + this.tokens.push({index: this.index, text: ch}); + this.index++; + } else if (this.isWhitespace(ch)) { + this.index++; + } else { + var ch2 = ch + this.peek(); + var ch3 = ch2 + this.peek(2); + var op1 = OPERATORS[ch]; + var op2 = OPERATORS[ch2]; + var op3 = OPERATORS[ch3]; + if (op1 || op2 || op3) { + var token = op3 ? ch3 : (op2 ? ch2 : ch); + this.tokens.push({index: this.index, text: token, operator: true}); + this.index += token.length; + } else { + this.throwError('Unexpected next character ', this.index, this.index + 1); + } + } + } + return this.tokens; + }, + + is: function(ch, chars) { + return chars.indexOf(ch) !== -1; + }, + + peek: function(i) { + var num = i || 1; + return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false; + }, + + isNumber: function(ch) { + return ('0' <= ch && ch <= '9') && typeof ch === "string"; + }, + + isWhitespace: function(ch) { + // IE treats non-breaking space as \u00A0 + return (ch === ' ' || ch === '\r' || ch === '\t' || + ch === '\n' || ch === '\v' || ch === '\u00A0'); + }, + + isIdent: function(ch) { + return ('a' <= ch && ch <= 'z' || + 'A' <= ch && ch <= 'Z' || + '_' === ch || ch === '$'); + }, + + isExpOperator: function(ch) { + return (ch === '-' || ch === '+' || this.isNumber(ch)); + }, + + throwError: function(error, start, end) { + end = end || this.index; + var colStr = (isDefined(start) + ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']' + : ' ' + end); + throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', + error, colStr, this.text); + }, + + readNumber: function() { + var number = ''; + var start = this.index; + while (this.index < this.text.length) { + var ch = lowercase(this.text.charAt(this.index)); + if (ch == '.' || this.isNumber(ch)) { + number += ch; + } else { + var peekCh = this.peek(); + if (ch == 'e' && this.isExpOperator(peekCh)) { + number += ch; + } else if (this.isExpOperator(ch) && + peekCh && this.isNumber(peekCh) && + number.charAt(number.length - 1) == 'e') { + number += ch; + } else if (this.isExpOperator(ch) && + (!peekCh || !this.isNumber(peekCh)) && + number.charAt(number.length - 1) == 'e') { + this.throwError('Invalid exponent'); + } else { + break; + } + } + this.index++; + } + this.tokens.push({ + index: start, + text: number, + constant: true, + value: Number(number) + }); + }, + + readIdent: function() { + var start = this.index; + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + if (!(this.isIdent(ch) || this.isNumber(ch))) { + break; + } + this.index++; + } + this.tokens.push({ + index: start, + text: this.text.slice(start, this.index), + identifier: true + }); + }, + + readString: function(quote) { + var start = this.index; + this.index++; + var string = ''; + var rawString = quote; + var escape = false; + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + rawString += ch; + if (escape) { + if (ch === 'u') { + var hex = this.text.substring(this.index + 1, this.index + 5); + if (!hex.match(/[\da-f]{4}/i)) { + this.throwError('Invalid unicode escape [\\u' + hex + ']'); + } + this.index += 4; + string += String.fromCharCode(parseInt(hex, 16)); + } else { + var rep = ESCAPE[ch]; + string = string + (rep || ch); + } + escape = false; + } else if (ch === '\\') { + escape = true; + } else if (ch === quote) { + this.index++; + this.tokens.push({ + index: start, + text: rawString, + constant: true, + value: string + }); + return; + } else { + string += ch; + } + this.index++; + } + this.throwError('Unterminated quote', start); + } +}; + +var AST = function(lexer, options) { + this.lexer = lexer; + this.options = options; +}; + +AST.Program = 'Program'; +AST.ExpressionStatement = 'ExpressionStatement'; +AST.AssignmentExpression = 'AssignmentExpression'; +AST.ConditionalExpression = 'ConditionalExpression'; +AST.LogicalExpression = 'LogicalExpression'; +AST.BinaryExpression = 'BinaryExpression'; +AST.UnaryExpression = 'UnaryExpression'; +AST.CallExpression = 'CallExpression'; +AST.MemberExpression = 'MemberExpression'; +AST.Identifier = 'Identifier'; +AST.Literal = 'Literal'; +AST.ArrayExpression = 'ArrayExpression'; +AST.Property = 'Property'; +AST.ObjectExpression = 'ObjectExpression'; +AST.ThisExpression = 'ThisExpression'; + +// Internal use only +AST.NGValueParameter = 'NGValueParameter'; + +AST.prototype = { + ast: function(text) { + this.text = text; + this.tokens = this.lexer.lex(text); + + var value = this.program(); + + if (this.tokens.length !== 0) { + this.throwError('is an unexpected token', this.tokens[0]); + } + + return value; + }, + + program: function() { + var body = []; + while (true) { + if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']')) + body.push(this.expressionStatement()); + if (!this.expect(';')) { + return { type: AST.Program, body: body}; + } + } + }, + + expressionStatement: function() { + return { type: AST.ExpressionStatement, expression: this.filterChain() }; + }, + + filterChain: function() { + var left = this.expression(); + var token; + while ((token = this.expect('|'))) { + left = this.filter(left); + } + return left; + }, + + expression: function() { + return this.assignment(); + }, + + assignment: function() { + var result = this.ternary(); + if (this.expect('=')) { + result = { type: AST.AssignmentExpression, left: result, right: this.assignment(), operator: '='}; + } + return result; + }, + + ternary: function() { + var test = this.logicalOR(); + var alternate; + var consequent; + if (this.expect('?')) { + alternate = this.expression(); + if (this.consume(':')) { + consequent = this.expression(); + return { type: AST.ConditionalExpression, test: test, alternate: alternate, consequent: consequent}; + } + } + return test; + }, + + logicalOR: function() { + var left = this.logicalAND(); + while (this.expect('||')) { + left = { type: AST.LogicalExpression, operator: '||', left: left, right: this.logicalAND() }; + } + return left; + }, + + logicalAND: function() { + var left = this.equality(); + while (this.expect('&&')) { + left = { type: AST.LogicalExpression, operator: '&&', left: left, right: this.equality()}; + } + return left; + }, + + equality: function() { + var left = this.relational(); + var token; + while ((token = this.expect('==','!=','===','!=='))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.relational() }; + } + return left; + }, + + relational: function() { + var left = this.additive(); + var token; + while ((token = this.expect('<', '>', '<=', '>='))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.additive() }; + } + return left; + }, + + additive: function() { + var left = this.multiplicative(); + var token; + while ((token = this.expect('+','-'))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.multiplicative() }; + } + return left; + }, + + multiplicative: function() { + var left = this.unary(); + var token; + while ((token = this.expect('*','/','%'))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.unary() }; + } + return left; + }, + + unary: function() { + var token; + if ((token = this.expect('+', '-', '!'))) { + return { type: AST.UnaryExpression, operator: token.text, prefix: true, argument: this.unary() }; + } else { + return this.primary(); + } + }, + + primary: function() { + var primary; + if (this.expect('(')) { + primary = this.filterChain(); + this.consume(')'); + } else if (this.expect('[')) { + primary = this.arrayDeclaration(); + } else if (this.expect('{')) { + primary = this.object(); + } else if (this.constants.hasOwnProperty(this.peek().text)) { + primary = copy(this.constants[this.consume().text]); + } else if (this.peek().identifier) { + primary = this.identifier(); + } else if (this.peek().constant) { + primary = this.constant(); + } else { + this.throwError('not a primary expression', this.peek()); + } + + var next; + while ((next = this.expect('(', '[', '.'))) { + if (next.text === '(') { + primary = {type: AST.CallExpression, callee: primary, arguments: this.parseArguments() }; + this.consume(')'); + } else if (next.text === '[') { + primary = { type: AST.MemberExpression, object: primary, property: this.expression(), computed: true }; + this.consume(']'); + } else if (next.text === '.') { + primary = { type: AST.MemberExpression, object: primary, property: this.identifier(), computed: false }; + } else { + this.throwError('IMPOSSIBLE'); + } + } + return primary; + }, + + filter: function(baseExpression) { + var args = [baseExpression]; + var result = {type: AST.CallExpression, callee: this.identifier(), arguments: args, filter: true}; + + while (this.expect(':')) { + args.push(this.expression()); + } + + return result; + }, + + parseArguments: function() { + var args = []; + if (this.peekToken().text !== ')') { + do { + args.push(this.expression()); + } while (this.expect(',')); + } + return args; + }, + + identifier: function() { + var token = this.consume(); + if (!token.identifier) { + this.throwError('is not a valid identifier', token); + } + return { type: AST.Identifier, name: token.text }; + }, + + constant: function() { + // TODO check that it is a constant + return { type: AST.Literal, value: this.consume().value }; + }, + + arrayDeclaration: function() { + var elements = []; + if (this.peekToken().text !== ']') { + do { + if (this.peek(']')) { + // Support trailing commas per ES5.1. + break; + } + elements.push(this.expression()); + } while (this.expect(',')); + } + this.consume(']'); + + return { type: AST.ArrayExpression, elements: elements }; + }, + + object: function() { + var properties = [], property; + if (this.peekToken().text !== '}') { + do { + if (this.peek('}')) { + // Support trailing commas per ES5.1. + break; + } + property = {type: AST.Property, kind: 'init'}; + if (this.peek().constant) { + property.key = this.constant(); + } else if (this.peek().identifier) { + property.key = this.identifier(); + } else { + this.throwError("invalid key", this.peek()); + } + this.consume(':'); + property.value = this.expression(); + properties.push(property); + } while (this.expect(',')); + } + this.consume('}'); + + return {type: AST.ObjectExpression, properties: properties }; + }, + + throwError: function(msg, token) { + throw $parseMinErr('syntax', + 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].', + token.text, msg, (token.index + 1), this.text, this.text.substring(token.index)); + }, + + consume: function(e1) { + if (this.tokens.length === 0) { + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); + } + + var token = this.expect(e1); + if (!token) { + this.throwError('is unexpected, expecting [' + e1 + ']', this.peek()); + } + return token; + }, + + peekToken: function() { + if (this.tokens.length === 0) { + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); + } + return this.tokens[0]; + }, + + peek: function(e1, e2, e3, e4) { + return this.peekAhead(0, e1, e2, e3, e4); + }, + + peekAhead: function(i, e1, e2, e3, e4) { + if (this.tokens.length > i) { + var token = this.tokens[i]; + var t = token.text; + if (t === e1 || t === e2 || t === e3 || t === e4 || + (!e1 && !e2 && !e3 && !e4)) { + return token; + } + } + return false; + }, + + expect: function(e1, e2, e3, e4) { + var token = this.peek(e1, e2, e3, e4); + if (token) { + this.tokens.shift(); + return token; + } + return false; + }, + + + /* `undefined` is not a constant, it is an identifier, + * but using it as an identifier is not supported + */ + constants: { + 'true': { type: AST.Literal, value: true }, + 'false': { type: AST.Literal, value: false }, + 'null': { type: AST.Literal, value: null }, + 'undefined': {type: AST.Literal, value: undefined }, + 'this': {type: AST.ThisExpression } + } +}; + +function ifDefined(v, d) { + return typeof v !== 'undefined' ? v : d; +} + +function plusFn(l, r) { + if (typeof l === 'undefined') return r; + if (typeof r === 'undefined') return l; + return l + r; +} + +function isStateless($filter, filterName) { + var fn = $filter(filterName); + return !fn.$stateful; +} + +function findConstantAndWatchExpressions(ast, $filter) { + var allConstants; + var argsToWatch; + switch (ast.type) { + case AST.Program: + allConstants = true; + forEach(ast.body, function(expr) { + findConstantAndWatchExpressions(expr.expression, $filter); + allConstants = allConstants && expr.expression.constant; + }); + ast.constant = allConstants; + break; + case AST.Literal: + ast.constant = true; + ast.toWatch = []; + break; + case AST.UnaryExpression: + findConstantAndWatchExpressions(ast.argument, $filter); + ast.constant = ast.argument.constant; + ast.toWatch = ast.argument.toWatch; + break; + case AST.BinaryExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = ast.left.toWatch.concat(ast.right.toWatch); + break; + case AST.LogicalExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = ast.constant ? [] : [ast]; + break; + case AST.ConditionalExpression: + findConstantAndWatchExpressions(ast.test, $filter); + findConstantAndWatchExpressions(ast.alternate, $filter); + findConstantAndWatchExpressions(ast.consequent, $filter); + ast.constant = ast.test.constant && ast.alternate.constant && ast.consequent.constant; + ast.toWatch = ast.constant ? [] : [ast]; + break; + case AST.Identifier: + ast.constant = false; + ast.toWatch = [ast]; + break; + case AST.MemberExpression: + findConstantAndWatchExpressions(ast.object, $filter); + if (ast.computed) { + findConstantAndWatchExpressions(ast.property, $filter); + } + ast.constant = ast.object.constant && (!ast.computed || ast.property.constant); + ast.toWatch = [ast]; + break; + case AST.CallExpression: + allConstants = ast.filter ? isStateless($filter, ast.callee.name) : false; + argsToWatch = []; + forEach(ast.arguments, function(expr) { + findConstantAndWatchExpressions(expr, $filter); + allConstants = allConstants && expr.constant; + if (!expr.constant) { + argsToWatch.push.apply(argsToWatch, expr.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = ast.filter && isStateless($filter, ast.callee.name) ? argsToWatch : [ast]; + break; + case AST.AssignmentExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = [ast]; + break; + case AST.ArrayExpression: + allConstants = true; + argsToWatch = []; + forEach(ast.elements, function(expr) { + findConstantAndWatchExpressions(expr, $filter); + allConstants = allConstants && expr.constant; + if (!expr.constant) { + argsToWatch.push.apply(argsToWatch, expr.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = argsToWatch; + break; + case AST.ObjectExpression: + allConstants = true; + argsToWatch = []; + forEach(ast.properties, function(property) { + findConstantAndWatchExpressions(property.value, $filter); + allConstants = allConstants && property.value.constant; + if (!property.value.constant) { + argsToWatch.push.apply(argsToWatch, property.value.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = argsToWatch; + break; + case AST.ThisExpression: + ast.constant = false; + ast.toWatch = []; + break; + } +} + +function getInputs(body) { + if (body.length != 1) return; + var lastExpression = body[0].expression; + var candidate = lastExpression.toWatch; + if (candidate.length !== 1) return candidate; + return candidate[0] !== lastExpression ? candidate : undefined; +} + +function isAssignable(ast) { + return ast.type === AST.Identifier || ast.type === AST.MemberExpression; +} + +function assignableAST(ast) { + if (ast.body.length === 1 && isAssignable(ast.body[0].expression)) { + return {type: AST.AssignmentExpression, left: ast.body[0].expression, right: {type: AST.NGValueParameter}, operator: '='}; + } +} + +function isLiteral(ast) { + return ast.body.length === 0 || + ast.body.length === 1 && ( + ast.body[0].expression.type === AST.Literal || + ast.body[0].expression.type === AST.ArrayExpression || + ast.body[0].expression.type === AST.ObjectExpression); +} + +function isConstant(ast) { + return ast.constant; +} + +function ASTCompiler(astBuilder, $filter) { + this.astBuilder = astBuilder; + this.$filter = $filter; +} + +ASTCompiler.prototype = { + compile: function(expression, expensiveChecks) { + var self = this; + var ast = this.astBuilder.ast(expression); + this.state = { + nextId: 0, + filters: {}, + expensiveChecks: expensiveChecks, + fn: {vars: [], body: [], own: {}}, + assign: {vars: [], body: [], own: {}}, + inputs: [] + }; + findConstantAndWatchExpressions(ast, self.$filter); + var extra = ''; + var assignable; + this.stage = 'assign'; + if ((assignable = assignableAST(ast))) { + this.state.computing = 'assign'; + var result = this.nextId(); + this.recurse(assignable, result); + extra = 'fn.assign=' + this.generateFunction('assign', 's,v,l'); + } + var toWatch = getInputs(ast.body); + self.stage = 'inputs'; + forEach(toWatch, function(watch, key) { + var fnKey = 'fn' + key; + self.state[fnKey] = {vars: [], body: [], own: {}}; + self.state.computing = fnKey; + var intoId = self.nextId(); + self.recurse(watch, intoId); + self.return_(intoId); + self.state.inputs.push(fnKey); + watch.watchId = key; + }); + this.state.computing = 'fn'; + this.stage = 'main'; + this.recurse(ast); + var fnString = + // The build and minification steps remove the string "use strict" from the code, but this is done using a regex. + // This is a workaround for this until we do a better job at only removing the prefix only when we should. + '"' + this.USE + ' ' + this.STRICT + '";\n' + + this.filterPrefix() + + 'var fn=' + this.generateFunction('fn', 's,l,a,i') + + extra + + this.watchFns() + + 'return fn;'; + + /* jshint -W054 */ + var fn = (new Function('$filter', + 'ensureSafeMemberName', + 'ensureSafeObject', + 'ensureSafeFunction', + 'ifDefined', + 'plus', + 'text', + fnString))( + this.$filter, + ensureSafeMemberName, + ensureSafeObject, + ensureSafeFunction, + ifDefined, + plusFn, + expression); + /* jshint +W054 */ + this.state = this.stage = undefined; + fn.literal = isLiteral(ast); + fn.constant = isConstant(ast); + return fn; + }, + + USE: 'use', + + STRICT: 'strict', + + watchFns: function() { + var result = []; + var fns = this.state.inputs; + var self = this; + forEach(fns, function(name) { + result.push('var ' + name + '=' + self.generateFunction(name, 's')); + }); + if (fns.length) { + result.push('fn.inputs=[' + fns.join(',') + '];'); + } + return result.join(''); + }, + + generateFunction: function(name, params) { + return 'function(' + params + '){' + + this.varsPrefix(name) + + this.body(name) + + '};'; + }, + + filterPrefix: function() { + var parts = []; + var self = this; + forEach(this.state.filters, function(id, filter) { + parts.push(id + '=$filter(' + self.escape(filter) + ')'); + }); + if (parts.length) return 'var ' + parts.join(',') + ';'; + return ''; + }, + + varsPrefix: function(section) { + return this.state[section].vars.length ? 'var ' + this.state[section].vars.join(',') + ';' : ''; + }, + + body: function(section) { + return this.state[section].body.join(''); + }, + + recurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { + var left, right, self = this, args, expression; + recursionFn = recursionFn || noop; + if (!skipWatchIdCheck && isDefined(ast.watchId)) { + intoId = intoId || this.nextId(); + this.if_('i', + this.lazyAssign(intoId, this.computedMember('i', ast.watchId)), + this.lazyRecurse(ast, intoId, nameId, recursionFn, create, true) + ); + return; + } + switch (ast.type) { + case AST.Program: + forEach(ast.body, function(expression, pos) { + self.recurse(expression.expression, undefined, undefined, function(expr) { right = expr; }); + if (pos !== ast.body.length - 1) { + self.current().body.push(right, ';'); + } else { + self.return_(right); + } + }); + break; + case AST.Literal: + expression = this.escape(ast.value); + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.UnaryExpression: + this.recurse(ast.argument, undefined, undefined, function(expr) { right = expr; }); + expression = ast.operator + '(' + this.ifDefined(right, 0) + ')'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.BinaryExpression: + this.recurse(ast.left, undefined, undefined, function(expr) { left = expr; }); + this.recurse(ast.right, undefined, undefined, function(expr) { right = expr; }); + if (ast.operator === '+') { + expression = this.plus(left, right); + } else if (ast.operator === '-') { + expression = this.ifDefined(left, 0) + ast.operator + this.ifDefined(right, 0); + } else { + expression = '(' + left + ')' + ast.operator + '(' + right + ')'; + } + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.LogicalExpression: + intoId = intoId || this.nextId(); + self.recurse(ast.left, intoId); + self.if_(ast.operator === '&&' ? intoId : self.not(intoId), self.lazyRecurse(ast.right, intoId)); + recursionFn(intoId); + break; + case AST.ConditionalExpression: + intoId = intoId || this.nextId(); + self.recurse(ast.test, intoId); + self.if_(intoId, self.lazyRecurse(ast.alternate, intoId), self.lazyRecurse(ast.consequent, intoId)); + recursionFn(intoId); + break; + case AST.Identifier: + intoId = intoId || this.nextId(); + if (nameId) { + nameId.context = self.stage === 'inputs' ? 's' : this.assign(this.nextId(), this.getHasOwnProperty('l', ast.name) + '?l:s'); + nameId.computed = false; + nameId.name = ast.name; + } + ensureSafeMemberName(ast.name); + self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)), + function() { + self.if_(self.stage === 'inputs' || 's', function() { + if (create && create !== 1) { + self.if_( + self.not(self.nonComputedMember('s', ast.name)), + self.lazyAssign(self.nonComputedMember('s', ast.name), '{}')); + } + self.assign(intoId, self.nonComputedMember('s', ast.name)); + }); + }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name)) + ); + if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.name)) { + self.addEnsureSafeObject(intoId); + } + recursionFn(intoId); + break; + case AST.MemberExpression: + left = nameId && (nameId.context = this.nextId()) || this.nextId(); + intoId = intoId || this.nextId(); + self.recurse(ast.object, left, undefined, function() { + self.if_(self.notNull(left), function() { + if (ast.computed) { + right = self.nextId(); + self.recurse(ast.property, right); + self.addEnsureSafeMemberName(right); + if (create && create !== 1) { + self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}')); + } + expression = self.ensureSafeObject(self.computedMember(left, right)); + self.assign(intoId, expression); + if (nameId) { + nameId.computed = true; + nameId.name = right; + } + } else { + ensureSafeMemberName(ast.property.name); + if (create && create !== 1) { + self.if_(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}')); + } + expression = self.nonComputedMember(left, ast.property.name); + if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.property.name)) { + expression = self.ensureSafeObject(expression); + } + self.assign(intoId, expression); + if (nameId) { + nameId.computed = false; + nameId.name = ast.property.name; + } + } + }, function() { + self.assign(intoId, 'undefined'); + }); + recursionFn(intoId); + }, !!create); + break; + case AST.CallExpression: + intoId = intoId || this.nextId(); + if (ast.filter) { + right = self.filter(ast.callee.name); + args = []; + forEach(ast.arguments, function(expr) { + var argument = self.nextId(); + self.recurse(expr, argument); + args.push(argument); + }); + expression = right + '(' + args.join(',') + ')'; + self.assign(intoId, expression); + recursionFn(intoId); + } else { + right = self.nextId(); + left = {}; + args = []; + self.recurse(ast.callee, right, left, function() { + self.if_(self.notNull(right), function() { + self.addEnsureSafeFunction(right); + forEach(ast.arguments, function(expr) { + self.recurse(expr, self.nextId(), undefined, function(argument) { + args.push(self.ensureSafeObject(argument)); + }); + }); + if (left.name) { + if (!self.state.expensiveChecks) { + self.addEnsureSafeObject(left.context); + } + expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')'; + } else { + expression = right + '(' + args.join(',') + ')'; + } + expression = self.ensureSafeObject(expression); + self.assign(intoId, expression); + }, function() { + self.assign(intoId, 'undefined'); + }); + recursionFn(intoId); + }); + } + break; + case AST.AssignmentExpression: + right = this.nextId(); + left = {}; + if (!isAssignable(ast.left)) { + throw $parseMinErr('lval', 'Trying to assing a value to a non l-value'); + } + this.recurse(ast.left, undefined, left, function() { + self.if_(self.notNull(left.context), function() { + self.recurse(ast.right, right); + self.addEnsureSafeObject(self.member(left.context, left.name, left.computed)); + expression = self.member(left.context, left.name, left.computed) + ast.operator + right; + self.assign(intoId, expression); + recursionFn(intoId || expression); + }); + }, 1); + break; + case AST.ArrayExpression: + args = []; + forEach(ast.elements, function(expr) { + self.recurse(expr, self.nextId(), undefined, function(argument) { + args.push(argument); + }); + }); + expression = '[' + args.join(',') + ']'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.ObjectExpression: + args = []; + forEach(ast.properties, function(property) { + self.recurse(property.value, self.nextId(), undefined, function(expr) { + args.push(self.escape( + property.key.type === AST.Identifier ? property.key.name : + ('' + property.key.value)) + + ':' + expr); + }); + }); + expression = '{' + args.join(',') + '}'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.ThisExpression: + this.assign(intoId, 's'); + recursionFn('s'); + break; + case AST.NGValueParameter: + this.assign(intoId, 'v'); + recursionFn('v'); + break; + } + }, + + getHasOwnProperty: function(element, property) { + var key = element + '.' + property; + var own = this.current().own; + if (!own.hasOwnProperty(key)) { + own[key] = this.nextId(false, element + '&&(' + this.escape(property) + ' in ' + element + ')'); + } + return own[key]; + }, + + assign: function(id, value) { + if (!id) return; + this.current().body.push(id, '=', value, ';'); + return id; + }, + + filter: function(filterName) { + if (!this.state.filters.hasOwnProperty(filterName)) { + this.state.filters[filterName] = this.nextId(true); + } + return this.state.filters[filterName]; + }, + + ifDefined: function(id, defaultValue) { + return 'ifDefined(' + id + ',' + this.escape(defaultValue) + ')'; + }, + + plus: function(left, right) { + return 'plus(' + left + ',' + right + ')'; + }, + + return_: function(id) { + this.current().body.push('return ', id, ';'); + }, + + if_: function(test, alternate, consequent) { + if (test === true) { + alternate(); + } else { + var body = this.current().body; + body.push('if(', test, '){'); + alternate(); + body.push('}'); + if (consequent) { + body.push('else{'); + consequent(); + body.push('}'); + } + } + }, + + not: function(expression) { + return '!(' + expression + ')'; + }, + + notNull: function(expression) { + return expression + '!=null'; + }, + + nonComputedMember: function(left, right) { + return left + '.' + right; + }, + + computedMember: function(left, right) { + return left + '[' + right + ']'; + }, + + member: function(left, right, computed) { + if (computed) return this.computedMember(left, right); + return this.nonComputedMember(left, right); + }, + + addEnsureSafeObject: function(item) { + this.current().body.push(this.ensureSafeObject(item), ';'); + }, + + addEnsureSafeMemberName: function(item) { + this.current().body.push(this.ensureSafeMemberName(item), ';'); + }, + + addEnsureSafeFunction: function(item) { + this.current().body.push(this.ensureSafeFunction(item), ';'); + }, + + ensureSafeObject: function(item) { + return 'ensureSafeObject(' + item + ',text)'; + }, + + ensureSafeMemberName: function(item) { + return 'ensureSafeMemberName(' + item + ',text)'; + }, + + ensureSafeFunction: function(item) { + return 'ensureSafeFunction(' + item + ',text)'; + }, + + lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { + var self = this; + return function() { + self.recurse(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck); + }; + }, + + lazyAssign: function(id, value) { + var self = this; + return function() { + self.assign(id, value); + }; + }, + + stringEscapeRegex: /[^ a-zA-Z0-9]/g, + + stringEscapeFn: function(c) { + return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4); + }, + + escape: function(value) { + if (isString(value)) return "'" + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + "'"; + if (isNumber(value)) return value.toString(); + if (value === true) return 'true'; + if (value === false) return 'false'; + if (value === null) return 'null'; + if (typeof value === 'undefined') return 'undefined'; + + throw $parseMinErr('esc', 'IMPOSSIBLE'); + }, + + nextId: function(skip, init) { + var id = 'v' + (this.state.nextId++); + if (!skip) { + this.current().vars.push(id + (init ? '=' + init : '')); + } + return id; + }, + + current: function() { + return this.state[this.state.computing]; + } +}; + + +function ASTInterpreter(astBuilder, $filter) { + this.astBuilder = astBuilder; + this.$filter = $filter; +} + +ASTInterpreter.prototype = { + compile: function(expression, expensiveChecks) { + var self = this; + var ast = this.astBuilder.ast(expression); + this.expression = expression; + this.expensiveChecks = expensiveChecks; + findConstantAndWatchExpressions(ast, self.$filter); + var assignable; + var assign; + if ((assignable = assignableAST(ast))) { + assign = this.recurse(assignable); + } + var toWatch = getInputs(ast.body); + var inputs; + if (toWatch) { + inputs = []; + forEach(toWatch, function(watch, key) { + var input = self.recurse(watch); + watch.input = input; + inputs.push(input); + watch.watchId = key; + }); + } + var expressions = []; + forEach(ast.body, function(expression) { + expressions.push(self.recurse(expression.expression)); + }); + var fn = ast.body.length === 0 ? function() {} : + ast.body.length === 1 ? expressions[0] : + function(scope, locals) { + var lastValue; + forEach(expressions, function(exp) { + lastValue = exp(scope, locals); + }); + return lastValue; + }; + if (assign) { + fn.assign = function(scope, value, locals) { + return assign(scope, locals, value); + }; + } + if (inputs) { + fn.inputs = inputs; + } + fn.literal = isLiteral(ast); + fn.constant = isConstant(ast); + return fn; + }, + + recurse: function(ast, context, create) { + var left, right, self = this, args, expression; + if (ast.input) { + return this.inputs(ast.input, ast.watchId); + } + switch (ast.type) { + case AST.Literal: + return this.value(ast.value, context); + case AST.UnaryExpression: + right = this.recurse(ast.argument); + return this['unary' + ast.operator](right, context); + case AST.BinaryExpression: + left = this.recurse(ast.left); + right = this.recurse(ast.right); + return this['binary' + ast.operator](left, right, context); + case AST.LogicalExpression: + left = this.recurse(ast.left); + right = this.recurse(ast.right); + return this['binary' + ast.operator](left, right, context); + case AST.ConditionalExpression: + return this['ternary?:']( + this.recurse(ast.test), + this.recurse(ast.alternate), + this.recurse(ast.consequent), + context + ); + case AST.Identifier: + ensureSafeMemberName(ast.name, self.expression); + return self.identifier(ast.name, + self.expensiveChecks || isPossiblyDangerousMemberName(ast.name), + context, create, self.expression); + case AST.MemberExpression: + left = this.recurse(ast.object, false, !!create); + if (!ast.computed) { + ensureSafeMemberName(ast.property.name, self.expression); + right = ast.property.name; + } + if (ast.computed) right = this.recurse(ast.property); + return ast.computed ? + this.computedMember(left, right, context, create, self.expression) : + this.nonComputedMember(left, right, self.expensiveChecks, context, create, self.expression); + case AST.CallExpression: + args = []; + forEach(ast.arguments, function(expr) { + args.push(self.recurse(expr)); + }); + if (ast.filter) right = this.$filter(ast.callee.name); + if (!ast.filter) right = this.recurse(ast.callee, true); + return ast.filter ? + function(scope, locals, assign, inputs) { + var values = []; + for (var i = 0; i < args.length; ++i) { + values.push(args[i](scope, locals, assign, inputs)); + } + var value = right.apply(undefined, values, inputs); + return context ? {context: undefined, name: undefined, value: value} : value; + } : + function(scope, locals, assign, inputs) { + var rhs = right(scope, locals, assign, inputs); + var value; + if (rhs.value != null) { + ensureSafeObject(rhs.context, self.expression); + ensureSafeFunction(rhs.value, self.expression); + var values = []; + for (var i = 0; i < args.length; ++i) { + values.push(ensureSafeObject(args[i](scope, locals, assign, inputs), self.expression)); + } + value = ensureSafeObject(rhs.value.apply(rhs.context, values), self.expression); + } + return context ? {value: value} : value; + }; + case AST.AssignmentExpression: + left = this.recurse(ast.left, true, 1); + right = this.recurse(ast.right); + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + ensureSafeObject(lhs.value, self.expression); + lhs.context[lhs.name] = rhs; + return context ? {value: rhs} : rhs; + }; + case AST.ArrayExpression: + args = []; + forEach(ast.elements, function(expr) { + args.push(self.recurse(expr)); + }); + return function(scope, locals, assign, inputs) { + var value = []; + for (var i = 0; i < args.length; ++i) { + value.push(args[i](scope, locals, assign, inputs)); + } + return context ? {value: value} : value; + }; + case AST.ObjectExpression: + args = []; + forEach(ast.properties, function(property) { + args.push({key: property.key.type === AST.Identifier ? + property.key.name : + ('' + property.key.value), + value: self.recurse(property.value) + }); + }); + return function(scope, locals, assign, inputs) { + var value = {}; + for (var i = 0; i < args.length; ++i) { + value[args[i].key] = args[i].value(scope, locals, assign, inputs); + } + return context ? {value: value} : value; + }; + case AST.ThisExpression: + return function(scope) { + return context ? {value: scope} : scope; + }; + case AST.NGValueParameter: + return function(scope, locals, assign, inputs) { + return context ? {value: assign} : assign; + }; + } + }, + + 'unary+': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = argument(scope, locals, assign, inputs); + if (isDefined(arg)) { + arg = +arg; + } else { + arg = 0; + } + return context ? {value: arg} : arg; + }; + }, + 'unary-': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = argument(scope, locals, assign, inputs); + if (isDefined(arg)) { + arg = -arg; + } else { + arg = 0; + } + return context ? {value: arg} : arg; + }; + }, + 'unary!': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = !argument(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary+': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + var arg = plusFn(lhs, rhs); + return context ? {value: arg} : arg; + }; + }, + 'binary-': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + var arg = (isDefined(lhs) ? lhs : 0) - (isDefined(rhs) ? rhs : 0); + return context ? {value: arg} : arg; + }; + }, + 'binary*': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) * right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary/': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) / right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary%': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) % right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary===': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) === right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary!==': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) !== right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary==': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) == right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary!=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) != right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary<': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) < right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary>': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) > right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary<=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) <= right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary>=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) >= right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary&&': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) && right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary||': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) || right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'ternary?:': function(test, alternate, consequent, context) { + return function(scope, locals, assign, inputs) { + var arg = test(scope, locals, assign, inputs) ? alternate(scope, locals, assign, inputs) : consequent(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + value: function(value, context) { + return function() { return context ? {context: undefined, name: undefined, value: value} : value; }; + }, + identifier: function(name, expensiveChecks, context, create, expression) { + return function(scope, locals, assign, inputs) { + var base = locals && (name in locals) ? locals : scope; + if (create && create !== 1 && base && !(base[name])) { + base[name] = {}; + } + var value = base ? base[name] : undefined; + if (expensiveChecks) { + ensureSafeObject(value, expression); + } + if (context) { + return {context: base, name: name, value: value}; + } else { + return value; + } + }; + }, + computedMember: function(left, right, context, create, expression) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs; + var value; + if (lhs != null) { + rhs = right(scope, locals, assign, inputs); + ensureSafeMemberName(rhs, expression); + if (create && create !== 1 && lhs && !(lhs[rhs])) { + lhs[rhs] = {}; + } + value = lhs[rhs]; + ensureSafeObject(value, expression); + } + if (context) { + return {context: lhs, name: rhs, value: value}; + } else { + return value; + } + }; + }, + nonComputedMember: function(left, right, expensiveChecks, context, create, expression) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + if (create && create !== 1 && lhs && !(lhs[right])) { + lhs[right] = {}; + } + var value = lhs != null ? lhs[right] : undefined; + if (expensiveChecks || isPossiblyDangerousMemberName(right)) { + ensureSafeObject(value, expression); + } + if (context) { + return {context: lhs, name: right, value: value}; + } else { + return value; + } + }; + }, + inputs: function(input, watchId) { + return function(scope, value, locals, inputs) { + if (inputs) return inputs[watchId]; + return input(scope, value, locals); + }; + } +}; + +/** + * @constructor + */ +var Parser = function(lexer, $filter, options) { + this.lexer = lexer; + this.$filter = $filter; + this.options = options; + this.ast = new AST(this.lexer); + this.astCompiler = options.csp ? new ASTInterpreter(this.ast, $filter) : + new ASTCompiler(this.ast, $filter); +}; + +Parser.prototype = { + constructor: Parser, + + parse: function(text) { + return this.astCompiler.compile(text, this.options.expensiveChecks); + } +}; + +////////////////////////////////////////////////// +// Parser helper functions +////////////////////////////////////////////////// + +function setter(obj, path, setValue, fullExp) { + ensureSafeObject(obj, fullExp); + + var element = path.split('.'), key; + for (var i = 0; element.length > 1; i++) { + key = ensureSafeMemberName(element.shift(), fullExp); + var propertyObj = ensureSafeObject(obj[key], fullExp); + if (!propertyObj) { + propertyObj = {}; + obj[key] = propertyObj; + } + obj = propertyObj; + } + key = ensureSafeMemberName(element.shift(), fullExp); + ensureSafeObject(obj[key], fullExp); + obj[key] = setValue; + return setValue; +} + +var getterFnCacheDefault = createMap(); +var getterFnCacheExpensive = createMap(); + +function isPossiblyDangerousMemberName(name) { + return name == 'constructor'; +} + +var objectValueOf = Object.prototype.valueOf; + +function getValueOf(value) { + return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value); +} + +/////////////////////////////////// + +/** + * @ngdoc service + * @name $parse + * @kind function + * + * @description + * + * Converts Angular {@link guide/expression expression} into a function. + * + * ```js + * var getter = $parse('user.name'); + * var setter = getter.assign; + * var context = {user:{name:'angular'}}; + * var locals = {user:{name:'local'}}; + * + * expect(getter(context)).toEqual('angular'); + * setter(context, 'newValue'); + * expect(context.user.name).toEqual('newValue'); + * expect(getter(context, locals)).toEqual('local'); + * ``` + * + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + * + * The returned function also has the following properties: + * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript + * literal. + * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript + * constant literals. + * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be + * set to a function to change its value on the given context. + * + */ + + +/** + * @ngdoc provider + * @name $parseProvider + * + * @description + * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse} + * service. + */ +function $ParseProvider() { + var cacheDefault = createMap(); + var cacheExpensive = createMap(); + + this.$get = ['$filter', '$sniffer', function($filter, $sniffer) { + var $parseOptions = { + csp: $sniffer.csp, + expensiveChecks: false + }, + $parseOptionsExpensive = { + csp: $sniffer.csp, + expensiveChecks: true + }; + + return function $parse(exp, interceptorFn, expensiveChecks) { + var parsedExpression, oneTime, cacheKey; + + switch (typeof exp) { + case 'string': + exp = exp.trim(); + cacheKey = exp; + + var cache = (expensiveChecks ? cacheExpensive : cacheDefault); + parsedExpression = cache[cacheKey]; + + if (!parsedExpression) { + if (exp.charAt(0) === ':' && exp.charAt(1) === ':') { + oneTime = true; + exp = exp.substring(2); + } + var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions; + var lexer = new Lexer(parseOptions); + var parser = new Parser(lexer, $filter, parseOptions); + parsedExpression = parser.parse(exp); + if (parsedExpression.constant) { + parsedExpression.$$watchDelegate = constantWatchDelegate; + } else if (oneTime) { + parsedExpression.$$watchDelegate = parsedExpression.literal ? + oneTimeLiteralWatchDelegate : oneTimeWatchDelegate; + } else if (parsedExpression.inputs) { + parsedExpression.$$watchDelegate = inputsWatchDelegate; + } + cache[cacheKey] = parsedExpression; + } + return addInterceptor(parsedExpression, interceptorFn); + + case 'function': + return addInterceptor(exp, interceptorFn); + + default: + return noop; + } + }; + + function expressionInputDirtyCheck(newValue, oldValueOfValue) { + + if (newValue == null || oldValueOfValue == null) { // null/undefined + return newValue === oldValueOfValue; + } + + if (typeof newValue === 'object') { + + // attempt to convert the value to a primitive type + // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can + // be cheaply dirty-checked + newValue = getValueOf(newValue); + + if (typeof newValue === 'object') { + // objects/arrays are not supported - deep-watching them would be too expensive + return false; + } + + // fall-through to the primitive equality check + } + + //Primitive or NaN + return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue); + } + + function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) { + var inputExpressions = parsedExpression.inputs; + var lastResult; + + if (inputExpressions.length === 1) { + var oldInputValueOf = expressionInputDirtyCheck; // init to something unique so that equals check fails + inputExpressions = inputExpressions[0]; + return scope.$watch(function expressionInputWatch(scope) { + var newInputValue = inputExpressions(scope); + if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf)) { + lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]); + oldInputValueOf = newInputValue && getValueOf(newInputValue); + } + return lastResult; + }, listener, objectEquality, prettyPrintExpression); + } + + var oldInputValueOfValues = []; + var oldInputValues = []; + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { + oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails + oldInputValues[i] = null; + } + + return scope.$watch(function expressionInputsWatch(scope) { + var changed = false; + + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { + var newInputValue = inputExpressions[i](scope); + if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) { + oldInputValues[i] = newInputValue; + oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue); + } + } + + if (changed) { + lastResult = parsedExpression(scope, undefined, undefined, oldInputValues); + } + + return lastResult; + }, listener, objectEquality, prettyPrintExpression); + } + + function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch, lastValue; + return unwatch = scope.$watch(function oneTimeWatch(scope) { + return parsedExpression(scope); + }, function oneTimeListener(value, old, scope) { + lastValue = value; + if (isFunction(listener)) { + listener.apply(this, arguments); + } + if (isDefined(value)) { + scope.$$postDigest(function() { + if (isDefined(lastValue)) { + unwatch(); + } + }); + } + }, objectEquality); + } + + function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch, lastValue; + return unwatch = scope.$watch(function oneTimeWatch(scope) { + return parsedExpression(scope); + }, function oneTimeListener(value, old, scope) { + lastValue = value; + if (isFunction(listener)) { + listener.call(this, value, old, scope); + } + if (isAllDefined(value)) { + scope.$$postDigest(function() { + if (isAllDefined(lastValue)) unwatch(); + }); + } + }, objectEquality); + + function isAllDefined(value) { + var allDefined = true; + forEach(value, function(val) { + if (!isDefined(val)) allDefined = false; + }); + return allDefined; + } + } + + function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch; + return unwatch = scope.$watch(function constantWatch(scope) { + return parsedExpression(scope); + }, function constantListener(value, old, scope) { + if (isFunction(listener)) { + listener.apply(this, arguments); + } + unwatch(); + }, objectEquality); + } + + function addInterceptor(parsedExpression, interceptorFn) { + if (!interceptorFn) return parsedExpression; + var watchDelegate = parsedExpression.$$watchDelegate; + + var regularWatch = + watchDelegate !== oneTimeLiteralWatchDelegate && + watchDelegate !== oneTimeWatchDelegate; + + var fn = regularWatch ? function regularInterceptedExpression(scope, locals, assign, inputs) { + var value = parsedExpression(scope, locals, assign, inputs); + return interceptorFn(value, scope, locals); + } : function oneTimeInterceptedExpression(scope, locals, assign, inputs) { + var value = parsedExpression(scope, locals, assign, inputs); + var result = interceptorFn(value, scope, locals); + // we only return the interceptor's result if the + // initial value is defined (for bind-once) + return isDefined(value) ? result : value; + }; + + // Propagate $$watchDelegates other then inputsWatchDelegate + if (parsedExpression.$$watchDelegate && + parsedExpression.$$watchDelegate !== inputsWatchDelegate) { + fn.$$watchDelegate = parsedExpression.$$watchDelegate; + } else if (!interceptorFn.$stateful) { + // If there is an interceptor, but no watchDelegate then treat the interceptor like + // we treat filters - it is assumed to be a pure function unless flagged with $stateful + fn.$$watchDelegate = inputsWatchDelegate; + fn.inputs = parsedExpression.inputs ? parsedExpression.inputs : [parsedExpression]; + } + + return fn; + } + }]; +} + +/** + * @ngdoc service + * @name $q + * @requires $rootScope + * + * @description + * A service that helps you run functions asynchronously, and use their return values (or exceptions) + * when they are done processing. + * + * This is an implementation of promises/deferred objects inspired by + * [Kris Kowal's Q](https://github.com/kriskowal/q). + * + * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred + * implementations, and the other which resembles ES6 promises to some degree. + * + * # $q constructor + * + * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver` + * function as the first argument. This is similar to the native Promise implementation from ES6 Harmony, + * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). + * + * While the constructor-style use is supported, not all of the supporting methods from ES6 Harmony promises are + * available yet. + * + * It can be used like so: + * + * ```js + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` + * // are available in the current lexical scope (they could have been injected or passed in). + * + * function asyncGreet(name) { + * // perform some asynchronous operation, resolve or reject the promise when appropriate. + * return $q(function(resolve, reject) { + * setTimeout(function() { + * if (okToGreet(name)) { + * resolve('Hello, ' + name + '!'); + * } else { + * reject('Greeting ' + name + ' is not allowed.'); + * } + * }, 1000); + * }); + * } + * + * var promise = asyncGreet('Robin Hood'); + * promise.then(function(greeting) { + * alert('Success: ' + greeting); + * }, function(reason) { + * alert('Failed: ' + reason); + * }); + * ``` + * + * Note: progress/notify callbacks are not currently supported via the ES6-style interface. + * + * However, the more traditional CommonJS-style usage is still available, and documented below. + * + * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an + * interface for interacting with an object that represents the result of an action that is + * performed asynchronously, and may or may not be finished at any given point in time. + * + * From the perspective of dealing with error handling, deferred and promise APIs are to + * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. + * + * ```js + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` + * // are available in the current lexical scope (they could have been injected or passed in). + * + * function asyncGreet(name) { + * var deferred = $q.defer(); + * + * setTimeout(function() { + * deferred.notify('About to greet ' + name + '.'); + * + * if (okToGreet(name)) { + * deferred.resolve('Hello, ' + name + '!'); + * } else { + * deferred.reject('Greeting ' + name + ' is not allowed.'); + * } + * }, 1000); + * + * return deferred.promise; + * } + * + * var promise = asyncGreet('Robin Hood'); + * promise.then(function(greeting) { + * alert('Success: ' + greeting); + * }, function(reason) { + * alert('Failed: ' + reason); + * }, function(update) { + * alert('Got notification: ' + update); + * }); + * ``` + * + * At first it might not be obvious why this extra complexity is worth the trouble. The payoff + * comes in the way of guarantees that promise and deferred APIs make, see + * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md. + * + * Additionally the promise api allows for composition that is very hard to do with the + * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. + * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the + * section on serial or parallel joining of promises. + * + * # The Deferred API + * + * A new instance of deferred is constructed by calling `$q.defer()`. + * + * The purpose of the deferred object is to expose the associated Promise instance as well as APIs + * that can be used for signaling the successful or unsuccessful completion, as well as the status + * of the task. + * + * **Methods** + * + * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection + * constructed via `$q.reject`, the promise will be rejected instead. + * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to + * resolving it with a rejection constructed via `$q.reject`. + * - `notify(value)` - provides updates on the status of the promise's execution. This may be called + * multiple times before the promise is either resolved or rejected. + * + * **Properties** + * + * - promise – `{Promise}` – promise object associated with this deferred. + * + * + * # The Promise API + * + * A new promise instance is created when a deferred instance is created and can be retrieved by + * calling `deferred.promise`. + * + * The purpose of the promise object is to allow for interested parties to get access to the result + * of the deferred task when it completes. + * + * **Methods** + * + * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or + * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously + * as soon as the result is available. The callbacks are called with a single argument: the result + * or rejection reason. Additionally, the notify callback may be called zero or more times to + * provide a progress indication, before the promise is resolved or rejected. + * + * This method *returns a new promise* which is resolved or rejected via the return value of the + * `successCallback`, `errorCallback` (unless that value is a promise, in which case it is resolved + * with the value which is resolved in that promise using + * [promise chaining](http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promises-queues)). + * It also notifies via the return value of the `notifyCallback` method. The promise cannot be + * resolved or rejected from the notifyCallback method. + * + * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)` + * + * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise, + * but to do so without modifying the final value. This is useful to release resources or do some + * clean-up that needs to be done whether the promise was rejected or resolved. See the [full + * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for + * more information. + * + * # Chaining promises + * + * Because calling the `then` method of a promise returns a new derived promise, it is easily + * possible to create a chain of promises: + * + * ```js + * promiseB = promiseA.then(function(result) { + * return result + 1; + * }); + * + * // promiseB will be resolved immediately after promiseA is resolved and its value + * // will be the result of promiseA incremented by 1 + * ``` + * + * It is possible to create chains of any length and since a promise can be resolved with another + * promise (which will defer its resolution further), it is possible to pause/defer resolution of + * the promises at any point in the chain. This makes it possible to implement powerful APIs like + * $http's response interceptors. + * + * + * # Differences between Kris Kowal's Q and $q + * + * There are two main differences: + * + * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation + * mechanism in angular, which means faster propagation of resolution or rejection into your + * models and avoiding unnecessary browser repaints, which would result in flickering UI. + * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains + * all the important functionality needed for common async tasks. + * + * # Testing + * + * ```js + * it('should simulate promise', inject(function($q, $rootScope) { + * var deferred = $q.defer(); + * var promise = deferred.promise; + * var resolvedValue; + * + * promise.then(function(value) { resolvedValue = value; }); + * expect(resolvedValue).toBeUndefined(); + * + * // Simulate resolving of promise + * deferred.resolve(123); + * // Note that the 'then' function does not get called synchronously. + * // This is because we want the promise API to always be async, whether or not + * // it got called synchronously or asynchronously. + * expect(resolvedValue).toBeUndefined(); + * + * // Propagate promise resolution to 'then' functions using $apply(). + * $rootScope.$apply(); + * expect(resolvedValue).toEqual(123); + * })); + * ``` + * + * @param {function(function, function)} resolver Function which is responsible for resolving or + * rejecting the newly created promise. The first parameter is a function which resolves the + * promise, the second parameter is a function which rejects the promise. + * + * @returns {Promise} The newly created promise. + */ +function $QProvider() { + + this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { + return qFactory(function(callback) { + $rootScope.$evalAsync(callback); + }, $exceptionHandler); + }]; +} + +function $$QProvider() { + this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) { + return qFactory(function(callback) { + $browser.defer(callback); + }, $exceptionHandler); + }]; +} + +/** + * Constructs a promise manager. + * + * @param {function(function)} nextTick Function for executing functions in the next turn. + * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for + * debugging purposes. + * @returns {object} Promise manager. + */ +function qFactory(nextTick, exceptionHandler) { + var $qMinErr = minErr('$q', TypeError); + function callOnce(self, resolveFn, rejectFn) { + var called = false; + function wrap(fn) { + return function(value) { + if (called) return; + called = true; + fn.call(self, value); + }; + } + + return [wrap(resolveFn), wrap(rejectFn)]; + } + + /** + * @ngdoc method + * @name ng.$q#defer + * @kind function + * + * @description + * Creates a `Deferred` object which represents a task which will finish in the future. + * + * @returns {Deferred} Returns a new instance of deferred. + */ + var defer = function() { + return new Deferred(); + }; + + function Promise() { + this.$$state = { status: 0 }; + } + + Promise.prototype = { + then: function(onFulfilled, onRejected, progressBack) { + var result = new Deferred(); + + this.$$state.pending = this.$$state.pending || []; + this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]); + if (this.$$state.status > 0) scheduleProcessQueue(this.$$state); + + return result.promise; + }, + + "catch": function(callback) { + return this.then(null, callback); + }, + + "finally": function(callback, progressBack) { + return this.then(function(value) { + return handleCallback(value, true, callback); + }, function(error) { + return handleCallback(error, false, callback); + }, progressBack); + } + }; + + //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native + function simpleBind(context, fn) { + return function(value) { + fn.call(context, value); + }; + } + + function processQueue(state) { + var fn, deferred, pending; + + pending = state.pending; + state.processScheduled = false; + state.pending = undefined; + for (var i = 0, ii = pending.length; i < ii; ++i) { + deferred = pending[i][0]; + fn = pending[i][state.status]; + try { + if (isFunction(fn)) { + deferred.resolve(fn(state.value)); + } else if (state.status === 1) { + deferred.resolve(state.value); + } else { + deferred.reject(state.value); + } + } catch (e) { + deferred.reject(e); + exceptionHandler(e); + } + } + } + + function scheduleProcessQueue(state) { + if (state.processScheduled || !state.pending) return; + state.processScheduled = true; + nextTick(function() { processQueue(state); }); + } + + function Deferred() { + this.promise = new Promise(); + //Necessary to support unbound execution :/ + this.resolve = simpleBind(this, this.resolve); + this.reject = simpleBind(this, this.reject); + this.notify = simpleBind(this, this.notify); + } + + Deferred.prototype = { + resolve: function(val) { + if (this.promise.$$state.status) return; + if (val === this.promise) { + this.$$reject($qMinErr( + 'qcycle', + "Expected promise to be resolved with value other than itself '{0}'", + val)); + } else { + this.$$resolve(val); + } + + }, + + $$resolve: function(val) { + var then, fns; + + fns = callOnce(this, this.$$resolve, this.$$reject); + try { + if ((isObject(val) || isFunction(val))) then = val && val.then; + if (isFunction(then)) { + this.promise.$$state.status = -1; + then.call(val, fns[0], fns[1], this.notify); + } else { + this.promise.$$state.value = val; + this.promise.$$state.status = 1; + scheduleProcessQueue(this.promise.$$state); + } + } catch (e) { + fns[1](e); + exceptionHandler(e); + } + }, + + reject: function(reason) { + if (this.promise.$$state.status) return; + this.$$reject(reason); + }, + + $$reject: function(reason) { + this.promise.$$state.value = reason; + this.promise.$$state.status = 2; + scheduleProcessQueue(this.promise.$$state); + }, + + notify: function(progress) { + var callbacks = this.promise.$$state.pending; + + if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) { + nextTick(function() { + var callback, result; + for (var i = 0, ii = callbacks.length; i < ii; i++) { + result = callbacks[i][0]; + callback = callbacks[i][3]; + try { + result.notify(isFunction(callback) ? callback(progress) : progress); + } catch (e) { + exceptionHandler(e); + } + } + }); + } + } + }; + + /** + * @ngdoc method + * @name $q#reject + * @kind function + * + * @description + * Creates a promise that is resolved as rejected with the specified `reason`. This api should be + * used to forward rejection in a chain of promises. If you are dealing with the last promise in + * a promise chain, you don't need to worry about it. + * + * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of + * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via + * a promise error callback and you want to forward the error to the promise derived from the + * current promise, you have to "rethrow" the error by returning a rejection constructed via + * `reject`. + * + * ```js + * promiseB = promiseA.then(function(result) { + * // success: do something and resolve promiseB + * // with the old or a new result + * return result; + * }, function(reason) { + * // error: handle the error if possible and + * // resolve promiseB with newPromiseOrValue, + * // otherwise forward the rejection to promiseB + * if (canHandle(reason)) { + * // handle the error and recover + * return newPromiseOrValue; + * } + * return $q.reject(reason); + * }); + * ``` + * + * @param {*} reason Constant, message, exception or an object representing the rejection reason. + * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. + */ + var reject = function(reason) { + var result = new Deferred(); + result.reject(reason); + return result.promise; + }; + + var makePromise = function makePromise(value, resolved) { + var result = new Deferred(); + if (resolved) { + result.resolve(value); + } else { + result.reject(value); + } + return result.promise; + }; + + var handleCallback = function handleCallback(value, isResolved, callback) { + var callbackOutput = null; + try { + if (isFunction(callback)) callbackOutput = callback(); + } catch (e) { + return makePromise(e, false); + } + if (isPromiseLike(callbackOutput)) { + return callbackOutput.then(function() { + return makePromise(value, isResolved); + }, function(error) { + return makePromise(error, false); + }); + } else { + return makePromise(value, isResolved); + } + }; + + /** + * @ngdoc method + * @name $q#when + * @kind function + * + * @description + * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. + * This is useful when you are dealing with an object that might or might not be a promise, or if + * the promise comes from a source that can't be trusted. + * + * @param {*} value Value or a promise + * @returns {Promise} Returns a promise of the passed value or promise + */ + + + var when = function(value, callback, errback, progressBack) { + var result = new Deferred(); + result.resolve(value); + return result.promise.then(callback, errback, progressBack); + }; + + /** + * @ngdoc method + * @name $q#resolve + * @kind function + * + * @description + * Alias of {@link ng.$q#when when} to maintain naming consistency with ES6. + * + * @param {*} value Value or a promise + * @returns {Promise} Returns a promise of the passed value or promise + */ + var resolve = when; + + /** + * @ngdoc method + * @name $q#all + * @kind function + * + * @description + * Combines multiple promises into a single promise that is resolved when all of the input + * promises are resolved. + * + * @param {Array.|Object.} promises An array or hash of promises. + * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values, + * each value corresponding to the promise at the same index/key in the `promises` array/hash. + * If any of the promises is resolved with a rejection, this resulting promise will be rejected + * with the same rejection value. + */ + + function all(promises) { + var deferred = new Deferred(), + counter = 0, + results = isArray(promises) ? [] : {}; + + forEach(promises, function(promise, key) { + counter++; + when(promise).then(function(value) { + if (results.hasOwnProperty(key)) return; + results[key] = value; + if (!(--counter)) deferred.resolve(results); + }, function(reason) { + if (results.hasOwnProperty(key)) return; + deferred.reject(reason); + }); + }); + + if (counter === 0) { + deferred.resolve(results); + } + + return deferred.promise; + } + + var $Q = function Q(resolver) { + if (!isFunction(resolver)) { + throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver); + } + + if (!(this instanceof Q)) { + // More useful when $Q is the Promise itself. + return new Q(resolver); + } + + var deferred = new Deferred(); + + function resolveFn(value) { + deferred.resolve(value); + } + + function rejectFn(reason) { + deferred.reject(reason); + } + + resolver(resolveFn, rejectFn); + + return deferred.promise; + }; + + $Q.defer = defer; + $Q.reject = reject; + $Q.when = when; + $Q.resolve = resolve; + $Q.all = all; + + return $Q; +} + +function $$RAFProvider() { //rAF + this.$get = ['$window', '$timeout', function($window, $timeout) { + var requestAnimationFrame = $window.requestAnimationFrame || + $window.webkitRequestAnimationFrame; + + var cancelAnimationFrame = $window.cancelAnimationFrame || + $window.webkitCancelAnimationFrame || + $window.webkitCancelRequestAnimationFrame; + + var rafSupported = !!requestAnimationFrame; + var rafFn = rafSupported + ? function(fn) { + var id = requestAnimationFrame(fn); + return function() { + cancelAnimationFrame(id); + }; + } + : function(fn) { + var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 + return function() { + $timeout.cancel(timer); + }; + }; + + queueFn.supported = rafSupported; + + var cancelLastRAF; + var taskCount = 0; + var taskQueue = []; + return queueFn; + + function flush() { + for (var i = 0; i < taskQueue.length; i++) { + var task = taskQueue[i]; + if (task) { + taskQueue[i] = null; + task(); + } + } + taskCount = taskQueue.length = 0; + } + + function queueFn(asyncFn) { + var index = taskQueue.length; + + taskCount++; + taskQueue.push(asyncFn); + + if (index === 0) { + cancelLastRAF = rafFn(flush); + } + + return function cancelQueueFn() { + if (index >= 0) { + taskQueue[index] = null; + index = null; + + if (--taskCount === 0 && cancelLastRAF) { + cancelLastRAF(); + cancelLastRAF = null; + taskQueue.length = 0; + } + } + }; + } + }]; +} + +/** + * DESIGN NOTES + * + * The design decisions behind the scope are heavily favored for speed and memory consumption. + * + * The typical use of scope is to watch the expressions, which most of the time return the same + * value as last time so we optimize the operation. + * + * Closures construction is expensive in terms of speed as well as memory: + * - No closures, instead use prototypical inheritance for API + * - Internal state needs to be stored on scope directly, which means that private state is + * exposed as $$____ properties + * + * Loop operations are optimized by using while(count--) { ... } + * - this means that in order to keep the same order of execution as addition we have to add + * items to the array at the beginning (unshift) instead of at the end (push) + * + * Child scopes are created and removed often + * - Using an array would be slow since inserts in middle are expensive so we use linked list + * + * There are few watches then a lot of observers. This is why you don't want the observer to be + * implemented in the same way as watch. Watch requires return of initialization function which + * are expensive to construct. + */ + + +/** + * @ngdoc provider + * @name $rootScopeProvider + * @description + * + * Provider for the $rootScope service. + */ + +/** + * @ngdoc method + * @name $rootScopeProvider#digestTtl + * @description + * + * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and + * assuming that the model is unstable. + * + * The current default is 10 iterations. + * + * In complex applications it's possible that the dependencies between `$watch`s will result in + * several digest iterations. However if an application needs more than the default 10 digest + * iterations for its model to stabilize then you should investigate what is causing the model to + * continuously change during the digest. + * + * Increasing the TTL could have performance implications, so you should not change it without + * proper justification. + * + * @param {number} limit The number of digest iterations. + */ + + +/** + * @ngdoc service + * @name $rootScope + * @description + * + * Every application has a single root {@link ng.$rootScope.Scope scope}. + * All other scopes are descendant scopes of the root scope. Scopes provide separation + * between the model and the view, via a mechanism for watching the model for changes. + * They also provide an event emission/broadcast and subscription facility. See the + * {@link guide/scope developer guide on scopes}. + */ +function $RootScopeProvider() { + var TTL = 10; + var $rootScopeMinErr = minErr('$rootScope'); + var lastDirtyWatch = null; + var applyAsyncId = null; + + this.digestTtl = function(value) { + if (arguments.length) { + TTL = value; + } + return TTL; + }; + + function createChildScopeClass(parent) { + function ChildScope() { + this.$$watchers = this.$$nextSibling = + this.$$childHead = this.$$childTail = null; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$$watchersCount = 0; + this.$id = nextUid(); + this.$$ChildScope = null; + } + ChildScope.prototype = parent; + return ChildScope; + } + + this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser', + function($injector, $exceptionHandler, $parse, $browser) { + + function destroyChildScope($event) { + $event.currentScope.$$destroyed = true; + } + + /** + * @ngdoc type + * @name $rootScope.Scope + * + * @description + * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the + * {@link auto.$injector $injector}. Child scopes are created using the + * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when + * compiled HTML template is executed.) + * + * Here is a simple scope snippet to show how you can interact with the scope. + * ```html + * + * ``` + * + * # Inheritance + * A scope can inherit from a parent scope, as in this example: + * ```js + var parent = $rootScope; + var child = parent.$new(); + + parent.salutation = "Hello"; + expect(child.salutation).toEqual('Hello'); + + child.salutation = "Welcome"; + expect(child.salutation).toEqual('Welcome'); + expect(parent.salutation).toEqual('Hello'); + * ``` + * + * When interacting with `Scope` in tests, additional helper methods are available on the + * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional + * details. + * + * + * @param {Object.=} providers Map of service factory which need to be + * provided for the current scope. Defaults to {@link ng}. + * @param {Object.=} instanceCache Provides pre-instantiated services which should + * append/override services provided by `providers`. This is handy + * when unit-testing and having the need to override a default + * service. + * @returns {Object} Newly created scope. + * + */ + function Scope() { + this.$id = nextUid(); + this.$$phase = this.$parent = this.$$watchers = + this.$$nextSibling = this.$$prevSibling = + this.$$childHead = this.$$childTail = null; + this.$root = this; + this.$$destroyed = false; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$$watchersCount = 0; + this.$$isolateBindings = null; + } + + /** + * @ngdoc property + * @name $rootScope.Scope#$id + * + * @description + * Unique scope ID (monotonically increasing) useful for debugging. + */ + + /** + * @ngdoc property + * @name $rootScope.Scope#$parent + * + * @description + * Reference to the parent scope. + */ + + /** + * @ngdoc property + * @name $rootScope.Scope#$root + * + * @description + * Reference to the root scope. + */ + + Scope.prototype = { + constructor: Scope, + /** + * @ngdoc method + * @name $rootScope.Scope#$new + * @kind function + * + * @description + * Creates a new child {@link ng.$rootScope.Scope scope}. + * + * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event. + * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}. + * + * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is + * desired for the scope and its child scopes to be permanently detached from the parent and + * thus stop participating in model change detection and listener notification by invoking. + * + * @param {boolean} isolate If true, then the scope does not prototypically inherit from the + * parent scope. The scope is isolated, as it can not see parent scope properties. + * When creating widgets, it is useful for the widget to not accidentally read parent + * state. + * + * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent` + * of the newly created scope. Defaults to `this` scope if not provided. + * This is used when creating a transclude scope to correctly place it + * in the scope hierarchy while maintaining the correct prototypical + * inheritance. + * + * @returns {Object} The newly created child scope. + * + */ + $new: function(isolate, parent) { + var child; + + parent = parent || this; + + if (isolate) { + child = new Scope(); + child.$root = this.$root; + } else { + // Only create a child scope class if somebody asks for one, + // but cache it to allow the VM to optimize lookups. + if (!this.$$ChildScope) { + this.$$ChildScope = createChildScopeClass(this); + } + child = new this.$$ChildScope(); + } + child.$parent = parent; + child.$$prevSibling = parent.$$childTail; + if (parent.$$childHead) { + parent.$$childTail.$$nextSibling = child; + parent.$$childTail = child; + } else { + parent.$$childHead = parent.$$childTail = child; + } + + // When the new scope is not isolated or we inherit from `this`, and + // the parent scope is destroyed, the property `$$destroyed` is inherited + // prototypically. In all other cases, this property needs to be set + // when the parent scope is destroyed. + // The listener needs to be added after the parent is set + if (isolate || parent != this) child.$on('$destroy', destroyChildScope); + + return child; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$watch + * @kind function + * + * @description + * Registers a `listener` callback to be executed whenever the `watchExpression` changes. + * + * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest + * $digest()} and should return the value that will be watched. (Since + * {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the + * `watchExpression` can execute multiple times per + * {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.) + * - The `listener` is called only when the value from the current `watchExpression` and the + * previous call to `watchExpression` are not equal (with the exception of the initial run, + * see below). Inequality is determined according to reference inequality, + * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) + * via the `!==` Javascript operator, unless `objectEquality == true` + * (see next point) + * - When `objectEquality == true`, inequality of the `watchExpression` is determined + * according to the {@link angular.equals} function. To save the value of the object for + * later comparison, the {@link angular.copy} function is used. This therefore means that + * watching complex objects will have adverse memory and performance implications. + * - The watch `listener` may change the model, which may trigger other `listener`s to fire. + * This is achieved by rerunning the watchers until no changes are detected. The rerun + * iteration limit is 10 to prevent an infinite loop deadlock. + * + * + * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called, + * you can register a `watchExpression` function with no `listener`. (Since `watchExpression` + * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a + * change is detected, be prepared for multiple calls to your listener.) + * + * After a watcher is registered with the scope, the `listener` fn is called asynchronously + * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the + * watcher. In rare cases, this is undesirable because the listener is called when the result + * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you + * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the + * listener was called due to initialization. + * + * + * + * # Example + * ```js + // let's assume that scope was dependency injected as the $rootScope + var scope = $rootScope; + scope.name = 'misko'; + scope.counter = 0; + + expect(scope.counter).toEqual(0); + scope.$watch('name', function(newValue, oldValue) { + scope.counter = scope.counter + 1; + }); + expect(scope.counter).toEqual(0); + + scope.$digest(); + // the listener is always called during the first $digest loop after it was registered + expect(scope.counter).toEqual(1); + + scope.$digest(); + // but now it will not be called unless the value changes + expect(scope.counter).toEqual(1); + + scope.name = 'adam'; + scope.$digest(); + expect(scope.counter).toEqual(2); + + + + // Using a function as a watchExpression + var food; + scope.foodCounter = 0; + expect(scope.foodCounter).toEqual(0); + scope.$watch( + // This function returns the value being watched. It is called for each turn of the $digest loop + function() { return food; }, + // This is the change listener, called when the value returned from the above function changes + function(newValue, oldValue) { + if ( newValue !== oldValue ) { + // Only increment the counter if the value changed + scope.foodCounter = scope.foodCounter + 1; + } + } + ); + // No digest has been run so the counter will be zero + expect(scope.foodCounter).toEqual(0); + + // Run the digest but since food has not changed count will still be zero + scope.$digest(); + expect(scope.foodCounter).toEqual(0); + + // Update food and run digest. Now the counter will increment + food = 'cheeseburger'; + scope.$digest(); + expect(scope.foodCounter).toEqual(1); + + * ``` + * + * + * + * @param {(function()|string)} watchExpression Expression that is evaluated on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers + * a call to the `listener`. + * + * - `string`: Evaluated as {@link guide/expression expression} + * - `function(scope)`: called with current `scope` as a parameter. + * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value + * of `watchExpression` changes. + * + * - `newVal` contains the current value of the `watchExpression` + * - `oldVal` contains the previous value of the `watchExpression` + * - `scope` refers to the current scope + * @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of + * comparing for reference equality. + * @returns {function()} Returns a deregistration function for this listener. + */ + $watch: function(watchExp, listener, objectEquality, prettyPrintExpression) { + var get = $parse(watchExp); + + if (get.$$watchDelegate) { + return get.$$watchDelegate(this, listener, objectEquality, get, watchExp); + } + var scope = this, + array = scope.$$watchers, + watcher = { + fn: listener, + last: initWatchVal, + get: get, + exp: prettyPrintExpression || watchExp, + eq: !!objectEquality + }; + + lastDirtyWatch = null; + + if (!isFunction(listener)) { + watcher.fn = noop; + } + + if (!array) { + array = scope.$$watchers = []; + } + // we use unshift since we use a while loop in $digest for speed. + // the while loop reads in reverse order. + array.unshift(watcher); + incrementWatchersCount(this, 1); + + return function deregisterWatch() { + if (arrayRemove(array, watcher) >= 0) { + incrementWatchersCount(scope, -1); + } + lastDirtyWatch = null; + }; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$watchGroup + * @kind function + * + * @description + * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`. + * If any one expression in the collection changes the `listener` is executed. + * + * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every + * call to $digest() to see if any items changes. + * - The `listener` is called whenever any expression in the `watchExpressions` array changes. + * + * @param {Array.} watchExpressions Array of expressions that will be individually + * watched using {@link ng.$rootScope.Scope#$watch $watch()} + * + * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any + * expression in `watchExpressions` changes + * The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching + * those of `watchExpression` + * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching + * those of `watchExpression` + * The `scope` refers to the current scope. + * @returns {function()} Returns a de-registration function for all listeners. + */ + $watchGroup: function(watchExpressions, listener) { + var oldValues = new Array(watchExpressions.length); + var newValues = new Array(watchExpressions.length); + var deregisterFns = []; + var self = this; + var changeReactionScheduled = false; + var firstRun = true; + + if (!watchExpressions.length) { + // No expressions means we call the listener ASAP + var shouldCall = true; + self.$evalAsync(function() { + if (shouldCall) listener(newValues, newValues, self); + }); + return function deregisterWatchGroup() { + shouldCall = false; + }; + } + + if (watchExpressions.length === 1) { + // Special case size of one + return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) { + newValues[0] = value; + oldValues[0] = oldValue; + listener(newValues, (value === oldValue) ? newValues : oldValues, scope); + }); + } + + forEach(watchExpressions, function(expr, i) { + var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) { + newValues[i] = value; + oldValues[i] = oldValue; + if (!changeReactionScheduled) { + changeReactionScheduled = true; + self.$evalAsync(watchGroupAction); + } + }); + deregisterFns.push(unwatchFn); + }); + + function watchGroupAction() { + changeReactionScheduled = false; + + if (firstRun) { + firstRun = false; + listener(newValues, newValues, self); + } else { + listener(newValues, oldValues, self); + } + } + + return function deregisterWatchGroup() { + while (deregisterFns.length) { + deregisterFns.shift()(); + } + }; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$watchCollection + * @kind function + * + * @description + * Shallow watches the properties of an object and fires whenever any of the properties change + * (for arrays, this implies watching the array items; for object maps, this implies watching + * the properties). If a change is detected, the `listener` callback is fired. + * + * - The `obj` collection is observed via standard $watch operation and is examined on every + * call to $digest() to see if any items have been added, removed, or moved. + * - The `listener` is called whenever anything within the `obj` has changed. Examples include + * adding, removing, and moving items belonging to an object or array. + * + * + * # Example + * ```js + $scope.names = ['igor', 'matias', 'misko', 'james']; + $scope.dataCount = 4; + + $scope.$watchCollection('names', function(newNames, oldNames) { + $scope.dataCount = newNames.length; + }); + + expect($scope.dataCount).toEqual(4); + $scope.$digest(); + + //still at 4 ... no changes + expect($scope.dataCount).toEqual(4); + + $scope.names.pop(); + $scope.$digest(); + + //now there's been a change + expect($scope.dataCount).toEqual(3); + * ``` + * + * + * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The + * expression value should evaluate to an object or an array which is observed on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the + * collection will trigger a call to the `listener`. + * + * @param {function(newCollection, oldCollection, scope)} listener a callback function called + * when a change is detected. + * - The `newCollection` object is the newly modified data obtained from the `obj` expression + * - The `oldCollection` object is a copy of the former collection data. + * Due to performance considerations, the`oldCollection` value is computed only if the + * `listener` function declares two or more arguments. + * - The `scope` argument refers to the current scope. + * + * @returns {function()} Returns a de-registration function for this listener. When the + * de-registration function is executed, the internal watch operation is terminated. + */ + $watchCollection: function(obj, listener) { + $watchCollectionInterceptor.$stateful = true; + + var self = this; + // the current value, updated on each dirty-check run + var newValue; + // a shallow copy of the newValue from the last dirty-check run, + // updated to match newValue during dirty-check run + var oldValue; + // a shallow copy of the newValue from when the last change happened + var veryOldValue; + // only track veryOldValue if the listener is asking for it + var trackVeryOldValue = (listener.length > 1); + var changeDetected = 0; + var changeDetector = $parse(obj, $watchCollectionInterceptor); + var internalArray = []; + var internalObject = {}; + var initRun = true; + var oldLength = 0; + + function $watchCollectionInterceptor(_value) { + newValue = _value; + var newLength, key, bothNaN, newItem, oldItem; + + // If the new value is undefined, then return undefined as the watch may be a one-time watch + if (isUndefined(newValue)) return; + + if (!isObject(newValue)) { // if primitive + if (oldValue !== newValue) { + oldValue = newValue; + changeDetected++; + } + } else if (isArrayLike(newValue)) { + if (oldValue !== internalArray) { + // we are transitioning from something which was not an array into array. + oldValue = internalArray; + oldLength = oldValue.length = 0; + changeDetected++; + } + + newLength = newValue.length; + + if (oldLength !== newLength) { + // if lengths do not match we need to trigger change notification + changeDetected++; + oldValue.length = oldLength = newLength; + } + // copy the items to oldValue and look for changes. + for (var i = 0; i < newLength; i++) { + oldItem = oldValue[i]; + newItem = newValue[i]; + + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); + if (!bothNaN && (oldItem !== newItem)) { + changeDetected++; + oldValue[i] = newItem; + } + } + } else { + if (oldValue !== internalObject) { + // we are transitioning from something which was not an object into object. + oldValue = internalObject = {}; + oldLength = 0; + changeDetected++; + } + // copy the items to oldValue and look for changes. + newLength = 0; + for (key in newValue) { + if (newValue.hasOwnProperty(key)) { + newLength++; + newItem = newValue[key]; + oldItem = oldValue[key]; + + if (key in oldValue) { + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); + if (!bothNaN && (oldItem !== newItem)) { + changeDetected++; + oldValue[key] = newItem; + } + } else { + oldLength++; + oldValue[key] = newItem; + changeDetected++; + } + } + } + if (oldLength > newLength) { + // we used to have more keys, need to find them and destroy them. + changeDetected++; + for (key in oldValue) { + if (!newValue.hasOwnProperty(key)) { + oldLength--; + delete oldValue[key]; + } + } + } + } + return changeDetected; + } + + function $watchCollectionAction() { + if (initRun) { + initRun = false; + listener(newValue, newValue, self); + } else { + listener(newValue, veryOldValue, self); + } + + // make a copy for the next time a collection is changed + if (trackVeryOldValue) { + if (!isObject(newValue)) { + //primitive + veryOldValue = newValue; + } else if (isArrayLike(newValue)) { + veryOldValue = new Array(newValue.length); + for (var i = 0; i < newValue.length; i++) { + veryOldValue[i] = newValue[i]; + } + } else { // if object + veryOldValue = {}; + for (var key in newValue) { + if (hasOwnProperty.call(newValue, key)) { + veryOldValue[key] = newValue[key]; + } + } + } + } + } + + return this.$watch(changeDetector, $watchCollectionAction); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$digest + * @kind function + * + * @description + * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and + * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change + * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} + * until no more listeners are firing. This means that it is possible to get into an infinite + * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of + * iterations exceeds 10. + * + * Usually, you don't call `$digest()` directly in + * {@link ng.directive:ngController controllers} or in + * {@link ng.$compileProvider#directive directives}. + * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within + * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`. + * + * If you want to be notified whenever `$digest()` is called, + * you can register a `watchExpression` function with + * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`. + * + * In unit tests, you may need to call `$digest()` to simulate the scope life cycle. + * + * # Example + * ```js + var scope = ...; + scope.name = 'misko'; + scope.counter = 0; + + expect(scope.counter).toEqual(0); + scope.$watch('name', function(newValue, oldValue) { + scope.counter = scope.counter + 1; + }); + expect(scope.counter).toEqual(0); + + scope.$digest(); + // the listener is always called during the first $digest loop after it was registered + expect(scope.counter).toEqual(1); + + scope.$digest(); + // but now it will not be called unless the value changes + expect(scope.counter).toEqual(1); + + scope.name = 'adam'; + scope.$digest(); + expect(scope.counter).toEqual(2); + * ``` + * + */ + $digest: function() { + var watch, value, last, + watchers, + length, + dirty, ttl = TTL, + next, current, target = this, + watchLog = [], + logIdx, logMsg, asyncTask; + + beginPhase('$digest'); + // Check for changes to browser url that happened in sync before the call to $digest + $browser.$$checkUrlChange(); + + if (this === $rootScope && applyAsyncId !== null) { + // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then + // cancel the scheduled $apply and flush the queue of expressions to be evaluated. + $browser.defer.cancel(applyAsyncId); + flushApplyAsync(); + } + + lastDirtyWatch = null; + + do { // "while dirty" loop + dirty = false; + current = target; + + while (asyncQueue.length) { + try { + asyncTask = asyncQueue.shift(); + asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals); + } catch (e) { + $exceptionHandler(e); + } + lastDirtyWatch = null; + } + + traverseScopesLoop: + do { // "traverse the scopes" loop + if ((watchers = current.$$watchers)) { + // process our watches + length = watchers.length; + while (length--) { + try { + watch = watchers[length]; + // Most common watches are on primitives, in which case we can short + // circuit it with === operator, only when === fails do we use .equals + if (watch) { + if ((value = watch.get(current)) !== (last = watch.last) && + !(watch.eq + ? equals(value, last) + : (typeof value === 'number' && typeof last === 'number' + && isNaN(value) && isNaN(last)))) { + dirty = true; + lastDirtyWatch = watch; + watch.last = watch.eq ? copy(value, null) : value; + watch.fn(value, ((last === initWatchVal) ? value : last), current); + if (ttl < 5) { + logIdx = 4 - ttl; + if (!watchLog[logIdx]) watchLog[logIdx] = []; + watchLog[logIdx].push({ + msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp, + newVal: value, + oldVal: last + }); + } + } else if (watch === lastDirtyWatch) { + // If the most recently dirty watcher is now clean, short circuit since the remaining watchers + // have already been tested. + dirty = false; + break traverseScopesLoop; + } + } + } catch (e) { + $exceptionHandler(e); + } + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $broadcast + if (!(next = ((current.$$watchersCount && current.$$childHead) || + (current !== target && current.$$nextSibling)))) { + while (current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } while ((current = next)); + + // `break traverseScopesLoop;` takes us to here + + if ((dirty || asyncQueue.length) && !(ttl--)) { + clearPhase(); + throw $rootScopeMinErr('infdig', + '{0} $digest() iterations reached. Aborting!\n' + + 'Watchers fired in the last 5 iterations: {1}', + TTL, watchLog); + } + + } while (dirty || asyncQueue.length); + + clearPhase(); + + while (postDigestQueue.length) { + try { + postDigestQueue.shift()(); + } catch (e) { + $exceptionHandler(e); + } + } + }, + + + /** + * @ngdoc event + * @name $rootScope.Scope#$destroy + * @eventType broadcast on scope being destroyed + * + * @description + * Broadcasted when a scope and its children are being destroyed. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + + /** + * @ngdoc method + * @name $rootScope.Scope#$destroy + * @kind function + * + * @description + * Removes the current scope (and all of its children) from the parent scope. Removal implies + * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer + * propagate to the current scope and its children. Removal also implies that the current + * scope is eligible for garbage collection. + * + * The `$destroy()` is usually used by directives such as + * {@link ng.directive:ngRepeat ngRepeat} for managing the + * unrolling of the loop. + * + * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope. + * Application code can register a `$destroy` event handler that will give it a chance to + * perform any necessary cleanup. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + $destroy: function() { + // We can't destroy a scope that has been already destroyed. + if (this.$$destroyed) return; + var parent = this.$parent; + + this.$broadcast('$destroy'); + this.$$destroyed = true; + + if (this === $rootScope) { + //Remove handlers attached to window when $rootScope is removed + $browser.$$applicationDestroyed(); + } + + incrementWatchersCount(this, -this.$$watchersCount); + for (var eventName in this.$$listenerCount) { + decrementListenerCount(this, this.$$listenerCount[eventName], eventName); + } + + // sever all the references to parent scopes (after this cleanup, the current scope should + // not be retained by any of our references and should be eligible for garbage collection) + if (parent && parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; + if (parent && parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; + if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; + if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; + + // Disable listeners, watchers and apply/digest methods + this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop; + this.$on = this.$watch = this.$watchGroup = function() { return noop; }; + this.$$listeners = {}; + + // All of the code below is bogus code that works around V8's memory leak via optimized code + // and inline caches. + // + // see: + // - https://code.google.com/p/v8/issues/detail?id=2073#c26 + // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909 + // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 + + this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = + this.$$childTail = this.$root = this.$$watchers = null; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$eval + * @kind function + * + * @description + * Executes the `expression` on the current scope and returns the result. Any exceptions in + * the expression are propagated (uncaught). This is useful when evaluating Angular + * expressions. + * + * # Example + * ```js + var scope = ng.$rootScope.Scope(); + scope.a = 1; + scope.b = 2; + + expect(scope.$eval('a+b')).toEqual(3); + expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3); + * ``` + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @param {(object)=} locals Local variables object, useful for overriding values in scope. + * @returns {*} The result of evaluating the expression. + */ + $eval: function(expr, locals) { + return $parse(expr)(this, locals); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$evalAsync + * @kind function + * + * @description + * Executes the expression on the current scope at a later point in time. + * + * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only + * that: + * + * - it will execute after the function that scheduled the evaluation (preferably before DOM + * rendering). + * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after + * `expression` execution. + * + * Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle + * will be scheduled. However, it is encouraged to always call code that changes the model + * from within an `$apply` call. That includes code evaluated via `$evalAsync`. + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @param {(object)=} locals Local variables object, useful for overriding values in scope. + */ + $evalAsync: function(expr, locals) { + // if we are outside of an $digest loop and this is the first time we are scheduling async + // task also schedule async auto-flush + if (!$rootScope.$$phase && !asyncQueue.length) { + $browser.defer(function() { + if (asyncQueue.length) { + $rootScope.$digest(); + } + }); + } + + asyncQueue.push({scope: this, expression: expr, locals: locals}); + }, + + $$postDigest: function(fn) { + postDigestQueue.push(fn); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$apply + * @kind function + * + * @description + * `$apply()` is used to execute an expression in angular from outside of the angular + * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries). + * Because we are calling into the angular framework we need to perform proper scope life + * cycle of {@link ng.$exceptionHandler exception handling}, + * {@link ng.$rootScope.Scope#$digest executing watches}. + * + * ## Life cycle + * + * # Pseudo-Code of `$apply()` + * ```js + function $apply(expr) { + try { + return $eval(expr); + } catch (e) { + $exceptionHandler(e); + } finally { + $root.$digest(); + } + } + * ``` + * + * + * Scope's `$apply()` method transitions through the following stages: + * + * 1. The {@link guide/expression expression} is executed using the + * {@link ng.$rootScope.Scope#$eval $eval()} method. + * 2. Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the + * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method. + * + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + * + * @returns {*} The result of evaluating the expression. + */ + $apply: function(expr) { + try { + beginPhase('$apply'); + return this.$eval(expr); + } catch (e) { + $exceptionHandler(e); + } finally { + clearPhase(); + try { + $rootScope.$digest(); + } catch (e) { + $exceptionHandler(e); + throw e; + } + } + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$applyAsync + * @kind function + * + * @description + * Schedule the invocation of $apply to occur at a later time. The actual time difference + * varies across browsers, but is typically around ~10 milliseconds. + * + * This can be used to queue up multiple expressions which need to be evaluated in the same + * digest. + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + */ + $applyAsync: function(expr) { + var scope = this; + expr && applyAsyncQueue.push($applyAsyncExpression); + scheduleApplyAsync(); + + function $applyAsyncExpression() { + scope.$eval(expr); + } + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$on + * @kind function + * + * @description + * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for + * discussion of event life cycle. + * + * The event listener function format is: `function(event, args...)`. The `event` object + * passed into the listener has the following attributes: + * + * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or + * `$broadcast`-ed. + * - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the + * event propagates through the scope hierarchy, this property is set to null. + * - `name` - `{string}`: name of the event. + * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel + * further event propagation (available only for events that were `$emit`-ed). + * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag + * to true. + * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. + * + * @param {string} name Event name to listen on. + * @param {function(event, ...args)} listener Function to call when the event is emitted. + * @returns {function()} Returns a deregistration function for this listener. + */ + $on: function(name, listener) { + var namedListeners = this.$$listeners[name]; + if (!namedListeners) { + this.$$listeners[name] = namedListeners = []; + } + namedListeners.push(listener); + + var current = this; + do { + if (!current.$$listenerCount[name]) { + current.$$listenerCount[name] = 0; + } + current.$$listenerCount[name]++; + } while ((current = current.$parent)); + + var self = this; + return function() { + var indexOfListener = namedListeners.indexOf(listener); + if (indexOfListener !== -1) { + namedListeners[indexOfListener] = null; + decrementListenerCount(self, 1, name); + } + }; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$emit + * @kind function + * + * @description + * Dispatches an event `name` upwards through the scope hierarchy notifying the + * registered {@link ng.$rootScope.Scope#$on} listeners. + * + * The event life cycle starts at the scope on which `$emit` was called. All + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get + * notified. Afterwards, the event traverses upwards toward the root scope and calls all + * registered listeners along the way. The event will stop propagating if one of the listeners + * cancels it. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to emit. + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. + * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}). + */ + $emit: function(name, args) { + var empty = [], + namedListeners, + scope = this, + stopPropagation = false, + event = { + name: name, + targetScope: scope, + stopPropagation: function() {stopPropagation = true;}, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }, + listenerArgs = concat([event], arguments, 1), + i, length; + + do { + namedListeners = scope.$$listeners[name] || empty; + event.currentScope = scope; + for (i = 0, length = namedListeners.length; i < length; i++) { + + // if listeners were deregistered, defragment the array + if (!namedListeners[i]) { + namedListeners.splice(i, 1); + i--; + length--; + continue; + } + try { + //allow all listeners attached to the current scope to run + namedListeners[i].apply(null, listenerArgs); + } catch (e) { + $exceptionHandler(e); + } + } + //if any listener on the current scope stops propagation, prevent bubbling + if (stopPropagation) { + event.currentScope = null; + return event; + } + //traverse upwards + scope = scope.$parent; + } while (scope); + + event.currentScope = null; + + return event; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$broadcast + * @kind function + * + * @description + * Dispatches an event `name` downwards to all child scopes (and their children) notifying the + * registered {@link ng.$rootScope.Scope#$on} listeners. + * + * The event life cycle starts at the scope on which `$broadcast` was called. All + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get + * notified. Afterwards, the event propagates to all direct and indirect scopes of the current + * scope and calls all registered listeners along the way. The event cannot be canceled. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to broadcast. + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. + * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on} + */ + $broadcast: function(name, args) { + var target = this, + current = target, + next = target, + event = { + name: name, + targetScope: target, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }; + + if (!target.$$listenerCount[name]) return event; + + var listenerArgs = concat([event], arguments, 1), + listeners, i, length; + + //down while you can, then up and next sibling or up and next sibling until back at root + while ((current = next)) { + event.currentScope = current; + listeners = current.$$listeners[name] || []; + for (i = 0, length = listeners.length; i < length; i++) { + // if listeners were deregistered, defragment the array + if (!listeners[i]) { + listeners.splice(i, 1); + i--; + length--; + continue; + } + + try { + listeners[i].apply(null, listenerArgs); + } catch (e) { + $exceptionHandler(e); + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $digest + // (though it differs due to having the extra check for $$listenerCount) + if (!(next = ((current.$$listenerCount[name] && current.$$childHead) || + (current !== target && current.$$nextSibling)))) { + while (current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } + + event.currentScope = null; + return event; + } + }; + + var $rootScope = new Scope(); + + //The internal queues. Expose them on the $rootScope for debugging/testing purposes. + var asyncQueue = $rootScope.$$asyncQueue = []; + var postDigestQueue = $rootScope.$$postDigestQueue = []; + var applyAsyncQueue = $rootScope.$$applyAsyncQueue = []; + + return $rootScope; + + + function beginPhase(phase) { + if ($rootScope.$$phase) { + throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase); + } + + $rootScope.$$phase = phase; + } + + function clearPhase() { + $rootScope.$$phase = null; + } + + function incrementWatchersCount(current, count) { + do { + current.$$watchersCount += count; + } while ((current = current.$parent)); + } + + function decrementListenerCount(current, count, name) { + do { + current.$$listenerCount[name] -= count; + + if (current.$$listenerCount[name] === 0) { + delete current.$$listenerCount[name]; + } + } while ((current = current.$parent)); + } + + /** + * function used as an initial value for watchers. + * because it's unique we can easily tell it apart from other values + */ + function initWatchVal() {} + + function flushApplyAsync() { + while (applyAsyncQueue.length) { + try { + applyAsyncQueue.shift()(); + } catch (e) { + $exceptionHandler(e); + } + } + applyAsyncId = null; + } + + function scheduleApplyAsync() { + if (applyAsyncId === null) { + applyAsyncId = $browser.defer(function() { + $rootScope.$apply(flushApplyAsync); + }); + } + } + }]; +} + +/** + * @description + * Private service to sanitize uris for links and images. Used by $compile and $sanitize. + */ +function $$SanitizeUriProvider() { + var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, + imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/; + + /** + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.aHrefSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + aHrefSanitizationWhitelist = regexp; + return this; + } + return aHrefSanitizationWhitelist; + }; + + + /** + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during img[src] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.imgSrcSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + imgSrcSanitizationWhitelist = regexp; + return this; + } + return imgSrcSanitizationWhitelist; + }; + + this.$get = function() { + return function sanitizeUri(uri, isImage) { + var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; + var normalizedVal; + normalizedVal = urlResolve(uri).href; + if (normalizedVal !== '' && !normalizedVal.match(regex)) { + return 'unsafe:' + normalizedVal; + } + return uri; + }; + }; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $sceMinErr = minErr('$sce'); + +var SCE_CONTEXTS = { + HTML: 'html', + CSS: 'css', + URL: 'url', + // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a + // url. (e.g. ng-include, script src, templateUrl) + RESOURCE_URL: 'resourceUrl', + JS: 'js' +}; + +// Helper functions follow. + +function adjustMatcher(matcher) { + if (matcher === 'self') { + return matcher; + } else if (isString(matcher)) { + // Strings match exactly except for 2 wildcards - '*' and '**'. + // '*' matches any character except those from the set ':/.?&'. + // '**' matches any character (like .* in a RegExp). + // More than 2 *'s raises an error as it's ill defined. + if (matcher.indexOf('***') > -1) { + throw $sceMinErr('iwcard', + 'Illegal sequence *** in string matcher. String: {0}', matcher); + } + matcher = escapeForRegexp(matcher). + replace('\\*\\*', '.*'). + replace('\\*', '[^:/.?&;]*'); + return new RegExp('^' + matcher + '$'); + } else if (isRegExp(matcher)) { + // The only other type of matcher allowed is a Regexp. + // Match entire URL / disallow partial matches. + // Flags are reset (i.e. no global, ignoreCase or multiline) + return new RegExp('^' + matcher.source + '$'); + } else { + throw $sceMinErr('imatcher', + 'Matchers may only be "self", string patterns or RegExp objects'); + } +} + + +function adjustMatchers(matchers) { + var adjustedMatchers = []; + if (isDefined(matchers)) { + forEach(matchers, function(matcher) { + adjustedMatchers.push(adjustMatcher(matcher)); + }); + } + return adjustedMatchers; +} + + +/** + * @ngdoc service + * @name $sceDelegate + * @kind function + * + * @description + * + * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict + * Contextual Escaping (SCE)} services to AngularJS. + * + * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of + * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is + * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to + * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things + * work because `$sce` delegates to `$sceDelegate` for these operations. + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service. + * + * The default instance of `$sceDelegate` should work out of the box with little pain. While you + * can override it completely to change the behavior of `$sce`, the common case would + * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting + * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as + * templates. Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist + * $sceDelegateProvider.resourceUrlWhitelist} and {@link + * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + */ + +/** + * @ngdoc provider + * @name $sceDelegateProvider + * @description + * + * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate + * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure + * that the URLs used for sourcing Angular templates are safe. Refer {@link + * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and + * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + * + * For the general details about this service in Angular, read the main page for {@link ng.$sce + * Strict Contextual Escaping (SCE)}. + * + * **Example**: Consider the following case. + * + * - your app is hosted at url `http://myapp.example.com/` + * - but some of your templates are hosted on other domains you control such as + * `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc. + * - and you have an open redirect at `http://myapp.example.com/clickThru?...`. + * + * Here is what a secure configuration for this scenario might look like: + * + * ``` + * angular.module('myApp', []).config(function($sceDelegateProvider) { + * $sceDelegateProvider.resourceUrlWhitelist([ + * // Allow same origin resource loads. + * 'self', + * // Allow loading from our assets domain. Notice the difference between * and **. + * 'http://srv*.assets.example.com/**' + * ]); + * + * // The blacklist overrides the whitelist so the open redirect here is blocked. + * $sceDelegateProvider.resourceUrlBlacklist([ + * 'http://myapp.example.com/clickThru**' + * ]); + * }); + * ``` + */ + +function $SceDelegateProvider() { + this.SCE_CONTEXTS = SCE_CONTEXTS; + + // Resource URLs can also be trusted by policy. + var resourceUrlWhitelist = ['self'], + resourceUrlBlacklist = []; + + /** + * @ngdoc method + * @name $sceDelegateProvider#resourceUrlWhitelist + * @kind function + * + * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + * Note: **an empty whitelist array will block all URLs**! + * + * @return {Array} the currently set whitelist array. + * + * The **default value** when no whitelist has been explicitly set is `['self']` allowing only + * same origin resource requests. + * + * @description + * Sets/Gets the whitelist of trusted resource URLs. + */ + this.resourceUrlWhitelist = function(value) { + if (arguments.length) { + resourceUrlWhitelist = adjustMatchers(value); + } + return resourceUrlWhitelist; + }; + + /** + * @ngdoc method + * @name $sceDelegateProvider#resourceUrlBlacklist + * @kind function + * + * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + * The typical usage for the blacklist is to **block + * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as + * these would otherwise be trusted but actually return content from the redirected domain. + * + * Finally, **the blacklist overrides the whitelist** and has the final say. + * + * @return {Array} the currently set blacklist array. + * + * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there + * is no blacklist.) + * + * @description + * Sets/Gets the blacklist of trusted resource URLs. + */ + + this.resourceUrlBlacklist = function(value) { + if (arguments.length) { + resourceUrlBlacklist = adjustMatchers(value); + } + return resourceUrlBlacklist; + }; + + this.$get = ['$injector', function($injector) { + + var htmlSanitizer = function htmlSanitizer(html) { + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + }; + + if ($injector.has('$sanitize')) { + htmlSanitizer = $injector.get('$sanitize'); + } + + + function matchUrl(matcher, parsedUrl) { + if (matcher === 'self') { + return urlIsSameOrigin(parsedUrl); + } else { + // definitely a regex. See adjustMatchers() + return !!matcher.exec(parsedUrl.href); + } + } + + function isResourceUrlAllowedByPolicy(url) { + var parsedUrl = urlResolve(url.toString()); + var i, n, allowed = false; + // Ensure that at least one item from the whitelist allows this url. + for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) { + if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) { + allowed = true; + break; + } + } + if (allowed) { + // Ensure that no item from the blacklist blocked this url. + for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) { + if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) { + allowed = false; + break; + } + } + } + return allowed; + } + + function generateHolderType(Base) { + var holderType = function TrustedValueHolderType(trustedValue) { + this.$$unwrapTrustedValue = function() { + return trustedValue; + }; + }; + if (Base) { + holderType.prototype = new Base(); + } + holderType.prototype.valueOf = function sceValueOf() { + return this.$$unwrapTrustedValue(); + }; + holderType.prototype.toString = function sceToString() { + return this.$$unwrapTrustedValue().toString(); + }; + return holderType; + } + + var trustedValueHolderBase = generateHolderType(), + byType = {}; + + byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]); + + /** + * @ngdoc method + * @name $sceDelegate#trustAs + * + * @description + * Returns an object that is trusted by angular for use in specified strict + * contextual escaping contexts (such as ng-bind-html, ng-include, any src + * attribute interpolation, any dom event binding attribute interpolation + * such as for onclick, etc.) that uses the provided value. + * See {@link ng.$sce $sce} for enabling strict contextual escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resourceUrl, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + function trustAs(type, trustedValue) { + var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (!Constructor) { + throw $sceMinErr('icontext', + 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}', + type, trustedValue); + } + if (trustedValue === null || trustedValue === undefined || trustedValue === '') { + return trustedValue; + } + // All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting + // mutable objects, we ensure here that the value passed in is actually a string. + if (typeof trustedValue !== 'string') { + throw $sceMinErr('itype', + 'Attempted to trust a non-string value in a content requiring a string: Context: {0}', + type); + } + return new Constructor(trustedValue); + } + + /** + * @ngdoc method + * @name $sceDelegate#valueOf + * + * @description + * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. + * + * If the passed parameter is not a value that had been returned by {@link + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is. + * + * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} + * call or anything else. + * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns + * `value` unchanged. + */ + function valueOf(maybeTrusted) { + if (maybeTrusted instanceof trustedValueHolderBase) { + return maybeTrusted.$$unwrapTrustedValue(); + } else { + return maybeTrusted; + } + } + + /** + * @ngdoc method + * @name $sceDelegate#getTrusted + * + * @description + * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and + * returns the originally supplied value if the queried context type is a supertype of the + * created type. If this condition isn't satisfied, throws an exception. + * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} call. + * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception. + */ + function getTrusted(type, maybeTrusted) { + if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') { + return maybeTrusted; + } + var constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (constructor && maybeTrusted instanceof constructor) { + return maybeTrusted.$$unwrapTrustedValue(); + } + // If we get here, then we may only take one of two actions. + // 1. sanitize the value for the requested type, or + // 2. throw an exception. + if (type === SCE_CONTEXTS.RESOURCE_URL) { + if (isResourceUrlAllowedByPolicy(maybeTrusted)) { + return maybeTrusted; + } else { + throw $sceMinErr('insecurl', + 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}', + maybeTrusted.toString()); + } + } else if (type === SCE_CONTEXTS.HTML) { + return htmlSanitizer(maybeTrusted); + } + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + } + + return { trustAs: trustAs, + getTrusted: getTrusted, + valueOf: valueOf }; + }]; +} + + +/** + * @ngdoc provider + * @name $sceProvider + * @description + * + * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service. + * - enable/disable Strict Contextual Escaping (SCE) in a module + * - override the default implementation with a custom delegate + * + * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}. + */ + +/* jshint maxlen: false*/ + +/** + * @ngdoc service + * @name $sce + * @kind function + * + * @description + * + * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS. + * + * # Strict Contextual Escaping + * + * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain + * contexts to result in a value that is marked as safe to use for that context. One example of + * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer + * to these contexts as privileged or SCE contexts. + * + * As of version 1.2, Angular ships with SCE enabled by default. + * + * Note: When enabled (the default), IE<11 in quirks mode is not supported. In this mode, IE<11 allow + * one to execute arbitrary javascript by the use of the expression() syntax. Refer + * to learn more about them. + * You can ensure your document is in standards mode and not quirks mode by adding `` + * to the top of your HTML document. + * + * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for + * security vulnerabilities such as XSS, clickjacking, etc. a lot easier. + * + * Here's an example of a binding in a privileged context: + * + * ``` + * + *
    + * ``` + * + * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE + * disabled, this application allows the user to render arbitrary HTML into the DIV. + * In a more realistic example, one may be rendering user comments, blog articles, etc. via + * bindings. (HTML is just one example of a context where rendering user controlled input creates + * security vulnerabilities.) + * + * For the case of HTML, you might use a library, either on the client side, or on the server side, + * to sanitize unsafe HTML before binding to the value and rendering it in the document. + * + * How would you ensure that every place that used these types of bindings was bound to a value that + * was sanitized by your library (or returned as safe for rendering by your server?) How can you + * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some + * properties/fields and forgot to update the binding to the sanitized value? + * + * To be secure by default, you want to ensure that any such bindings are disallowed unless you can + * determine that something explicitly says it's safe to use a value for binding in that + * context. You can then audit your code (a simple grep would do) to ensure that this is only done + * for those values that you can easily tell are safe - because they were received from your server, + * sanitized by your library, etc. You can organize your codebase to help with this - perhaps + * allowing only the files in a specific directory to do this. Ensuring that the internal API + * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task. + * + * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs} + * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to + * obtain values that will be accepted by SCE / privileged contexts. + * + * + * ## How does it work? + * + * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted + * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link + * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the + * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals. + * + * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link + * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly + * simplified): + * + * ``` + * var ngBindHtmlDirective = ['$sce', function($sce) { + * return function(scope, element, attr) { + * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) { + * element.html(value || ''); + * }); + * }; + * }]; + * ``` + * + * ## Impact on loading templates + * + * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as + * `templateUrl`'s specified by {@link guide/directive directives}. + * + * By default, Angular only loads templates from the same domain and protocol as the application + * document. This is done by calling {@link ng.$sce#getTrustedResourceUrl + * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or + * protocols, you may either either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist + * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value. + * + * *Please note*: + * The browser's + * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest) + * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) + * policy apply in addition to this and may further restrict whether the template is successfully + * loaded. This means that without the right CORS policy, loading templates from a different domain + * won't work on all browsers. Also, loading templates from `file://` URL does not work on some + * browsers. + * + * ## This feels like too much overhead + * + * It's important to remember that SCE only applies to interpolation expressions. + * + * If your expressions are constant literals, they're automatically trusted and you don't need to + * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g. + * `
    `) just works. + * + * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them + * through {@link ng.$sce#getTrusted $sce.getTrusted}. SCE doesn't play a role here. + * + * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load + * templates in `ng-include` from your application's domain without having to even know about SCE. + * It blocks loading templates from other domains or loading templates over http from an https + * served document. You can change these by setting your own custom {@link + * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link + * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs. + * + * This significantly reduces the overhead. It is far easier to pay the small overhead and have an + * application that's secure and can be audited to verify that with much more ease than bolting + * security onto an application later. + * + * + * ## What trusted context types are supported? + * + * | Context | Notes | + * |---------------------|----------------| + * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | + * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | + * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
    Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | + * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | + * + * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist}
    + * + * Each element in these arrays must be one of the following: + * + * - **'self'** + * - The special **string**, `'self'`, can be used to match against all URLs of the **same + * domain** as the application document using the **same protocol**. + * - **String** (except the special value `'self'`) + * - The string is matched against the full *normalized / absolute URL* of the resource + * being tested (substring matches are not good enough.) + * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters + * match themselves. + * - `*`: matches zero or more occurrences of any character other than one of the following 6 + * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'. It's a useful wildcard for use + * in a whitelist. + * - `**`: matches zero or more occurrences of *any* character. As such, it's not + * not appropriate to use in for a scheme, domain, etc. as it would match too much. (e.g. + * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might + * not have been the intention.) Its usage at the very end of the path is ok. (e.g. + * http://foo.example.com/templates/**). + * - **RegExp** (*see caveat below*) + * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax + * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to + * accidentally introduce a bug when one updates a complex expression (imho, all regexes should + * have good test coverage.). For instance, the use of `.` in the regex is correct only in a + * small number of cases. A `.` character in the regex used when matching the scheme or a + * subdomain could be matched against a `:` or literal `.` that was likely not intended. It + * is highly recommended to use the string patterns and only fall back to regular expressions + * if they as a last resort. + * - The regular expression must be an instance of RegExp (i.e. not a string.) It is + * matched against the **entire** *normalized / absolute URL* of the resource being tested + * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags + * present on the RegExp (such as multiline, global, ignoreCase) are ignored. + * - If you are generating your JavaScript from some other templating engine (not + * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)), + * remember to escape your regular expression (and be aware that you might need more than + * one level of escaping depending on your templating engine and the way you interpolated + * the value.) Do make use of your platform's escaping mechanism as it might be good + * enough before coding your own. e.g. Ruby has + * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape) + * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape). + * Javascript lacks a similar built in function for escaping. Take a look at Google + * Closure library's [goog.string.regExpEscape(s)]( + * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962). + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example. + * + * ## Show me an example using SCE. + * + * + * + *
    + *

    + * User comments
    + * By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when + * $sanitize is available. If $sanitize isn't available, this results in an error instead of an + * exploit. + *
    + *
    + * {{userComment.name}}: + * + *
    + *
    + *
    + *
    + *
    + * + * + * angular.module('mySceApp', ['ngSanitize']) + * .controller('AppController', ['$http', '$templateCache', '$sce', + * function($http, $templateCache, $sce) { + * var self = this; + * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) { + * self.userComments = userComments; + * }); + * self.explicitlyTrustedHtml = $sce.trustAsHtml( + * 'Hover over this text.'); + * }]); + * + * + * + * [ + * { "name": "Alice", + * "htmlComment": + * "Is anyone reading this?" + * }, + * { "name": "Bob", + * "htmlComment": "Yes! Am I the only other one?" + * } + * ] + * + * + * + * describe('SCE doc demo', function() { + * it('should sanitize untrusted values', function() { + * expect(element.all(by.css('.htmlComment')).first().getInnerHtml()) + * .toBe('Is anyone reading this?'); + * }); + * + * it('should NOT sanitize explicitly trusted values', function() { + * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe( + * 'Hover over this text.'); + * }); + * }); + * + *
    + * + * + * + * ## Can I disable SCE completely? + * + * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits + * for little coding overhead. It will be much harder to take an SCE disabled application and + * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE + * for cases where you have a lot of existing code that was written before SCE was introduced and + * you're migrating them a module at a time. + * + * That said, here's how you can completely disable SCE: + * + * ``` + * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) { + * // Completely disable SCE. For demonstration purposes only! + * // Do not use in new projects. + * $sceProvider.enabled(false); + * }); + * ``` + * + */ +/* jshint maxlen: 100 */ + +function $SceProvider() { + var enabled = true; + + /** + * @ngdoc method + * @name $sceProvider#enabled + * @kind function + * + * @param {boolean=} value If provided, then enables/disables SCE. + * @return {boolean} true if SCE is enabled, false otherwise. + * + * @description + * Enables/disables SCE and returns the current value. + */ + this.enabled = function(value) { + if (arguments.length) { + enabled = !!value; + } + return enabled; + }; + + + /* Design notes on the default implementation for SCE. + * + * The API contract for the SCE delegate + * ------------------------------------- + * The SCE delegate object must provide the following 3 methods: + * + * - trustAs(contextEnum, value) + * This method is used to tell the SCE service that the provided value is OK to use in the + * contexts specified by contextEnum. It must return an object that will be accepted by + * getTrusted() for a compatible contextEnum and return this value. + * + * - valueOf(value) + * For values that were not produced by trustAs(), return them as is. For values that were + * produced by trustAs(), return the corresponding input value to trustAs. Basically, if + * trustAs is wrapping the given values into some type, this operation unwraps it when given + * such a value. + * + * - getTrusted(contextEnum, value) + * This function should return the a value that is safe to use in the context specified by + * contextEnum or throw and exception otherwise. + * + * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be + * opaque or wrapped in some holder object. That happens to be an implementation detail. For + * instance, an implementation could maintain a registry of all trusted objects by context. In + * such a case, trustAs() would return the same object that was passed in. getTrusted() would + * return the same object passed in if it was found in the registry under a compatible context or + * throw an exception otherwise. An implementation might only wrap values some of the time based + * on some criteria. getTrusted() might return a value and not throw an exception for special + * constants or objects even if not wrapped. All such implementations fulfill this contract. + * + * + * A note on the inheritance model for SCE contexts + * ------------------------------------------------ + * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This + * is purely an implementation details. + * + * The contract is simply this: + * + * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value) + * will also succeed. + * + * Inheritance happens to capture this in a natural way. In some future, we + * may not use inheritance anymore. That is OK because no code outside of + * sce.js and sceSpecs.js would need to be aware of this detail. + */ + + this.$get = ['$parse', '$sceDelegate', function( + $parse, $sceDelegate) { + // Prereq: Ensure that we're not running in IE<11 quirks mode. In that mode, IE < 11 allow + // the "expression(javascript expression)" syntax which is insecure. + if (enabled && msie < 8) { + throw $sceMinErr('iequirks', + 'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' + + 'mode. You can fix this by adding the text to the top of your HTML ' + + 'document. See http://docs.angularjs.org/api/ng.$sce for more information.'); + } + + var sce = shallowCopy(SCE_CONTEXTS); + + /** + * @ngdoc method + * @name $sce#isEnabled + * @kind function + * + * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you + * have to do it at module config time on {@link ng.$sceProvider $sceProvider}. + * + * @description + * Returns a boolean indicating if SCE is enabled. + */ + sce.isEnabled = function() { + return enabled; + }; + sce.trustAs = $sceDelegate.trustAs; + sce.getTrusted = $sceDelegate.getTrusted; + sce.valueOf = $sceDelegate.valueOf; + + if (!enabled) { + sce.trustAs = sce.getTrusted = function(type, value) { return value; }; + sce.valueOf = identity; + } + + /** + * @ngdoc method + * @name $sce#parseAs + * + * @description + * Converts Angular {@link guide/expression expression} into a function. This is like {@link + * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it + * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*, + * *result*)} + * + * @param {string} type The kind of SCE context in which this result will be used. + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + sce.parseAs = function sceParseAs(type, expr) { + var parsed = $parse(expr); + if (parsed.literal && parsed.constant) { + return parsed; + } else { + return $parse(expr, function(value) { + return sce.getTrusted(type, value); + }); + } + }; + + /** + * @ngdoc method + * @name $sce#trustAs + * + * @description + * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such, + * returns an object that is trusted by angular for use in specified strict contextual + * escaping contexts (such as ng-bind-html, ng-include, any src attribute + * interpolation, any dom event binding attribute interpolation such as for onclick, etc.) + * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual + * escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resourceUrl, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + + /** + * @ngdoc method + * @name $sce#trustAsHtml + * + * @description + * Shorthand method. `$sce.trustAsHtml(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml + * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsUrl + * + * @description + * Shorthand method. `$sce.trustAsUrl(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl + * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsResourceUrl + * + * @description + * Shorthand method. `$sce.trustAsResourceUrl(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl + * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the return + * value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsJs + * + * @description + * Shorthand method. `$sce.trustAsJs(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs + * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#getTrusted + * + * @description + * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}. As such, + * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the + * originally supplied value if the queried context type is a supertype of the created type. + * If this condition isn't satisfied, throws an exception. + * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`} + * call. + * @returns {*} The value the was originally provided to + * {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context. + * Otherwise, throws an exception. + */ + + /** + * @ngdoc method + * @name $sce#getTrustedHtml + * + * @description + * Shorthand method. `$sce.getTrustedHtml(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedCss + * + * @description + * Shorthand method. `$sce.getTrustedCss(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedUrl + * + * @description + * Shorthand method. `$sce.getTrustedUrl(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedResourceUrl + * + * @description + * Shorthand method. `$sce.getTrustedResourceUrl(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to pass to `$sceDelegate.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedJs + * + * @description + * Shorthand method. `$sce.getTrustedJs(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)` + */ + + /** + * @ngdoc method + * @name $sce#parseAsHtml + * + * @description + * Shorthand method. `$sce.parseAsHtml(expression string)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsCss + * + * @description + * Shorthand method. `$sce.parseAsCss(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsUrl + * + * @description + * Shorthand method. `$sce.parseAsUrl(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsResourceUrl + * + * @description + * Shorthand method. `$sce.parseAsResourceUrl(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsJs + * + * @description + * Shorthand method. `$sce.parseAsJs(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + // Shorthand delegations. + var parse = sce.parseAs, + getTrusted = sce.getTrusted, + trustAs = sce.trustAs; + + forEach(SCE_CONTEXTS, function(enumValue, name) { + var lName = lowercase(name); + sce[camelCase("parse_as_" + lName)] = function(expr) { + return parse(enumValue, expr); + }; + sce[camelCase("get_trusted_" + lName)] = function(value) { + return getTrusted(enumValue, value); + }; + sce[camelCase("trust_as_" + lName)] = function(value) { + return trustAs(enumValue, value); + }; + }); + + return sce; + }]; +} + +/** + * !!! This is an undocumented "private" service !!! + * + * @name $sniffer + * @requires $window + * @requires $document + * + * @property {boolean} history Does the browser support html5 history api ? + * @property {boolean} transitions Does the browser support CSS transition events ? + * @property {boolean} animations Does the browser support CSS animation events ? + * + * @description + * This is very simple implementation of testing browser's features. + */ +function $SnifferProvider() { + this.$get = ['$window', '$document', function($window, $document) { + var eventSupport = {}, + android = + toInt((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), + boxee = /Boxee/i.test(($window.navigator || {}).userAgent), + document = $document[0] || {}, + vendorPrefix, + vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/, + bodyStyle = document.body && document.body.style, + transitions = false, + animations = false, + match; + + if (bodyStyle) { + for (var prop in bodyStyle) { + if (match = vendorRegex.exec(prop)) { + vendorPrefix = match[0]; + vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1); + break; + } + } + + if (!vendorPrefix) { + vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; + } + + transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); + animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); + + if (android && (!transitions || !animations)) { + transitions = isString(bodyStyle.webkitTransition); + animations = isString(bodyStyle.webkitAnimation); + } + } + + + return { + // Android has history.pushState, but it does not update location correctly + // so let's not use the history API at all. + // http://code.google.com/p/android/issues/detail?id=17471 + // https://github.com/angular/angular.js/issues/904 + + // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has + // so let's not use the history API also + // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined + // jshint -W018 + history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee), + // jshint +W018 + hasEvent: function(event) { + // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have + // it. In particular the event is not fired when backspace or delete key are pressed or + // when cut operation is performed. + // IE10+ implements 'input' event but it erroneously fires under various situations, + // e.g. when placeholder changes, or a form is focused. + if (event === 'input' && msie <= 11) return false; + + if (isUndefined(eventSupport[event])) { + var divElm = document.createElement('div'); + eventSupport[event] = 'on' + event in divElm; + } + + return eventSupport[event]; + }, + csp: csp(), + vendorPrefix: vendorPrefix, + transitions: transitions, + animations: animations, + android: android + }; + }]; +} + +var $compileMinErr = minErr('$compile'); + +/** + * @ngdoc service + * @name $templateRequest + * + * @description + * The `$templateRequest` service runs security checks then downloads the provided template using + * `$http` and, upon success, stores the contents inside of `$templateCache`. If the HTTP request + * fails or the response data of the HTTP request is empty, a `$compile` error will be thrown (the + * exception can be thwarted by setting the 2nd parameter of the function to true). Note that the + * contents of `$templateCache` are trusted, so the call to `$sce.getTrustedUrl(tpl)` is omitted + * when `tpl` is of type string and `$templateCache` has the matching entry. + * + * @param {string|TrustedResourceUrl} tpl The HTTP request template URL + * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty + * + * @return {Promise} a promise for the HTTP response data of the given URL. + * + * @property {number} totalPendingRequests total amount of pending template requests being downloaded. + */ +function $TemplateRequestProvider() { + this.$get = ['$templateCache', '$http', '$q', '$sce', function($templateCache, $http, $q, $sce) { + function handleRequestFn(tpl, ignoreRequestError) { + handleRequestFn.totalPendingRequests++; + + // We consider the template cache holds only trusted templates, so + // there's no need to go through whitelisting again for keys that already + // are included in there. This also makes Angular accept any script + // directive, no matter its name. However, we still need to unwrap trusted + // types. + if (!isString(tpl) || !$templateCache.get(tpl)) { + tpl = $sce.getTrustedResourceUrl(tpl); + } + + var transformResponse = $http.defaults && $http.defaults.transformResponse; + + if (isArray(transformResponse)) { + transformResponse = transformResponse.filter(function(transformer) { + return transformer !== defaultHttpResponseTransform; + }); + } else if (transformResponse === defaultHttpResponseTransform) { + transformResponse = null; + } + + var httpOptions = { + cache: $templateCache, + transformResponse: transformResponse + }; + + return $http.get(tpl, httpOptions) + ['finally'](function() { + handleRequestFn.totalPendingRequests--; + }) + .then(function(response) { + $templateCache.put(tpl, response.data); + return response.data; + }, handleError); + + function handleError(resp) { + if (!ignoreRequestError) { + throw $compileMinErr('tpload', 'Failed to load template: {0} (HTTP status: {1} {2})', + tpl, resp.status, resp.statusText); + } + return $q.reject(resp); + } + } + + handleRequestFn.totalPendingRequests = 0; + + return handleRequestFn; + }]; +} + +function $$TestabilityProvider() { + this.$get = ['$rootScope', '$browser', '$location', + function($rootScope, $browser, $location) { + + /** + * @name $testability + * + * @description + * The private $$testability service provides a collection of methods for use when debugging + * or by automated test and debugging tools. + */ + var testability = {}; + + /** + * @name $$testability#findBindings + * + * @description + * Returns an array of elements that are bound (via ng-bind or {{}}) + * to expressions matching the input. + * + * @param {Element} element The element root to search from. + * @param {string} expression The binding expression to match. + * @param {boolean} opt_exactMatch If true, only returns exact matches + * for the expression. Filters and whitespace are ignored. + */ + testability.findBindings = function(element, expression, opt_exactMatch) { + var bindings = element.getElementsByClassName('ng-binding'); + var matches = []; + forEach(bindings, function(binding) { + var dataBinding = angular.element(binding).data('$binding'); + if (dataBinding) { + forEach(dataBinding, function(bindingName) { + if (opt_exactMatch) { + var matcher = new RegExp('(^|\\s)' + escapeForRegexp(expression) + '(\\s|\\||$)'); + if (matcher.test(bindingName)) { + matches.push(binding); + } + } else { + if (bindingName.indexOf(expression) != -1) { + matches.push(binding); + } + } + }); + } + }); + return matches; + }; + + /** + * @name $$testability#findModels + * + * @description + * Returns an array of elements that are two-way found via ng-model to + * expressions matching the input. + * + * @param {Element} element The element root to search from. + * @param {string} expression The model expression to match. + * @param {boolean} opt_exactMatch If true, only returns exact matches + * for the expression. + */ + testability.findModels = function(element, expression, opt_exactMatch) { + var prefixes = ['ng-', 'data-ng-', 'ng\\:']; + for (var p = 0; p < prefixes.length; ++p) { + var attributeEquals = opt_exactMatch ? '=' : '*='; + var selector = '[' + prefixes[p] + 'model' + attributeEquals + '"' + expression + '"]'; + var elements = element.querySelectorAll(selector); + if (elements.length) { + return elements; + } + } + }; + + /** + * @name $$testability#getLocation + * + * @description + * Shortcut for getting the location in a browser agnostic way. Returns + * the path, search, and hash. (e.g. /path?a=b#hash) + */ + testability.getLocation = function() { + return $location.url(); + }; + + /** + * @name $$testability#setLocation + * + * @description + * Shortcut for navigating to a location without doing a full page reload. + * + * @param {string} url The location url (path, search and hash, + * e.g. /path?a=b#hash) to go to. + */ + testability.setLocation = function(url) { + if (url !== $location.url()) { + $location.url(url); + $rootScope.$digest(); + } + }; + + /** + * @name $$testability#whenStable + * + * @description + * Calls the callback when $timeout and $http requests are completed. + * + * @param {function} callback + */ + testability.whenStable = function(callback) { + $browser.notifyWhenNoOutstandingRequests(callback); + }; + + return testability; + }]; +} + +function $TimeoutProvider() { + this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler', + function($rootScope, $browser, $q, $$q, $exceptionHandler) { + + var deferreds = {}; + + + /** + * @ngdoc service + * @name $timeout + * + * @description + * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch + * block and delegates any exceptions to + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * The return value of calling `$timeout` is a promise, which will be resolved when + * the delay has passed and the timeout function, if provided, is executed. + * + * To cancel a timeout request, call `$timeout.cancel(promise)`. + * + * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to + * synchronously flush the queue of deferred functions. + * + * If you only want a promise that will be resolved after some specified delay + * then you can call `$timeout` without the `fn` function. + * + * @param {function()=} fn A function, whose execution should be delayed. + * @param {number=} [delay=0] Delay in milliseconds. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. + * @param {...*=} Pass additional parameters to the executed function. + * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this + * promise will be resolved with is the return value of the `fn` function. + * + */ + function timeout(fn, delay, invokeApply) { + if (!isFunction(fn)) { + invokeApply = delay; + delay = fn; + fn = noop; + } + + var args = sliceArgs(arguments, 3), + skipApply = (isDefined(invokeApply) && !invokeApply), + deferred = (skipApply ? $$q : $q).defer(), + promise = deferred.promise, + timeoutId; + + timeoutId = $browser.defer(function() { + try { + deferred.resolve(fn.apply(null, args)); + } catch (e) { + deferred.reject(e); + $exceptionHandler(e); + } + finally { + delete deferreds[promise.$$timeoutId]; + } + + if (!skipApply) $rootScope.$apply(); + }, delay); + + promise.$$timeoutId = timeoutId; + deferreds[timeoutId] = deferred; + + return promise; + } + + + /** + * @ngdoc method + * @name $timeout#cancel + * + * @description + * Cancels a task associated with the `promise`. As a result of this, the promise will be + * resolved with a rejection. + * + * @param {Promise=} promise Promise returned by the `$timeout` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + timeout.cancel = function(promise) { + if (promise && promise.$$timeoutId in deferreds) { + deferreds[promise.$$timeoutId].reject('canceled'); + delete deferreds[promise.$$timeoutId]; + return $browser.defer.cancel(promise.$$timeoutId); + } + return false; + }; + + return timeout; + }]; +} + +// NOTE: The usage of window and document instead of $window and $document here is +// deliberate. This service depends on the specific behavior of anchor nodes created by the +// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and +// cause us to break tests. In addition, when the browser resolves a URL for XHR, it +// doesn't know about mocked locations and resolves URLs to the real document - which is +// exactly the behavior needed here. There is little value is mocking these out for this +// service. +var urlParsingNode = document.createElement("a"); +var originUrl = urlResolve(window.location.href); + + +/** + * + * Implementation Notes for non-IE browsers + * ---------------------------------------- + * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM, + * results both in the normalizing and parsing of the URL. Normalizing means that a relative + * URL will be resolved into an absolute URL in the context of the application document. + * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related + * properties are all populated to reflect the normalized URL. This approach has wide + * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * + * Implementation Notes for IE + * --------------------------- + * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other + * browsers. However, the parsed components will not be set if the URL assigned did not specify + * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We + * work around that by performing the parsing in a 2nd step by taking a previously normalized + * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the + * properties such as protocol, hostname, port, etc. + * + * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one + * uses the inner HTML approach to assign the URL as part of an HTML snippet - + * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL. + * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception. + * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that + * method and IE < 8 is unsupported. + * + * References: + * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * http://url.spec.whatwg.org/#urlutils + * https://github.com/angular/angular.js/pull/2902 + * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ + * + * @kind function + * @param {string} url The URL to be parsed. + * @description Normalizes and parses a URL. + * @returns {object} Returns the normalized URL as a dictionary. + * + * | member name | Description | + * |---------------|----------------| + * | href | A normalized version of the provided URL if it was not an absolute URL | + * | protocol | The protocol including the trailing colon | + * | host | The host and port (if the port is non-default) of the normalizedUrl | + * | search | The search params, minus the question mark | + * | hash | The hash string, minus the hash symbol + * | hostname | The hostname + * | port | The port, without ":" + * | pathname | The pathname, beginning with "/" + * + */ +function urlResolve(url) { + var href = url; + + if (msie) { + // Normalize before parse. Refer Implementation Notes on why this is + // done in two steps on IE. + urlParsingNode.setAttribute("href", href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') + ? urlParsingNode.pathname + : '/' + urlParsingNode.pathname + }; +} + +/** + * Parse a request URL and determine whether this is a same-origin request as the application document. + * + * @param {string|object} requestUrl The url of the request as a string that will be resolved + * or a parsed URL object. + * @returns {boolean} Whether the request is for the same origin as the application document. + */ +function urlIsSameOrigin(requestUrl) { + var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl; + return (parsed.protocol === originUrl.protocol && + parsed.host === originUrl.host); +} + +/** + * @ngdoc service + * @name $window + * + * @description + * A reference to the browser's `window` object. While `window` + * is globally available in JavaScript, it causes testability problems, because + * it is a global variable. In angular we always refer to it through the + * `$window` service, so it may be overridden, removed or mocked for testing. + * + * Expressions, like the one defined for the `ngClick` directive in the example + * below, are evaluated with respect to the current scope. Therefore, there is + * no risk of inadvertently coding in a dependency on a global value in such an + * expression. + * + * @example + + + +
    + + +
    +
    + + it('should display the greeting in the input box', function() { + element(by.model('greeting')).sendKeys('Hello, E2E Tests'); + // If we click the button it will block the test runner + // element(':button').click(); + }); + +
    + */ +function $WindowProvider() { + this.$get = valueFn(window); +} + +/** + * @name $$cookieReader + * @requires $document + * + * @description + * This is a private service for reading cookies used by $http and ngCookies + * + * @return {Object} a key/value map of the current cookies + */ +function $$CookieReader($document) { + var rawDocument = $document[0] || {}; + var lastCookies = {}; + var lastCookieString = ''; + + function safeDecodeURIComponent(str) { + try { + return decodeURIComponent(str); + } catch (e) { + return str; + } + } + + return function() { + var cookieArray, cookie, i, index, name; + var currentCookieString = rawDocument.cookie || ''; + + if (currentCookieString !== lastCookieString) { + lastCookieString = currentCookieString; + cookieArray = lastCookieString.split('; '); + lastCookies = {}; + + for (i = 0; i < cookieArray.length; i++) { + cookie = cookieArray[i]; + index = cookie.indexOf('='); + if (index > 0) { //ignore nameless cookies + name = safeDecodeURIComponent(cookie.substring(0, index)); + // the first value that is seen for a cookie is the most + // specific one. values for the same cookie name that + // follow are for less specific paths. + if (lastCookies[name] === undefined) { + lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)); + } + } + } + } + return lastCookies; + }; +} + +$$CookieReader.$inject = ['$document']; + +function $$CookieReaderProvider() { + this.$get = $$CookieReader; +} + +/* global currencyFilter: true, + dateFilter: true, + filterFilter: true, + jsonFilter: true, + limitToFilter: true, + lowercaseFilter: true, + numberFilter: true, + orderByFilter: true, + uppercaseFilter: true, + */ + +/** + * @ngdoc provider + * @name $filterProvider + * @description + * + * Filters are just functions which transform input to an output. However filters need to be + * Dependency Injected. To achieve this a filter definition consists of a factory function which is + * annotated with dependencies and is responsible for creating a filter function. + * + *
    + * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
    + * + * ```js + * // Filter registration + * function MyModule($provide, $filterProvider) { + * // create a service to demonstrate injection (not always needed) + * $provide.value('greet', function(name){ + * return 'Hello ' + name + '!'; + * }); + * + * // register a filter factory which uses the + * // greet service to demonstrate DI. + * $filterProvider.register('greet', function(greet){ + * // return the filter function which uses the greet service + * // to generate salutation + * return function(text) { + * // filters need to be forgiving so check input validity + * return text && greet(text) || text; + * }; + * }); + * } + * ``` + * + * The filter function is registered with the `$injector` under the filter name suffix with + * `Filter`. + * + * ```js + * it('should be the same instance', inject( + * function($filterProvider) { + * $filterProvider.register('reverse', function(){ + * return ...; + * }); + * }, + * function($filter, reverseFilter) { + * expect($filter('reverse')).toBe(reverseFilter); + * }); + * ``` + * + * + * For more information about how angular filters work, and how to create your own filters, see + * {@link guide/filter Filters} in the Angular Developer Guide. + */ + +/** + * @ngdoc service + * @name $filter + * @kind function + * @description + * Filters are used for formatting data displayed to the user. + * + * The general syntax in templates is as follows: + * + * {{ expression [| filter_name[:parameter_value] ... ] }} + * + * @param {String} name Name of the filter function to retrieve + * @return {Function} the filter function + * @example + + +
    +

    {{ originalText }}

    +

    {{ filteredText }}

    +
    +
    + + + angular.module('filterExample', []) + .controller('MainCtrl', function($scope, $filter) { + $scope.originalText = 'hello'; + $scope.filteredText = $filter('uppercase')($scope.originalText); + }); + +
    + */ +$FilterProvider.$inject = ['$provide']; +function $FilterProvider($provide) { + var suffix = 'Filter'; + + /** + * @ngdoc method + * @name $filterProvider#register + * @param {string|Object} name Name of the filter function, or an object map of filters where + * the keys are the filter names and the values are the filter factories. + * + *
    + * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
    + * @returns {Object} Registered filter instance, or if a map of filters was provided then a map + * of the registered filter instances. + */ + function register(name, factory) { + if (isObject(name)) { + var filters = {}; + forEach(name, function(filter, key) { + filters[key] = register(key, filter); + }); + return filters; + } else { + return $provide.factory(name + suffix, factory); + } + } + this.register = register; + + this.$get = ['$injector', function($injector) { + return function(name) { + return $injector.get(name + suffix); + }; + }]; + + //////////////////////////////////////// + + /* global + currencyFilter: false, + dateFilter: false, + filterFilter: false, + jsonFilter: false, + limitToFilter: false, + lowercaseFilter: false, + numberFilter: false, + orderByFilter: false, + uppercaseFilter: false, + */ + + register('currency', currencyFilter); + register('date', dateFilter); + register('filter', filterFilter); + register('json', jsonFilter); + register('limitTo', limitToFilter); + register('lowercase', lowercaseFilter); + register('number', numberFilter); + register('orderBy', orderByFilter); + register('uppercase', uppercaseFilter); +} + +/** + * @ngdoc filter + * @name filter + * @kind function + * + * @description + * Selects a subset of items from `array` and returns it as a new array. + * + * @param {Array} array The source array. + * @param {string|Object|function()} expression The predicate to be used for selecting items from + * `array`. + * + * Can be one of: + * + * - `string`: The string is used for matching against the contents of the `array`. All strings or + * objects with string properties in `array` that match this string will be returned. This also + * applies to nested object properties. + * The predicate can be negated by prefixing the string with `!`. + * + * - `Object`: A pattern object can be used to filter specific properties on objects contained + * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items + * which have property `name` containing "M" and property `phone` containing "1". A special + * property name `$` can be used (as in `{$:"text"}`) to accept a match against any + * property of the object or its nested object properties. That's equivalent to the simple + * substring match with a `string` as described above. The predicate can be negated by prefixing + * the string with `!`. + * For example `{name: "!M"}` predicate will return an array of items which have property `name` + * not containing "M". + * + * Note that a named property will match properties on the same level only, while the special + * `$` property will match properties on the same level or deeper. E.g. an array item like + * `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but + * **will** be matched by `{$: 'John'}`. + * + * - `function(value, index, array)`: A predicate function can be used to write arbitrary filters. + * The function is called for each element of the array, with the element, its index, and + * the entire array itself as arguments. + * + * The final result is an array of those elements that the predicate returned true for. + * + * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in + * determining if the expected value (from the filter expression) and actual value (from + * the object in the array) should be considered a match. + * + * Can be one of: + * + * - `function(actual, expected)`: + * The function will be given the object value and the predicate value to compare and + * should return true if both values should be considered equal. + * + * - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`. + * This is essentially strict comparison of expected and actual. + * + * - `false|undefined`: A short hand for a function which will look for a substring match in case + * insensitive way. + * + * Primitive values are converted to strings. Objects are not compared against primitives, + * unless they have a custom `toString` method (e.g. `Date` objects). + * + * @example + + +
    + + + + + + + + +
    NamePhone
    {{friend.name}}{{friend.phone}}
    +
    +
    +
    +
    +
    + + + + + + +
    NamePhone
    {{friendObj.name}}{{friendObj.phone}}
    +
    + + var expectFriendNames = function(expectedNames, key) { + element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) { + arr.forEach(function(wd, i) { + expect(wd.getText()).toMatch(expectedNames[i]); + }); + }); + }; + + it('should search across all fields when filtering with a string', function() { + var searchText = element(by.model('searchText')); + searchText.clear(); + searchText.sendKeys('m'); + expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend'); + + searchText.clear(); + searchText.sendKeys('76'); + expectFriendNames(['John', 'Julie'], 'friend'); + }); + + it('should search in specific fields when filtering with a predicate object', function() { + var searchAny = element(by.model('search.$')); + searchAny.clear(); + searchAny.sendKeys('i'); + expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj'); + }); + it('should use a equal comparison when comparator is true', function() { + var searchName = element(by.model('search.name')); + var strict = element(by.model('strict')); + searchName.clear(); + searchName.sendKeys('Julie'); + strict.click(); + expectFriendNames(['Julie'], 'friendObj'); + }); + +
    + */ +function filterFilter() { + return function(array, expression, comparator) { + if (!isArrayLike(array)) { + if (array == null) { + return array; + } else { + throw minErr('filter')('notarray', 'Expected array but received: {0}', array); + } + } + + var expressionType = getTypeForFilter(expression); + var predicateFn; + var matchAgainstAnyProp; + + switch (expressionType) { + case 'function': + predicateFn = expression; + break; + case 'boolean': + case 'null': + case 'number': + case 'string': + matchAgainstAnyProp = true; + //jshint -W086 + case 'object': + //jshint +W086 + predicateFn = createPredicateFn(expression, comparator, matchAgainstAnyProp); + break; + default: + return array; + } + + return Array.prototype.filter.call(array, predicateFn); + }; +} + +// Helper functions for `filterFilter` +function createPredicateFn(expression, comparator, matchAgainstAnyProp) { + var shouldMatchPrimitives = isObject(expression) && ('$' in expression); + var predicateFn; + + if (comparator === true) { + comparator = equals; + } else if (!isFunction(comparator)) { + comparator = function(actual, expected) { + if (isUndefined(actual)) { + // No substring matching against `undefined` + return false; + } + if ((actual === null) || (expected === null)) { + // No substring matching against `null`; only match against `null` + return actual === expected; + } + if (isObject(expected) || (isObject(actual) && !hasCustomToString(actual))) { + // Should not compare primitives against objects, unless they have custom `toString` method + return false; + } + + actual = lowercase('' + actual); + expected = lowercase('' + expected); + return actual.indexOf(expected) !== -1; + }; + } + + predicateFn = function(item) { + if (shouldMatchPrimitives && !isObject(item)) { + return deepCompare(item, expression.$, comparator, false); + } + return deepCompare(item, expression, comparator, matchAgainstAnyProp); + }; + + return predicateFn; +} + +function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) { + var actualType = getTypeForFilter(actual); + var expectedType = getTypeForFilter(expected); + + if ((expectedType === 'string') && (expected.charAt(0) === '!')) { + return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp); + } else if (isArray(actual)) { + // In case `actual` is an array, consider it a match + // if ANY of it's items matches `expected` + return actual.some(function(item) { + return deepCompare(item, expected, comparator, matchAgainstAnyProp); + }); + } + + switch (actualType) { + case 'object': + var key; + if (matchAgainstAnyProp) { + for (key in actual) { + if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) { + return true; + } + } + return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false); + } else if (expectedType === 'object') { + for (key in expected) { + var expectedVal = expected[key]; + if (isFunction(expectedVal) || isUndefined(expectedVal)) { + continue; + } + + var matchAnyProperty = key === '$'; + var actualVal = matchAnyProperty ? actual : actual[key]; + if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) { + return false; + } + } + return true; + } else { + return comparator(actual, expected); + } + break; + case 'function': + return false; + default: + return comparator(actual, expected); + } +} + +// Used for easily differentiating between `null` and actual `object` +function getTypeForFilter(val) { + return (val === null) ? 'null' : typeof val; +} + +/** + * @ngdoc filter + * @name currency + * @kind function + * + * @description + * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default + * symbol for current locale is used. + * + * @param {number} amount Input to filter. + * @param {string=} symbol Currency symbol or identifier to be displayed. + * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale + * @returns {string} Formatted number. + * + * + * @example + + + +
    +
    + default currency symbol ($): {{amount | currency}}
    + custom currency identifier (USD$): {{amount | currency:"USD$"}} + no fractions (0): {{amount | currency:"USD$":0}} +
    +
    + + it('should init with 1234.56', function() { + expect(element(by.id('currency-default')).getText()).toBe('$1,234.56'); + expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56'); + expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235'); + }); + it('should update', function() { + if (browser.params.browser == 'safari') { + // Safari does not understand the minus key. See + // https://github.com/angular/protractor/issues/481 + return; + } + element(by.model('amount')).clear(); + element(by.model('amount')).sendKeys('-1234'); + expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)'); + expect(element(by.id('currency-custom')).getText()).toBe('(USD$1,234.00)'); + expect(element(by.id('currency-no-fractions')).getText()).toBe('(USD$1,234)'); + }); + +
    + */ +currencyFilter.$inject = ['$locale']; +function currencyFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(amount, currencySymbol, fractionSize) { + if (isUndefined(currencySymbol)) { + currencySymbol = formats.CURRENCY_SYM; + } + + if (isUndefined(fractionSize)) { + fractionSize = formats.PATTERNS[1].maxFrac; + } + + // if null or undefined pass it through + return (amount == null) + ? amount + : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize). + replace(/\u00A4/g, currencySymbol); + }; +} + +/** + * @ngdoc filter + * @name number + * @kind function + * + * @description + * Formats a number as text. + * + * If the input is null or undefined, it will just be returned. + * If the input is infinite (Infinity/-Infinity) the Infinity symbol '∞' is returned. + * If the input is not a number an empty string is returned. + * + * + * @param {number|string} number Number to format. + * @param {(number|string)=} fractionSize Number of decimal places to round the number to. + * If this is not provided then the fraction size is computed from the current locale's number + * formatting pattern. In the case of the default locale, it will be 3. + * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit. + * + * @example + + + +
    +
    + Default formatting: {{val | number}}
    + No fractions: {{val | number:0}}
    + Negative number: {{-val | number:4}} +
    +
    + + it('should format numbers', function() { + expect(element(by.id('number-default')).getText()).toBe('1,234.568'); + expect(element(by.binding('val | number:0')).getText()).toBe('1,235'); + expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679'); + }); + + it('should update', function() { + element(by.model('val')).clear(); + element(by.model('val')).sendKeys('3374.333'); + expect(element(by.id('number-default')).getText()).toBe('3,374.333'); + expect(element(by.binding('val | number:0')).getText()).toBe('3,374'); + expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330'); + }); + +
    + */ + + +numberFilter.$inject = ['$locale']; +function numberFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(number, fractionSize) { + + // if null or undefined pass it through + return (number == null) + ? number + : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, + fractionSize); + }; +} + +var DECIMAL_SEP = '.'; +function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { + if (isObject(number)) return ''; + + var isNegative = number < 0; + number = Math.abs(number); + + var isInfinity = number === Infinity; + if (!isInfinity && !isFinite(number)) return ''; + + var numStr = number + '', + formatedText = '', + hasExponent = false, + parts = []; + + if (isInfinity) formatedText = '\u221e'; + + if (!isInfinity && numStr.indexOf('e') !== -1) { + var match = numStr.match(/([\d\.]+)e(-?)(\d+)/); + if (match && match[2] == '-' && match[3] > fractionSize + 1) { + number = 0; + } else { + formatedText = numStr; + hasExponent = true; + } + } + + if (!isInfinity && !hasExponent) { + var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length; + + // determine fractionSize if it is not specified + if (isUndefined(fractionSize)) { + fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); + } + + // safely round numbers in JS without hitting imprecisions of floating-point arithmetics + // inspired by: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round + number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize); + + var fraction = ('' + number).split(DECIMAL_SEP); + var whole = fraction[0]; + fraction = fraction[1] || ''; + + var i, pos = 0, + lgroup = pattern.lgSize, + group = pattern.gSize; + + if (whole.length >= (lgroup + group)) { + pos = whole.length - lgroup; + for (i = 0; i < pos; i++) { + if ((pos - i) % group === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + } + + for (i = pos; i < whole.length; i++) { + if ((whole.length - i) % lgroup === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + + // format fraction part. + while (fraction.length < fractionSize) { + fraction += '0'; + } + + if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize); + } else { + if (fractionSize > 0 && number < 1) { + formatedText = number.toFixed(fractionSize); + number = parseFloat(formatedText); + } + } + + if (number === 0) { + isNegative = false; + } + + parts.push(isNegative ? pattern.negPre : pattern.posPre, + formatedText, + isNegative ? pattern.negSuf : pattern.posSuf); + return parts.join(''); +} + +function padNumber(num, digits, trim) { + var neg = ''; + if (num < 0) { + neg = '-'; + num = -num; + } + num = '' + num; + while (num.length < digits) num = '0' + num; + if (trim) { + num = num.substr(num.length - digits); + } + return neg + num; +} + + +function dateGetter(name, size, offset, trim) { + offset = offset || 0; + return function(date) { + var value = date['get' + name](); + if (offset > 0 || value > -offset) { + value += offset; + } + if (value === 0 && offset == -12) value = 12; + return padNumber(value, size, trim); + }; +} + +function dateStrGetter(name, shortForm) { + return function(date, formats) { + var value = date['get' + name](); + var get = uppercase(shortForm ? ('SHORT' + name) : name); + + return formats[get][value]; + }; +} + +function timeZoneGetter(date, formats, offset) { + var zone = -1 * offset; + var paddedZone = (zone >= 0) ? "+" : ""; + + paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + + padNumber(Math.abs(zone % 60), 2); + + return paddedZone; +} + +function getFirstThursdayOfYear(year) { + // 0 = index of January + var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay(); + // 4 = index of Thursday (+1 to account for 1st = 5) + // 11 = index of *next* Thursday (+1 account for 1st = 12) + return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst); +} + +function getThursdayThisWeek(datetime) { + return new Date(datetime.getFullYear(), datetime.getMonth(), + // 4 = index of Thursday + datetime.getDate() + (4 - datetime.getDay())); +} + +function weekGetter(size) { + return function(date) { + var firstThurs = getFirstThursdayOfYear(date.getFullYear()), + thisThurs = getThursdayThisWeek(date); + + var diff = +thisThurs - +firstThurs, + result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week + + return padNumber(result, size); + }; +} + +function ampmGetter(date, formats) { + return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; +} + +function eraGetter(date, formats) { + return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1]; +} + +function longEraGetter(date, formats) { + return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1]; +} + +var DATE_FORMATS = { + yyyy: dateGetter('FullYear', 4), + yy: dateGetter('FullYear', 2, 0, true), + y: dateGetter('FullYear', 1), + MMMM: dateStrGetter('Month'), + MMM: dateStrGetter('Month', true), + MM: dateGetter('Month', 2, 1), + M: dateGetter('Month', 1, 1), + dd: dateGetter('Date', 2), + d: dateGetter('Date', 1), + HH: dateGetter('Hours', 2), + H: dateGetter('Hours', 1), + hh: dateGetter('Hours', 2, -12), + h: dateGetter('Hours', 1, -12), + mm: dateGetter('Minutes', 2), + m: dateGetter('Minutes', 1), + ss: dateGetter('Seconds', 2), + s: dateGetter('Seconds', 1), + // while ISO 8601 requires fractions to be prefixed with `.` or `,` + // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions + sss: dateGetter('Milliseconds', 3), + EEEE: dateStrGetter('Day'), + EEE: dateStrGetter('Day', true), + a: ampmGetter, + Z: timeZoneGetter, + ww: weekGetter(2), + w: weekGetter(1), + G: eraGetter, + GG: eraGetter, + GGG: eraGetter, + GGGG: longEraGetter +}; + +var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/, + NUMBER_STRING = /^\-?\d+$/; + +/** + * @ngdoc filter + * @name date + * @kind function + * + * @description + * Formats `date` to a string based on the requested `format`. + * + * `format` string can be composed of the following elements: + * + * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) + * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) + * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) + * * `'MMMM'`: Month in year (January-December) + * * `'MMM'`: Month in year (Jan-Dec) + * * `'MM'`: Month in year, padded (01-12) + * * `'M'`: Month in year (1-12) + * * `'dd'`: Day in month, padded (01-31) + * * `'d'`: Day in month (1-31) + * * `'EEEE'`: Day in Week,(Sunday-Saturday) + * * `'EEE'`: Day in Week, (Sun-Sat) + * * `'HH'`: Hour in day, padded (00-23) + * * `'H'`: Hour in day (0-23) + * * `'hh'`: Hour in AM/PM, padded (01-12) + * * `'h'`: Hour in AM/PM, (1-12) + * * `'mm'`: Minute in hour, padded (00-59) + * * `'m'`: Minute in hour (0-59) + * * `'ss'`: Second in minute, padded (00-59) + * * `'s'`: Second in minute (0-59) + * * `'sss'`: Millisecond in second, padded (000-999) + * * `'a'`: AM/PM marker + * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) + * * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year + * * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year + * * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD') + * * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini') + * + * `format` string can also be one of the following predefined + * {@link guide/i18n localizable formats}: + * + * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale + * (e.g. Sep 3, 2010 12:05:08 PM) + * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 PM) + * * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US locale + * (e.g. Friday, September 3, 2010) + * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010) + * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) + * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) + * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM) + * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM) + * + * `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g. + * `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence + * (e.g. `"h 'o''clock'"`). + * + * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or + * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its + * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is + * specified in the string input, the time is considered to be in the local timezone. + * @param {string=} format Formatting rules (see Description). If not specified, + * `mediumDate` is used. + * @param {string=} timezone Timezone to be used for formatting. It understands UTC/GMT and the + * continental US time zone abbreviations, but for general use, use a time zone offset, for + * example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian) + * If not specified, the timezone of the browser will be used. + * @returns {string} Formatted string or the input if input is not recognized as date/millis. + * + * @example + + + {{1288323623006 | date:'medium'}}: + {{1288323623006 | date:'medium'}}
    + {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}: + {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
    + {{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}: + {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
    + {{1288323623006 | date:"MM/dd/yyyy 'at' h:mma"}}: + {{'1288323623006' | date:"MM/dd/yyyy 'at' h:mma"}}
    +
    + + it('should format date', function() { + expect(element(by.binding("1288323623006 | date:'medium'")).getText()). + toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); + expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()). + toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); + expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()). + toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); + expect(element(by.binding("'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"")).getText()). + toMatch(/10\/2\d\/2010 at \d{1,2}:\d{2}(AM|PM)/); + }); + +
    + */ +dateFilter.$inject = ['$locale']; +function dateFilter($locale) { + + + var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; + // 1 2 3 4 5 6 7 8 9 10 11 + function jsonStringToDate(string) { + var match; + if (match = string.match(R_ISO8601_STR)) { + var date = new Date(0), + tzHour = 0, + tzMin = 0, + dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, + timeSetter = match[8] ? date.setUTCHours : date.setHours; + + if (match[9]) { + tzHour = toInt(match[9] + match[10]); + tzMin = toInt(match[9] + match[11]); + } + dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3])); + var h = toInt(match[4] || 0) - tzHour; + var m = toInt(match[5] || 0) - tzMin; + var s = toInt(match[6] || 0); + var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000); + timeSetter.call(date, h, m, s, ms); + return date; + } + return string; + } + + + return function(date, format, timezone) { + var text = '', + parts = [], + fn, match; + + format = format || 'mediumDate'; + format = $locale.DATETIME_FORMATS[format] || format; + if (isString(date)) { + date = NUMBER_STRING.test(date) ? toInt(date) : jsonStringToDate(date); + } + + if (isNumber(date)) { + date = new Date(date); + } + + if (!isDate(date) || !isFinite(date.getTime())) { + return date; + } + + while (format) { + match = DATE_FORMATS_SPLIT.exec(format); + if (match) { + parts = concat(parts, match, 1); + format = parts.pop(); + } else { + parts.push(format); + format = null; + } + } + + var dateTimezoneOffset = date.getTimezoneOffset(); + if (timezone) { + dateTimezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset()); + date = convertTimezoneToLocal(date, timezone, true); + } + forEach(parts, function(value) { + fn = DATE_FORMATS[value]; + text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset) + : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); + }); + + return text; + }; +} + + +/** + * @ngdoc filter + * @name json + * @kind function + * + * @description + * Allows you to convert a JavaScript object into JSON string. + * + * This filter is mostly useful for debugging. When using the double curly {{value}} notation + * the binding is automatically converted to JSON. + * + * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. + * @param {number=} spacing The number of spaces to use per indentation, defaults to 2. + * @returns {string} JSON string. + * + * + * @example + + +
    {{ {'name':'value'} | json }}
    +
    {{ {'name':'value'} | json:4 }}
    +
    + + it('should jsonify filtered objects', function() { + expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); + expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); + }); + +
    + * + */ +function jsonFilter() { + return function(object, spacing) { + if (isUndefined(spacing)) { + spacing = 2; + } + return toJson(object, spacing); + }; +} + + +/** + * @ngdoc filter + * @name lowercase + * @kind function + * @description + * Converts string to lowercase. + * @see angular.lowercase + */ +var lowercaseFilter = valueFn(lowercase); + + +/** + * @ngdoc filter + * @name uppercase + * @kind function + * @description + * Converts string to uppercase. + * @see angular.uppercase + */ +var uppercaseFilter = valueFn(uppercase); + +/** + * @ngdoc filter + * @name limitTo + * @kind function + * + * @description + * Creates a new array or string containing only a specified number of elements. The elements + * are taken from either the beginning or the end of the source array, string or number, as specified by + * the value and sign (positive or negative) of `limit`. If a number is used as input, it is + * converted to a string. + * + * @param {Array|string|number} input Source array, string or number to be limited. + * @param {string|number} limit The length of the returned array or string. If the `limit` number + * is positive, `limit` number of items from the beginning of the source array/string are copied. + * If the number is negative, `limit` number of items from the end of the source array/string + * are copied. The `limit` will be trimmed if it exceeds `array.length`. If `limit` is undefined, + * the input will be returned unchanged. + * @param {(string|number)=} begin Index at which to begin limitation. As a negative index, `begin` + * indicates an offset from the end of `input`. Defaults to `0`. + * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array + * had less than `limit` elements. + * + * @example + + + +
    + +

    Output numbers: {{ numbers | limitTo:numLimit }}

    + +

    Output letters: {{ letters | limitTo:letterLimit }}

    + +

    Output long number: {{ longNumber | limitTo:longNumberLimit }}

    +
    +
    + + var numLimitInput = element(by.model('numLimit')); + var letterLimitInput = element(by.model('letterLimit')); + var longNumberLimitInput = element(by.model('longNumberLimit')); + var limitedNumbers = element(by.binding('numbers | limitTo:numLimit')); + var limitedLetters = element(by.binding('letters | limitTo:letterLimit')); + var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit')); + + it('should limit the number array to first three items', function() { + expect(numLimitInput.getAttribute('value')).toBe('3'); + expect(letterLimitInput.getAttribute('value')).toBe('3'); + expect(longNumberLimitInput.getAttribute('value')).toBe('3'); + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]'); + expect(limitedLetters.getText()).toEqual('Output letters: abc'); + expect(limitedLongNumber.getText()).toEqual('Output long number: 234'); + }); + + // There is a bug in safari and protractor that doesn't like the minus key + // it('should update the output when -3 is entered', function() { + // numLimitInput.clear(); + // numLimitInput.sendKeys('-3'); + // letterLimitInput.clear(); + // letterLimitInput.sendKeys('-3'); + // longNumberLimitInput.clear(); + // longNumberLimitInput.sendKeys('-3'); + // expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]'); + // expect(limitedLetters.getText()).toEqual('Output letters: ghi'); + // expect(limitedLongNumber.getText()).toEqual('Output long number: 342'); + // }); + + it('should not exceed the maximum size of input array', function() { + numLimitInput.clear(); + numLimitInput.sendKeys('100'); + letterLimitInput.clear(); + letterLimitInput.sendKeys('100'); + longNumberLimitInput.clear(); + longNumberLimitInput.sendKeys('100'); + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]'); + expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi'); + expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342'); + }); + +
    +*/ +function limitToFilter() { + return function(input, limit, begin) { + if (Math.abs(Number(limit)) === Infinity) { + limit = Number(limit); + } else { + limit = toInt(limit); + } + if (isNaN(limit)) return input; + + if (isNumber(input)) input = input.toString(); + if (!isArray(input) && !isString(input)) return input; + + begin = (!begin || isNaN(begin)) ? 0 : toInt(begin); + begin = (begin < 0 && begin >= -input.length) ? input.length + begin : begin; + + if (limit >= 0) { + return input.slice(begin, begin + limit); + } else { + if (begin === 0) { + return input.slice(limit, input.length); + } else { + return input.slice(Math.max(0, begin + limit), begin); + } + } + }; +} + +/** + * @ngdoc filter + * @name orderBy + * @kind function + * + * @description + * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically + * for strings and numerically for numbers. Note: if you notice numbers are not being sorted + * as expected, make sure they are actually being saved as numbers and not strings. + * + * @param {Array} array The array to sort. + * @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be + * used by the comparator to determine the order of elements. + * + * Can be one of: + * + * - `function`: Getter function. The result of this function will be sorted using the + * `<`, `===`, `>` operator. + * - `string`: An Angular expression. The result of this expression is used to compare elements + * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by + * 3 first characters of a property called `name`). The result of a constant expression + * is interpreted as a property name to be used in comparisons (for example `"special name"` + * to sort object by the value of their `special name` property). An expression can be + * optionally prefixed with `+` or `-` to control ascending or descending sort order + * (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array + * element itself is used to compare where sorting. + * - `Array`: An array of function or string predicates. The first predicate in the array + * is used for sorting, but when two items are equivalent, the next predicate is used. + * + * If the predicate is missing or empty then it defaults to `'+'`. + * + * @param {boolean=} reverse Reverse the order of the array. + * @returns {Array} Sorted copy of the source array. + * + * + * @example + * The example below demonstrates a simple ngRepeat, where the data is sorted + * by age in descending order (predicate is set to `'-age'`). + * `reverse` is not set, which means it defaults to `false`. + + + +
    + + + + + + + + + + + +
    NamePhone NumberAge
    {{friend.name}}{{friend.phone}}{{friend.age}}
    +
    +
    +
    + * + * The predicate and reverse parameters can be controlled dynamically through scope properties, + * as shown in the next example. + * @example + + + + +
    +
    Sorting predicate = {{predicate}}; reverse = {{reverse}}
    +
    + [ unsorted ] + + + + + + + + + + + +
    + Name + + + Phone Number + + + Age + +
    {{friend.name}}{{friend.phone}}{{friend.age}}
    +
    +
    +
    + * + * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the + * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the + * desired parameters. + * + * Example: + * + * @example + + +
    + + + + + + + + + + + +
    Name + (^)Phone NumberAge
    {{friend.name}}{{friend.phone}}{{friend.age}}
    +
    +
    + + + angular.module('orderByExample', []) + .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) { + var orderBy = $filter('orderBy'); + $scope.friends = [ + { name: 'John', phone: '555-1212', age: 10 }, + { name: 'Mary', phone: '555-9876', age: 19 }, + { name: 'Mike', phone: '555-4321', age: 21 }, + { name: 'Adam', phone: '555-5678', age: 35 }, + { name: 'Julie', phone: '555-8765', age: 29 } + ]; + $scope.order = function(predicate, reverse) { + $scope.friends = orderBy($scope.friends, predicate, reverse); + }; + $scope.order('-age',false); + }]); + +
    + */ +orderByFilter.$inject = ['$parse']; +function orderByFilter($parse) { + return function(array, sortPredicate, reverseOrder) { + + if (!(isArrayLike(array))) return array; + + if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; } + if (sortPredicate.length === 0) { sortPredicate = ['+']; } + + var predicates = processPredicates(sortPredicate, reverseOrder); + + // The next three lines are a version of a Swartzian Transform idiom from Perl + // (sometimes called the Decorate-Sort-Undecorate idiom) + // See https://en.wikipedia.org/wiki/Schwartzian_transform + var compareValues = Array.prototype.map.call(array, getComparisonObject); + compareValues.sort(doComparison); + array = compareValues.map(function(item) { return item.value; }); + + return array; + + function getComparisonObject(value, index) { + return { + value: value, + predicateValues: predicates.map(function(predicate) { + return getPredicateValue(predicate.get(value), index); + }) + }; + } + + function doComparison(v1, v2) { + var result = 0; + for (var index=0, length = predicates.length; index < length; ++index) { + result = compare(v1.predicateValues[index], v2.predicateValues[index]) * predicates[index].descending; + if (result) break; + } + return result; + } + }; + + function processPredicates(sortPredicate, reverseOrder) { + reverseOrder = reverseOrder ? -1 : 1; + return sortPredicate.map(function(predicate) { + var descending = 1, get = identity; + + if (isFunction(predicate)) { + get = predicate; + } else if (isString(predicate)) { + if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { + descending = predicate.charAt(0) == '-' ? -1 : 1; + predicate = predicate.substring(1); + } + if (predicate !== '') { + get = $parse(predicate); + if (get.constant) { + var key = get(); + get = function(value) { return value[key]; }; + } + } + } + return { get: get, descending: descending * reverseOrder }; + }); + } + + function isPrimitive(value) { + switch (typeof value) { + case 'number': /* falls through */ + case 'boolean': /* falls through */ + case 'string': + return true; + default: + return false; + } + } + + function objectValue(value, index) { + // If `valueOf` is a valid function use that + if (typeof value.valueOf === 'function') { + value = value.valueOf(); + if (isPrimitive(value)) return value; + } + // If `toString` is a valid function and not the one from `Object.prototype` use that + if (hasCustomToString(value)) { + value = value.toString(); + if (isPrimitive(value)) return value; + } + // We have a basic object so we use the position of the object in the collection + return index; + } + + function getPredicateValue(value, index) { + var type = typeof value; + if (value === null) { + type = 'string'; + value = 'null'; + } else if (type === 'string') { + value = value.toLowerCase(); + } else if (type === 'object') { + value = objectValue(value, index); + } + return { value: value, type: type }; + } + + function compare(v1, v2) { + var result = 0; + if (v1.type === v2.type) { + if (v1.value !== v2.value) { + result = v1.value < v2.value ? -1 : 1; + } + } else { + result = v1.type < v2.type ? -1 : 1; + } + return result; + } +} + +function ngDirective(directive) { + if (isFunction(directive)) { + directive = { + link: directive + }; + } + directive.restrict = directive.restrict || 'AC'; + return valueFn(directive); +} + +/** + * @ngdoc directive + * @name a + * @restrict E + * + * @description + * Modifies the default behavior of the html A tag so that the default action is prevented when + * the href attribute is empty. + * + * This change permits the easy creation of action links with the `ngClick` directive + * without changing the location or causing page reloads, e.g.: + * `Add Item` + */ +var htmlAnchorDirective = valueFn({ + restrict: 'E', + compile: function(element, attr) { + if (!attr.href && !attr.xlinkHref) { + return function(scope, element) { + // If the linked element is not an anchor tag anymore, do nothing + if (element[0].nodeName.toLowerCase() !== 'a') return; + + // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute. + var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ? + 'xlink:href' : 'href'; + element.on('click', function(event) { + // if we have no href url, then don't navigate anywhere. + if (!element.attr(href)) { + event.preventDefault(); + } + }); + }; + } + } +}); + +/** + * @ngdoc directive + * @name ngHref + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in an href attribute will + * make the link go to the wrong URL if the user clicks it before + * Angular has a chance to replace the `{{hash}}` markup with its + * value. Until Angular replaces the markup the link will be broken + * and will most likely return a 404 error. The `ngHref` directive + * solves this problem. + * + * The wrong way to write it: + * ```html + * link1 + * ``` + * + * The correct way to write it: + * ```html + * link1 + * ``` + * + * @element A + * @param {template} ngHref any string which can contain `{{}}` markup. + * + * @example + * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes + * in links and their different behaviors: + + +
    + link 1 (link, don't reload)
    + link 2 (link, don't reload)
    + link 3 (link, reload!)
    + anchor (link, don't reload)
    + anchor (no link)
    + link (link, change location) +
    + + it('should execute ng-click but not reload when href without value', function() { + element(by.id('link-1')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('1'); + expect(element(by.id('link-1')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click but not reload when href empty string', function() { + element(by.id('link-2')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('2'); + expect(element(by.id('link-2')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click and change url when ng-href specified', function() { + expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/); + + element(by.id('link-3')).click(); + + // At this point, we navigate away from an Angular page, so we need + // to use browser.driver to get the base webdriver. + + browser.wait(function() { + return browser.driver.getCurrentUrl().then(function(url) { + return url.match(/\/123$/); + }); + }, 5000, 'page should navigate to /123'); + }); + + it('should execute ng-click but not reload when href empty string and name specified', function() { + element(by.id('link-4')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('4'); + expect(element(by.id('link-4')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click but not reload when no href but name specified', function() { + element(by.id('link-5')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('5'); + expect(element(by.id('link-5')).getAttribute('href')).toBe(null); + }); + + it('should only change url when only ng-href', function() { + element(by.model('value')).clear(); + element(by.model('value')).sendKeys('6'); + expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/); + + element(by.id('link-6')).click(); + + // At this point, we navigate away from an Angular page, so we need + // to use browser.driver to get the base webdriver. + browser.wait(function() { + return browser.driver.getCurrentUrl().then(function(url) { + return url.match(/\/6$/); + }); + }, 5000, 'page should navigate to /6'); + }); + +
    + */ + +/** + * @ngdoc directive + * @name ngSrc + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `src` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrc` directive solves this problem. + * + * The buggy way to write it: + * ```html + * Description + * ``` + * + * The correct way to write it: + * ```html + * Description + * ``` + * + * @element IMG + * @param {template} ngSrc any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ngSrcset + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrcset` directive solves this problem. + * + * The buggy way to write it: + * ```html + * Description + * ``` + * + * The correct way to write it: + * ```html + * Description + * ``` + * + * @element IMG + * @param {template} ngSrcset any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ngDisabled + * @restrict A + * @priority 100 + * + * @description + * + * This directive sets the `disabled` attribute on the element if the + * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy. + * + * A special directive is necessary because we cannot use interpolation inside the `disabled` + * attribute. The following example would make the button enabled on Chrome/Firefox + * but not on older IEs: + * + * ```html + * + *
    + * + *
    + * ``` + * + * This is because the HTML specification does not require browsers to preserve the values of + * boolean attributes such as `disabled` (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * + * @example + + +
    + +
    + + it('should toggle button', function() { + expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy(); + element(by.model('checked')).click(); + expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy(); + }); + +
    + * + * @element INPUT + * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, + * then the `disabled` attribute will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngChecked + * @restrict A + * @priority 100 + * + * @description + * Sets the `checked` attribute on the element, if the expression inside `ngChecked` is truthy. + * + * Note that this directive should not be used together with {@link ngModel `ngModel`}, + * as this can lead to unexpected behavior. + * + * ### Why do we need `ngChecked`? + * + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as checked. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngChecked` directive solves this problem for the `checked` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @example + + +
    + +
    + + it('should check both checkBoxes', function() { + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy(); + element(by.model('master')).click(); + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy(); + }); + +
    + * + * @element INPUT + * @param {expression} ngChecked If the {@link guide/expression expression} is truthy, + * then the `checked` attribute will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngReadonly + * @restrict A + * @priority 100 + * + * @description + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as readonly. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngReadonly` directive solves this problem for the `readonly` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @example + + +
    + +
    + + it('should toggle readonly attr', function() { + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeFalsy(); + element(by.model('checked')).click(); + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeTruthy(); + }); + +
    + * + * @element INPUT + * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, + * then special attribute "readonly" will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngSelected + * @restrict A + * @priority 100 + * + * @description + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as selected. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngSelected` directive solves this problem for the `selected` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * + * @example + + +
    + +
    + + it('should select Greetings!', function() { + expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy(); + element(by.model('selected')).click(); + expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy(); + }); + +
    + * + * @element OPTION + * @param {expression} ngSelected If the {@link guide/expression expression} is truthy, + * then special attribute "selected" will be set on the element + */ + +/** + * @ngdoc directive + * @name ngOpen + * @restrict A + * @priority 100 + * + * @description + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as open. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngOpen` directive solves this problem for the `open` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @example + + +
    +
    + Show/Hide me +
    +
    + + it('should toggle open', function() { + expect(element(by.id('details')).getAttribute('open')).toBeFalsy(); + element(by.model('open')).click(); + expect(element(by.id('details')).getAttribute('open')).toBeTruthy(); + }); + +
    + * + * @element DETAILS + * @param {expression} ngOpen If the {@link guide/expression expression} is truthy, + * then special attribute "open" will be set on the element + */ + +var ngAttributeAliasDirectives = {}; + +// boolean attrs are evaluated +forEach(BOOLEAN_ATTR, function(propName, attrName) { + // binding to multiple is not supported + if (propName == "multiple") return; + + function defaultLinkFn(scope, element, attr) { + scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { + attr.$set(attrName, !!value); + }); + } + + var normalized = directiveNormalize('ng-' + attrName); + var linkFn = defaultLinkFn; + + if (propName === 'checked') { + linkFn = function(scope, element, attr) { + // ensuring ngChecked doesn't interfere with ngModel when both are set on the same input + if (attr.ngModel !== attr[normalized]) { + defaultLinkFn(scope, element, attr); + } + }; + } + + ngAttributeAliasDirectives[normalized] = function() { + return { + restrict: 'A', + priority: 100, + link: linkFn + }; + }; +}); + +// aliased input attrs are evaluated +forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { + ngAttributeAliasDirectives[ngAttr] = function() { + return { + priority: 100, + link: function(scope, element, attr) { + //special case ngPattern when a literal regular expression value + //is used as the expression (this way we don't have to watch anything). + if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) == "/") { + var match = attr.ngPattern.match(REGEX_STRING_REGEXP); + if (match) { + attr.$set("ngPattern", new RegExp(match[1], match[2])); + return; + } + } + + scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) { + attr.$set(ngAttr, value); + }); + } + }; + }; +}); + +// ng-src, ng-srcset, ng-href are interpolated +forEach(['src', 'srcset', 'href'], function(attrName) { + var normalized = directiveNormalize('ng-' + attrName); + ngAttributeAliasDirectives[normalized] = function() { + return { + priority: 99, // it needs to run after the attributes are interpolated + link: function(scope, element, attr) { + var propName = attrName, + name = attrName; + + if (attrName === 'href' && + toString.call(element.prop('href')) === '[object SVGAnimatedString]') { + name = 'xlinkHref'; + attr.$attr[name] = 'xlink:href'; + propName = null; + } + + attr.$observe(normalized, function(value) { + if (!value) { + if (attrName === 'href') { + attr.$set(name, null); + } + return; + } + + attr.$set(name, value); + + // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist + // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need + // to set the property as well to achieve the desired effect. + // we use attr[attrName] value since $set can sanitize the url. + if (msie && propName) element.prop(propName, attr[name]); + }); + } + }; + }; +}); + +/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true + */ +var nullFormCtrl = { + $addControl: noop, + $$renameControl: nullFormRenameControl, + $removeControl: noop, + $setValidity: noop, + $setDirty: noop, + $setPristine: noop, + $setSubmitted: noop +}, +SUBMITTED_CLASS = 'ng-submitted'; + +function nullFormRenameControl(control, name) { + control.$name = name; +} + +/** + * @ngdoc type + * @name form.FormController + * + * @property {boolean} $pristine True if user has not interacted with the form yet. + * @property {boolean} $dirty True if user has already interacted with the form. + * @property {boolean} $valid True if all of the containing forms and controls are valid. + * @property {boolean} $invalid True if at least one containing control or form is invalid. + * @property {boolean} $submitted True if user has submitted the form even if its invalid. + * + * @property {Object} $error Is an object hash, containing references to controls or + * forms with failing validators, where: + * + * - keys are validation tokens (error names), + * - values are arrays of controls or forms that have a failing validator for given error name. + * + * Built-in validation tokens: + * + * - `email` + * - `max` + * - `maxlength` + * - `min` + * - `minlength` + * - `number` + * - `pattern` + * - `required` + * - `url` + * - `date` + * - `datetimelocal` + * - `time` + * - `week` + * - `month` + * + * @description + * `FormController` keeps track of all its controls and nested forms as well as the state of them, + * such as being valid/invalid or dirty/pristine. + * + * Each {@link ng.directive:form form} directive creates an instance + * of `FormController`. + * + */ +//asks for $scope to fool the BC controller module +FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate']; +function FormController(element, attrs, $scope, $animate, $interpolate) { + var form = this, + controls = []; + + var parentForm = form.$$parentForm = element.parent().controller('form') || nullFormCtrl; + + // init state + form.$error = {}; + form.$$success = {}; + form.$pending = undefined; + form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope); + form.$dirty = false; + form.$pristine = true; + form.$valid = true; + form.$invalid = false; + form.$submitted = false; + + parentForm.$addControl(form); + + /** + * @ngdoc method + * @name form.FormController#$rollbackViewValue + * + * @description + * Rollback all form controls pending updates to the `$modelValue`. + * + * Updates may be pending by a debounced event or because the input is waiting for a some future + * event defined in `ng-model-options`. This method is typically needed by the reset button of + * a form that uses `ng-model-options` to pend updates. + */ + form.$rollbackViewValue = function() { + forEach(controls, function(control) { + control.$rollbackViewValue(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$commitViewValue + * + * @description + * Commit all form controls pending updates to the `$modelValue`. + * + * Updates may be pending by a debounced event or because the input is waiting for a some future + * event defined in `ng-model-options`. This method is rarely needed as `NgModelController` + * usually handles calling this in response to input events. + */ + form.$commitViewValue = function() { + forEach(controls, function(control) { + control.$commitViewValue(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$addControl + * + * @description + * Register a control with the form. + * + * Input elements using ngModelController do this automatically when they are linked. + */ + form.$addControl = function(control) { + // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored + // and not added to the scope. Now we throw an error. + assertNotHasOwnProperty(control.$name, 'input'); + controls.push(control); + + if (control.$name) { + form[control.$name] = control; + } + }; + + // Private API: rename a form control + form.$$renameControl = function(control, newName) { + var oldName = control.$name; + + if (form[oldName] === control) { + delete form[oldName]; + } + form[newName] = control; + control.$name = newName; + }; + + /** + * @ngdoc method + * @name form.FormController#$removeControl + * + * @description + * Deregister a control from the form. + * + * Input elements using ngModelController do this automatically when they are destroyed. + */ + form.$removeControl = function(control) { + if (control.$name && form[control.$name] === control) { + delete form[control.$name]; + } + forEach(form.$pending, function(value, name) { + form.$setValidity(name, null, control); + }); + forEach(form.$error, function(value, name) { + form.$setValidity(name, null, control); + }); + forEach(form.$$success, function(value, name) { + form.$setValidity(name, null, control); + }); + + arrayRemove(controls, control); + }; + + + /** + * @ngdoc method + * @name form.FormController#$setValidity + * + * @description + * Sets the validity of a form control. + * + * This method will also propagate to parent forms. + */ + addSetValidityMethod({ + ctrl: this, + $element: element, + set: function(object, property, controller) { + var list = object[property]; + if (!list) { + object[property] = [controller]; + } else { + var index = list.indexOf(controller); + if (index === -1) { + list.push(controller); + } + } + }, + unset: function(object, property, controller) { + var list = object[property]; + if (!list) { + return; + } + arrayRemove(list, controller); + if (list.length === 0) { + delete object[property]; + } + }, + parentForm: parentForm, + $animate: $animate + }); + + /** + * @ngdoc method + * @name form.FormController#$setDirty + * + * @description + * Sets the form to a dirty state. + * + * This method can be called to add the 'ng-dirty' class and set the form to a dirty + * state (ng-dirty class). This method will also propagate to parent forms. + */ + form.$setDirty = function() { + $animate.removeClass(element, PRISTINE_CLASS); + $animate.addClass(element, DIRTY_CLASS); + form.$dirty = true; + form.$pristine = false; + parentForm.$setDirty(); + }; + + /** + * @ngdoc method + * @name form.FormController#$setPristine + * + * @description + * Sets the form to its pristine state. + * + * This method can be called to remove the 'ng-dirty' class and set the form to its pristine + * state (ng-pristine class). This method will also propagate to all the controls contained + * in this form. + * + * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after + * saving or resetting it. + */ + form.$setPristine = function() { + $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS); + form.$dirty = false; + form.$pristine = true; + form.$submitted = false; + forEach(controls, function(control) { + control.$setPristine(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$setUntouched + * + * @description + * Sets the form to its untouched state. + * + * This method can be called to remove the 'ng-touched' class and set the form controls to their + * untouched state (ng-untouched class). + * + * Setting a form controls back to their untouched state is often useful when setting the form + * back to its pristine state. + */ + form.$setUntouched = function() { + forEach(controls, function(control) { + control.$setUntouched(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$setSubmitted + * + * @description + * Sets the form to its submitted state. + */ + form.$setSubmitted = function() { + $animate.addClass(element, SUBMITTED_CLASS); + form.$submitted = true; + parentForm.$setSubmitted(); + }; +} + +/** + * @ngdoc directive + * @name ngForm + * @restrict EAC + * + * @description + * Nestable alias of {@link ng.directive:form `form`} directive. HTML + * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a + * sub-group of controls needs to be determined. + * + * Note: the purpose of `ngForm` is to group controls, + * but not to be a replacement for the `
    ` tag with all of its capabilities + * (e.g. posting to the server, ...). + * + * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + * + */ + + /** + * @ngdoc directive + * @name form + * @restrict E + * + * @description + * Directive that instantiates + * {@link form.FormController FormController}. + * + * If the `name` attribute is specified, the form controller is published onto the current scope under + * this name. + * + * # Alias: {@link ng.directive:ngForm `ngForm`} + * + * In Angular, forms can be nested. This means that the outer form is valid when all of the child + * forms are valid as well. However, browsers do not allow nesting of `` elements, so + * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to + * `` but can be nested. This allows you to have nested forms, which is very useful when + * using Angular validation directives in forms that are dynamically generated using the + * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name` + * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an + * `ngForm` directive and nest these in an outer `form` element. + * + * + * # CSS classes + * - `ng-valid` is set if the form is valid. + * - `ng-invalid` is set if the form is invalid. + * - `ng-pristine` is set if the form is pristine. + * - `ng-dirty` is set if the form is dirty. + * - `ng-submitted` is set if the form was submitted. + * + * Keep in mind that ngAnimate can detect each of these classes when added and removed. + * + * + * # Submitting a form and preventing the default action + * + * Since the role of forms in client-side Angular applications is different than in classical + * roundtrip apps, it is desirable for the browser not to translate the form submission into a full + * page reload that sends the data to the server. Instead some javascript logic should be triggered + * to handle the form submission in an application-specific way. + * + * For this reason, Angular prevents the default action (form submission to the server) unless the + * `` element has an `action` attribute specified. + * + * You can use one of the following two ways to specify what javascript method should be called when + * a form is submitted: + * + * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element + * - {@link ng.directive:ngClick ngClick} directive on the first + * button or input field of type submit (input[type=submit]) + * + * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit} + * or {@link ng.directive:ngClick ngClick} directives. + * This is because of the following form submission rules in the HTML specification: + * + * - If a form has only one input field then hitting enter in this field triggers form submit + * (`ngSubmit`) + * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter + * doesn't trigger submit + * - if a form has one or more input fields and one or more buttons or input[type=submit] then + * hitting enter in any of the input fields will trigger the click handler on the *first* button or + * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) + * + * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is + * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` + * to have access to the updated model. + * + * ## Animation Hooks + * + * Animations in ngForm are triggered when any of the associated CSS classes are added and removed. + * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any + * other validations that are performed within the form. Animations in ngForm are similar to how + * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well + * as JS animations. + * + * The following example shows a simple way to utilize CSS transitions to style a form element + * that has been rendered as invalid after it has been validated: + * + *
    + * //be sure to include ngAnimate as a module to hook into more
    + * //advanced animations
    + * .my-form {
    + *   transition:0.5s linear all;
    + *   background: white;
    + * }
    + * .my-form.ng-invalid {
    + *   background: red;
    + *   color:white;
    + * }
    + * 
    + * + * @example + + + + + + userType: + Required!
    + userType = {{userType}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    + +
    + + it('should initialize to model', function() { + var userType = element(by.binding('userType')); + var valid = element(by.binding('myForm.input.$valid')); + + expect(userType.getText()).toContain('guest'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + var userType = element(by.binding('userType')); + var valid = element(by.binding('myForm.input.$valid')); + var userInput = element(by.model('userType')); + + userInput.clear(); + userInput.sendKeys(''); + + expect(userType.getText()).toEqual('userType ='); + expect(valid.getText()).toContain('false'); + }); + +
    + * + * @param {string=} name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + */ +var formDirectiveFactory = function(isNgForm) { + return ['$timeout', function($timeout) { + var formDirective = { + name: 'form', + restrict: isNgForm ? 'EAC' : 'E', + controller: FormController, + compile: function ngFormCompile(formElement, attr) { + // Setup initial state of the control + formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS); + + var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false); + + return { + pre: function ngFormPreLink(scope, formElement, attr, controller) { + // if `action` attr is not present on the form, prevent the default action (submission) + if (!('action' in attr)) { + // we can't use jq events because if a form is destroyed during submission the default + // action is not prevented. see #1238 + // + // IE 9 is not affected because it doesn't fire a submit event and try to do a full + // page reload if the form was destroyed by submission of the form via a click handler + // on a button in the form. Looks like an IE9 specific bug. + var handleFormSubmission = function(event) { + scope.$apply(function() { + controller.$commitViewValue(); + controller.$setSubmitted(); + }); + + event.preventDefault(); + }; + + addEventListenerFn(formElement[0], 'submit', handleFormSubmission); + + // unregister the preventDefault listener so that we don't not leak memory but in a + // way that will achieve the prevention of the default action. + formElement.on('$destroy', function() { + $timeout(function() { + removeEventListenerFn(formElement[0], 'submit', handleFormSubmission); + }, 0, false); + }); + } + + var parentFormCtrl = controller.$$parentForm; + + if (nameAttr) { + setter(scope, controller.$name, controller, controller.$name); + attr.$observe(nameAttr, function(newValue) { + if (controller.$name === newValue) return; + setter(scope, controller.$name, undefined, controller.$name); + parentFormCtrl.$$renameControl(controller, newValue); + setter(scope, controller.$name, controller, controller.$name); + }); + } + formElement.on('$destroy', function() { + parentFormCtrl.$removeControl(controller); + if (nameAttr) { + setter(scope, attr[nameAttr], undefined, controller.$name); + } + extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards + }); + } + }; + } + }; + + return formDirective; + }]; +}; + +var formDirective = formDirectiveFactory(); +var ngFormDirective = formDirectiveFactory(true); + +/* global VALID_CLASS: false, + INVALID_CLASS: false, + PRISTINE_CLASS: false, + DIRTY_CLASS: false, + UNTOUCHED_CLASS: false, + TOUCHED_CLASS: false, + $ngModelMinErr: false, +*/ + +// Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 +var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/; +var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; +var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i; +var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/; +var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/; +var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; +var WEEK_REGEXP = /^(\d{4})-W(\d\d)$/; +var MONTH_REGEXP = /^(\d{4})-(\d\d)$/; +var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; + +var inputType = { + + /** + * @ngdoc input + * @name input[text] + * + * @description + * Standard HTML text input with angular data binding, inherited by most of the `input` elements. + * + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Adds `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
    + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + * This parameter is ignored for input[type=password] controls, which will never trim the + * input. + * + * @example + + + +
    + +
    + + Required! + + Single word only! +
    + text = {{example.text}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    +
    +
    + + var text = element(by.binding('example.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('guest'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if multi word', function() { + input.clear(); + input.sendKeys('hello world'); + + expect(valid.getText()).toContain('false'); + }); + +
    + */ + 'text': textInputType, + + /** + * @ngdoc input + * @name input[date] + * + * @description + * Input with date validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601 + * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many + * modern browsers do not yet support this input type, it is important to provide cues to users on the + * expected input format via a placeholder or label. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a + * valid ISO date string (yyyy-MM-dd). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be + * a valid ISO date string (yyyy-MM-dd). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    + + +
    + + Required! + + Not a valid date! +
    + value = {{example.value | date: "yyyy-MM-dd"}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    +
    +
    + + var value = element(by.binding('example.value | date: "yyyy-MM-dd"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (see https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-10-22'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01-01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
    + */ + 'date': createDateInputType('date', DATE_REGEXP, + createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']), + 'yyyy-MM-dd'), + + /** + * @ngdoc input + * @name input[datetime-local] + * + * @description + * Input with datetime validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a + * valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be + * a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    + + +
    + + Required! + + Not a valid date! +
    + value = {{example.value | date: "yyyy-MM-ddTHH:mm:ss"}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    +
    +
    + + var value = element(by.binding('example.value | date: "yyyy-MM-ddTHH:mm:ss"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2010-12-28T14:57:00'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01-01T23:59:00'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
    + */ + 'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP, + createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']), + 'yyyy-MM-ddTHH:mm:ss.sss'), + + /** + * @ngdoc input + * @name input[time] + * + * @description + * Input with time validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a + * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a + * valid ISO time format (HH:mm:ss). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be a + * valid ISO time format (HH:mm:ss). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    + + +
    + + Required! + + Not a valid date! +
    + value = {{example.value | date: "HH:mm:ss"}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    +
    +
    + + var value = element(by.binding('example.value | date: "HH:mm:ss"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('14:57:00'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('23:59:00'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
    + */ + 'time': createDateInputType('time', TIME_REGEXP, + createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']), + 'HH:mm:ss.sss'), + + /** + * @ngdoc input + * @name input[week] + * + * @description + * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support + * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * week format (yyyy-W##), for example: `2013-W02`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a + * valid ISO week format (yyyy-W##). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be + * a valid ISO week format (yyyy-W##). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    + +
    + + Required! + + Not a valid date! +
    + value = {{example.value | date: "yyyy-Www"}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    +
    +
    + + var value = element(by.binding('example.value | date: "yyyy-Www"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-W01'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-W01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
    + */ + 'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'), + + /** + * @ngdoc input + * @name input[month] + * + * @description + * Input with month validation and transformation. In browsers that do not yet support + * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * month format (yyyy-MM), for example: `2009-01`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * If the model is not set to the first of the month, the next view to model update will set it + * to the first of the month. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be + * a valid ISO month format (yyyy-MM). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must + * be a valid ISO month format (yyyy-MM). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    + + +
    + + Required! + + Not a valid month! +
    + value = {{example.value | date: "yyyy-MM"}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    +
    +
    + + var value = element(by.binding('example.value | date: "yyyy-MM"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-10'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
    + */ + 'month': createDateInputType('month', MONTH_REGEXP, + createDateParser(MONTH_REGEXP, ['yyyy', 'MM']), + 'yyyy-MM'), + + /** + * @ngdoc input + * @name input[number] + * + * @description + * Text input with number validation and transformation. Sets the `number` validation + * error if not a valid number. + * + *
    + * The model must always be of type `number` otherwise Angular will throw an error. + * Be aware that a string containing a number is not enough. See the {@link ngModel:numfmt} + * error docs for more information and an example of how to convert your model if necessary. + *
    + * + * ## Issues with HTML5 constraint validation + * + * In browsers that follow the + * [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29), + * `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}. + * If a non-number is entered in the input, the browser will report the value as an empty string, + * which means the view / model values in `ngModel` and subsequently the scope value + * will also be an empty string. + * + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
    + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    + +
    + + Required! + + Not valid number! +
    + value = {{example.value}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    +
    +
    + + var value = element(by.binding('example.value')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + it('should initialize to model', function() { + expect(value.getText()).toContain('12'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if over max', function() { + input.clear(); + input.sendKeys('123'); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('false'); + }); + +
    + */ + 'number': numberInputType, + + + /** + * @ngdoc input + * @name input[url] + * + * @description + * Text input with URL validation. Sets the `url` validation error key if the content is not a + * valid URL. + * + *
    + * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex + * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify + * the built-in validators (see the {@link guide/forms Forms guide}) + *
    + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
    + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    +
    + + var text = element(by.binding('url.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('url.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('http://google.com'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if not url', function() { + input.clear(); + input.sendKeys('box'); + + expect(valid.getText()).toContain('false'); + }); + +
    + */ + 'url': urlInputType, + + + /** + * @ngdoc input + * @name input[email] + * + * @description + * Text input with email validation. Sets the `email` validation error key if not a valid email + * address. + * + *
    + * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex + * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can + * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide}) + *
    + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
    + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    + +
    + + Required! + + Not valid email! +
    + text = {{email.text}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    + myForm.$error.email = {{!!myForm.$error.email}}
    +
    +
    + + var text = element(by.binding('email.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('email.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('me@example.com'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if not email', function() { + input.clear(); + input.sendKeys('xxx'); + + expect(valid.getText()).toContain('false'); + }); + +
    + */ + 'email': emailInputType, + + + /** + * @ngdoc input + * @name input[radio] + * + * @description + * HTML radio button. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string} value The value to which the `ngModel` expression should be set when selected. + * Note that `value` only supports `string` values, i.e. the scope model needs to be a string, + * too. Use `ngValue` if you need complex models (`number`, `object`, ...). + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {string} ngValue Angular expression to which `ngModel` will be be set when the radio + * is selected. Should be used instead of the `value` attribute if you need + * a non-string `ngModel` (`boolean`, `array`, ...). + * + * @example + + + +
    +
    +
    +
    + color = {{color.name | json}}
    +
    + Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`. +
    + + it('should change state', function() { + var color = element(by.binding('color.name')); + + expect(color.getText()).toContain('blue'); + + element.all(by.model('color.name')).get(0).click(); + + expect(color.getText()).toContain('red'); + }); + +
    + */ + 'radio': radioInputType, + + + /** + * @ngdoc input + * @name input[checkbox] + * + * @description + * HTML checkbox. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {expression=} ngTrueValue The value to which the expression should be set when selected. + * @param {expression=} ngFalseValue The value to which the expression should be set when not selected. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    +
    +
    + value1 = {{checkboxModel.value1}}
    + value2 = {{checkboxModel.value2}}
    +
    +
    + + it('should change state', function() { + var value1 = element(by.binding('checkboxModel.value1')); + var value2 = element(by.binding('checkboxModel.value2')); + + expect(value1.getText()).toContain('true'); + expect(value2.getText()).toContain('YES'); + + element(by.model('checkboxModel.value1')).click(); + element(by.model('checkboxModel.value2')).click(); + + expect(value1.getText()).toContain('false'); + expect(value2.getText()).toContain('NO'); + }); + +
    + */ + 'checkbox': checkboxInputType, + + 'hidden': noop, + 'button': noop, + 'submit': noop, + 'reset': noop, + 'file': noop +}; + +function stringBasedInputType(ctrl) { + ctrl.$formatters.push(function(value) { + return ctrl.$isEmpty(value) ? value : value.toString(); + }); +} + +function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); +} + +function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { + var type = lowercase(element[0].type); + + // In composition mode, users are still inputing intermediate text buffer, + // hold the listener until composition is done. + // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent + if (!$sniffer.android) { + var composing = false; + + element.on('compositionstart', function(data) { + composing = true; + }); + + element.on('compositionend', function() { + composing = false; + listener(); + }); + } + + var listener = function(ev) { + if (timeout) { + $browser.defer.cancel(timeout); + timeout = null; + } + if (composing) return; + var value = element.val(), + event = ev && ev.type; + + // By default we will trim the value + // If the attribute ng-trim exists we will avoid trimming + // If input type is 'password', the value is never trimmed + if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) { + value = trim(value); + } + + // If a control is suffering from bad input (due to native validators), browsers discard its + // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the + // control's value is the same empty value twice in a row. + if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) { + ctrl.$setViewValue(value, event); + } + }; + + // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the + // input event on backspace, delete or cut + if ($sniffer.hasEvent('input')) { + element.on('input', listener); + } else { + var timeout; + + var deferListener = function(ev, input, origValue) { + if (!timeout) { + timeout = $browser.defer(function() { + timeout = null; + if (!input || input.value !== origValue) { + listener(ev); + } + }); + } + }; + + element.on('keydown', function(event) { + var key = event.keyCode; + + // ignore + // command modifiers arrows + if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; + + deferListener(event, this, this.value); + }); + + // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it + if ($sniffer.hasEvent('paste')) { + element.on('paste cut', deferListener); + } + } + + // if user paste into input using mouse on older browser + // or form autocomplete on newer browser, we need "change" event to catch it + element.on('change', listener); + + ctrl.$render = function() { + element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue); + }; +} + +function weekParser(isoWeek, existingDate) { + if (isDate(isoWeek)) { + return isoWeek; + } + + if (isString(isoWeek)) { + WEEK_REGEXP.lastIndex = 0; + var parts = WEEK_REGEXP.exec(isoWeek); + if (parts) { + var year = +parts[1], + week = +parts[2], + hours = 0, + minutes = 0, + seconds = 0, + milliseconds = 0, + firstThurs = getFirstThursdayOfYear(year), + addDays = (week - 1) * 7; + + if (existingDate) { + hours = existingDate.getHours(); + minutes = existingDate.getMinutes(); + seconds = existingDate.getSeconds(); + milliseconds = existingDate.getMilliseconds(); + } + + return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds); + } + } + + return NaN; +} + +function createDateParser(regexp, mapping) { + return function(iso, date) { + var parts, map; + + if (isDate(iso)) { + return iso; + } + + if (isString(iso)) { + // When a date is JSON'ified to wraps itself inside of an extra + // set of double quotes. This makes the date parsing code unable + // to match the date string and parse it as a date. + if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') { + iso = iso.substring(1, iso.length - 1); + } + if (ISO_DATE_REGEXP.test(iso)) { + return new Date(iso); + } + regexp.lastIndex = 0; + parts = regexp.exec(iso); + + if (parts) { + parts.shift(); + if (date) { + map = { + yyyy: date.getFullYear(), + MM: date.getMonth() + 1, + dd: date.getDate(), + HH: date.getHours(), + mm: date.getMinutes(), + ss: date.getSeconds(), + sss: date.getMilliseconds() / 1000 + }; + } else { + map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 }; + } + + forEach(parts, function(part, index) { + if (index < mapping.length) { + map[mapping[index]] = +part; + } + }); + return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0); + } + } + + return NaN; + }; +} + +function createDateInputType(type, regexp, parseDate, format) { + return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) { + badInputChecker(scope, element, attr, ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + var timezone = ctrl && ctrl.$options && ctrl.$options.timezone; + var previousDate; + + ctrl.$$parserName = type; + ctrl.$parsers.push(function(value) { + if (ctrl.$isEmpty(value)) return null; + if (regexp.test(value)) { + // Note: We cannot read ctrl.$modelValue, as there might be a different + // parser/formatter in the processing chain so that the model + // contains some different data format! + var parsedDate = parseDate(value, previousDate); + if (timezone) { + parsedDate = convertTimezoneToLocal(parsedDate, timezone); + } + return parsedDate; + } + return undefined; + }); + + ctrl.$formatters.push(function(value) { + if (value && !isDate(value)) { + throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value); + } + if (isValidDate(value)) { + previousDate = value; + if (previousDate && timezone) { + previousDate = convertTimezoneToLocal(previousDate, timezone, true); + } + return $filter('date')(value, format, timezone); + } else { + previousDate = null; + return ''; + } + }); + + if (isDefined(attr.min) || attr.ngMin) { + var minVal; + ctrl.$validators.min = function(value) { + return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal; + }; + attr.$observe('min', function(val) { + minVal = parseObservedDateValue(val); + ctrl.$validate(); + }); + } + + if (isDefined(attr.max) || attr.ngMax) { + var maxVal; + ctrl.$validators.max = function(value) { + return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal; + }; + attr.$observe('max', function(val) { + maxVal = parseObservedDateValue(val); + ctrl.$validate(); + }); + } + + function isValidDate(value) { + // Invalid Date: getTime() returns NaN + return value && !(value.getTime && value.getTime() !== value.getTime()); + } + + function parseObservedDateValue(val) { + return isDefined(val) ? (isDate(val) ? val : parseDate(val)) : undefined; + } + }; +} + +function badInputChecker(scope, element, attr, ctrl) { + var node = element[0]; + var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity); + if (nativeValidation) { + ctrl.$parsers.push(function(value) { + var validity = element.prop(VALIDITY_STATE_PROPERTY) || {}; + // Detect bug in FF35 for input[email] (https://bugzilla.mozilla.org/show_bug.cgi?id=1064430): + // - also sets validity.badInput (should only be validity.typeMismatch). + // - see http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#e-mail-state-(type=email) + // - can ignore this case as we can still read out the erroneous email... + return validity.badInput && !validity.typeMismatch ? undefined : value; + }); + } +} + +function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { + badInputChecker(scope, element, attr, ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + + ctrl.$$parserName = 'number'; + ctrl.$parsers.push(function(value) { + if (ctrl.$isEmpty(value)) return null; + if (NUMBER_REGEXP.test(value)) return parseFloat(value); + return undefined; + }); + + ctrl.$formatters.push(function(value) { + if (!ctrl.$isEmpty(value)) { + if (!isNumber(value)) { + throw $ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value); + } + value = value.toString(); + } + return value; + }); + + if (isDefined(attr.min) || attr.ngMin) { + var minVal; + ctrl.$validators.min = function(value) { + return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal; + }; + + attr.$observe('min', function(val) { + if (isDefined(val) && !isNumber(val)) { + val = parseFloat(val, 10); + } + minVal = isNumber(val) && !isNaN(val) ? val : undefined; + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + }); + } + + if (isDefined(attr.max) || attr.ngMax) { + var maxVal; + ctrl.$validators.max = function(value) { + return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal; + }; + + attr.$observe('max', function(val) { + if (isDefined(val) && !isNumber(val)) { + val = parseFloat(val, 10); + } + maxVal = isNumber(val) && !isNaN(val) ? val : undefined; + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + }); + } +} + +function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { + // Note: no badInputChecker here by purpose as `url` is only a validation + // in browsers, i.e. we can always read out input.value even if it is not valid! + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); + + ctrl.$$parserName = 'url'; + ctrl.$validators.url = function(modelValue, viewValue) { + var value = modelValue || viewValue; + return ctrl.$isEmpty(value) || URL_REGEXP.test(value); + }; +} + +function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { + // Note: no badInputChecker here by purpose as `url` is only a validation + // in browsers, i.e. we can always read out input.value even if it is not valid! + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); + + ctrl.$$parserName = 'email'; + ctrl.$validators.email = function(modelValue, viewValue) { + var value = modelValue || viewValue; + return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value); + }; +} + +function radioInputType(scope, element, attr, ctrl) { + // make the name unique, if not defined + if (isUndefined(attr.name)) { + element.attr('name', nextUid()); + } + + var listener = function(ev) { + if (element[0].checked) { + ctrl.$setViewValue(attr.value, ev && ev.type); + } + }; + + element.on('click', listener); + + ctrl.$render = function() { + var value = attr.value; + element[0].checked = (value == ctrl.$viewValue); + }; + + attr.$observe('value', ctrl.$render); +} + +function parseConstantExpr($parse, context, name, expression, fallback) { + var parseFn; + if (isDefined(expression)) { + parseFn = $parse(expression); + if (!parseFn.constant) { + throw minErr('ngModel')('constexpr', 'Expected constant expression for `{0}`, but saw ' + + '`{1}`.', name, expression); + } + return parseFn(context); + } + return fallback; +} + +function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) { + var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true); + var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false); + + var listener = function(ev) { + ctrl.$setViewValue(element[0].checked, ev && ev.type); + }; + + element.on('click', listener); + + ctrl.$render = function() { + element[0].checked = ctrl.$viewValue; + }; + + // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false` + // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert + // it to a boolean. + ctrl.$isEmpty = function(value) { + return value === false; + }; + + ctrl.$formatters.push(function(value) { + return equals(value, trueValue); + }); + + ctrl.$parsers.push(function(value) { + return value ? trueValue : falseValue; + }); +} + + +/** + * @ngdoc directive + * @name textarea + * @restrict E + * + * @description + * HTML textarea element control with angular data-binding. The data-binding and validation + * properties of this element are exactly the same as those of the + * {@link ng.directive:input input element}. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any + * length. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
    + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + */ + + +/** + * @ngdoc directive + * @name input + * @restrict E + * + * @description + * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding, + * input state control, and validation. + * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers. + * + *
    + * **Note:** Not every feature offered is available for all input types. + * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`. + *
    + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {boolean=} ngRequired Sets `required` attribute if set to true + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any + * length. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
    + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + * This parameter is ignored for input[type=password] controls, which will never trim the + * input. + * + * @example + + + +
    +
    + +
    + + Required! +
    + +
    + + Too short! + + Too long! +
    +
    +
    + user = {{user}}
    + myForm.userName.$valid = {{myForm.userName.$valid}}
    + myForm.userName.$error = {{myForm.userName.$error}}
    + myForm.lastName.$valid = {{myForm.lastName.$valid}}
    + myForm.lastName.$error = {{myForm.lastName.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    + myForm.$error.minlength = {{!!myForm.$error.minlength}}
    + myForm.$error.maxlength = {{!!myForm.$error.maxlength}}
    +
    +
    + + var user = element(by.exactBinding('user')); + var userNameValid = element(by.binding('myForm.userName.$valid')); + var lastNameValid = element(by.binding('myForm.lastName.$valid')); + var lastNameError = element(by.binding('myForm.lastName.$error')); + var formValid = element(by.binding('myForm.$valid')); + var userNameInput = element(by.model('user.name')); + var userLastInput = element(by.model('user.last')); + + it('should initialize to model', function() { + expect(user.getText()).toContain('{"name":"guest","last":"visitor"}'); + expect(userNameValid.getText()).toContain('true'); + expect(formValid.getText()).toContain('true'); + }); + + it('should be invalid if empty when required', function() { + userNameInput.clear(); + userNameInput.sendKeys(''); + + expect(user.getText()).toContain('{"last":"visitor"}'); + expect(userNameValid.getText()).toContain('false'); + expect(formValid.getText()).toContain('false'); + }); + + it('should be valid if empty when min length is set', function() { + userLastInput.clear(); + userLastInput.sendKeys(''); + + expect(user.getText()).toContain('{"name":"guest","last":""}'); + expect(lastNameValid.getText()).toContain('true'); + expect(formValid.getText()).toContain('true'); + }); + + it('should be invalid if less than required min length', function() { + userLastInput.clear(); + userLastInput.sendKeys('xx'); + + expect(user.getText()).toContain('{"name":"guest"}'); + expect(lastNameValid.getText()).toContain('false'); + expect(lastNameError.getText()).toContain('minlength'); + expect(formValid.getText()).toContain('false'); + }); + + it('should be invalid if longer than max length', function() { + userLastInput.clear(); + userLastInput.sendKeys('some ridiculously long name'); + + expect(user.getText()).toContain('{"name":"guest"}'); + expect(lastNameValid.getText()).toContain('false'); + expect(lastNameError.getText()).toContain('maxlength'); + expect(formValid.getText()).toContain('false'); + }); + +
    + */ +var inputDirective = ['$browser', '$sniffer', '$filter', '$parse', + function($browser, $sniffer, $filter, $parse) { + return { + restrict: 'E', + require: ['?ngModel'], + link: { + pre: function(scope, element, attr, ctrls) { + if (ctrls[0]) { + (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, + $browser, $filter, $parse); + } + } + } + }; +}]; + + + +var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; +/** + * @ngdoc directive + * @name ngValue + * + * @description + * Binds the given expression to the value of `
    + + it('should check ng-options', function() { + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red'); + element.all(by.model('myColor')).first().click(); + element.all(by.css('select[ng-model="myColor"] option')).first().click(); + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black'); + element(by.css('.nullable select[ng-model="myColor"]')).click(); + element.all(by.css('.nullable select[ng-model="myColor"] option')).first().click(); + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null'); + }); + + + */ + +// jshint maxlen: false +// //00001111111111000000000002222222222000000000000000000000333333333300000000000000000000000004444444444400000000000005555555555555550000000006666666666666660000000777777777777777000000000000000888888888800000000000000000009999999999 +var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/; + // 1: value expression (valueFn) + // 2: label expression (displayFn) + // 3: group by expression (groupByFn) + // 4: disable when expression (disableWhenFn) + // 5: array item variable name + // 6: object item key variable name + // 7: object item value variable name + // 8: collection expression + // 9: track by expression +// jshint maxlen: 100 + + +var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) { + + function parseOptionsExpression(optionsExp, selectElement, scope) { + + var match = optionsExp.match(NG_OPTIONS_REGEXP); + if (!(match)) { + throw ngOptionsMinErr('iexp', + "Expected expression in form of " + + "'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'" + + " but got '{0}'. Element: {1}", + optionsExp, startingTag(selectElement)); + } + + // Extract the parts from the ngOptions expression + + // The variable name for the value of the item in the collection + var valueName = match[5] || match[7]; + // The variable name for the key of the item in the collection + var keyName = match[6]; + + // An expression that generates the viewValue for an option if there is a label expression + var selectAs = / as /.test(match[0]) && match[1]; + // An expression that is used to track the id of each object in the options collection + var trackBy = match[9]; + // An expression that generates the viewValue for an option if there is no label expression + var valueFn = $parse(match[2] ? match[1] : valueName); + var selectAsFn = selectAs && $parse(selectAs); + var viewValueFn = selectAsFn || valueFn; + var trackByFn = trackBy && $parse(trackBy); + + // Get the value by which we are going to track the option + // if we have a trackFn then use that (passing scope and locals) + // otherwise just hash the given viewValue + var getTrackByValueFn = trackBy ? + function(value, locals) { return trackByFn(scope, locals); } : + function getHashOfValue(value) { return hashKey(value); }; + var getTrackByValue = function(value, key) { + return getTrackByValueFn(value, getLocals(value, key)); + }; + + var displayFn = $parse(match[2] || match[1]); + var groupByFn = $parse(match[3] || ''); + var disableWhenFn = $parse(match[4] || ''); + var valuesFn = $parse(match[8]); + + var locals = {}; + var getLocals = keyName ? function(value, key) { + locals[keyName] = key; + locals[valueName] = value; + return locals; + } : function(value) { + locals[valueName] = value; + return locals; + }; + + + function Option(selectValue, viewValue, label, group, disabled) { + this.selectValue = selectValue; + this.viewValue = viewValue; + this.label = label; + this.group = group; + this.disabled = disabled; + } + + function getOptionValuesKeys(optionValues) { + var optionValuesKeys; + + if (!keyName && isArrayLike(optionValues)) { + optionValuesKeys = optionValues; + } else { + // if object, extract keys, in enumeration order, unsorted + optionValuesKeys = []; + for (var itemKey in optionValues) { + if (optionValues.hasOwnProperty(itemKey) && itemKey.charAt(0) !== '$') { + optionValuesKeys.push(itemKey); + } + } + } + return optionValuesKeys; + } + + return { + trackBy: trackBy, + getTrackByValue: getTrackByValue, + getWatchables: $parse(valuesFn, function(optionValues) { + // Create a collection of things that we would like to watch (watchedArray) + // so that they can all be watched using a single $watchCollection + // that only runs the handler once if anything changes + var watchedArray = []; + optionValues = optionValues || []; + + var optionValuesKeys = getOptionValuesKeys(optionValues); + var optionValuesLength = optionValuesKeys.length; + for (var index = 0; index < optionValuesLength; index++) { + var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index]; + var value = optionValues[key]; + + var locals = getLocals(optionValues[key], key); + var selectValue = getTrackByValueFn(optionValues[key], locals); + watchedArray.push(selectValue); + + // Only need to watch the displayFn if there is a specific label expression + if (match[2] || match[1]) { + var label = displayFn(scope, locals); + watchedArray.push(label); + } + + // Only need to watch the disableWhenFn if there is a specific disable expression + if (match[4]) { + var disableWhen = disableWhenFn(scope, locals); + watchedArray.push(disableWhen); + } + } + return watchedArray; + }), + + getOptions: function() { + + var optionItems = []; + var selectValueMap = {}; + + // The option values were already computed in the `getWatchables` fn, + // which must have been called to trigger `getOptions` + var optionValues = valuesFn(scope) || []; + var optionValuesKeys = getOptionValuesKeys(optionValues); + var optionValuesLength = optionValuesKeys.length; + + for (var index = 0; index < optionValuesLength; index++) { + var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index]; + var value = optionValues[key]; + var locals = getLocals(value, key); + var viewValue = viewValueFn(scope, locals); + var selectValue = getTrackByValueFn(viewValue, locals); + var label = displayFn(scope, locals); + var group = groupByFn(scope, locals); + var disabled = disableWhenFn(scope, locals); + var optionItem = new Option(selectValue, viewValue, label, group, disabled); + + optionItems.push(optionItem); + selectValueMap[selectValue] = optionItem; + } + + return { + items: optionItems, + selectValueMap: selectValueMap, + getOptionFromViewValue: function(value) { + return selectValueMap[getTrackByValue(value)]; + }, + getViewValueFromOption: function(option) { + // If the viewValue could be an object that may be mutated by the application, + // we need to make a copy and not return the reference to the value on the option. + return trackBy ? angular.copy(option.viewValue) : option.viewValue; + } + }; + } + }; + } + + + // we can't just jqLite(' + * + * + * + * {{ model }} + * + * + * angular.module('nonStringSelect', []) + * .run(function($rootScope) { + * $rootScope.model = { id: 2 }; + * }) + * .directive('convertToNumber', function() { + * return { + * require: 'ngModel', + * link: function(scope, element, attrs, ngModel) { + * ngModel.$parsers.push(function(val) { + * return parseInt(val, 10); + * }); + * ngModel.$formatters.push(function(val) { + * return '' + val; + * }); + * } + * }; + * }); + * + * + * it('should initialize to model', function() { + * var select = element(by.css('select')); + * expect(element(by.model('model.id')).$('option:checked').getText()).toEqual('Two'); + * }); + * + * + * + */ +var selectDirective = function() { + + return { + restrict: 'E', + require: ['select', '?ngModel'], + controller: SelectController, + link: function(scope, element, attr, ctrls) { + + // if ngModel is not defined, we don't need to do anything + var ngModelCtrl = ctrls[1]; + if (!ngModelCtrl) return; + + var selectCtrl = ctrls[0]; + + selectCtrl.ngModelCtrl = ngModelCtrl; + + // We delegate rendering to the `writeValue` method, which can be changed + // if the select can have multiple selected values or if the options are being + // generated by `ngOptions` + ngModelCtrl.$render = function() { + selectCtrl.writeValue(ngModelCtrl.$viewValue); + }; + + // When the selected item(s) changes we delegate getting the value of the select control + // to the `readValue` method, which can be changed if the select can have multiple + // selected values or if the options are being generated by `ngOptions` + element.on('change', function() { + scope.$apply(function() { + ngModelCtrl.$setViewValue(selectCtrl.readValue()); + }); + }); + + // If the select allows multiple values then we need to modify how we read and write + // values from and to the control; also what it means for the value to be empty and + // we have to add an extra watch since ngModel doesn't work well with arrays - it + // doesn't trigger rendering if only an item in the array changes. + if (attr.multiple) { + + // Read value now needs to check each option to see if it is selected + selectCtrl.readValue = function readMultipleValue() { + var array = []; + forEach(element.find('option'), function(option) { + if (option.selected) { + array.push(option.value); + } + }); + return array; + }; + + // Write value now needs to set the selected property of each matching option + selectCtrl.writeValue = function writeMultipleValue(value) { + var items = new HashMap(value); + forEach(element.find('option'), function(option) { + option.selected = isDefined(items.get(option.value)); + }); + }; + + // we have to do it on each watch since ngModel watches reference, but + // we need to work of an array, so we need to see if anything was inserted/removed + var lastView, lastViewRef = NaN; + scope.$watch(function selectMultipleWatch() { + if (lastViewRef === ngModelCtrl.$viewValue && !equals(lastView, ngModelCtrl.$viewValue)) { + lastView = shallowCopy(ngModelCtrl.$viewValue); + ngModelCtrl.$render(); + } + lastViewRef = ngModelCtrl.$viewValue; + }); + + // If we are a multiple select then value is now a collection + // so the meaning of $isEmpty changes + ngModelCtrl.$isEmpty = function(value) { + return !value || value.length === 0; + }; + + } + } + }; +}; + + +// The option directive is purely designed to communicate the existence (or lack of) +// of dynamically created (and destroyed) option elements to their containing select +// directive via its controller. +var optionDirective = ['$interpolate', function($interpolate) { + + function chromeHack(optionElement) { + // Workaround for https://code.google.com/p/chromium/issues/detail?id=381459 + // Adding an
  • @FHUiu&=5w(f-3S1h*&)&h2 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 + + + + +Created by FontForge 20120731 at Thu Dec 4 09:51:48 2014 + By Adam Bradley +Created by Adam Bradley with FontForge 2.0 (http://fontforge.sf.net) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/lib/ionic/fonts/ionicons.ttf b/www/lib/ionic/fonts/ionicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c4e4632486d863337c1c73478ddb3c20726c55a0 GIT binary patch literal 188508 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