From 0da0bc6321942e956c7df9179157adff5c237d80 Mon Sep 17 00:00:00 2001 From: Vic McGlaughlin Date: Tue, 3 Mar 2015 08:53:39 -0500 Subject: [PATCH] updating ionic to beta.14-nightly-1102, now showing issue with scrolling side menu --- bower.json | 4 +- www/lib/angular-animate/.bower.json | 19 + www/lib/angular-animate/README.md | 77 + .../angular-animate.js | 0 .../angular-animate.min.js | 0 .../angular-animate.min.js.map | 8 + www/lib/angular-animate/bower.json | 9 + www/lib/angular-animate/package.json | 26 + www/lib/angular-sanitize/.bower.json | 19 + www/lib/angular-sanitize/README.md | 77 + .../angular-sanitize.js | 0 .../angular-sanitize.min.js | 0 .../angular-sanitize.min.js.map | 8 + www/lib/angular-sanitize/bower.json | 9 + www/lib/angular-sanitize/package.json | 26 + www/lib/angular-ui-router/.bower.json | 33 + www/lib/angular-ui-router/CHANGELOG.md | 197 + www/lib/angular-ui-router/CONTRIBUTING.md | 65 + www/lib/angular-ui-router/LICENSE | 21 + www/lib/angular-ui-router/README.md | 243 + .../api/angular-ui-router.d.ts | 126 + www/lib/angular-ui-router/bower.json | 23 + .../release}/angular-ui-router.js | 0 .../release}/angular-ui-router.min.js | 0 www/lib/angular-ui-router/src/common.js | 292 + www/lib/angular-ui-router/src/resolve.js | 252 + www/lib/angular-ui-router/src/state.js | 1373 ++ .../angular-ui-router/src/stateDirectives.js | 268 + www/lib/angular-ui-router/src/stateFilters.js | 39 + .../angular-ui-router/src/templateFactory.js | 110 + .../src/urlMatcherFactory.js | 1036 ++ www/lib/angular-ui-router/src/urlRouter.js | 413 + www/lib/angular-ui-router/src/view.js | 71 + .../angular-ui-router/src/viewDirective.js | 302 + www/lib/angular-ui-router/src/viewScroll.js | 52 + www/lib/angular/.bower.json | 17 + www/lib/angular/README.md | 67 + www/lib/angular/angular-csp.css | 13 + www/lib/{ionic/js => }/angular/angular.js | 0 www/lib/{ionic/js => }/angular/angular.min.js | 0 www/lib/angular/angular.min.js.gzip | Bin 0 -> 45839 bytes www/lib/angular/angular.min.js.map | 8 + www/lib/angular/bower.json | 8 + www/lib/angular/package.json | 25 + www/lib/ionic/.bower.json | 46 + www/lib/ionic/README.md | 15 + www/lib/ionic/bower.json | 37 + www/lib/ionic/css/ionic.css | 2318 +-- www/lib/ionic/css/ionic.min.css | 11 +- www/lib/ionic/fonts/ionicons.eot | Bin 101984 -> 120724 bytes www/lib/ionic/fonts/ionicons.svg | 1725 ++- www/lib/ionic/fonts/ionicons.ttf | Bin 164548 -> 188508 bytes www/lib/ionic/fonts/ionicons.woff | Bin 57276 -> 67904 bytes www/lib/ionic/js/angular/angular-resource.js | 667 - .../ionic/js/angular/angular-resource.min.js | 13 - www/lib/ionic/js/ionic-angular.js | 4093 ++++-- www/lib/ionic/js/ionic-angular.min.js | 10 +- www/lib/ionic/js/ionic.bundle.js | 11821 +++++++++------- www/lib/ionic/js/ionic.bundle.min.js | 534 +- www/lib/ionic/js/ionic.js | 554 +- www/lib/ionic/js/ionic.min.js | 8 +- www/lib/ionic/scss/_action-sheet.scss | 112 +- www/lib/ionic/scss/_bar.scss | 22 + www/lib/ionic/scss/_form.scss | 30 +- www/lib/ionic/scss/_grid.scss | 8 + www/lib/ionic/scss/_items.scss | 24 +- www/lib/ionic/scss/_loaders.scss | 28 + www/lib/ionic/scss/_mixins.scss | 9 + www/lib/ionic/scss/_modal.scss | 15 +- www/lib/ionic/scss/_platform.scss | 4 +- www/lib/ionic/scss/_popover.scss | 5 +- www/lib/ionic/scss/_range.scss | 3 +- www/lib/ionic/scss/_refresher.scss | 108 + www/lib/ionic/scss/_reset.scss | 0 www/lib/ionic/scss/_scaffolding.scss | 127 +- www/lib/ionic/scss/_spinner.scss | 76 + www/lib/ionic/scss/_split-pane.scss | 29 + www/lib/ionic/scss/_tabs.scss | 26 +- www/lib/ionic/scss/_toggle.scss | 64 +- www/lib/ionic/scss/_transitions.scss | 33 +- www/lib/ionic/scss/_util.scss | 44 +- www/lib/ionic/scss/_variables.scss | 64 +- www/lib/ionic/scss/ionic.scss | 2 + .../scss/ionicons/_ionicons-animation.scss | 0 .../ionic/scss/ionicons/_ionicons-font.scss | 0 .../ionic/scss/ionicons/_ionicons-icons.scss | 1396 +- .../scss/ionicons/_ionicons-variables.scss | 700 +- www/lib/ionic/scss/ionicons/ionicons.scss | 8 +- www/lib/ionic/version.json | 6 - 89 files changed, 19941 insertions(+), 10190 deletions(-) create mode 100644 www/lib/angular-animate/.bower.json create mode 100644 www/lib/angular-animate/README.md rename www/lib/{ionic/js/angular => angular-animate}/angular-animate.js (100%) rename www/lib/{ionic/js/angular => angular-animate}/angular-animate.min.js (100%) create mode 100644 www/lib/angular-animate/angular-animate.min.js.map create mode 100644 www/lib/angular-animate/bower.json create mode 100644 www/lib/angular-animate/package.json create mode 100644 www/lib/angular-sanitize/.bower.json create mode 100644 www/lib/angular-sanitize/README.md rename www/lib/{ionic/js/angular => angular-sanitize}/angular-sanitize.js (100%) rename www/lib/{ionic/js/angular => angular-sanitize}/angular-sanitize.min.js (100%) create mode 100644 www/lib/angular-sanitize/angular-sanitize.min.js.map create mode 100644 www/lib/angular-sanitize/bower.json create mode 100644 www/lib/angular-sanitize/package.json create mode 100644 www/lib/angular-ui-router/.bower.json create mode 100644 www/lib/angular-ui-router/CHANGELOG.md create mode 100644 www/lib/angular-ui-router/CONTRIBUTING.md create mode 100644 www/lib/angular-ui-router/LICENSE create mode 100644 www/lib/angular-ui-router/README.md create mode 100644 www/lib/angular-ui-router/api/angular-ui-router.d.ts create mode 100644 www/lib/angular-ui-router/bower.json rename www/lib/{ionic/js/angular-ui => angular-ui-router/release}/angular-ui-router.js (100%) rename www/lib/{ionic/js/angular-ui => angular-ui-router/release}/angular-ui-router.min.js (100%) create mode 100644 www/lib/angular-ui-router/src/common.js create mode 100644 www/lib/angular-ui-router/src/resolve.js create mode 100644 www/lib/angular-ui-router/src/state.js create mode 100644 www/lib/angular-ui-router/src/stateDirectives.js create mode 100644 www/lib/angular-ui-router/src/stateFilters.js create mode 100644 www/lib/angular-ui-router/src/templateFactory.js create mode 100644 www/lib/angular-ui-router/src/urlMatcherFactory.js create mode 100644 www/lib/angular-ui-router/src/urlRouter.js create mode 100644 www/lib/angular-ui-router/src/view.js create mode 100644 www/lib/angular-ui-router/src/viewDirective.js create mode 100644 www/lib/angular-ui-router/src/viewScroll.js create mode 100644 www/lib/angular/.bower.json create mode 100644 www/lib/angular/README.md create mode 100644 www/lib/angular/angular-csp.css rename www/lib/{ionic/js => }/angular/angular.js (100%) rename www/lib/{ionic/js => }/angular/angular.min.js (100%) create mode 100644 www/lib/angular/angular.min.js.gzip create mode 100644 www/lib/angular/angular.min.js.map create mode 100644 www/lib/angular/bower.json create mode 100644 www/lib/angular/package.json create mode 100644 www/lib/ionic/.bower.json create mode 100644 www/lib/ionic/README.md create mode 100644 www/lib/ionic/bower.json delete mode 100644 www/lib/ionic/js/angular/angular-resource.js delete mode 100644 www/lib/ionic/js/angular/angular-resource.min.js create mode 100644 www/lib/ionic/scss/_loaders.scss create mode 100644 www/lib/ionic/scss/_refresher.scss mode change 100644 => 100755 www/lib/ionic/scss/_reset.scss create mode 100644 www/lib/ionic/scss/_spinner.scss create mode 100644 www/lib/ionic/scss/_split-pane.scss mode change 100644 => 100755 www/lib/ionic/scss/ionicons/_ionicons-animation.scss mode change 100644 => 100755 www/lib/ionic/scss/ionicons/_ionicons-font.scss mode change 100644 => 100755 www/lib/ionic/scss/ionicons/_ionicons-icons.scss mode change 100644 => 100755 www/lib/ionic/scss/ionicons/_ionicons-variables.scss mode change 100644 => 100755 www/lib/ionic/scss/ionicons/ionicons.scss delete mode 100644 www/lib/ionic/version.json diff --git a/bower.json b/bower.json index 7dc3a71..2b836a5 100644 --- a/bower.json +++ b/bower.json @@ -2,6 +2,6 @@ "name": "ionic-sidemenu", "private": "true", "devDependencies": { - "ionic": "driftyco/ionic-bower#1.0.0-beta.14" + "ionic": "driftyco/ionic-bower#1.0.0-beta.14-nightly-1102" } -} \ No newline at end of file +} diff --git a/www/lib/angular-animate/.bower.json b/www/lib/angular-animate/.bower.json new file mode 100644 index 0000000..35d85c9 --- /dev/null +++ b/www/lib/angular-animate/.bower.json @@ -0,0 +1,19 @@ +{ + "name": "angular-animate", + "version": "1.3.6", + "main": "./angular-animate.js", + "ignore": [], + "dependencies": { + "angular": "1.3.6" + }, + "homepage": "https://github.com/angular/bower-angular-animate", + "_release": "1.3.6", + "_resolution": { + "type": "version", + "tag": "v1.3.6", + "commit": "d38c9593911d231cce076c1b64f823e572813214" + }, + "_source": "git://github.com/angular/bower-angular-animate.git", + "_target": "1.3.6", + "_originalSource": "angular-animate" +} \ No newline at end of file diff --git a/www/lib/angular-animate/README.md b/www/lib/angular-animate/README.md new file mode 100644 index 0000000..930b5dc --- /dev/null +++ b/www/lib/angular-animate/README.md @@ -0,0 +1,77 @@ +# packaged angular-animate + +This repo is for distribution on `npm` and `bower`. The source for this module is in the +[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngAnimate). +Please file issues and pull requests against that repo. + +## Install + +You can install this package either with `npm` or with `bower`. + +### npm + +```shell +npm install angular-animate +``` + +Add a ` +``` + +Then add `ngAnimate` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngAnimate']); +``` + +Note that this package is not in CommonJS format, so doing `require('angular-animate')` will +return `undefined`. + +### bower + +```shell +bower install angular-animate +``` + +Then add a ` +``` + +Then add `ngAnimate` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngAnimate']); +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/api/ngAnimate). + +## License + +The MIT License + +Copyright (c) 2010-2012 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/www/lib/ionic/js/angular/angular-animate.js b/www/lib/angular-animate/angular-animate.js similarity index 100% rename from www/lib/ionic/js/angular/angular-animate.js rename to www/lib/angular-animate/angular-animate.js diff --git a/www/lib/ionic/js/angular/angular-animate.min.js b/www/lib/angular-animate/angular-animate.min.js similarity index 100% rename from www/lib/ionic/js/angular/angular-animate.min.js rename to www/lib/angular-animate/angular-animate.min.js diff --git a/www/lib/angular-animate/angular-animate.min.js.map b/www/lib/angular-animate/angular-animate.min.js.map new file mode 100644 index 0000000..dcc3932 --- /dev/null +++ b/www/lib/angular-animate/angular-animate.min.js.map @@ -0,0 +1,8 @@ +{ +"version":3, +"file":"angular-animate.min.js", +"lineCount":32, +"mappings":"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", +"sources":["angular-animate.js"], +"names":["window","angular","undefined","module","directive","scope","element","attrs","val","ngAnimateChildren","isString","length","data","NG_ANIMATE_CHILDREN","$watch","value","factory","$$rAF","$document","fn","config","$provide","$animateProvider","extractElementNode","i","elm","ELEMENT_NODE","nodeType","isMatchingElement","elm1","elm2","noop","forEach","selectors","$$selectors","isArray","isObject","rootAnimateState","running","$$jqLite","decorator","$delegate","$$q","$injector","$sniffer","$rootElement","$$asyncCallback","$rootScope","$templateRequest","$$$jqLite","classBasedAnimationsBlocked","setter","NG_ANIMATE_STATE","structural","disabled","runAnimationPostDigest","cancelFn","defer","promise","$$cancelFn","defer.promise.$$cancelFn","$$postDigest","resolve","parseAnimateOptions","options","tempClasses","split","resolveElementClasses","cache","runningAnimations","lookup","selector","s","hasClasses","Object","create","attr","className","toAdd","toRemove","classes","status","hasClass","matchingAnimation","event","push","join","name","matches","flagMap","substr","transitions","animations","get","klass","selectorFactoryName","animationRunner","animationEvent","registerAnimation","animationFactory","afterFn","beforeFn","charAt","toUpperCase","after","before","run","fns","cancellations","allCompleteFn","animation","count","index","progress","classNameAdd","classNameRemove","from","to","node","isSetClassOperation","isClassBased","currentClassName","isAnimatableClassName","beforeComplete","beforeCancel","afterComplete","afterCancel","animationLookup","replace","created","applyStyles","css","extend","cancel","performAnimation","parentElement","afterElement","domOperation","doneCallback","fireDOMCallback","animationPhase","eventName","elementEvents","triggerHandler","fireBeforeCallbackAsync","fireAfterCallbackAsync","fireDOMOperation","hasBeenRun","closeAnimation","runner","removeClass","cleanup","localAnimationCount","_data","events","parent","animationsDisabled","ngAnimateState","active","totalActiveAnimations","totalActive","lastAnimation","last","skipAnimation","animationsToCancel","current","operation","one","e","state","activeLeaveAnimation","addClass","NG_ANIMATE_CLASS_NAME","globalAnimationCounter","cancelled","cancelChildAnimations","nodes","isFunction","getElementsByClassName","querySelectorAll","removeAnimations","removeData","allowChildAnimations","parentRunningAnimation","hasParent","isRoot","animateChildrenFlag","isDefined","deregisterWatch","totalPendingRequests","oldVal","classNameFilter","test","animate","done","enter","leave","move","setClass","add","remove","$$setClassImmediately","STORAGE_KEY","hasCache","c","elementNode","parentNode","$$addClassImmediately","$$removeClassImmediately","enabled","arguments","register","$window","$timeout","$$animateReflow","clearCacheAfterReflow","cancelAnimationReflow","animationReflowQueue","lookupCache","afterReflow","callback","animationCloseHandler","totalTime","animationElementQueue","futureTimestamp","Date","now","closingTimestamp","closingTimer","closeAllAnimations","elements","elementData","NG_ANIMATE_CSS_DATA_KEY","closeAnimationFns","getElementAnimationDetails","cacheKey","transitionDuration","transitionDelay","animationDuration","animationDelay","elementStyles","getComputedStyle","Math","max","parseMaxTime","transitionDurationStyle","TRANSITION_PROP","DURATION_KEY","transitionDelayStyle","DELAY_KEY","ANIMATION_PROP","aDuration","parseInt","ANIMATION_ITERATION_COUNT_KEY","total","str","maxValue","values","parseFloat","animateSetup","styles","indexOf","parentID","NG_ANIMATE_PARENT_KEY","parentCounter","getAttribute","eventCacheKey","itemIndex","stagger","staggerClassName","staggerCacheKey","applyClasses","formerData","timings","blockTransition","blockAnimation","blockTransitions","style","ANIMATION_PLAYSTATE_KEY","animateRun","activeAnimationComplete","onEnd","off","css3AnimationEvents","onAnimationProgress","activeClassName","pendingClassName","staggerTimeout","animateClose","appliedStyles","removeProperty","stopPropagation","ev","originalEvent","timeStamp","$manualTimeStamp","elapsedTime","toFixed","ELAPSED_TIME_MAX_DECIMAL_PLACES","startTime","maxDelayTime","maxDuration","prefix","staggerTime","transitionStaggerDelay","animationStaggerDelay","CSS_PREFIX","round","maxDelay","ONE_SECOND","oldStyle","setAttribute","ANIMATIONEND_EVENT","TRANSITIONEND_EVENT","CLOSING_TIME_BUFFER","on","bool","PROPERTY_KEY","animateBefore","animateAfter","afterAnimationComplete","animationComplete","preReflowCancellation","suffixClasses","suffix","ontransitionend","onwebkittransitionend","onanimationend","onwebkitanimationend","animationCompleted","beforeSetClass","cancellationMethod","beforeAddClass","beforeRemoveClass"] +} diff --git a/www/lib/angular-animate/bower.json b/www/lib/angular-animate/bower.json new file mode 100644 index 0000000..5c0e2bc --- /dev/null +++ b/www/lib/angular-animate/bower.json @@ -0,0 +1,9 @@ +{ + "name": "angular-animate", + "version": "1.3.6", + "main": "./angular-animate.js", + "ignore": [], + "dependencies": { + "angular": "1.3.6" + } +} diff --git a/www/lib/angular-animate/package.json b/www/lib/angular-animate/package.json new file mode 100644 index 0000000..10b45b5 --- /dev/null +++ b/www/lib/angular-animate/package.json @@ -0,0 +1,26 @@ +{ + "name": "angular-animate", + "version": "1.3.6", + "description": "AngularJS module for animations", + "main": "angular-animate.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/angular/angular.js.git" + }, + "keywords": [ + "angular", + "framework", + "browser", + "animation", + "client-side" + ], + "author": "Angular Core Team ", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular.js/issues" + }, + "homepage": "http://angularjs.org" +} diff --git a/www/lib/angular-sanitize/.bower.json b/www/lib/angular-sanitize/.bower.json new file mode 100644 index 0000000..6de026f --- /dev/null +++ b/www/lib/angular-sanitize/.bower.json @@ -0,0 +1,19 @@ +{ + "name": "angular-sanitize", + "version": "1.3.6", + "main": "./angular-sanitize.js", + "ignore": [], + "dependencies": { + "angular": "1.3.6" + }, + "homepage": "https://github.com/angular/bower-angular-sanitize", + "_release": "1.3.6", + "_resolution": { + "type": "version", + "tag": "v1.3.6", + "commit": "ccd773f961fa1fadc8d728c45a2635c73d34fb2d" + }, + "_source": "git://github.com/angular/bower-angular-sanitize.git", + "_target": "1.3.6", + "_originalSource": "angular-sanitize" +} \ No newline at end of file diff --git a/www/lib/angular-sanitize/README.md b/www/lib/angular-sanitize/README.md new file mode 100644 index 0000000..6bc0a30 --- /dev/null +++ b/www/lib/angular-sanitize/README.md @@ -0,0 +1,77 @@ +# packaged angular-sanitize + +This repo is for distribution on `npm` and `bower`. The source for this module is in the +[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngSanitize). +Please file issues and pull requests against that repo. + +## Install + +You can install this package either with `npm` or with `bower`. + +### npm + +```shell +npm install angular-sanitize +``` + +Add a ` +``` + +Then add `ngSanitize` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngSanitize']); +``` + +Note that this package is not in CommonJS format, so doing `require('angular-sanitize')` will +return `undefined`. + +### bower + +```shell +bower install angular-sanitize +``` + +Add a ` +``` + +Then add `ngSanitize` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngSanitize']); +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/api/ngSanitize). + +## License + +The MIT License + +Copyright (c) 2010-2012 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/www/lib/ionic/js/angular/angular-sanitize.js b/www/lib/angular-sanitize/angular-sanitize.js similarity index 100% rename from www/lib/ionic/js/angular/angular-sanitize.js rename to www/lib/angular-sanitize/angular-sanitize.js diff --git a/www/lib/ionic/js/angular/angular-sanitize.min.js b/www/lib/angular-sanitize/angular-sanitize.min.js similarity index 100% rename from www/lib/ionic/js/angular/angular-sanitize.min.js rename to www/lib/angular-sanitize/angular-sanitize.min.js diff --git a/www/lib/angular-sanitize/angular-sanitize.min.js.map b/www/lib/angular-sanitize/angular-sanitize.min.js.map new file mode 100644 index 0000000..80a8889 --- /dev/null +++ b/www/lib/angular-sanitize/angular-sanitize.min.js.map @@ -0,0 +1,8 @@ +{ +"version":3, +"file":"angular-sanitize.min.js", +"lineCount":15, +"mappings":"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", +"sources":["angular-sanitize.js"], +"names":["window","angular","undefined","sanitizeText","chars","buf","htmlSanitizeWriter","writer","noop","join","makeMap","str","obj","items","split","i","length","htmlParser","html","handler","parseStartTag","tag","tagName","rest","unary","lowercase","blockElements","stack","last","inlineElements","parseEndTag","optionalEndTagElements","voidElements","push","attrs","replace","ATTR_REGEXP","match","name","doubleQuotedValue","singleQuotedValue","unquotedValue","decodeEntities","start","pos","end","index","text","stack.last","specialElements","RegExp","all","COMMENT_REGEXP","CDATA_REGEXP","indexOf","lastIndexOf","comment","substring","DOCTYPE_REGEXP","test","BEGING_END_TAGE_REGEXP","END_TAG_REGEXP","BEGIN_TAG_REGEXP","START_TAG_REGEXP","$sanitizeMinErr","value","parts","spaceRe","exec","spaceBefore","spaceAfter","content","hiddenPre","innerHTML","textContent","innerText","encodeEntities","SURROGATE_PAIR_REGEXP","hi","charCodeAt","low","NON_ALPHANUMERIC_REGEXP","uriValidator","ignore","out","bind","validElements","forEach","key","lkey","isImage","validAttrs","uriAttrs","$$minErr","optionalEndTagBlockElements","optionalEndTagInlineElements","extend","svgElements","htmlAttrs","svgAttrs","document","createElement","module","provider","$SanitizeProvider","$get","$$sanitizeUri","uri","filter","$sanitize","LINKY_URL_REGEXP","MAILTO_REGEXP","target","addText","addLink","url","isDefined","raw","substr"] +} diff --git a/www/lib/angular-sanitize/bower.json b/www/lib/angular-sanitize/bower.json new file mode 100644 index 0000000..db42ff3 --- /dev/null +++ b/www/lib/angular-sanitize/bower.json @@ -0,0 +1,9 @@ +{ + "name": "angular-sanitize", + "version": "1.3.6", + "main": "./angular-sanitize.js", + "ignore": [], + "dependencies": { + "angular": "1.3.6" + } +} diff --git a/www/lib/angular-sanitize/package.json b/www/lib/angular-sanitize/package.json new file mode 100644 index 0000000..59e6b6e --- /dev/null +++ b/www/lib/angular-sanitize/package.json @@ -0,0 +1,26 @@ +{ + "name": "angular-sanitize", + "version": "1.3.6", + "description": "AngularJS module for sanitizing HTML", + "main": "angular-sanitize.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/angular/angular.js.git" + }, + "keywords": [ + "angular", + "framework", + "browser", + "html", + "client-side" + ], + "author": "Angular Core Team ", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular.js/issues" + }, + "homepage": "http://angularjs.org" +} diff --git a/www/lib/angular-ui-router/.bower.json b/www/lib/angular-ui-router/.bower.json new file mode 100644 index 0000000..092d436 --- /dev/null +++ b/www/lib/angular-ui-router/.bower.json @@ -0,0 +1,33 @@ +{ + "name": "angular-ui-router", + "version": "0.2.13", + "main": "./release/angular-ui-router.js", + "dependencies": { + "angular": ">= 1.0.8" + }, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "component.json", + "package.json", + "lib", + "config", + "sample", + "test", + "tests", + "ngdoc_assets", + "Gruntfile.js", + "files.js" + ], + "homepage": "https://github.com/angular-ui/ui-router", + "_release": "0.2.13", + "_resolution": { + "type": "version", + "tag": "0.2.13", + "commit": "c3d543aae43d4600512520a0d70723ac31f2cb62" + }, + "_source": "git://github.com/angular-ui/ui-router.git", + "_target": "0.2.13", + "_originalSource": "angular-ui-router" +} \ No newline at end of file diff --git a/www/lib/angular-ui-router/CHANGELOG.md b/www/lib/angular-ui-router/CHANGELOG.md new file mode 100644 index 0000000..e0848c3 --- /dev/null +++ b/www/lib/angular-ui-router/CHANGELOG.md @@ -0,0 +1,197 @@ + +### 0.2.13 (2014-11-20) + +This release primarily fixes issues reported against 0.2.12 + +#### Bug Fixes + +* **$state:** fix $state.includes/.is to apply param types before comparisions fix(uiSref): ma ([19715d15](https://github.com/angular-ui/ui-router/commit/19715d15e3cbfff724519e9febedd05b49c75baa), closes [#1513](https://github.com/angular-ui/ui-router/issues/1513)) + * Avoid re-synchronizing from url after .transitionTo ([b267ecd3](https://github.com/angular-ui/ui-router/commit/b267ecd348e5c415233573ef95ebdbd051875f52), closes [#1573](https://github.com/angular-ui/ui-router/issues/1573)) +* **$urlMatcherFactory:** + * Built-in date type uses local time zone ([d726bedc](https://github.com/angular-ui/ui-router/commit/d726bedcbb5f70a5660addf43fd52ec730790293)) + * make date type fn check .is before running ([aa94ce3b](https://github.com/angular-ui/ui-router/commit/aa94ce3b86632ad05301530a2213099da73a3dc0), closes [#1564](https://github.com/angular-ui/ui-router/issues/1564)) + * early binding of array handler bypasses type resolution ([ada4bc27](https://github.com/angular-ui/ui-router/commit/ada4bc27df5eff3ba3ab0de94a09bd91b0f7a28c)) + * add 'any' Type for non-encoding non-url params ([3bfd75ab](https://github.com/angular-ui/ui-router/commit/3bfd75ab445ee2f1dd55275465059ed116b10b27), closes [#1562](https://github.com/angular-ui/ui-router/issues/1562)) + * fix encoding slashes in params ([0c983a08](https://github.com/angular-ui/ui-router/commit/0c983a08e2947f999683571477debd73038e95cf), closes [#1119](https://github.com/angular-ui/ui-router/issues/1119)) + * fix mixed path/query params ordering problem ([a479fbd0](https://github.com/angular-ui/ui-router/commit/a479fbd0b8eb393a94320973e5b9a62d83912ee2), closes [#1543](https://github.com/angular-ui/ui-router/issues/1543)) +* **ArrayType:** + * specify empty array mapping corner case ([74aa6091](https://github.com/angular-ui/ui-router/commit/74aa60917e996b0b4e27bbb4eb88c3c03832021d), closes [#1511](https://github.com/angular-ui/ui-router/issues/1511)) + * fix .equals for array types ([5e6783b7](https://github.com/angular-ui/ui-router/commit/5e6783b77af9a90ddff154f990b43dbb17eeda6e), closes [#1538](https://github.com/angular-ui/ui-router/issues/1538)) +* **Param:** fix default value shorthand declaration ([831d812a](https://github.com/angular-ui/ui-router/commit/831d812a524524c71f0ee1c9afaf0487a5a66230), closes [#1554](https://github.com/angular-ui/ui-router/issues/1554)) +* **common:** fixed the _.filter clone to not create sparse arrays ([750f5cf5](https://github.com/angular-ui/ui-router/commit/750f5cf5fd91f9ada96f39e50d39aceb2caf22b6), closes [#1563](https://github.com/angular-ui/ui-router/issues/1563)) +* **ie8:** fix calls to indexOf and filter ([dcb31b84](https://github.com/angular-ui/ui-router/commit/dcb31b843391b3e61dee4de13f368c109541813e), closes [#1556](https://github.com/angular-ui/ui-router/issues/1556)) + + +#### Features + +* add json parameter Type ([027f1fcf](https://github.com/angular-ui/ui-router/commit/027f1fcf9c0916cea651e88981345da6f9ff214a)) + + + +### 0.2.12 (2014-11-13) + +#### Bug Fixes + +* **$resolve:** use resolve fn result, not parent resolved value of same name ([67f5e00c](https://github.com/angular-ui/ui-router/commit/67f5e00cc9aa006ce3fe6cde9dff261c28eab70a), closes [#1317], [#1353]) +* **$state:** + * populate default params in .transitionTo. ([3f60fbe6](https://github.com/angular-ui/ui-router/commit/3f60fbe6d65ebeca8d97952c05aa1d269f1b7ba1), closes [#1396]) + * reload() now reinvokes controllers ([73443420](https://github.com/angular-ui/ui-router/commit/7344342018847902594dc1fc62d30a5c30f01763), closes [#582]) + * do not emit $viewContentLoading if notify: false ([74255feb](https://github.com/angular-ui/ui-router/commit/74255febdf48ae082a02ca1e735165f2c369a463), closes [#1387](https://github.com/angular-ui/ui-router/issues/1387)) + * register states at config-time ([4533fe36](https://github.com/angular-ui/ui-router/commit/4533fe36e0ab2f0143edd854a4145deaa013915a)) + * handle parent.name when parent is obj ([4533fe36](https://github.com/angular-ui/ui-router/commit/4533fe36e0ab2f0143edd854a4145deaa013915a)) +* **$urlMatcherFactory:** + * register types at config ([4533fe36](https://github.com/angular-ui/ui-router/commit/4533fe36e0ab2f0143edd854a4145deaa013915a), closes [#1476]) + * made path params default value "" for backwards compat ([8f998e71](https://github.com/angular-ui/ui-router/commit/8f998e71e43a0b31293331c981f5db0f0097b8ba)) + * Pre-replace certain param values for better mapping ([6374a3e2](https://github.com/angular-ui/ui-router/commit/6374a3e29ab932014a7c77d2e1ab884cc841a2e3)) + * fixed ParamSet.$$keys() ordering ([9136fecb](https://github.com/angular-ui/ui-router/commit/9136fecbc2bfd4fda748a9914f0225a46c933860)) + * empty string policy now respected in Param.value() ([db12c85c](https://github.com/angular-ui/ui-router/commit/db12c85c16f2d105415f9bbbdeb11863f64728e0)) + * "string" type now encodes/decodes slashes ([3045e415](https://github.com/angular-ui/ui-router/commit/3045e41577a8b8b8afc6039f42adddf5f3c061ec), closes [#1119]) + * allow arrays in both path and query params ([fdd2f2c1](https://github.com/angular-ui/ui-router/commit/fdd2f2c191c4a67c874fdb9ec9a34f8dde9ad180), closes [#1073], [#1045], [#1486], [#1394]) + * typed params in search ([8d4cab69](https://github.com/angular-ui/ui-router/commit/8d4cab69dd67058e1a716892cc37b7d80a57037f), closes [#1488](https://github.com/angular-ui/ui-router/issues/1488)) + * no longer generate unroutable urls ([cb9fd9d8](https://github.com/angular-ui/ui-router/commit/cb9fd9d8943cb26c7223f6990db29c82ae8740f8), closes [#1487](https://github.com/angular-ui/ui-router/issues/1487)) + * handle optional parameter followed by required parameter in url format. ([efc72106](https://github.com/angular-ui/ui-router/commit/efc72106ddcc4774b48ea176a505ef9e95193b41)) + * default to parameter string coersion. ([13a468a7](https://github.com/angular-ui/ui-router/commit/13a468a7d54c2fb0751b94c0c1841d580b71e6dc), closes [#1414](https://github.com/angular-ui/ui-router/issues/1414)) + * concat respects strictMode/caseInsensitive ([dd72e103](https://github.com/angular-ui/ui-router/commit/dd72e103edb342d9cf802816fe127e1bbd68fd5f), closes [#1395]) +* **ui-sref:** + * Allow sref state options to take a scope object ([b5f7b596](https://github.com/angular-ui/ui-router/commit/b5f7b59692ce4933e2d63eb5df3f50a4ba68ccc0)) + * replace raw href modification with attrs. ([08c96782](https://github.com/angular-ui/ui-router/commit/08c96782faf881b0c7ab00afc233ee6729548fa0)) + * nagivate to state when url is "" fix($state.href): generate href for state with ([656b5aab](https://github.com/angular-ui/ui-router/commit/656b5aab906e5749db9b5a080c6a83b95f50fd91), closes [#1363](https://github.com/angular-ui/ui-router/issues/1363)) + * Check that state is defined in isMatch() ([92aebc75](https://github.com/angular-ui/ui-router/commit/92aebc7520f88babdc6e266536086e07263514c3), closes [#1314](https://github.com/angular-ui/ui-router/issues/1314), [#1332](https://github.com/angular-ui/ui-router/issues/1332)) +* **uiView:** + * allow inteprolated ui-view names ([81f6a19a](https://github.com/angular-ui/ui-router/commit/81f6a19a432dac9198fd33243855bfd3b4fea8c0), closes [#1324](https://github.com/angular-ui/ui-router/issues/1324)) + * Made anim work with angular 1.3 ([c3bb7ad9](https://github.com/angular-ui/ui-router/commit/c3bb7ad903da1e1f3c91019cfd255be8489ff4ef), closes [#1367](https://github.com/angular-ui/ui-router/issues/1367), [#1345](https://github.com/angular-ui/ui-router/issues/1345)) +* **urlRouter:** html5Mode accepts an object from angular v1.3.0-rc.3 ([7fea1e9d](https://github.com/angular-ui/ui-router/commit/7fea1e9d0d8c6e09cc6c895ecb93d4221e9adf48)) +* **stateFilters:** mark state filters as stateful. ([a00b353e](https://github.com/angular-ui/ui-router/commit/a00b353e3036f64a81245c4e7898646ba218f833), closes [#1479]) +* **ui-router:** re-add IE8 compatibility for map/filter/keys ([8ce69d9f](https://github.com/angular-ui/ui-router/commit/8ce69d9f7c886888ab53eca7e53536f36b428aae), closes [#1518], [#1383]) +* **package:** point 'main' to a valid filename ([ac903350](https://github.com/angular-ui/ui-router/commit/ac9033501debb63364539d91fbf3a0cba4579f8e)) +* **travis:** make CI build faster ([0531de05](https://github.com/angular-ui/ui-router/commit/0531de052e414a8d839fbb4e7635e923e94865b3)) + + +#### Features + +##### Default and Typed params + +This release includes a lot of bug fixes around default/optional and typed parameters. As such, 0.2.12 is the first release where we recommend those features be used. + +* **$state:** + * add state params validation ([b1379e6a](https://github.com/angular-ui/ui-router/commit/b1379e6a4d38f7ed7436e05873932d7c279af578), closes [#1433](https://github.com/angular-ui/ui-router/issues/1433)) + * is/includes/get work on relative stateOrName ([232e94b3](https://github.com/angular-ui/ui-router/commit/232e94b3c2ca2c764bb9510046e4b61690c87852)) + * .reload() returns state transition promise ([639e0565](https://github.com/angular-ui/ui-router/commit/639e0565dece9d5544cc93b3eee6e11c99bd7373)) +* **$templateFactory:** request templateURL as text/html ([ccd60769](https://github.com/angular-ui/ui-router/commit/ccd6076904a4b801d77b47f6e2de4c06ce9962f8), closes [#1287]) +* **$urlMatcherFactory:** Made a Params and ParamSet class ([0cc1e6cc](https://github.com/angular-ui/ui-router/commit/0cc1e6cc461a4640618e2bb594566551c54834e2)) + + + + +### 0.2.11 (2014-08-26) + + +#### Bug Fixes + +* **$resolve:** Resolves only inherit from immediate parent fixes #702 ([df34e20c](https://github.com/angular-ui/ui-router/commit/df34e20c576299e7a3c8bd4ebc68d42341c0ace9)) +* **$state:** + * change $state.href default options.inherit to true ([deea695f](https://github.com/angular-ui/ui-router/commit/deea695f5cacc55de351ab985144fd233c02a769)) + * sanity-check state lookups ([456fd5ae](https://github.com/angular-ui/ui-router/commit/456fd5aec9ea507518927bfabd62b4afad4cf714), closes [#980](https://github.com/angular-ui/ui-router/issues/980)) + * didn't comply to inherit parameter ([09836781](https://github.com/angular-ui/ui-router/commit/09836781f126c1c485b06551eb9cfd4fa0f45c35)) + * allow view content loading broadcast ([7b78edee](https://github.com/angular-ui/ui-router/commit/7b78edeeb52a74abf4d3f00f79534033d5a08d1a)) +* **$urlMatcherFactory:** + * detect injected functions ([91f75ae6](https://github.com/angular-ui/ui-router/commit/91f75ae66c4d129f6f69e53bd547594e9661f5d5)) + * syntax ([1ebed370](https://github.com/angular-ui/ui-router/commit/1ebed37069bae8614d41541d56521f5c45f703f3)) +* **UrlMatcher:** + * query param function defaults ([f9c20530](https://github.com/angular-ui/ui-router/commit/f9c205304f10d8a4ebe7efe9025e642016479a51)) + * don't decode default values ([63607bdb](https://github.com/angular-ui/ui-router/commit/63607bdbbcb432d3fb37856a1cb3da0cd496804e)) +* **travis:** update Node version to fix build ([d6b95ef2](https://github.com/angular-ui/ui-router/commit/d6b95ef23d9dacb4eba08897f5190a0bcddb3a48)) +* **uiSref:** + * Generate an href for states with a blank url. closes #1293 ([691745b1](https://github.com/angular-ui/ui-router/commit/691745b12fa05d3700dd28f0c8d25f8a105074ad)) + * should inherit params by default ([b973dad1](https://github.com/angular-ui/ui-router/commit/b973dad155ad09a7975e1476bd096f7b2c758eeb)) + * cancel transition if preventDefault() has been called ([2e6d9167](https://github.com/angular-ui/ui-router/commit/2e6d9167d3afbfbca6427e53e012f94fb5fb8022)) +* **uiView:** Fixed infinite loop when is called .go() from a controller. ([e13988b8](https://github.com/angular-ui/ui-router/commit/e13988b8cd6231d75c78876ee9d012cc87f4a8d9), closes [#1194](https://github.com/angular-ui/ui-router/issues/1194)) +* **docs:** + * Fixed link to milestones ([6c0ae500](https://github.com/angular-ui/ui-router/commit/6c0ae500cc238ea9fc95adcc15415c55fc9e1f33)) + * fix bug in decorator example ([4bd00af5](https://github.com/angular-ui/ui-router/commit/4bd00af50b8b88a49d1545a76290731cb8e0feb1)) + * Removed an incorrect semi-colon ([af97cef8](https://github.com/angular-ui/ui-router/commit/af97cef8b967f2e32177e539ef41450dca131a7d)) + * Explain return value of rule as function ([5e887890](https://github.com/angular-ui/ui-router/commit/5e8878900a6ffe59a81aed531a3925e34a297377)) + + +#### Features + +* **$state:** + * allow parameters to pass unharmed ([8939d057](https://github.com/angular-ui/ui-router/commit/8939d0572ab1316e458ef016317ecff53131a822)) + * **BREAKING CHANGE**: state parameters are no longer automatically coerced to strings, and unspecified parameter values are now set to undefined rather than null. + * allow prevent syncUrl on failure ([753060b9](https://github.com/angular-ui/ui-router/commit/753060b910d5d2da600a6fa0757976e401c33172)) +* **typescript:** Add typescript definitions for component builds ([521ceb3f](https://github.com/angular-ui/ui-router/commit/521ceb3fd7850646422f411921e21ce5e7d82e0f)) +* **uiSref:** extend syntax for ui-sref ([71cad3d6](https://github.com/angular-ui/ui-router/commit/71cad3d636508b5a9fe004775ad1f1adc0c80c3e)) +* **uiSrefActive:** + * Also activate for child states. ([bf163ad6](https://github.com/angular-ui/ui-router/commit/bf163ad6ce176ce28792696c8302d7cdf5c05a01), closes [#818](https://github.com/angular-ui/ui-router/issues/818)) + * **BREAKING CHANGE** Since ui-sref-active now activates even when child states are active you may need to swap out your ui-sref-active with ui-sref-active-eq, thought typically we think devs want the auto inheritance. + + * uiSrefActiveEq: new directive with old ui-sref-active behavior +* **$urlRouter:** + * defer URL change interception ([c72d8ce1](https://github.com/angular-ui/ui-router/commit/c72d8ce11916d0ac22c81b409c9e61d7048554d7)) + * force URLs to have valid params ([d48505cd](https://github.com/angular-ui/ui-router/commit/d48505cd328d83e39d5706e085ba319715f999a6)) + * abstract $location handling ([08b4636b](https://github.com/angular-ui/ui-router/commit/08b4636b294611f08db35f00641eb5211686fb50)) +* **$urlMatcherFactory:** + * fail on bad parameters ([d8f124c1](https://github.com/angular-ui/ui-router/commit/d8f124c10d00c7e5dde88c602d966db261aea221)) + * date type support ([b7f074ff](https://github.com/angular-ui/ui-router/commit/b7f074ff65ca150a3cdbda4d5ad6cb17107300eb)) + * implement type support ([450b1f0e](https://github.com/angular-ui/ui-router/commit/450b1f0e8e03c738174ff967f688b9a6373290f4)) +* **UrlMatcher:** + * handle query string arrays ([9cf764ef](https://github.com/angular-ui/ui-router/commit/9cf764efab45fa9309368688d535ddf6e96d6449), closes [#373](https://github.com/angular-ui/ui-router/issues/373)) + * injectable functions as defaults ([00966ecd](https://github.com/angular-ui/ui-router/commit/00966ecd91fb745846039160cab707bfca8b3bec)) + * default values & type decoding for query params ([a472b301](https://github.com/angular-ui/ui-router/commit/a472b301389fbe84d1c1fa9f24852b492a569d11)) + * allow shorthand definitions ([5b724304](https://github.com/angular-ui/ui-router/commit/5b7243049793505e44b6608ea09878c37c95b1f5)) + * validates whole interface ([32b27db1](https://github.com/angular-ui/ui-router/commit/32b27db173722e9194ef1d5c0ea7d93f25a98d11)) + * implement non-strict matching ([a3e21366](https://github.com/angular-ui/ui-router/commit/a3e21366bee0475c9795a1ec76f70eec41c5b4e3)) + * add per-param config support ([07b3029f](https://github.com/angular-ui/ui-router/commit/07b3029f4d409cf955780113df92e36401b47580)) + * **BREAKING CHANGE**: the `params` option in state configurations must now be an object keyed by parameter name. + +### 0.2.10 (2014-03-12) + + +#### Bug Fixes + +* **$state:** use $browser.baseHref() when generating urls with .href() ([cbcc8488](https://github.com/angular-ui/ui-router/commit/cbcc84887d6b6d35258adabb97c714cd9c1e272d)) +* **bower.json:** JS files should not be ignored ([ccdab193](https://github.com/angular-ui/ui-router/commit/ccdab193315f304eb3be5f5b97c47a926c79263e)) +* **dev:** karma:background task is missing, can't run grunt:dev. ([d9f7b898](https://github.com/angular-ui/ui-router/commit/d9f7b898e8e3abb8c846b0faa16a382913d7b22b)) +* **sample:** Contacts menu button not staying active when navigating to detail states. Need t ([2fcb8443](https://github.com/angular-ui/ui-router/commit/2fcb84437cb43ade12682a92b764f13cac77dfe7)) +* **uiSref:** support mock-clicks/events with no data ([717d3ff7](https://github.com/angular-ui/ui-router/commit/717d3ff7d0ba72d239892dee562b401cdf90e418)) +* **uiView:** + * Do NOT autoscroll when autoscroll attr is missing ([affe5bd7](https://github.com/angular-ui/ui-router/commit/affe5bd785cdc3f02b7a9f64a52e3900386ec3a0), closes [#807](https://github.com/angular-ui/ui-router/issues/807)) + * Refactoring uiView directive to copy ngView logic ([548fab6a](https://github.com/angular-ui/ui-router/commit/548fab6ab9debc9904c5865c8bc68b4fc3271dd0), closes [#857](https://github.com/angular-ui/ui-router/issues/857), [#552](https://github.com/angular-ui/ui-router/issues/552)) + + +#### Features + +* **$state:** includes() allows glob patterns for state matching. ([2d5f6b37](https://github.com/angular-ui/ui-router/commit/2d5f6b37191a3135f4a6d9e8f344c54edcdc065b)) +* **UrlMatcher:** Add support for case insensitive url matching ([642d5247](https://github.com/angular-ui/ui-router/commit/642d524799f604811e680331002feec7199a1fb5)) +* **uiSref:** add support for transition options ([2ed7a728](https://github.com/angular-ui/ui-router/commit/2ed7a728cee6854b38501fbc1df6139d3de5b28a)) +* **uiView:** add controllerAs config with function ([1ee7334a](https://github.com/angular-ui/ui-router/commit/1ee7334a73efeccc9b95340e315cdfd59944762d)) + + +### 0.2.9 (2014-01-17) + + +This release is identical to 0.2.8. 0.2.8 was re-tagged in git to fix a problem with bower. + + +### 0.2.8 (2014-01-16) + + +#### Bug Fixes + +* **$state:** allow null to be passed as 'params' param ([094dc30e](https://github.com/angular-ui/ui-router/commit/094dc30e883e1bd14e50a475553bafeaade3b178)) +* **$state.go:** param inheritance shouldn't inherit from siblings ([aea872e0](https://github.com/angular-ui/ui-router/commit/aea872e0b983cb433436ce5875df10c838fccedb)) +* **bower.json:** fixes bower.json ([eed3cc4d](https://github.com/angular-ui/ui-router/commit/eed3cc4d4dfef1d3ef84b9fd063127538ebf59d3)) +* **uiSrefActive:** annotate controller injection ([85921422](https://github.com/angular-ui/ui-router/commit/85921422ff7fb0effed358136426d616cce3d583), closes [#671](https://github.com/angular-ui/ui-router/issues/671)) +* **uiView:** + * autoscroll tests pass on 1.2.4 & 1.1.5 ([86eacac0](https://github.com/angular-ui/ui-router/commit/86eacac09ca5e9000bd3b9c7ba6e2cc95d883a3a)) + * don't animate initial load ([83b6634d](https://github.com/angular-ui/ui-router/commit/83b6634d27942ca74766b2b1244a7fc52c5643d9)) + * test pass against 1.0.8 and 1.2.4 ([a402415a](https://github.com/angular-ui/ui-router/commit/a402415a2a28b360c43b9fe8f4f54c540f6c33de)) + * it should autoscroll when expr is missing. ([8bb9e27a](https://github.com/angular-ui/ui-router/commit/8bb9e27a2986725f45daf44c4c9f846385095aff)) + + +#### Features + +* **uiSref:** add target attribute behaviour ([c12bf9a5](https://github.com/angular-ui/ui-router/commit/c12bf9a520d30d70294e3d82de7661900f8e394e)) +* **uiView:** + * merge autoscroll expression test. ([b89e0f87](https://github.com/angular-ui/ui-router/commit/b89e0f871d5cc35c10925ede986c10684d5c9252)) + * cache and test autoscroll expression ([ee262282](https://github.com/angular-ui/ui-router/commit/ee2622828c2ce83807f006a459ac4e11406d9258)) diff --git a/www/lib/angular-ui-router/CONTRIBUTING.md b/www/lib/angular-ui-router/CONTRIBUTING.md new file mode 100644 index 0000000..63829a5 --- /dev/null +++ b/www/lib/angular-ui-router/CONTRIBUTING.md @@ -0,0 +1,65 @@ + +# Report an Issue + +Help us make UI-Router better! If you think you might have found a bug, or some other weirdness, start by making sure +it hasn't already been reported. You can [search through existing issues](https://github.com/angular-ui/ui-router/search?q=wat%3F&type=Issues) +to see if someone's reported one similar to yours. + +If not, then [create a plunkr](http://bit.ly/UIR-Plunk) that demonstrates the problem (try to use as little code +as possible: the more minimalist, the faster we can debug it). + +Next, [create a new issue](https://github.com/angular-ui/ui-router/issues/new) that briefly explains the problem, +and provides a bit of background as to the circumstances that triggered it. Don't forget to include the link to +that plunkr you created! + +**Note**: If you're unsure how a feature is used, or are encountering some unexpected behavior that you aren't sure +is a bug, it's best to talk it out on +[StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) before reporting it. This +keeps development streamlined, and helps us focus on building great software. + + +Issues only! | +-------------| +Please keep in mind that the issue tracker is for *issues*. Please do *not* post an issue if you need help or support. Instead, see one of the above-mentioned forums or [IRC](irc://irc.freenode.net/#angularjs). | + +####Purple Labels +A purple label means that **you** need to take some further action. + - ![Not Actionable - Need Info](http://angular-ui.github.io/ui-router/images/notactionable.png): Your issue is not specific enough, or there is no clear action that we can take. Please clarify and refine your issue. + - ![Plunkr Please](http://angular-ui.github.io/ui-router/images/plunkrplease.png): Please [create a plunkr](http://bit.ly/UIR-Plunk) + - ![StackOverflow](http://angular-ui.github.io/ui-router/images/stackoverflow.png): We suspect your issue is really a help request, or could be answered by the community. Please ask your question on [StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router). If you determine that is an actual issue, please explain why. + +If your issue gets labeled with purple label, no further action will be taken until you respond to the label appropriately. + +# Contribute + +**(1)** See the **[Developing](#developing)** section below, to get the development version of UI-Router up and running on your local machine. + +**(2)** Check out the [roadmap](https://github.com/angular-ui/ui-router/milestones) to see where the project is headed, and if your feature idea fits with where we're headed. + +**(3)** If you're not sure, [open an RFC](https://github.com/angular-ui/ui-router/issues/new?title=RFC:%20My%20idea) to get some feedback on your idea. + +**(4)** Finally, commit some code and open a pull request. Code & commits should abide by the following rules: + +- *Always* have test coverage for new features (or regression tests for bug fixes), and *never* break existing tests +- Commits should represent one logical change each; if a feature goes through multiple iterations, squash your commits down to one +- Make sure to follow the [Angular commit message format](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format) so your change will appear in the changelog of the next release. +- Changes should always respect the coding style of the project + + + +# Developing + +UI-Router uses grunt >= 0.4.x. Make sure to upgrade your environment and read the +[Migration Guide](http://gruntjs.com/upgrading-from-0.3-to-0.4). + +Dependencies for building from source and running tests: + +* [grunt-cli](https://github.com/gruntjs/grunt-cli) - run: `$ npm install -g grunt-cli` +* Then, install the development dependencies by running `$ npm install` from the project directory + +There are a number of targets in the gruntfile that are used to generating different builds: + +* `grunt`: Perform a normal build, runs jshint and karma tests +* `grunt build`: Perform a normal build +* `grunt dist`: Perform a clean build and generate documentation +* `grunt dev`: Run dev server (sample app) and watch for changes, builds and runs karma tests on changes. diff --git a/www/lib/angular-ui-router/LICENSE b/www/lib/angular-ui-router/LICENSE new file mode 100644 index 0000000..939f8f8 --- /dev/null +++ b/www/lib/angular-ui-router/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2014 The AngularUI Team, Karsten Sperling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/www/lib/angular-ui-router/README.md b/www/lib/angular-ui-router/README.md new file mode 100644 index 0000000..f02d83b --- /dev/null +++ b/www/lib/angular-ui-router/README.md @@ -0,0 +1,243 @@ +# AngularUI Router  [![Build Status](https://travis-ci.org/angular-ui/ui-router.svg?branch=master)](https://travis-ci.org/angular-ui/ui-router) + +#### The de-facto solution to flexible routing with nested views +--- +**[Download 0.2.11](http://angular-ui.github.io/ui-router/release/angular-ui-router.js)** (or **[Minified](http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js)**) **|** +**[Guide](https://github.com/angular-ui/ui-router/wiki) |** +**[API](http://angular-ui.github.io/ui-router/site) |** +**[Sample](http://angular-ui.github.com/ui-router/sample/) ([Src](https://github.com/angular-ui/ui-router/tree/gh-pages/sample)) |** +**[FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions) |** +**[Resources](#resources) |** +**[Report an Issue](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#report-an-issue) |** +**[Contribute](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#contribute) |** +**[Help!](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) |** +**[Discuss](https://groups.google.com/forum/#!categories/angular-ui/router)** + +--- + +AngularUI Router is a routing framework for [AngularJS](http://angularjs.org), which allows you to organize the +parts of your interface into a [*state machine*](https://en.wikipedia.org/wiki/Finite-state_machine). Unlike the +[`$route` service](http://docs.angularjs.org/api/ngRoute.$route) in the Angular ngRoute module, which is organized around URL +routes, UI-Router is organized around [*states*](https://github.com/angular-ui/ui-router/wiki), +which may optionally have routes, as well as other behavior, attached. + +States are bound to *named*, *nested* and *parallel views*, allowing you to powerfully manage your application's interface. + +Check out the sample app: http://angular-ui.github.io/ui-router/sample/ + +- +**Note:** *UI-Router is under active development. As such, while this library is well-tested, the API may change. Consider using it in production applications only if you're comfortable following a changelog and updating your usage accordingly.* + + +## Get Started + +**(1)** Get UI-Router in one of the following ways: + - clone & [build](CONTRIBUTING.md#developing) this repository + - [download the release](http://angular-ui.github.io/ui-router/release/angular-ui-router.js) (or [minified](http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js)) + - via **[Bower](http://bower.io/)**: by running `$ bower install angular-ui-router` from your console + - or via **[npm](https://www.npmjs.org/)**: by running `$ npm install angular-ui-router` from your console + - or via **[Component](https://github.com/component/component)**: by running `$ component install angular-ui/ui-router` from your console + +**(2)** Include `angular-ui-router.js` (or `angular-ui-router.min.js`) in your `index.html`, after including Angular itself (For Component users: ignore this step) + +**(3)** Add `'ui.router'` to your main module's list of dependencies (For Component users: replace `'ui.router'` with `require('angular-ui-router')`) + +When you're done, your setup should look similar to the following: + +> +```html + + + + + + + ... + + + ... + + +``` + +### [Nested States & Views](http://plnkr.co/edit/u18KQc?p=preview) + +The majority of UI-Router's power is in its ability to nest states & views. + +**(1)** First, follow the [setup](#get-started) instructions detailed above. + +**(2)** Then, add a [`ui-view` directive](https://github.com/angular-ui/ui-router/wiki/Quick-Reference#ui-view) to the `` of your app. + +> +```html + + +
+ + State 1 + State 2 + +``` + +**(3)** You'll notice we also added some links with [`ui-sref` directives](https://github.com/angular-ui/ui-router/wiki/Quick-Reference#ui-sref). In addition to managing state transitions, this directive auto-generates the `href` attribute of the `` element it's attached to, if the corresponding state has a URL. Next we'll add some templates. These will plug into the `ui-view` within `index.html`. Notice that they have their own `ui-view` as well! That is the key to nesting states and views. + +> +```html + +

State 1

+
+
Show List +
+``` +```html + +

State 2

+
+Show List +
+``` + +**(4)** Next, we'll add some child templates. *These* will get plugged into the `ui-view` of their parent state templates. + +> +```html + +

List of State 1 Items

+
    +
  • {{ item }}
  • +
+``` + +> +```html + +

List of State 2 Things

+
    +
  • {{ thing }}
  • +
+``` + +**(5)** Finally, we'll wire it all up with `$stateProvider`. Set up your states in the module config, as in the following: + + +> +```javascript +myApp.config(function($stateProvider, $urlRouterProvider) { + // + // For any unmatched url, redirect to /state1 + $urlRouterProvider.otherwise("/state1"); + // + // Now set up the states + $stateProvider + .state('state1', { + url: "/state1", + templateUrl: "partials/state1.html" + }) + .state('state1.list', { + url: "/list", + templateUrl: "partials/state1.list.html", + controller: function($scope) { + $scope.items = ["A", "List", "Of", "Items"]; + } + }) + .state('state2', { + url: "/state2", + templateUrl: "partials/state2.html" + }) + .state('state2.list', { + url: "/list", + templateUrl: "partials/state2.list.html", + controller: function($scope) { + $scope.things = ["A", "Set", "Of", "Things"]; + } + }); +}); +``` + +**(6)** See this quick start example in action. +>**[Go to Quick Start Plunker for Nested States & Views](http://plnkr.co/edit/u18KQc?p=preview)** + +**(7)** This only scratches the surface +>**[Dive Deeper!](https://github.com/angular-ui/ui-router/wiki)** + + +### [Multiple & Named Views](http://plnkr.co/edit/SDOcGS?p=preview) + +Another great feature is the ability to have multiple `ui-view`s view per template. + +**Pro Tip:** *While multiple parallel views are a powerful feature, you'll often be able to manage your +interfaces more effectively by nesting your views, and pairing those views with nested states.* + +**(1)** Follow the [setup](#get-started) instructions detailed above. + +**(2)** Add one or more `ui-view` to your app, give them names. +> +```html + + +
+
+ + Route 1 + Route 2 + +``` + +**(3)** Set up your states in the module config: +> +```javascript +myApp.config(function($stateProvider) { + $stateProvider + .state('index', { + url: "", + views: { + "viewA": { template: "index.viewA" }, + "viewB": { template: "index.viewB" } + } + }) + .state('route1', { + url: "/route1", + views: { + "viewA": { template: "route1.viewA" }, + "viewB": { template: "route1.viewB" } + } + }) + .state('route2', { + url: "/route2", + views: { + "viewA": { template: "route2.viewA" }, + "viewB": { template: "route2.viewB" } + } + }) +}); +``` + +**(4)** See this quick start example in action. +>**[Go to Quick Start Plunker for Multiple & Named Views](http://plnkr.co/edit/SDOcGS?p=preview)** + + +## Resources + +* [In-Depth Guide](https://github.com/angular-ui/ui-router/wiki) +* [API Reference](http://angular-ui.github.io/ui-router/site) +* [Sample App](http://angular-ui.github.com/ui-router/sample/) ([Source](https://github.com/angular-ui/ui-router/tree/gh-pages/sample)) +* [FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions) +* [Slides comparing ngRoute to ui-router](http://slid.es/timkindberg/ui-router#/) +* [UI-Router Extras / Addons](http://christopherthielen.github.io/ui-router-extras/#/home) (@christopherthielen) + +### Videos + +* [Introduction Video](https://egghead.io/lessons/angularjs-introduction-ui-router) (egghead.io) +* [Tim Kindberg on Angular UI-Router](https://www.youtube.com/watch?v=lBqiZSemrqg) +* [Activating States](https://egghead.io/lessons/angularjs-ui-router-activating-states) (egghead.io) +* [Learn Angular.js using UI-Router](http://youtu.be/QETUuZ27N0w) (LearnCode.academy) + + + +## Reporting issues and Contributing + +Please read our [Contributor guidelines](CONTRIBUTING.md) before reporting an issue or creating a pull request. diff --git a/www/lib/angular-ui-router/api/angular-ui-router.d.ts b/www/lib/angular-ui-router/api/angular-ui-router.d.ts new file mode 100644 index 0000000..55c5d5e --- /dev/null +++ b/www/lib/angular-ui-router/api/angular-ui-router.d.ts @@ -0,0 +1,126 @@ +// Type definitions for Angular JS 1.1.5+ (ui.router module) +// Project: https://github.com/angular-ui/ui-router +// Definitions by: Michel Salib +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +declare module ng.ui { + + interface IState { + name?: string; + template?: string; + templateUrl?: any; // string || () => string + templateProvider?: any; // () => string || IPromise + controller?: any; + controllerAs?: string; + controllerProvider?: any; + resolve?: {}; + url?: string; + params?: any; + views?: {}; + abstract?: boolean; + onEnter?: (...args: any[]) => void; + onExit?: (...args: any[]) => void; + data?: any; + reloadOnSearch?: boolean; + } + + interface ITypedState extends IState { + data?: T; + } + + interface IStateProvider extends IServiceProvider { + state(name: string, config: IState): IStateProvider; + state(config: IState): IStateProvider; + decorator(name?: string, decorator?: (state: IState, parent: Function) => any): any; + } + + interface IUrlMatcher { + concat(pattern: string): IUrlMatcher; + exec(path: string, searchParams: {}): {}; + parameters(): string[]; + format(values: {}): string; + } + + interface IUrlMatcherFactory { + compile(pattern: string): IUrlMatcher; + isMatcher(o: any): boolean; + } + + interface IUrlRouterProvider extends IServiceProvider { + when(whenPath: RegExp, handler: Function): IUrlRouterProvider; + when(whenPath: RegExp, handler: any[]): IUrlRouterProvider; + when(whenPath: RegExp, toPath: string): IUrlRouterProvider; + when(whenPath: IUrlMatcher, hanlder: Function): IUrlRouterProvider; + when(whenPath: IUrlMatcher, handler: any[]): IUrlRouterProvider; + when(whenPath: IUrlMatcher, toPath: string): IUrlRouterProvider; + when(whenPath: string, handler: Function): IUrlRouterProvider; + when(whenPath: string, handler: any[]): IUrlRouterProvider; + when(whenPath: string, toPath: string): IUrlRouterProvider; + otherwise(handler: Function): IUrlRouterProvider; + otherwise(handler: any[]): IUrlRouterProvider; + otherwise(path: string): IUrlRouterProvider; + rule(handler: Function): IUrlRouterProvider; + rule(handler: any[]): IUrlRouterProvider; + } + + interface IStateOptions { + location?: any; + inherit?: boolean; + relative?: IState; + notify?: boolean; + reload?: boolean; + } + + interface IHrefOptions { + lossy?: boolean; + inherit?: boolean; + relative?: IState; + absolute?: boolean; + } + + interface IStateService { + go(to: string, params?: {}, options?: IStateOptions): IPromise; + transitionTo(state: string, params?: {}, updateLocation?: boolean): void; + transitionTo(state: string, params?: {}, options?: IStateOptions): void; + includes(state: string, params?: {}): boolean; + is(state:string, params?: {}): boolean; + is(state: IState, params?: {}): boolean; + href(state: IState, params?: {}, options?: IHrefOptions): string; + href(state: string, params?: {}, options?: IHrefOptions): string; + get(state: string): IState; + get(): IState[]; + current: IState; + params: any; + reload(): void; + } + + interface IStateParamsService { + [key: string]: any; + } + + interface IStateParams { + [key: string]: any; + } + + interface IUrlRouterService { + /* + * 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(). + * + */ + sync(): void; + } + + interface IUiViewScrollProvider { + /* + * Reverts back to using the core $anchorScroll service for scrolling + * based on the url anchor. + */ + useAnchorScroll(): void; + } +} diff --git a/www/lib/angular-ui-router/bower.json b/www/lib/angular-ui-router/bower.json new file mode 100644 index 0000000..45e802a --- /dev/null +++ b/www/lib/angular-ui-router/bower.json @@ -0,0 +1,23 @@ +{ + "name": "angular-ui-router", + "version": "0.2.13", + "main": "./release/angular-ui-router.js", + "dependencies": { + "angular": ">= 1.0.8" + }, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "component.json", + "package.json", + "lib", + "config", + "sample", + "test", + "tests", + "ngdoc_assets", + "Gruntfile.js", + "files.js" + ] +} diff --git a/www/lib/ionic/js/angular-ui/angular-ui-router.js b/www/lib/angular-ui-router/release/angular-ui-router.js similarity index 100% rename from www/lib/ionic/js/angular-ui/angular-ui-router.js rename to www/lib/angular-ui-router/release/angular-ui-router.js diff --git a/www/lib/ionic/js/angular-ui/angular-ui-router.min.js b/www/lib/angular-ui-router/release/angular-ui-router.min.js similarity index 100% rename from www/lib/ionic/js/angular-ui/angular-ui-router.min.js rename to www/lib/angular-ui-router/release/angular-ui-router.min.js diff --git a/www/lib/angular-ui-router/src/common.js b/www/lib/angular-ui-router/src/common.js new file mode 100644 index 0000000..5f0500e --- /dev/null +++ b/www/lib/angular-ui-router/src/common.js @@ -0,0 +1,292 @@ +/*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']); diff --git a/www/lib/angular-ui-router/src/resolve.js b/www/lib/angular-ui-router/src/resolve.js new file mode 100644 index 0000000..f1c1790 --- /dev/null +++ b/www/lib/angular-ui-router/src/resolve.js @@ -0,0 +1,252 @@ +/** + * @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= 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); diff --git a/www/lib/angular-ui-router/src/stateDirectives.js b/www/lib/angular-ui-router/src/stateDirectives.js new file mode 100644 index 0000000..4d9d527 --- /dev/null +++ b/www/lib/angular-ui-router/src/stateDirectives.js @@ -0,0 +1,268 @@ +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); diff --git a/www/lib/angular-ui-router/src/stateFilters.js b/www/lib/angular-ui-router/src/stateFilters.js new file mode 100644 index 0000000..e0a1175 --- /dev/null +++ b/www/lib/angular-ui-router/src/stateFilters.js @@ -0,0 +1,39 @@ +/** + * @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); diff --git a/www/lib/angular-ui-router/src/templateFactory.js b/www/lib/angular-ui-router/src/templateFactory.js new file mode 100644 index 0000000..ca491a9 --- /dev/null +++ b/www/lib/angular-ui-router/src/templateFactory.js @@ -0,0 +1,110 @@ +/** + * @ngdoc object + * @name ui.router.util.$templateFactory + * + * @requires $http + * @requires $templateCache + * @requires $injector + * + * @description + * Service. Manages loading of templates. + */ +$TemplateFactory.$inject = ['$http', '$templateCache', '$injector']; +function $TemplateFactory( $http, $templateCache, $injector) { + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromConfig + * @methodOf ui.router.util.$templateFactory + * + * @description + * Creates a template from a configuration object. + * + * @param {object} config Configuration object for which to load a template. + * The following properties are search in the specified order, and the first one + * that is defined is used to create the template: + * + * @param {string|object} config.template html string template or function to + * load via {@link ui.router.util.$templateFactory#fromString fromString}. + * @param {string|object} config.templateUrl url to load or a function returning + * the url to load via {@link ui.router.util.$templateFactory#fromUrl fromUrl}. + * @param {Function} config.templateProvider function to invoke via + * {@link ui.router.util.$templateFactory#fromProvider fromProvider}. + * @param {object} params Parameters to pass to the template function. + * @param {object} locals Locals to pass to `invoke` if the template is loaded + * via a `templateProvider`. Defaults to `{ params: params }`. + * + * @return {string|object} The template html as a string, or a promise for + * that string,or `null` if no template is configured. + */ + this.fromConfig = function (config, params, locals) { + return ( + isDefined(config.template) ? this.fromString(config.template, params) : + isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) : + isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) : + null + ); + }; + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromString + * @methodOf ui.router.util.$templateFactory + * + * @description + * Creates a template from a string or a function returning a string. + * + * @param {string|object} template html template as a string or function that + * returns an html template as a string. + * @param {object} params Parameters to pass to the template function. + * + * @return {string|object} The template html as a string, or a promise for that + * string. + */ + this.fromString = function (template, params) { + return isFunction(template) ? template(params) : template; + }; + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromUrl + * @methodOf ui.router.util.$templateFactory + * + * @description + * Loads a template from the a URL via `$http` and `$templateCache`. + * + * @param {string|Function} url url of the template to load, or a function + * that returns a url. + * @param {Object} params Parameters to pass to the url function. + * @return {string|Promise.} 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); diff --git a/www/lib/angular-ui-router/src/urlMatcherFactory.js b/www/lib/angular-ui-router/src/urlMatcherFactory.js new file mode 100644 index 0000000..a16e728 --- /dev/null +++ b/www/lib/angular-ui-router/src/urlMatcherFactory.js @@ -0,0 +1,1036 @@ +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) { }]); diff --git a/www/lib/angular-ui-router/src/urlRouter.js b/www/lib/angular-ui-router/src/urlRouter.js new file mode 100644 index 0000000..2b22937 --- /dev/null +++ b/www/lib/angular-ui-router/src/urlRouter.js @@ -0,0 +1,413 @@ +/** + * @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); diff --git a/www/lib/angular-ui-router/src/view.js b/www/lib/angular-ui-router/src/view.js new file mode 100644 index 0000000..f19a3c5 --- /dev/null +++ b/www/lib/angular-ui-router/src/view.js @@ -0,0 +1,71 @@ + +$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); diff --git a/www/lib/angular-ui-router/src/viewDirective.js b/www/lib/angular-ui-router/src/viewDirective.js new file mode 100644 index 0000000..d3cf100 --- /dev/null +++ b/www/lib/angular-ui-router/src/viewDirective.js @@ -0,0 +1,302 @@ +/** + * @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); diff --git a/www/lib/angular-ui-router/src/viewScroll.js b/www/lib/angular-ui-router/src/viewScroll.js new file mode 100644 index 0000000..dfe0a03 --- /dev/null +++ b/www/lib/angular-ui-router/src/viewScroll.js @@ -0,0 +1,52 @@ +/** + * @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); diff --git a/www/lib/angular/.bower.json b/www/lib/angular/.bower.json new file mode 100644 index 0000000..3352fa7 --- /dev/null +++ b/www/lib/angular/.bower.json @@ -0,0 +1,17 @@ +{ + "name": "angular", + "version": "1.3.6", + "main": "./angular.js", + "ignore": [], + "dependencies": {}, + "homepage": "https://github.com/angular/bower-angular", + "_release": "1.3.6", + "_resolution": { + "type": "version", + "tag": "v1.3.6", + "commit": "a525f1199d44c2aa6d69b1900d4a2e950adc5752" + }, + "_source": "git://github.com/angular/bower-angular.git", + "_target": "1.3.6", + "_originalSource": "angular" +} \ No newline at end of file diff --git a/www/lib/angular/README.md b/www/lib/angular/README.md new file mode 100644 index 0000000..897fb7f --- /dev/null +++ b/www/lib/angular/README.md @@ -0,0 +1,67 @@ +# packaged angular + +This repo is for distribution on `npm` and `bower`. The source for this module is in the +[main AngularJS repo](https://github.com/angular/angular.js). +Please file issues and pull requests against that repo. + +## Install + +You can install this package either with `npm` or with `bower`. + +### npm + +```shell +npm install angular +``` + +Then add a ` +``` + +Note that this package is not in CommonJS format, so doing `require('angular')` will return `undefined`. +If you're using [Browserify](https://github.com/substack/node-browserify), you can use +[exposify](https://github.com/thlorenz/exposify) to have `require('angular')` return the `angular` +global. + +### bower + +```shell +bower install angular +``` + +Then add a ` +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/). + +## License + +The MIT License + +Copyright (c) 2010-2012 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/www/lib/angular/angular-csp.css b/www/lib/angular/angular-csp.css new file mode 100644 index 0000000..0ce9d86 --- /dev/null +++ b/www/lib/angular/angular-csp.css @@ -0,0 +1,13 @@ +/* Include this file in your html if you are using the CSP mode. */ + +@charset "UTF-8"; + +[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], +.ng-cloak, .x-ng-cloak, +.ng-hide:not(.ng-hide-animate) { + display: none !important; +} + +ng\:form { + display: block; +} diff --git a/www/lib/ionic/js/angular/angular.js b/www/lib/angular/angular.js similarity index 100% rename from www/lib/ionic/js/angular/angular.js rename to www/lib/angular/angular.js diff --git a/www/lib/ionic/js/angular/angular.min.js b/www/lib/angular/angular.min.js similarity index 100% rename from www/lib/ionic/js/angular/angular.min.js rename to www/lib/angular/angular.min.js diff --git a/www/lib/angular/angular.min.js.gzip b/www/lib/angular/angular.min.js.gzip new file mode 100644 index 0000000000000000000000000000000000000000..b98cb14674281bfa0f16c105d8dae842c23f1546 GIT binary patch literal 45839 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","<=",">=","&&","||","!","ESCAPE","lex","tokens","readString","peek","readNumber","isIdent","readIdent","is","isWhitespace","ch2","ch3","op2","op3","op1","operator","throwError","chars","isExpOperator","start","end","colStr","peekCh","quote","rawString","hex","String","fromCharCode","rep","ZERO","statements","primary","expect","filterChain","consume","arrayDeclaration","functionCall","objectIndex","fieldAccess","peekToken","e1","e2","e3","e4","peekAhead","t","unaryFn","right","$parseUnaryFn","binaryFn","left","isBranching","$parseBinaryFn","$parseConstant","$parseStatements","inputFn","argsFn","$parseFilter","every","assignment","ternary","$parseAssignment","logicalOR","middle","$parseTernary","logicalAND","equality","relational","additive","multiplicative","unary","field","$parseFieldAccess","indexFn","$parseObjectIndex","fnGetter","contextGetter","expressionText","$parseFunctionCall","elementFns","$parseArrayLiteral","valueFns","$parseObjectLiteral","yy","y","MMMM","MMM","M","H","hh","EEEE","EEE","ampmGetter","Z","timeZoneGetter","zone","paddedZone","ww","w","xlinkHref","propName","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","nullFormRenameControl","formDirectiveFactory","isNgForm","ngFormCompile","formElement","ngFormPreLink","handleFormSubmission","parentFormCtrl","alias","URL_REGEXP","EMAIL_REGEXP","NUMBER_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","DEFAULT_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","minutes","hours","seconds","milliseconds","addDays","numberInputType","urlInputType","ctrl.$validators.url","modelValue","viewValue","emailInputType","email","ctrl.$validators.email","radioInputType","checked","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrl.$isEmpty","ctrls","NgModelController","$modelValue","$$rawModelValue","$asyncValidators","$viewChangeListeners","$untouched","$touched","parsedNgModel","parsedNgModelAssign","ngModelGet","ngModelSet","pendingDebounce","$$setOptions","this.$$setOptions","getterSetter","invokeModelGetter","invokeModelSetter","$$$p","this.$isEmpty","currentValidationRunId","this.$setPristine","this.$setDirty","this.$setUntouched","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","this.$setTouched","this.$rollbackViewValue","$$lastCommittedViewValue","this.$validate","prevValid","prevModelValue","allowInvalid","$$runValidators","parserValid","allValid","$$writeModelToScope","this.$$runValidators","parseValid","doneCallback","processSyncValidators","syncValidatorsValid","validator","processAsyncValidators","validatorPromises","validationDone","localValidationRunId","processParseErrors","errorKey","this.$commitViewValue","$$parseAndValidate","this.$$parseAndValidate","this.$$writeModelToScope","this.$setViewValue","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","ngModelPostLink","updateOn","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","intVal","ctrl.$validators.maxlength","ctrl.$validators.minlength","trimValues","CONSTANT_VALUE_REGEXP","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","that","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","tElement","ngBindHtmlGetter","ngBindHtmlWatch","getStringValue","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","forceAsyncEvents","ngEventHandler","$event","previousElements","ngIfWatchAction","newScope","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","parseAsResourceUrl","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","BRACE","IS_WHEN","updateElementText","newText","numberExp","whenExp","whens","whensExpFns","braceReplacement","watchRemover","lastCount","attributeName","tmpMatch","whenKey","ngPluralizeWatchAction","countIsNaN","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","ngRepeatCompile","ngRepeatEndComment","lhs","rhs","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","ngRepeatLink","lastBlockMap","ngRepeatAction","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","itemKey","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","tempClasses","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","ngSwitchController","cases","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","ngOptionsMinErr","NG_OPTIONS_REGEXP","nullModelCtrl","optionsMap","ngModelCtrl","unknownOption","databound","init","self.init","ngModelCtrl_","nullOption_","unknownOption_","addOption","self.addOption","removeOption","self.removeOption","hasOption","renderUnknownOption","self.renderUnknownOption","unknownVal","self.hasOption","setupAsSingle","selectElement","selectCtrl","ngModelCtrl.$render","emptyOption","setupAsMultiple","lastView","selectMultipleWatch","setupAsOptions","callExpression","exprFn","valueName","keyName","createIsSelectedFn","selectedSet","trackFn","trackIndex","isSelected","compareValueFn","selectAsFn","scheduleRendering","renderScheduled","render","updateLabelMap","labelMap","label","added","optionGroups","optionGroupNames","optionGroupName","optionGroup","existingParent","existingOptions","existingOption","valuesFn","anySelected","optionId","trackKeysCache","groupByFn","displayFn","nullOption","groupIndex","groupLength","optionGroupsCache","optGroupTemplate","lastElement","optionTemplate","optionsExp","selectAs","track","selectionChanged","selectedKey","viewValueFn","getLabels","toDisplay","ngModelCtrl.$isEmpty","nullSelectCtrl","selectCtrlName","interpolateWatchAction","$$csp"] +} diff --git a/www/lib/angular/bower.json b/www/lib/angular/bower.json new file mode 100644 index 0000000..a2f659c --- /dev/null +++ b/www/lib/angular/bower.json @@ -0,0 +1,8 @@ +{ + "name": "angular", + "version": "1.3.6", + "main": "./angular.js", + "ignore": [], + "dependencies": { + } +} diff --git a/www/lib/angular/package.json b/www/lib/angular/package.json new file mode 100644 index 0000000..89c7a7b --- /dev/null +++ b/www/lib/angular/package.json @@ -0,0 +1,25 @@ +{ + "name": "angular", + "version": "1.3.6", + "description": "HTML enhanced for web apps", + "main": "angular.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/angular/angular.js.git" + }, + "keywords": [ + "angular", + "framework", + "browser", + "client-side" + ], + "author": "Angular Core Team ", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular.js/issues" + }, + "homepage": "http://angularjs.org" +} diff --git a/www/lib/ionic/.bower.json b/www/lib/ionic/.bower.json new file mode 100644 index 0000000..9e2c473 --- /dev/null +++ b/www/lib/ionic/.bower.json @@ -0,0 +1,46 @@ +{ + "name": "ionic", + "version": "1.0.0-beta.14-nightly-1102", + "codename": "magnesium-mongoose", + "homepage": "https://github.com/driftyco/ionic", + "authors": [ + "Max Lynch ", + "Adam Bradley ", + "Ben Sperry " + ], + "description": "Advanced HTML5 hybrid mobile app development framework.", + "main": [ + "css/ionic.css", + "fonts/*", + "js/ionic.js", + "js/ionic-angular.js" + ], + "keywords": [ + "mobile", + "html5", + "ionic", + "cordova", + "phonegap", + "trigger", + "triggerio", + "angularjs", + "angular" + ], + "license": "MIT", + "private": false, + "dependencies": { + "angular": "1.3.6", + "angular-animate": "1.3.6", + "angular-sanitize": "1.3.6", + "angular-ui-router": "0.2.13" + }, + "_release": "1.0.0-beta.14-nightly-1102", + "_resolution": { + "type": "version", + "tag": "v1.0.0-beta.14-nightly-1102", + "commit": "7fd76f9e8e137788ea6b8b7854dbb9d97caea690" + }, + "_source": "git://github.com/driftyco/ionic-bower.git", + "_target": "1.0.0-beta.14-nightly-1102", + "_originalSource": "driftyco/ionic-bower" +} \ No newline at end of file diff --git a/www/lib/ionic/README.md b/www/lib/ionic/README.md new file mode 100644 index 0000000..d3b167b --- /dev/null +++ b/www/lib/ionic/README.md @@ -0,0 +1,15 @@ +# ionic-bower + +Bower repository for [Ionic Framework](http://github.com/driftyco/ionic) + +### Usage + +Include `js/ionic.bundle.js` to get ionic and all of its dependencies. + +Alternatively, include the individual ionic files with the dependencies separately. + +### Versions + +To install the latest stable version, `bower install driftyco/ionic-bower#v1.0.0-beta.13` + +To install the latest nightly release, `bower install driftyco/ionic-bower#master` diff --git a/www/lib/ionic/bower.json b/www/lib/ionic/bower.json new file mode 100644 index 0000000..7f6dd68 --- /dev/null +++ b/www/lib/ionic/bower.json @@ -0,0 +1,37 @@ +{ + "name": "ionic", + "version": "1.0.0-beta.14-nightly-1102", + "codename": "magnesium-mongoose", + "homepage": "https://github.com/driftyco/ionic", + "authors": [ + "Max Lynch ", + "Adam Bradley ", + "Ben Sperry " + ], + "description": "Advanced HTML5 hybrid mobile app development framework.", + "main": [ + "css/ionic.css", + "fonts/*", + "js/ionic.js", + "js/ionic-angular.js" + ], + "keywords": [ + "mobile", + "html5", + "ionic", + "cordova", + "phonegap", + "trigger", + "triggerio", + "angularjs", + "angular" + ], + "license": "MIT", + "private": false, + "dependencies": { + "angular": "1.3.6", + "angular-animate": "1.3.6", + "angular-sanitize": "1.3.6", + "angular-ui-router": "0.2.13" + } +} diff --git a/www/lib/ionic/css/ionic.css b/www/lib/ionic/css/ionic.css index 4920709..f686abf 100644 --- a/www/lib/ionic/css/ionic.css +++ b/www/lib/ionic/css/ionic.css @@ -2,7 +2,7 @@ * Copyright 2014 Drifty Co. * http://drifty.com/ * - * Ionic, v1.0.0-beta.14 + * Ionic, v1.0.0-beta.14-nightly-1102 * A powerful HTML5 mobile app framework. * http://ionicframework.com/ * @@ -12,19 +12,24 @@ * */ /*! - Ionicons, v1.5.2 + 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=1.5.2"); - src: url("../fonts/ionicons.eot?v=1.5.2#iefix") format("embedded-opentype"), url("../fonts/ionicons.ttf?v=1.5.2") format("truetype"), url("../fonts/ionicons.woff?v=1.5.2") format("woff"), url("../fonts/ionicons.svg?v=1.5.2#Ionicons") format("svg"); + 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.svg?v=2.0.1#Ionicons") format("svg"); font-weight: normal; font-style: normal; } -.ion, .ion-loading-a, .ion-loading-b, .ion-loading-c, .ion-loading-d, .ion-looping, .ion-refreshing, .ion-ios7-reloading, .ionicons, .ion-alert:before, .ion-alert-circled:before, .ion-android-add:before, .ion-android-add-contact:before, .ion-android-alarm:before, .ion-android-archive:before, .ion-android-arrow-back:before, .ion-android-arrow-down-left:before, .ion-android-arrow-down-right:before, .ion-android-arrow-forward:before, .ion-android-arrow-up-left:before, .ion-android-arrow-up-right:before, .ion-android-battery:before, .ion-android-book:before, .ion-android-calendar:before, .ion-android-call:before, .ion-android-camera:before, .ion-android-chat:before, .ion-android-checkmark:before, .ion-android-clock:before, .ion-android-close:before, .ion-android-contact:before, .ion-android-contacts:before, .ion-android-data:before, .ion-android-developer:before, .ion-android-display:before, .ion-android-download:before, .ion-android-drawer:before, .ion-android-dropdown:before, .ion-android-earth:before, .ion-android-folder:before, .ion-android-forums:before, .ion-android-friends:before, .ion-android-hand:before, .ion-android-image:before, .ion-android-inbox:before, .ion-android-information:before, .ion-android-keypad:before, .ion-android-lightbulb:before, .ion-android-locate:before, .ion-android-location:before, .ion-android-mail:before, .ion-android-microphone:before, .ion-android-mixer:before, .ion-android-more:before, .ion-android-note:before, .ion-android-playstore:before, .ion-android-printer:before, .ion-android-promotion:before, .ion-android-reminder:before, .ion-android-remove:before, .ion-android-search:before, .ion-android-send:before, .ion-android-settings:before, .ion-android-share:before, .ion-android-social:before, .ion-android-social-user:before, .ion-android-sort:before, .ion-android-stair-drawer:before, .ion-android-star:before, .ion-android-stopwatch:before, .ion-android-storage:before, .ion-android-system-back:before, .ion-android-system-home:before, .ion-android-system-windows:before, .ion-android-timer:before, .ion-android-trash:before, .ion-android-user-menu:before, .ion-android-volume: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-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-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-cube:before, .ion-disc:before, .ion-document:before, .ion-document-text:before, .ion-drag:before, .ion-earth:before, .ion-edit:before, .ion-egg:before, .ion-eject:before, .ion-email: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-flask:before, .ion-folder:before, .ion-fork:before, .ion-fork-repo:before, .ion-forward:before, .ion-funnel:before, .ion-game-controller-a:before, .ion-game-controller-b:before, .ion-gear-a:before, .ion-gear-b:before, .ion-grid:before, .ion-hammer:before, .ion-happy: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-icon-social-google-plus:before, .ion-icon-social-google-plus-outline:before, .ion-image:before, .ion-images:before, .ion-information:before, .ion-information-circled:before, .ion-ionic:before, .ion-ios7-alarm:before, .ion-ios7-alarm-outline:before, .ion-ios7-albums:before, .ion-ios7-albums-outline:before, .ion-ios7-americanfootball:before, .ion-ios7-americanfootball-outline:before, .ion-ios7-analytics:before, .ion-ios7-analytics-outline:before, .ion-ios7-arrow-back:before, .ion-ios7-arrow-down:before, .ion-ios7-arrow-forward:before, .ion-ios7-arrow-left:before, .ion-ios7-arrow-right:before, .ion-ios7-arrow-thin-down:before, .ion-ios7-arrow-thin-left:before, .ion-ios7-arrow-thin-right:before, .ion-ios7-arrow-thin-up:before, .ion-ios7-arrow-up:before, .ion-ios7-at:before, .ion-ios7-at-outline:before, .ion-ios7-barcode:before, .ion-ios7-barcode-outline:before, .ion-ios7-baseball:before, .ion-ios7-baseball-outline:before, .ion-ios7-basketball:before, .ion-ios7-basketball-outline:before, .ion-ios7-bell:before, .ion-ios7-bell-outline:before, .ion-ios7-bolt:before, .ion-ios7-bolt-outline:before, .ion-ios7-bookmarks:before, .ion-ios7-bookmarks-outline:before, .ion-ios7-box:before, .ion-ios7-box-outline:before, .ion-ios7-briefcase:before, .ion-ios7-briefcase-outline:before, .ion-ios7-browsers:before, .ion-ios7-browsers-outline:before, .ion-ios7-calculator:before, .ion-ios7-calculator-outline:before, .ion-ios7-calendar:before, .ion-ios7-calendar-outline:before, .ion-ios7-camera:before, .ion-ios7-camera-outline:before, .ion-ios7-cart:before, .ion-ios7-cart-outline:before, .ion-ios7-chatboxes:before, .ion-ios7-chatboxes-outline:before, .ion-ios7-chatbubble:before, .ion-ios7-chatbubble-outline:before, .ion-ios7-checkmark:before, .ion-ios7-checkmark-empty:before, .ion-ios7-checkmark-outline:before, .ion-ios7-circle-filled:before, .ion-ios7-circle-outline:before, .ion-ios7-clock:before, .ion-ios7-clock-outline:before, .ion-ios7-close:before, .ion-ios7-close-empty:before, .ion-ios7-close-outline:before, .ion-ios7-cloud:before, .ion-ios7-cloud-download:before, .ion-ios7-cloud-download-outline:before, .ion-ios7-cloud-outline:before, .ion-ios7-cloud-upload:before, .ion-ios7-cloud-upload-outline:before, .ion-ios7-cloudy:before, .ion-ios7-cloudy-night:before, .ion-ios7-cloudy-night-outline:before, .ion-ios7-cloudy-outline:before, .ion-ios7-cog:before, .ion-ios7-cog-outline:before, .ion-ios7-compose:before, .ion-ios7-compose-outline:before, .ion-ios7-contact:before, .ion-ios7-contact-outline:before, .ion-ios7-copy:before, .ion-ios7-copy-outline:before, .ion-ios7-download:before, .ion-ios7-download-outline:before, .ion-ios7-drag:before, .ion-ios7-email:before, .ion-ios7-email-outline:before, .ion-ios7-expand:before, .ion-ios7-eye:before, .ion-ios7-eye-outline:before, .ion-ios7-fastforward:before, .ion-ios7-fastforward-outline:before, .ion-ios7-filing:before, .ion-ios7-filing-outline:before, .ion-ios7-film:before, .ion-ios7-film-outline:before, .ion-ios7-flag:before, .ion-ios7-flag-outline:before, .ion-ios7-folder:before, .ion-ios7-folder-outline:before, .ion-ios7-football:before, .ion-ios7-football-outline:before, .ion-ios7-gear:before, .ion-ios7-gear-outline:before, .ion-ios7-glasses:before, .ion-ios7-glasses-outline:before, .ion-ios7-heart:before, .ion-ios7-heart-outline:before, .ion-ios7-help:before, .ion-ios7-help-empty:before, .ion-ios7-help-outline:before, .ion-ios7-home:before, .ion-ios7-home-outline:before, .ion-ios7-infinite:before, .ion-ios7-infinite-outline:before, .ion-ios7-information:before, .ion-ios7-information-empty:before, .ion-ios7-information-outline:before, .ion-ios7-ionic-outline:before, .ion-ios7-keypad:before, .ion-ios7-keypad-outline:before, .ion-ios7-lightbulb:before, .ion-ios7-lightbulb-outline:before, .ion-ios7-location:before, .ion-ios7-location-outline:before, .ion-ios7-locked:before, .ion-ios7-locked-outline:before, .ion-ios7-loop:before, .ion-ios7-loop-strong:before, .ion-ios7-medkit:before, .ion-ios7-medkit-outline:before, .ion-ios7-mic:before, .ion-ios7-mic-off:before, .ion-ios7-mic-outline:before, .ion-ios7-minus:before, .ion-ios7-minus-empty:before, .ion-ios7-minus-outline:before, .ion-ios7-monitor:before, .ion-ios7-monitor-outline:before, .ion-ios7-moon:before, .ion-ios7-moon-outline:before, .ion-ios7-more:before, .ion-ios7-more-outline:before, .ion-ios7-musical-note:before, .ion-ios7-musical-notes:before, .ion-ios7-navigate:before, .ion-ios7-navigate-outline:before, .ion-ios7-paper:before, .ion-ios7-paper-outline:before, .ion-ios7-paperplane:before, .ion-ios7-paperplane-outline:before, .ion-ios7-partlysunny:before, .ion-ios7-partlysunny-outline:before, .ion-ios7-pause:before, .ion-ios7-pause-outline:before, .ion-ios7-paw:before, .ion-ios7-paw-outline:before, .ion-ios7-people:before, .ion-ios7-people-outline:before, .ion-ios7-person:before, .ion-ios7-person-outline:before, .ion-ios7-personadd:before, .ion-ios7-personadd-outline:before, .ion-ios7-photos:before, .ion-ios7-photos-outline:before, .ion-ios7-pie:before, .ion-ios7-pie-outline:before, .ion-ios7-play:before, .ion-ios7-play-outline:before, .ion-ios7-plus:before, .ion-ios7-plus-empty:before, .ion-ios7-plus-outline:before, .ion-ios7-pricetag:before, .ion-ios7-pricetag-outline:before, .ion-ios7-pricetags:before, .ion-ios7-pricetags-outline:before, .ion-ios7-printer:before, .ion-ios7-printer-outline:before, .ion-ios7-pulse:before, .ion-ios7-pulse-strong:before, .ion-ios7-rainy:before, .ion-ios7-rainy-outline:before, .ion-ios7-recording:before, .ion-ios7-recording-outline:before, .ion-ios7-redo:before, .ion-ios7-redo-outline:before, .ion-ios7-refresh:before, .ion-ios7-refresh-empty:before, .ion-ios7-refresh-outline:before, .ion-ios7-reload:before, .ion-ios7-reloading:before, .ion-ios7-reverse-camera:before, .ion-ios7-reverse-camera-outline:before, .ion-ios7-rewind:before, .ion-ios7-rewind-outline:before, .ion-ios7-search:before, .ion-ios7-search-strong:before, .ion-ios7-settings:before, .ion-ios7-settings-strong:before, .ion-ios7-shrink:before, .ion-ios7-skipbackward:before, .ion-ios7-skipbackward-outline:before, .ion-ios7-skipforward:before, .ion-ios7-skipforward-outline:before, .ion-ios7-snowy:before, .ion-ios7-speedometer:before, .ion-ios7-speedometer-outline:before, .ion-ios7-star:before, .ion-ios7-star-half:before, .ion-ios7-star-outline:before, .ion-ios7-stopwatch:before, .ion-ios7-stopwatch-outline:before, .ion-ios7-sunny:before, .ion-ios7-sunny-outline:before, .ion-ios7-telephone:before, .ion-ios7-telephone-outline:before, .ion-ios7-tennisball:before, .ion-ios7-tennisball-outline:before, .ion-ios7-thunderstorm:before, .ion-ios7-thunderstorm-outline:before, .ion-ios7-time:before, .ion-ios7-time-outline:before, .ion-ios7-timer:before, .ion-ios7-timer-outline:before, .ion-ios7-toggle:before, .ion-ios7-toggle-outline:before, .ion-ios7-trash:before, .ion-ios7-trash-outline:before, .ion-ios7-undo:before, .ion-ios7-undo-outline:before, .ion-ios7-unlocked:before, .ion-ios7-unlocked-outline:before, .ion-ios7-upload:before, .ion-ios7-upload-outline:before, .ion-ios7-videocam:before, .ion-ios7-videocam-outline:before, .ion-ios7-volume-high:before, .ion-ios7-volume-low:before, .ion-ios7-wineglass:before, .ion-ios7-wineglass-outline:before, .ion-ios7-world:before, .ion-ios7-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-loading-a:before, .ion-load-b:before, .ion-loading-b:before, .ion-load-c:before, .ion-loading-c:before, .ion-load-d:before, .ion-loading-d:before, .ion-location:before, .ion-locked:before, .ion-log-in:before, .ion-log-out:before, .ion-loop:before, .ion-looping: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-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-refreshing:before, .ion-reply:before, .ion-reply-all:before, .ion-ribbon-a:before, .ion-ribbon-b: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:before, .ion-social-android-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-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-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-instagram:before, .ion-social-instagram-outline:before, .ion-social-linkedin:before, .ion-social-linkedin-outline:before, .ion-social-pinterest:before, .ion-social-pinterest-outline:before, .ion-social-reddit:before, .ion-social-reddit-outline:before, .ion-social-rss:before, .ion-social-rss-outline:before, .ion-social-skype:before, .ion-social-skype-outline:before, .ion-social-tumblr:before, .ion-social-tumblr-outline:before, .ion-social-tux: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-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-youtube:before, .ion-social-youtube-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-trash-a:before, .ion-trash-b:before, .ion-trophy: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 { +.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; @@ -37,52 +42,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } -.ion-spin, .ion-loading-a, .ion-loading-b, .ion-loading-c, .ion-loading-d, .ion-looping, .ion-refreshing, .ion-ios7-reloading { - -webkit-animation: spin 1s infinite linear; - -moz-animation: spin 1s infinite linear; - -o-animation: spin 1s infinite linear; - animation: spin 1s infinite linear; } - -@-moz-keyframes spin { - 0% { - -moz-transform: rotate(0deg); } - - 100% { - -moz-transform: rotate(359deg); } } - -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg); } - - 100% { - -webkit-transform: rotate(359deg); } } - -@-o-keyframes spin { - 0% { - -o-transform: rotate(0deg); } - - 100% { - -o-transform: rotate(359deg); } } - -@-ms-keyframes spin { - 0% { - -ms-transform: rotate(0deg); } - - 100% { - -ms-transform: rotate(359deg); } } - -@keyframes spin { - 0% { - transform: rotate(0deg); } - - 100% { - transform: rotate(359deg); } } - -.ion-loading-a { - -webkit-animation-timing-function: steps(8, start); - -moz-animation-timing-function: steps(8, start); - animation-timing-function: steps(8, start); } - .ion-alert:before { content: "\f101"; } @@ -92,11 +51,17 @@ .ion-android-add:before { content: "\f2c7"; } -.ion-android-add-contact:before { - content: "\f2c6"; } +.ion-android-add-circle:before { + content: "\f359"; } + +.ion-android-alarm-clock:before { + content: "\f35a"; } -.ion-android-alarm:before { - content: "\f2c8"; } +.ion-android-alert:before { + content: "\f35b"; } + +.ion-android-apps:before { + content: "\f35c"; } .ion-android-archive:before { content: "\f2c9"; } @@ -104,26 +69,59 @@ .ion-android-arrow-back:before { content: "\f2ca"; } -.ion-android-arrow-down-left:before { - content: "\f2cb"; } +.ion-android-arrow-down:before { + content: "\f35d"; } + +.ion-android-arrow-dropdown:before { + content: "\f35f"; } + +.ion-android-arrow-dropdown-circle:before { + content: "\f35e"; } + +.ion-android-arrow-dropleft:before { + content: "\f361"; } + +.ion-android-arrow-dropleft-circle:before { + content: "\f360"; } + +.ion-android-arrow-dropright:before { + content: "\f363"; } + +.ion-android-arrow-dropright-circle:before { + content: "\f362"; } + +.ion-android-arrow-dropup:before { + content: "\f365"; } -.ion-android-arrow-down-right:before { - content: "\f2cc"; } +.ion-android-arrow-dropup-circle:before { + content: "\f364"; } .ion-android-arrow-forward:before { content: "\f30f"; } -.ion-android-arrow-up-left:before { - content: "\f2cd"; } +.ion-android-arrow-up:before { + content: "\f366"; } -.ion-android-arrow-up-right:before { - content: "\f2ce"; } +.ion-android-attach:before { + content: "\f367"; } -.ion-android-battery:before { - content: "\f2cf"; } +.ion-android-bar:before { + content: "\f368"; } -.ion-android-book:before { - content: "\f2d0"; } +.ion-android-bicycle:before { + content: "\f369"; } + +.ion-android-boat:before { + content: "\f36a"; } + +.ion-android-bookmark:before { + content: "\f36b"; } + +.ion-android-bulb:before { + content: "\f36c"; } + +.ion-android-bus:before { + content: "\f36d"; } .ion-android-calendar:before { content: "\f2d1"; } @@ -134,108 +132,231 @@ .ion-android-camera:before { content: "\f2d3"; } +.ion-android-cancel:before { + content: "\f36e"; } + +.ion-android-car:before { + content: "\f36f"; } + +.ion-android-cart:before { + content: "\f370"; } + .ion-android-chat:before { content: "\f2d4"; } -.ion-android-checkmark:before { - content: "\f2d5"; } +.ion-android-checkbox:before { + content: "\f374"; } + +.ion-android-checkbox-blank:before { + content: "\f371"; } -.ion-android-clock:before { - content: "\f2d6"; } +.ion-android-checkbox-outline:before { + content: "\f373"; } + +.ion-android-checkbox-outline-blank:before { + content: "\f372"; } + +.ion-android-checkmark-circle:before { + content: "\f375"; } + +.ion-android-clipboard:before { + content: "\f376"; } .ion-android-close:before { content: "\f2d7"; } +.ion-android-cloud:before { + content: "\f37a"; } + +.ion-android-cloud-circle:before { + content: "\f377"; } + +.ion-android-cloud-done:before { + content: "\f378"; } + +.ion-android-cloud-outline:before { + content: "\f379"; } + +.ion-android-color-palette:before { + content: "\f37b"; } + +.ion-android-compass:before { + content: "\f37c"; } + .ion-android-contact:before { content: "\f2d8"; } .ion-android-contacts:before { content: "\f2d9"; } -.ion-android-data:before { - content: "\f2da"; } +.ion-android-contract:before { + content: "\f37d"; } + +.ion-android-create:before { + content: "\f37e"; } + +.ion-android-delete:before { + content: "\f37f"; } + +.ion-android-desktop:before { + content: "\f380"; } -.ion-android-developer:before { - content: "\f2db"; } +.ion-android-document:before { + content: "\f381"; } -.ion-android-display:before { - content: "\f2dc"; } +.ion-android-done:before { + content: "\f383"; } + +.ion-android-done-all:before { + content: "\f382"; } .ion-android-download:before { content: "\f2dd"; } -.ion-android-drawer:before { - content: "\f310"; } +.ion-android-drafts:before { + content: "\f384"; } + +.ion-android-exit:before { + content: "\f385"; } + +.ion-android-expand:before { + content: "\f386"; } + +.ion-android-favorite:before { + content: "\f388"; } -.ion-android-dropdown:before { - content: "\f2de"; } +.ion-android-favorite-outline:before { + content: "\f387"; } -.ion-android-earth:before { - content: "\f2df"; } +.ion-android-film:before { + content: "\f389"; } .ion-android-folder:before { content: "\f2e0"; } -.ion-android-forums:before { - content: "\f2e1"; } +.ion-android-folder-open:before { + content: "\f38a"; } -.ion-android-friends:before { - content: "\f2e2"; } +.ion-android-funnel:before { + content: "\f38b"; } + +.ion-android-globe:before { + content: "\f38c"; } .ion-android-hand:before { content: "\f2e3"; } -.ion-android-image:before { - content: "\f2e4"; } +.ion-android-hangout:before { + content: "\f38d"; } -.ion-android-inbox:before { - content: "\f2e5"; } +.ion-android-happy:before { + content: "\f38e"; } -.ion-android-information:before { - content: "\f2e6"; } +.ion-android-home:before { + content: "\f38f"; } -.ion-android-keypad:before { - content: "\f2e7"; } +.ion-android-image:before { + content: "\f2e4"; } + +.ion-android-laptop:before { + content: "\f390"; } -.ion-android-lightbulb:before { - content: "\f2e8"; } +.ion-android-list:before { + content: "\f391"; } .ion-android-locate:before { content: "\f2e9"; } -.ion-android-location:before { - content: "\f2ea"; } +.ion-android-lock:before { + content: "\f392"; } .ion-android-mail:before { content: "\f2eb"; } +.ion-android-map:before { + content: "\f393"; } + +.ion-android-menu:before { + content: "\f394"; } + .ion-android-microphone:before { content: "\f2ec"; } -.ion-android-mixer:before { - content: "\f2ed"; } +.ion-android-microphone-off:before { + content: "\f395"; } + +.ion-android-more-horizontal:before { + content: "\f396"; } + +.ion-android-more-vertical:before { + content: "\f397"; } + +.ion-android-navigate:before { + content: "\f398"; } + +.ion-android-notifications:before { + content: "\f39b"; } + +.ion-android-notifications-none:before { + content: "\f399"; } + +.ion-android-notifications-off:before { + content: "\f39a"; } + +.ion-android-open:before { + content: "\f39c"; } -.ion-android-more:before { - content: "\f2ee"; } +.ion-android-options:before { + content: "\f39d"; } -.ion-android-note:before { - content: "\f2ef"; } +.ion-android-people:before { + content: "\f39e"; } + +.ion-android-person:before { + content: "\f3a0"; } + +.ion-android-person-add:before { + content: "\f39f"; } + +.ion-android-phone-landscape:before { + content: "\f3a1"; } + +.ion-android-phone-portrait:before { + content: "\f3a2"; } + +.ion-android-pin:before { + content: "\f3a3"; } + +.ion-android-plane:before { + content: "\f3a4"; } .ion-android-playstore:before { content: "\f2f0"; } -.ion-android-printer:before { - content: "\f2f1"; } +.ion-android-print:before { + content: "\f3a5"; } -.ion-android-promotion:before { - content: "\f2f2"; } +.ion-android-radio-button-off:before { + content: "\f3a6"; } -.ion-android-reminder:before { - content: "\f2f3"; } +.ion-android-radio-button-on:before { + content: "\f3a7"; } + +.ion-android-refresh:before { + content: "\f3a8"; } .ion-android-remove:before { content: "\f2f4"; } +.ion-android-remove-circle:before { + content: "\f3a9"; } + +.ion-android-restaurant:before { + content: "\f3aa"; } + +.ion-android-sad:before { + content: "\f3ab"; } + .ion-android-search:before { content: "\f2f5"; } @@ -248,47 +369,65 @@ .ion-android-share:before { content: "\f2f8"; } -.ion-android-social:before { - content: "\f2fa"; } - -.ion-android-social-user:before { - content: "\f2f9"; } - -.ion-android-sort:before { - content: "\f2fb"; } - -.ion-android-stair-drawer:before { - content: "\f311"; } +.ion-android-share-alt:before { + content: "\f3ac"; } .ion-android-star:before { content: "\f2fc"; } +.ion-android-star-half:before { + content: "\f3ad"; } + +.ion-android-star-outline:before { + content: "\f3ae"; } + .ion-android-stopwatch:before { content: "\f2fd"; } -.ion-android-storage:before { - content: "\f2fe"; } +.ion-android-subway:before { + content: "\f3af"; } + +.ion-android-sunny:before { + content: "\f3b0"; } -.ion-android-system-back:before { - content: "\f2ff"; } +.ion-android-sync:before { + content: "\f3b1"; } -.ion-android-system-home:before { - content: "\f300"; } +.ion-android-textsms:before { + content: "\f3b2"; } -.ion-android-system-windows:before { - content: "\f301"; } +.ion-android-time:before { + content: "\f3b3"; } -.ion-android-timer:before { - content: "\f302"; } +.ion-android-train:before { + content: "\f3b4"; } -.ion-android-trash:before { - content: "\f303"; } +.ion-android-unlock:before { + content: "\f3b5"; } -.ion-android-user-menu:before { - content: "\f312"; } +.ion-android-upload:before { + content: "\f3b6"; } -.ion-android-volume:before { - content: "\f304"; } +.ion-android-volume-down:before { + content: "\f3b7"; } + +.ion-android-volume-mute:before { + content: "\f3b8"; } + +.ion-android-volume-off:before { + content: "\f3b9"; } + +.ion-android-volume-up:before { + content: "\f3ba"; } + +.ion-android-walk:before { + content: "\f3bb"; } + +.ion-android-warning:before { + content: "\f3bc"; } + +.ion-android-watch:before { + content: "\f3bd"; } .ion-android-wifi:before { content: "\f305"; } @@ -374,6 +513,12 @@ .ion-at:before { content: "\f10f"; } +.ion-backspace:before { + content: "\f3bf"; } + +.ion-backspace-outline:before { + content: "\f3be"; } + .ion-bag:before { content: "\f110"; } @@ -407,6 +552,9 @@ .ion-bookmark:before { content: "\f26b"; } +.ion-bowtie:before { + content: "\f3c0"; } + .ion-briefcase:before { content: "\f26c"; } @@ -512,6 +660,9 @@ .ion-contrast:before { content: "\f275"; } +.ion-crop:before { + content: "\f3c1"; } + .ion-cube:before { content: "\f318"; } @@ -530,6 +681,9 @@ .ion-earth:before { content: "\f276"; } +.ion-easel:before { + content: "\f3c2"; } + .ion-edit:before { content: "\f2bf"; } @@ -542,6 +696,15 @@ .ion-email:before { content: "\f132"; } +.ion-email-unread:before { + content: "\f3c3"; } + +.ion-erlenmeyer-flask:before { + content: "\f3c5"; } + +.ion-erlenmeyer-flask-bubbles:before { + content: "\f3c4"; } + .ion-eye:before { content: "\f133"; } @@ -572,9 +735,6 @@ .ion-flash-off:before { content: "\f136"; } -.ion-flask:before { - content: "\f138"; } - .ion-folder:before { content: "\f139"; } @@ -590,12 +750,6 @@ .ion-funnel:before { content: "\f31b"; } -.ion-game-controller-a:before { - content: "\f13b"; } - -.ion-game-controller-b:before { - content: "\f13c"; } - .ion-gear-a:before { content: "\f13d"; } @@ -611,6 +765,9 @@ .ion-happy:before { content: "\f31c"; } +.ion-happy-outline:before { + content: "\f3c6"; } + .ion-headphone:before { content: "\f140"; } @@ -635,12 +792,6 @@ .ion-icecream:before { content: "\f27d"; } -.ion-icon-social-google-plus:before { - content: "\f146"; } - -.ion-icon-social-google-plus-outline:before { - content: "\f145"; } - .ion-image:before { content: "\f147"; } @@ -656,716 +807,812 @@ .ion-ionic:before { content: "\f14b"; } -.ion-ios7-alarm:before { - content: "\f14d"; } +.ion-ios-alarm:before { + content: "\f3c8"; } + +.ion-ios-alarm-outline:before { + content: "\f3c7"; } + +.ion-ios-albums:before { + content: "\f3ca"; } + +.ion-ios-albums-outline:before { + content: "\f3c9"; } + +.ion-ios-americanfootball:before { + content: "\f3cc"; } + +.ion-ios-americanfootball-outline:before { + content: "\f3cb"; } + +.ion-ios-analytics:before { + content: "\f3ce"; } + +.ion-ios-analytics-outline:before { + content: "\f3cd"; } + +.ion-ios-arrow-back:before { + content: "\f3cf"; } + +.ion-ios-arrow-down:before { + content: "\f3d0"; } + +.ion-ios-arrow-forward:before { + content: "\f3d1"; } + +.ion-ios-arrow-left:before { + content: "\f3d2"; } + +.ion-ios-arrow-right:before { + content: "\f3d3"; } + +.ion-ios-arrow-thin-down:before { + content: "\f3d4"; } + +.ion-ios-arrow-thin-left:before { + content: "\f3d5"; } + +.ion-ios-arrow-thin-right:before { + content: "\f3d6"; } + +.ion-ios-arrow-thin-up:before { + content: "\f3d7"; } + +.ion-ios-arrow-up:before { + content: "\f3d8"; } + +.ion-ios-at:before { + content: "\f3da"; } -.ion-ios7-alarm-outline:before { - content: "\f14c"; } +.ion-ios-at-outline:before { + content: "\f3d9"; } -.ion-ios7-albums:before { - content: "\f14f"; } +.ion-ios-barcode:before { + content: "\f3dc"; } -.ion-ios7-albums-outline:before { - content: "\f14e"; } +.ion-ios-barcode-outline:before { + content: "\f3db"; } -.ion-ios7-americanfootball:before { - content: "\f31f"; } +.ion-ios-baseball:before { + content: "\f3de"; } -.ion-ios7-americanfootball-outline:before { - content: "\f31e"; } +.ion-ios-baseball-outline:before { + content: "\f3dd"; } -.ion-ios7-analytics:before { - content: "\f321"; } +.ion-ios-basketball:before { + content: "\f3e0"; } -.ion-ios7-analytics-outline:before { - content: "\f320"; } +.ion-ios-basketball-outline:before { + content: "\f3df"; } -.ion-ios7-arrow-back:before { - content: "\f150"; } +.ion-ios-bell:before { + content: "\f3e2"; } -.ion-ios7-arrow-down:before { - content: "\f151"; } +.ion-ios-bell-outline:before { + content: "\f3e1"; } -.ion-ios7-arrow-forward:before { - content: "\f152"; } +.ion-ios-body:before { + content: "\f3e4"; } -.ion-ios7-arrow-left:before { - content: "\f153"; } +.ion-ios-body-outline:before { + content: "\f3e3"; } -.ion-ios7-arrow-right:before { - content: "\f154"; } +.ion-ios-bolt:before { + content: "\f3e6"; } -.ion-ios7-arrow-thin-down:before { - content: "\f27e"; } +.ion-ios-bolt-outline:before { + content: "\f3e5"; } -.ion-ios7-arrow-thin-left:before { - content: "\f27f"; } +.ion-ios-book:before { + content: "\f3e8"; } -.ion-ios7-arrow-thin-right:before { - content: "\f280"; } +.ion-ios-book-outline:before { + content: "\f3e7"; } -.ion-ios7-arrow-thin-up:before { - content: "\f281"; } +.ion-ios-bookmarks:before { + content: "\f3ea"; } -.ion-ios7-arrow-up:before { - content: "\f155"; } +.ion-ios-bookmarks-outline:before { + content: "\f3e9"; } -.ion-ios7-at:before { - content: "\f157"; } +.ion-ios-box:before { + content: "\f3ec"; } -.ion-ios7-at-outline:before { - content: "\f156"; } +.ion-ios-box-outline:before { + content: "\f3eb"; } -.ion-ios7-barcode:before { - content: "\f323"; } +.ion-ios-briefcase:before { + content: "\f3ee"; } -.ion-ios7-barcode-outline:before { - content: "\f322"; } +.ion-ios-briefcase-outline:before { + content: "\f3ed"; } -.ion-ios7-baseball:before { - content: "\f325"; } +.ion-ios-browsers:before { + content: "\f3f0"; } -.ion-ios7-baseball-outline:before { - content: "\f324"; } +.ion-ios-browsers-outline:before { + content: "\f3ef"; } -.ion-ios7-basketball:before { - content: "\f327"; } +.ion-ios-calculator:before { + content: "\f3f2"; } -.ion-ios7-basketball-outline:before { - content: "\f326"; } +.ion-ios-calculator-outline:before { + content: "\f3f1"; } -.ion-ios7-bell:before { - content: "\f159"; } +.ion-ios-calendar:before { + content: "\f3f4"; } -.ion-ios7-bell-outline:before { - content: "\f158"; } +.ion-ios-calendar-outline:before { + content: "\f3f3"; } -.ion-ios7-bolt:before { - content: "\f15b"; } +.ion-ios-camera:before { + content: "\f3f6"; } -.ion-ios7-bolt-outline:before { - content: "\f15a"; } +.ion-ios-camera-outline:before { + content: "\f3f5"; } -.ion-ios7-bookmarks:before { - content: "\f15d"; } +.ion-ios-cart:before { + content: "\f3f8"; } -.ion-ios7-bookmarks-outline:before { - content: "\f15c"; } +.ion-ios-cart-outline:before { + content: "\f3f7"; } -.ion-ios7-box:before { - content: "\f15f"; } +.ion-ios-chatboxes:before { + content: "\f3fa"; } -.ion-ios7-box-outline:before { - content: "\f15e"; } +.ion-ios-chatboxes-outline:before { + content: "\f3f9"; } -.ion-ios7-briefcase:before { - content: "\f283"; } +.ion-ios-chatbubble:before { + content: "\f3fc"; } -.ion-ios7-briefcase-outline:before { - content: "\f282"; } +.ion-ios-chatbubble-outline:before { + content: "\f3fb"; } -.ion-ios7-browsers:before { - content: "\f161"; } +.ion-ios-checkmark:before { + content: "\f3ff"; } -.ion-ios7-browsers-outline:before { - content: "\f160"; } +.ion-ios-checkmark-empty:before { + content: "\f3fd"; } -.ion-ios7-calculator:before { - content: "\f285"; } +.ion-ios-checkmark-outline:before { + content: "\f3fe"; } -.ion-ios7-calculator-outline:before { - content: "\f284"; } +.ion-ios-circle-filled:before { + content: "\f400"; } -.ion-ios7-calendar:before { - content: "\f163"; } +.ion-ios-circle-outline:before { + content: "\f401"; } -.ion-ios7-calendar-outline:before { - content: "\f162"; } +.ion-ios-clock:before { + content: "\f403"; } -.ion-ios7-camera:before { - content: "\f165"; } +.ion-ios-clock-outline:before { + content: "\f402"; } -.ion-ios7-camera-outline:before { - content: "\f164"; } +.ion-ios-close:before { + content: "\f406"; } -.ion-ios7-cart:before { - content: "\f167"; } +.ion-ios-close-empty:before { + content: "\f404"; } -.ion-ios7-cart-outline:before { - content: "\f166"; } +.ion-ios-close-outline:before { + content: "\f405"; } -.ion-ios7-chatboxes:before { - content: "\f169"; } +.ion-ios-cloud:before { + content: "\f40c"; } -.ion-ios7-chatboxes-outline:before { - content: "\f168"; } +.ion-ios-cloud-download:before { + content: "\f408"; } -.ion-ios7-chatbubble:before { - content: "\f16b"; } +.ion-ios-cloud-download-outline:before { + content: "\f407"; } -.ion-ios7-chatbubble-outline:before { - content: "\f16a"; } +.ion-ios-cloud-outline:before { + content: "\f409"; } -.ion-ios7-checkmark:before { - content: "\f16e"; } +.ion-ios-cloud-upload:before { + content: "\f40b"; } -.ion-ios7-checkmark-empty:before { - content: "\f16c"; } +.ion-ios-cloud-upload-outline:before { + content: "\f40a"; } -.ion-ios7-checkmark-outline:before { - content: "\f16d"; } +.ion-ios-cloudy:before { + content: "\f410"; } -.ion-ios7-circle-filled:before { - content: "\f16f"; } +.ion-ios-cloudy-night:before { + content: "\f40e"; } -.ion-ios7-circle-outline:before { - content: "\f170"; } +.ion-ios-cloudy-night-outline:before { + content: "\f40d"; } -.ion-ios7-clock:before { - content: "\f172"; } +.ion-ios-cloudy-outline:before { + content: "\f40f"; } -.ion-ios7-clock-outline:before { - content: "\f171"; } +.ion-ios-cog:before { + content: "\f412"; } -.ion-ios7-close:before { - content: "\f2bc"; } +.ion-ios-cog-outline:before { + content: "\f411"; } -.ion-ios7-close-empty:before { - content: "\f2bd"; } +.ion-ios-color-filter:before { + content: "\f414"; } -.ion-ios7-close-outline:before { - content: "\f2bb"; } +.ion-ios-color-filter-outline:before { + content: "\f413"; } -.ion-ios7-cloud:before { - content: "\f178"; } +.ion-ios-color-wand:before { + content: "\f416"; } -.ion-ios7-cloud-download:before { - content: "\f174"; } +.ion-ios-color-wand-outline:before { + content: "\f415"; } -.ion-ios7-cloud-download-outline:before { - content: "\f173"; } +.ion-ios-compose:before { + content: "\f418"; } -.ion-ios7-cloud-outline:before { - content: "\f175"; } +.ion-ios-compose-outline:before { + content: "\f417"; } -.ion-ios7-cloud-upload:before { - content: "\f177"; } +.ion-ios-contact:before { + content: "\f41a"; } -.ion-ios7-cloud-upload-outline:before { - content: "\f176"; } +.ion-ios-contact-outline:before { + content: "\f419"; } -.ion-ios7-cloudy:before { - content: "\f17a"; } +.ion-ios-copy:before { + content: "\f41c"; } -.ion-ios7-cloudy-night:before { - content: "\f308"; } +.ion-ios-copy-outline:before { + content: "\f41b"; } -.ion-ios7-cloudy-night-outline:before { - content: "\f307"; } +.ion-ios-crop:before { + content: "\f41e"; } -.ion-ios7-cloudy-outline:before { - content: "\f179"; } +.ion-ios-crop-strong:before { + content: "\f41d"; } -.ion-ios7-cog:before { - content: "\f17c"; } +.ion-ios-download:before { + content: "\f420"; } -.ion-ios7-cog-outline:before { - content: "\f17b"; } +.ion-ios-download-outline:before { + content: "\f41f"; } -.ion-ios7-compose:before { - content: "\f17e"; } +.ion-ios-drag:before { + content: "\f421"; } -.ion-ios7-compose-outline:before { - content: "\f17d"; } +.ion-ios-email:before { + content: "\f423"; } -.ion-ios7-contact:before { - content: "\f180"; } +.ion-ios-email-outline:before { + content: "\f422"; } -.ion-ios7-contact-outline:before { - content: "\f17f"; } +.ion-ios-eye:before { + content: "\f425"; } -.ion-ios7-copy:before { - content: "\f182"; } +.ion-ios-eye-outline:before { + content: "\f424"; } -.ion-ios7-copy-outline:before { - content: "\f181"; } +.ion-ios-fastforward:before { + content: "\f427"; } -.ion-ios7-download:before { - content: "\f184"; } +.ion-ios-fastforward-outline:before { + content: "\f426"; } -.ion-ios7-download-outline:before { - content: "\f183"; } +.ion-ios-filing:before { + content: "\f429"; } -.ion-ios7-drag:before { - content: "\f185"; } +.ion-ios-filing-outline:before { + content: "\f428"; } -.ion-ios7-email:before { - content: "\f187"; } +.ion-ios-film:before { + content: "\f42b"; } -.ion-ios7-email-outline:before { - content: "\f186"; } +.ion-ios-film-outline:before { + content: "\f42a"; } -.ion-ios7-expand:before { - content: "\f30d"; } +.ion-ios-flag:before { + content: "\f42d"; } -.ion-ios7-eye:before { - content: "\f189"; } +.ion-ios-flag-outline:before { + content: "\f42c"; } -.ion-ios7-eye-outline:before { - content: "\f188"; } +.ion-ios-flame:before { + content: "\f42f"; } -.ion-ios7-fastforward:before { - content: "\f18b"; } +.ion-ios-flame-outline:before { + content: "\f42e"; } -.ion-ios7-fastforward-outline:before { - content: "\f18a"; } +.ion-ios-flask:before { + content: "\f431"; } -.ion-ios7-filing:before { - content: "\f18d"; } +.ion-ios-flask-outline:before { + content: "\f430"; } -.ion-ios7-filing-outline:before { - content: "\f18c"; } +.ion-ios-flower:before { + content: "\f433"; } -.ion-ios7-film:before { - content: "\f18f"; } +.ion-ios-flower-outline:before { + content: "\f432"; } -.ion-ios7-film-outline:before { - content: "\f18e"; } +.ion-ios-folder:before { + content: "\f435"; } -.ion-ios7-flag:before { - content: "\f191"; } +.ion-ios-folder-outline:before { + content: "\f434"; } -.ion-ios7-flag-outline:before { - content: "\f190"; } +.ion-ios-football:before { + content: "\f437"; } -.ion-ios7-folder:before { - content: "\f193"; } +.ion-ios-football-outline:before { + content: "\f436"; } -.ion-ios7-folder-outline:before { - content: "\f192"; } +.ion-ios-game-controller-a:before { + content: "\f439"; } -.ion-ios7-football:before { - content: "\f329"; } +.ion-ios-game-controller-a-outline:before { + content: "\f438"; } -.ion-ios7-football-outline:before { - content: "\f328"; } +.ion-ios-game-controller-b:before { + content: "\f43b"; } -.ion-ios7-gear:before { - content: "\f195"; } +.ion-ios-game-controller-b-outline:before { + content: "\f43a"; } -.ion-ios7-gear-outline:before { - content: "\f194"; } +.ion-ios-gear:before { + content: "\f43d"; } -.ion-ios7-glasses:before { - content: "\f197"; } +.ion-ios-gear-outline:before { + content: "\f43c"; } -.ion-ios7-glasses-outline:before { - content: "\f196"; } +.ion-ios-glasses:before { + content: "\f43f"; } -.ion-ios7-heart:before { - content: "\f199"; } +.ion-ios-glasses-outline:before { + content: "\f43e"; } -.ion-ios7-heart-outline:before { - content: "\f198"; } +.ion-ios-grid-view:before { + content: "\f441"; } -.ion-ios7-help:before { - content: "\f19c"; } +.ion-ios-grid-view-outline:before { + content: "\f440"; } -.ion-ios7-help-empty:before { - content: "\f19a"; } +.ion-ios-heart:before { + content: "\f443"; } -.ion-ios7-help-outline:before { - content: "\f19b"; } +.ion-ios-heart-outline:before { + content: "\f442"; } -.ion-ios7-home:before { - content: "\f32b"; } +.ion-ios-help:before { + content: "\f446"; } -.ion-ios7-home-outline:before { - content: "\f32a"; } +.ion-ios-help-empty:before { + content: "\f444"; } -.ion-ios7-infinite:before { - content: "\f19e"; } +.ion-ios-help-outline:before { + content: "\f445"; } -.ion-ios7-infinite-outline:before { - content: "\f19d"; } +.ion-ios-home:before { + content: "\f448"; } -.ion-ios7-information:before { - content: "\f1a1"; } +.ion-ios-home-outline:before { + content: "\f447"; } -.ion-ios7-information-empty:before { - content: "\f19f"; } +.ion-ios-infinite:before { + content: "\f44a"; } -.ion-ios7-information-outline:before { - content: "\f1a0"; } +.ion-ios-infinite-outline:before { + content: "\f449"; } -.ion-ios7-ionic-outline:before { - content: "\f1a2"; } +.ion-ios-information:before { + content: "\f44d"; } -.ion-ios7-keypad:before { - content: "\f1a4"; } +.ion-ios-information-empty:before { + content: "\f44b"; } -.ion-ios7-keypad-outline:before { - content: "\f1a3"; } +.ion-ios-information-outline:before { + content: "\f44c"; } -.ion-ios7-lightbulb:before { - content: "\f287"; } +.ion-ios-ionic-outline:before { + content: "\f44e"; } -.ion-ios7-lightbulb-outline:before { - content: "\f286"; } +.ion-ios-keypad:before { + content: "\f450"; } -.ion-ios7-location:before { - content: "\f1a6"; } +.ion-ios-keypad-outline:before { + content: "\f44f"; } -.ion-ios7-location-outline:before { - content: "\f1a5"; } +.ion-ios-lightbulb:before { + content: "\f452"; } -.ion-ios7-locked:before { - content: "\f1a8"; } +.ion-ios-lightbulb-outline:before { + content: "\f451"; } -.ion-ios7-locked-outline:before { - content: "\f1a7"; } +.ion-ios-list:before { + content: "\f454"; } -.ion-ios7-loop:before { - content: "\f32d"; } +.ion-ios-list-outline:before { + content: "\f453"; } -.ion-ios7-loop-strong:before { - content: "\f32c"; } +.ion-ios-location:before { + content: "\f456"; } -.ion-ios7-medkit:before { - content: "\f289"; } +.ion-ios-location-outline:before { + content: "\f455"; } -.ion-ios7-medkit-outline:before { - content: "\f288"; } +.ion-ios-locked:before { + content: "\f458"; } -.ion-ios7-mic:before { - content: "\f1ab"; } +.ion-ios-locked-outline:before { + content: "\f457"; } -.ion-ios7-mic-off:before { - content: "\f1a9"; } +.ion-ios-loop:before { + content: "\f45a"; } -.ion-ios7-mic-outline:before { - content: "\f1aa"; } +.ion-ios-loop-strong:before { + content: "\f459"; } -.ion-ios7-minus:before { - content: "\f1ae"; } +.ion-ios-medical:before { + content: "\f45c"; } -.ion-ios7-minus-empty:before { - content: "\f1ac"; } +.ion-ios-medical-outline:before { + content: "\f45b"; } -.ion-ios7-minus-outline:before { - content: "\f1ad"; } +.ion-ios-medkit:before { + content: "\f45e"; } -.ion-ios7-monitor:before { - content: "\f1b0"; } +.ion-ios-medkit-outline:before { + content: "\f45d"; } -.ion-ios7-monitor-outline:before { - content: "\f1af"; } +.ion-ios-mic:before { + content: "\f461"; } -.ion-ios7-moon:before { - content: "\f1b2"; } +.ion-ios-mic-off:before { + content: "\f45f"; } -.ion-ios7-moon-outline:before { - content: "\f1b1"; } +.ion-ios-mic-outline:before { + content: "\f460"; } -.ion-ios7-more:before { - content: "\f1b4"; } +.ion-ios-minus:before { + content: "\f464"; } -.ion-ios7-more-outline:before { - content: "\f1b3"; } +.ion-ios-minus-empty:before { + content: "\f462"; } -.ion-ios7-musical-note:before { - content: "\f1b5"; } +.ion-ios-minus-outline:before { + content: "\f463"; } -.ion-ios7-musical-notes:before { - content: "\f1b6"; } +.ion-ios-monitor:before { + content: "\f466"; } -.ion-ios7-navigate:before { - content: "\f1b8"; } +.ion-ios-monitor-outline:before { + content: "\f465"; } -.ion-ios7-navigate-outline:before { - content: "\f1b7"; } +.ion-ios-moon:before { + content: "\f468"; } -.ion-ios7-paper:before { - content: "\f32f"; } +.ion-ios-moon-outline:before { + content: "\f467"; } -.ion-ios7-paper-outline:before { - content: "\f32e"; } +.ion-ios-more:before { + content: "\f46a"; } -.ion-ios7-paperplane:before { - content: "\f1ba"; } +.ion-ios-more-outline:before { + content: "\f469"; } -.ion-ios7-paperplane-outline:before { - content: "\f1b9"; } +.ion-ios-musical-note:before { + content: "\f46b"; } -.ion-ios7-partlysunny:before { - content: "\f1bc"; } +.ion-ios-musical-notes:before { + content: "\f46c"; } -.ion-ios7-partlysunny-outline:before { - content: "\f1bb"; } +.ion-ios-navigate:before { + content: "\f46e"; } -.ion-ios7-pause:before { - content: "\f1be"; } +.ion-ios-navigate-outline:before { + content: "\f46d"; } -.ion-ios7-pause-outline:before { - content: "\f1bd"; } +.ion-ios-nutrition:before { + content: "\f470"; } -.ion-ios7-paw:before { - content: "\f331"; } +.ion-ios-nutrition-outline:before { + content: "\f46f"; } -.ion-ios7-paw-outline:before { - content: "\f330"; } +.ion-ios-paper:before { + content: "\f472"; } -.ion-ios7-people:before { - content: "\f1c0"; } +.ion-ios-paper-outline:before { + content: "\f471"; } -.ion-ios7-people-outline:before { - content: "\f1bf"; } +.ion-ios-paperplane:before { + content: "\f474"; } -.ion-ios7-person:before { - content: "\f1c2"; } +.ion-ios-paperplane-outline:before { + content: "\f473"; } -.ion-ios7-person-outline:before { - content: "\f1c1"; } +.ion-ios-partlysunny:before { + content: "\f476"; } -.ion-ios7-personadd:before { - content: "\f1c4"; } +.ion-ios-partlysunny-outline:before { + content: "\f475"; } -.ion-ios7-personadd-outline:before { - content: "\f1c3"; } +.ion-ios-pause:before { + content: "\f478"; } -.ion-ios7-photos:before { - content: "\f1c6"; } +.ion-ios-pause-outline:before { + content: "\f477"; } -.ion-ios7-photos-outline:before { - content: "\f1c5"; } +.ion-ios-paw:before { + content: "\f47a"; } -.ion-ios7-pie:before { - content: "\f28b"; } +.ion-ios-paw-outline:before { + content: "\f479"; } -.ion-ios7-pie-outline:before { - content: "\f28a"; } +.ion-ios-people:before { + content: "\f47c"; } -.ion-ios7-play:before { - content: "\f1c8"; } +.ion-ios-people-outline:before { + content: "\f47b"; } -.ion-ios7-play-outline:before { - content: "\f1c7"; } +.ion-ios-person:before { + content: "\f47e"; } -.ion-ios7-plus:before { - content: "\f1cb"; } +.ion-ios-person-outline:before { + content: "\f47d"; } -.ion-ios7-plus-empty:before { - content: "\f1c9"; } +.ion-ios-personadd:before { + content: "\f480"; } -.ion-ios7-plus-outline:before { - content: "\f1ca"; } +.ion-ios-personadd-outline:before { + content: "\f47f"; } -.ion-ios7-pricetag:before { - content: "\f28d"; } +.ion-ios-photos:before { + content: "\f482"; } -.ion-ios7-pricetag-outline:before { - content: "\f28c"; } +.ion-ios-photos-outline:before { + content: "\f481"; } -.ion-ios7-pricetags:before { - content: "\f333"; } +.ion-ios-pie:before { + content: "\f484"; } -.ion-ios7-pricetags-outline:before { - content: "\f332"; } +.ion-ios-pie-outline:before { + content: "\f483"; } -.ion-ios7-printer:before { - content: "\f1cd"; } +.ion-ios-pint:before { + content: "\f486"; } -.ion-ios7-printer-outline:before { - content: "\f1cc"; } +.ion-ios-pint-outline:before { + content: "\f485"; } -.ion-ios7-pulse:before { - content: "\f335"; } +.ion-ios-play:before { + content: "\f488"; } -.ion-ios7-pulse-strong:before { - content: "\f334"; } +.ion-ios-play-outline:before { + content: "\f487"; } -.ion-ios7-rainy:before { - content: "\f1cf"; } +.ion-ios-plus:before { + content: "\f48b"; } -.ion-ios7-rainy-outline:before { - content: "\f1ce"; } +.ion-ios-plus-empty:before { + content: "\f489"; } -.ion-ios7-recording:before { - content: "\f1d1"; } +.ion-ios-plus-outline:before { + content: "\f48a"; } -.ion-ios7-recording-outline:before { - content: "\f1d0"; } +.ion-ios-pricetag:before { + content: "\f48d"; } -.ion-ios7-redo:before { - content: "\f1d3"; } +.ion-ios-pricetag-outline:before { + content: "\f48c"; } -.ion-ios7-redo-outline:before { - content: "\f1d2"; } +.ion-ios-pricetags:before { + content: "\f48f"; } -.ion-ios7-refresh:before { - content: "\f1d6"; } +.ion-ios-pricetags-outline:before { + content: "\f48e"; } -.ion-ios7-refresh-empty:before { - content: "\f1d4"; } +.ion-ios-printer:before { + content: "\f491"; } -.ion-ios7-refresh-outline:before { - content: "\f1d5"; } +.ion-ios-printer-outline:before { + content: "\f490"; } -.ion-ios7-reload:before, .ion-ios7-reloading:before { - content: "\f28e"; } +.ion-ios-pulse:before { + content: "\f493"; } -.ion-ios7-reverse-camera:before { - content: "\f337"; } +.ion-ios-pulse-strong:before { + content: "\f492"; } -.ion-ios7-reverse-camera-outline:before { - content: "\f336"; } +.ion-ios-rainy:before { + content: "\f495"; } -.ion-ios7-rewind:before { - content: "\f1d8"; } +.ion-ios-rainy-outline:before { + content: "\f494"; } -.ion-ios7-rewind-outline:before { - content: "\f1d7"; } +.ion-ios-recording:before { + content: "\f497"; } -.ion-ios7-search:before { - content: "\f1da"; } +.ion-ios-recording-outline:before { + content: "\f496"; } -.ion-ios7-search-strong:before { - content: "\f1d9"; } +.ion-ios-redo:before { + content: "\f499"; } -.ion-ios7-settings:before { - content: "\f339"; } +.ion-ios-redo-outline:before { + content: "\f498"; } -.ion-ios7-settings-strong:before { - content: "\f338"; } +.ion-ios-refresh:before { + content: "\f49c"; } -.ion-ios7-shrink:before { - content: "\f30e"; } +.ion-ios-refresh-empty:before { + content: "\f49a"; } -.ion-ios7-skipbackward:before { - content: "\f1dc"; } +.ion-ios-refresh-outline:before { + content: "\f49b"; } -.ion-ios7-skipbackward-outline:before { - content: "\f1db"; } +.ion-ios-reload:before { + content: "\f49d"; } -.ion-ios7-skipforward:before { - content: "\f1de"; } +.ion-ios-reverse-camera:before { + content: "\f49f"; } -.ion-ios7-skipforward-outline:before { - content: "\f1dd"; } +.ion-ios-reverse-camera-outline:before { + content: "\f49e"; } -.ion-ios7-snowy:before { - content: "\f309"; } +.ion-ios-rewind:before { + content: "\f4a1"; } -.ion-ios7-speedometer:before { - content: "\f290"; } +.ion-ios-rewind-outline:before { + content: "\f4a0"; } -.ion-ios7-speedometer-outline:before { - content: "\f28f"; } +.ion-ios-rose:before { + content: "\f4a3"; } -.ion-ios7-star:before { - content: "\f1e0"; } +.ion-ios-rose-outline:before { + content: "\f4a2"; } -.ion-ios7-star-half:before { - content: "\f33a"; } +.ion-ios-search:before { + content: "\f4a5"; } -.ion-ios7-star-outline:before { - content: "\f1df"; } +.ion-ios-search-strong:before { + content: "\f4a4"; } -.ion-ios7-stopwatch:before { - content: "\f1e2"; } +.ion-ios-settings:before { + content: "\f4a7"; } -.ion-ios7-stopwatch-outline:before { - content: "\f1e1"; } +.ion-ios-settings-strong:before { + content: "\f4a6"; } -.ion-ios7-sunny:before { - content: "\f1e4"; } +.ion-ios-shuffle:before { + content: "\f4a9"; } -.ion-ios7-sunny-outline:before { - content: "\f1e3"; } +.ion-ios-shuffle-strong:before { + content: "\f4a8"; } -.ion-ios7-telephone:before { - content: "\f1e6"; } +.ion-ios-skipbackward:before { + content: "\f4ab"; } -.ion-ios7-telephone-outline:before { - content: "\f1e5"; } +.ion-ios-skipbackward-outline:before { + content: "\f4aa"; } -.ion-ios7-tennisball:before { - content: "\f33c"; } +.ion-ios-skipforward:before { + content: "\f4ad"; } -.ion-ios7-tennisball-outline:before { - content: "\f33b"; } +.ion-ios-skipforward-outline:before { + content: "\f4ac"; } -.ion-ios7-thunderstorm:before { - content: "\f1e8"; } +.ion-ios-snowy:before { + content: "\f4ae"; } -.ion-ios7-thunderstorm-outline:before { - content: "\f1e7"; } +.ion-ios-speedometer:before { + content: "\f4b0"; } -.ion-ios7-time:before { - content: "\f292"; } +.ion-ios-speedometer-outline:before { + content: "\f4af"; } -.ion-ios7-time-outline:before { - content: "\f291"; } +.ion-ios-star:before { + content: "\f4b3"; } -.ion-ios7-timer:before { - content: "\f1ea"; } +.ion-ios-star-half:before { + content: "\f4b1"; } -.ion-ios7-timer-outline:before { - content: "\f1e9"; } +.ion-ios-star-outline:before { + content: "\f4b2"; } -.ion-ios7-toggle:before { - content: "\f33e"; } +.ion-ios-stopwatch:before { + content: "\f4b5"; } -.ion-ios7-toggle-outline:before { - content: "\f33d"; } +.ion-ios-stopwatch-outline:before { + content: "\f4b4"; } -.ion-ios7-trash:before { - content: "\f1ec"; } +.ion-ios-sunny:before { + content: "\f4b7"; } -.ion-ios7-trash-outline:before { - content: "\f1eb"; } +.ion-ios-sunny-outline:before { + content: "\f4b6"; } -.ion-ios7-undo:before { - content: "\f1ee"; } +.ion-ios-telephone:before { + content: "\f4b9"; } -.ion-ios7-undo-outline:before { - content: "\f1ed"; } +.ion-ios-telephone-outline:before { + content: "\f4b8"; } -.ion-ios7-unlocked:before { - content: "\f1f0"; } +.ion-ios-tennisball:before { + content: "\f4bb"; } -.ion-ios7-unlocked-outline:before { - content: "\f1ef"; } +.ion-ios-tennisball-outline:before { + content: "\f4ba"; } -.ion-ios7-upload:before { - content: "\f1f2"; } +.ion-ios-thunderstorm:before { + content: "\f4bd"; } -.ion-ios7-upload-outline:before { - content: "\f1f1"; } +.ion-ios-thunderstorm-outline:before { + content: "\f4bc"; } -.ion-ios7-videocam:before { - content: "\f1f4"; } +.ion-ios-time:before { + content: "\f4bf"; } -.ion-ios7-videocam-outline:before { - content: "\f1f3"; } +.ion-ios-time-outline:before { + content: "\f4be"; } -.ion-ios7-volume-high:before { - content: "\f1f5"; } +.ion-ios-timer:before { + content: "\f4c1"; } -.ion-ios7-volume-low:before { - content: "\f1f6"; } +.ion-ios-timer-outline:before { + content: "\f4c0"; } -.ion-ios7-wineglass:before { - content: "\f294"; } +.ion-ios-toggle:before { + content: "\f4c3"; } -.ion-ios7-wineglass-outline:before { - content: "\f293"; } +.ion-ios-toggle-outline:before { + content: "\f4c2"; } -.ion-ios7-world:before { - content: "\f1f8"; } +.ion-ios-trash:before { + content: "\f4c5"; } -.ion-ios7-world-outline:before { - content: "\f1f7"; } +.ion-ios-trash-outline:before { + content: "\f4c4"; } + +.ion-ios-undo:before { + content: "\f4c7"; } + +.ion-ios-undo-outline:before { + content: "\f4c6"; } + +.ion-ios-unlocked:before { + content: "\f4c9"; } + +.ion-ios-unlocked-outline:before { + content: "\f4c8"; } + +.ion-ios-upload:before { + content: "\f4cb"; } + +.ion-ios-upload-outline:before { + content: "\f4ca"; } + +.ion-ios-videocam:before { + content: "\f4cd"; } + +.ion-ios-videocam-outline:before { + content: "\f4cc"; } + +.ion-ios-volume-high:before { + content: "\f4ce"; } + +.ion-ios-volume-low:before { + content: "\f4cf"; } + +.ion-ios-wineglass:before { + content: "\f4d1"; } + +.ion-ios-wineglass-outline:before { + content: "\f4d0"; } + +.ion-ios-world:before { + content: "\f4d3"; } + +.ion-ios-world-outline:before { + content: "\f4d2"; } .ion-ipad:before { content: "\f1f9"; } @@ -1400,21 +1647,24 @@ .ion-link:before { content: "\f1fe"; } -.ion-load-a:before, .ion-loading-a:before { +.ion-load-a:before { content: "\f29a"; } -.ion-load-b:before, .ion-loading-b:before { +.ion-load-b:before { content: "\f29b"; } -.ion-load-c:before, .ion-loading-c:before { +.ion-load-c:before { content: "\f29c"; } -.ion-load-d:before, .ion-loading-d:before { +.ion-load-d:before { content: "\f29d"; } .ion-location:before { content: "\f1ff"; } +.ion-lock-combination:before { + content: "\f4d4"; } + .ion-locked:before { content: "\f200"; } @@ -1424,7 +1674,7 @@ .ion-log-out:before { content: "\f29f"; } -.ion-loop:before, .ion-looping:before { +.ion-loop:before { content: "\f201"; } .ion-magnet:before { @@ -1499,6 +1749,12 @@ .ion-outlet:before { content: "\f342"; } +.ion-paintbrush:before { + content: "\f4d5"; } + +.ion-paintbucket:before { + content: "\f4d6"; } + .ion-paper-airplane:before { content: "\f2c3"; } @@ -1583,7 +1839,7 @@ .ion-record:before { content: "\f21b"; } -.ion-refresh:before, .ion-refreshing:before { +.ion-refresh:before { content: "\f21c"; } .ion-reply:before { @@ -1601,6 +1857,9 @@ .ion-sad:before { content: "\f34a"; } +.ion-sad-outline:before { + content: "\f4d7"; } + .ion-scissors:before { content: "\f34b"; } @@ -1628,6 +1887,12 @@ .ion-social-android-outline:before { content: "\f224"; } +.ion-social-angular:before { + content: "\f4d9"; } + +.ion-social-angular-outline:before { + content: "\f4d8"; } + .ion-social-apple:before { content: "\f227"; } @@ -1646,6 +1911,24 @@ .ion-social-buffer-outline:before { content: "\f228"; } +.ion-social-chrome:before { + content: "\f4db"; } + +.ion-social-chrome-outline:before { + content: "\f4da"; } + +.ion-social-codepen:before { + content: "\f4dd"; } + +.ion-social-codepen-outline:before { + content: "\f4dc"; } + +.ion-social-css3:before { + content: "\f4df"; } + +.ion-social-css3-outline:before { + content: "\f4de"; } + .ion-social-designernews:before { content: "\f22b"; } @@ -1664,6 +1947,12 @@ .ion-social-dropbox-outline:before { content: "\f22e"; } +.ion-social-euro:before { + content: "\f4e1"; } + +.ion-social-euro-outline:before { + content: "\f4e0"; } + .ion-social-facebook:before { content: "\f231"; } @@ -1703,24 +1992,48 @@ .ion-social-hackernews-outline:before { content: "\f236"; } +.ion-social-html5:before { + content: "\f4e3"; } + +.ion-social-html5-outline:before { + content: "\f4e2"; } + .ion-social-instagram:before { content: "\f351"; } .ion-social-instagram-outline:before { content: "\f350"; } +.ion-social-javascript:before { + content: "\f4e5"; } + +.ion-social-javascript-outline:before { + content: "\f4e4"; } + .ion-social-linkedin:before { content: "\f239"; } .ion-social-linkedin-outline:before { content: "\f238"; } +.ion-social-markdown:before { + content: "\f4e6"; } + +.ion-social-nodejs:before { + content: "\f4e7"; } + +.ion-social-octocat:before { + content: "\f4e8"; } + .ion-social-pinterest:before { content: "\f2b1"; } .ion-social-pinterest-outline:before { content: "\f2b0"; } +.ion-social-python:before { + content: "\f4e9"; } + .ion-social-reddit:before { content: "\f23b"; } @@ -1733,12 +2046,21 @@ .ion-social-rss-outline:before { content: "\f23c"; } +.ion-social-sass:before { + content: "\f4ea"; } + .ion-social-skype:before { content: "\f23f"; } .ion-social-skype-outline:before { content: "\f23e"; } +.ion-social-snapchat:before { + content: "\f4ec"; } + +.ion-social-snapchat-outline:before { + content: "\f4eb"; } + .ion-social-tumblr:before { content: "\f241"; } @@ -1748,6 +2070,12 @@ .ion-social-tux:before { content: "\f2c5"; } +.ion-social-twitch:before { + content: "\f4ee"; } + +.ion-social-twitch-outline:before { + content: "\f4ed"; } + .ion-social-twitter:before { content: "\f243"; } @@ -1766,6 +2094,12 @@ .ion-social-vimeo-outline:before { content: "\f244"; } +.ion-social-whatsapp:before { + content: "\f4f0"; } + +.ion-social-whatsapp-outline:before { + content: "\f4ef"; } + .ion-social-windows:before { content: "\f247"; } @@ -1784,12 +2118,24 @@ .ion-social-yahoo-outline:before { content: "\f24a"; } +.ion-social-yen:before { + content: "\f4f2"; } + +.ion-social-yen-outline:before { + content: "\f4f1"; } + .ion-social-youtube:before { content: "\f24d"; } .ion-social-youtube-outline:before { content: "\f24c"; } +.ion-soup-can:before { + content: "\f4f4"; } + +.ion-soup-can-outline:before { + content: "\f4f3"; } + .ion-speakerphone:before { content: "\f2b2"; } @@ -1826,6 +2172,9 @@ .ion-toggle-filled:before { content: "\f354"; } +.ion-transgender:before { + content: "\f4f5"; } + .ion-trash-a:before { content: "\f252"; } @@ -1835,6 +2184,12 @@ .ion-trophy:before { content: "\f356"; } +.ion-tshirt:before { + content: "\f4f7"; } + +.ion-tshirt-outline:before { + content: "\f4f6"; } + .ion-umbrella:before { content: "\f2b7"; } @@ -2211,7 +2566,8 @@ body, .ionic-body { line-height: 20px; text-rendering: optimizeLegibility; -webkit-backface-visibility: hidden; - -webkit-user-drag: none; } + -webkit-user-drag: none; + -ms-content-zooming: none; } body.grade-b, body.grade-c { text-rendering: auto; } @@ -2256,9 +2612,6 @@ body.grade-b, body.grade-c { -webkit-transform-origin: left top; transform-origin: left top; } -::-webkit-scrollbar { - display: none; } - .scroll-bar { position: absolute; z-index: 9999; } @@ -2301,104 +2654,10 @@ body.grade-b, body.grade-c { -webkit-transition: none; transition: none; } -@keyframes refresh-spin { - 0% { - transform: translate3d(0, 0, 0) rotate(0); } - - 100% { - transform: translate3d(0, 0, 0) rotate(180deg); } } - -@-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-back { - 0% { - transform: translate3d(0, 0, 0) rotate(180deg); } - - 100% { - transform: translate3d(0, 0, 0) rotate(0); } } - -@-webkit-keyframes refresh-spin-back { - 0% { - -webkit-transform: translate3d(0, 0, 0) rotate(180deg); } - - 100% { - -webkit-transform: translate3d(0, 0, 0) rotate(0); } } - -.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; - -webkit-transform-style: preserve-3d; - backface-visibility: hidden; - 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 0.2s; - transition: transform 0.2s; - -webkit-transition: -webkit-transform 0.2s; - transition: -webkit-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); } - ion-infinite-scroll { height: 60px; width: 100%; - opacity: 0; display: block; - -webkit-transition: opacity 0.25s; - transition: opacity 0.25s; display: -webkit-box; display: -webkit-flex; display: -moz-box; @@ -2425,8 +2684,12 @@ ion-infinite-scroll { color: #666666; font-size: 30px; color: #666666; } - ion-infinite-scroll.active { - opacity: 1; } + ion-infinite-scroll .icon:before, ion-infinite-scroll .spinner { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + ion-infinite-scroll:not(.active) .spinner, ion-infinite-scroll:not(.active) .icon:before { + -webkit-transform: translate3d(-1000px, 0, 0); + transform: translate3d(-1000px, 0, 0); } .overflow-scroll { overflow-x: hidden; @@ -2466,6 +2729,9 @@ ion-infinite-scroll { .has-tabs, .bar-footer.has-tabs { bottom: 49px; } + .has-tabs.pane, .bar-footer.has-tabs.pane { + bottom: 49px; + height: auto; } .has-footer.has-tabs { bottom: 93px; } @@ -2615,8 +2881,8 @@ a.subdued { * -------------------------------------------------- */ .action-sheet-backdrop { - -webkit-transition: background-color 300ms ease-in-out; - transition: background-color 300ms ease-in-out; + -webkit-transition: background-color 150ms ease-in-out; + transition: background-color 150ms ease-in-out; position: fixed; top: 0; left: 0; @@ -2625,13 +2891,13 @@ a.subdued { height: 100%; background-color: rgba(0, 0, 0, 0); } .action-sheet-backdrop.active { - background-color: rgba(0, 0, 0, 0.5); } + 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 ease-in-out 300ms; - transition: all ease-in-out 300ms; + -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; width: 100%; } @@ -2641,8 +2907,8 @@ a.subdued { transform: translate3d(0, 0, 0); } .action-sheet { - margin-left: 15px; - margin-right: 15px; + margin-left: 8px; + margin-right: 8px; width: auto; z-index: 11; overflow: hidden; } @@ -2651,31 +2917,48 @@ a.subdued { padding: 1px; width: 100%; border-radius: 0; + border-color: #d1d3d6; background-color: transparent; - color: #387ef5; - font-size: 18px; } + color: #007aff; + font-size: 21px; } + .action-sheet .button:hover { + color: #007aff; } .action-sheet .button.destructive { - color: #ef473a; } + 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: 10px; - color: #666666; + padding: 16px; + color: #8f8f8f; text-align: center; - font-size: 12px; } + font-size: 13px; } .action-sheet-group { - margin-bottom: 5px; - border-radius: 3px 3px 3px 3px; - background-color: #fff; } + margin-bottom: 8px; + border-radius: 4px; + background-color: #fff; + overflow: hidden; } .action-sheet-group .button { - border-width: 1px 0px 0px 0px; - border-radius: 0; } - .action-sheet-group .button.active { - background-color: transparent; - color: inherit; } + 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 { @@ -2683,6 +2966,30 @@ a.subdued { .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; @@ -2903,15 +3210,23 @@ a.subdued { .bar .buttons span { display: inline-block; } .bar .buttons-left span { - margin-right: 5px; } + margin-right: 5px; + display: inherit; } .bar .buttons-right span { - margin-left: 5px; } + 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 .bar .back-button .icon:before { + font-size: 24px; } +.platform-android .bar .title { + font-size: 19px; + line-height: 43px; } + .bar-light .button { border-color: #ddd; background-color: white; @@ -3109,6 +3424,10 @@ a.subdued { 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; @@ -3752,22 +4071,23 @@ ion-tabs.tabs-color-active-dark .tab-item { padding-bottom: 0; } .tabs-top.tabs-striped .tab-item { background: transparent; - -webkit-transition: all 0.1s ease; - -moz-transition: all 0.1s ease; - -ms-transition: all 0.1s ease; - -o-transition: all 0.1s ease; - transition: all 0.1s ease; } + -webkit-transition: color 0.1s ease; + -moz-transition: color 0.1s ease; + -ms-transition: color 0.1s ease; + -o-transition: color 0.1s ease; + transition: color 0.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: 0; - margin-bottom: -2px; + 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: all 0.2s ease; - -moz-transition: all 0.2s ease; - -ms-transition: all 0.2s ease; - -o-transition: all 0.2s ease; - transition: all 0.2s ease; } + -webkit-transition: color 0.2s ease; + -moz-transition: color 0.2s ease; + -ms-transition: color 0.2s ease; + -o-transition: color 0.2s ease; + transition: color 0.2s ease; } /* Allow parent element to have tabs-top */ /* If you change this, change platform.scss as well */ @@ -3949,17 +4269,12 @@ ion-tabs.tabs-color-active-dark .tab-item { * Modals are independent windows that slide in from off-screen. */ .modal-backdrop { - -webkit-transition: background-color 300ms ease-in-out; - transition: background-color 300ms ease-in-out; position: fixed; top: 0; left: 0; z-index: 10; width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0); } - .modal-backdrop.active { - background-color: rgba(0, 0, 0, 0.5); } + height: 100%; } .modal { display: block; @@ -3995,7 +4310,13 @@ ion-tabs.tabs-color-active-dark .tab-item { .platform-ios.platform-cordova .modal-wrapper .modal .has-tabs-top { top: 93px; } .platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top { - top: 137px; } } + top: 137px; } + .modal-backdrop { + -webkit-transition: background-color 300ms ease-in-out; + transition: background-color 300ms ease-in-out; + background-color: rgba(0, 0, 0, 0); } + .modal-backdrop.active { + background-color: rgba(0, 0, 0, 0.5); } } .modal-open { pointer-events: none; } @@ -4059,9 +4380,13 @@ ion-tabs.tabs-color-active-dark .tab-item { display: none; } .platform-ios .popover { - box-shadow: 0 0 40px rgba(0, 0, 0, 0.08); } -.platform-ios .popover, .platform-ios .popover .bar-header { + 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; } @@ -4667,6 +4992,7 @@ a.item-content { max-width: 40px; max-height: 40px; width: 100%; + height: 100%; border-radius: 50%; } .item-avatar-right, .item-avatar-right .item-content { @@ -4679,6 +5005,7 @@ a.item-content { max-width: 40px; max-height: 40px; width: 100%; + height: 100%; border-radius: 50%; } .item-thumbnail-left, .item-thumbnail-left .item-content { @@ -4691,7 +5018,8 @@ a.item-content { left: 10px; max-width: 80px; max-height: 80px; - width: 100%; } + width: 100%; + height: 100%; } .item-avatar.item-complex, .item-avatar-left.item-complex, .item-thumbnail-left.item-complex { padding-top: 0; @@ -4707,7 +5035,8 @@ a.item-content { right: 10px; max-width: 80px; max-height: 80px; - width: 100%; } + width: 100%; + height: 100%; } .item-avatar-right.item-complex, .item-thumbnail-right.item-complex { padding-top: 0; @@ -4767,10 +5096,6 @@ a.item-content { -webkit-transform: translate3d(50px, 0, 0); transform: translate3d(50px, 0, 0); } -.list-right-editing .item-right-editable .item-content, .item-right-editing.item-right-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; } @@ -4846,20 +5171,20 @@ a.item-content { opacity: 0.7; } .item-right-edit { - -webkit-transition: all ease-in-out 125ms; - transition: all ease-in-out 125ms; + -webkit-transition: all ease-in-out 250ms; + transition: all ease-in-out 250ms; position: absolute; top: 0; right: 0; - z-index: 0; + z-index: 3; width: 75px; height: 100%; background: inherit; padding-left: 20px; - display: none; + display: block; opacity: 0; - -webkit-transform: translate3d(25px, 0, 0); - transform: translate3d(25px, 0, 0); } + -webkit-transform: translate3d(75px, 0, 0); + transform: translate3d(75px, 0, 0); } .item-right-edit .button { min-width: 50px; height: 100%; } @@ -4880,17 +5205,12 @@ a.item-content { height: 100%; font-size: 32px; } .item-right-edit.visible { - display: block; - z-index: 3; } + display: block; } .item-right-edit.visible.active { opacity: 1; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } -.list-right-editing .item-right-edit { - -webkit-transition-delay: 125ms; - transition-delay: 125ms; } - .item-reorder .button.icon { color: #444; font-size: 32px; } @@ -4903,7 +5223,7 @@ a.item-content { width: 100%; box-shadow: 0px 0px 10px 0px #aaa; } .item-reordering .item-reorder { - z-index: 1; } + z-index: 9; } .item-placeholder { opacity: 0.7; } @@ -5117,6 +5437,155 @@ a.item-content { transition: opacity 0.4s ease-in; opacity: 1; } +.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; } + +@-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; } + /** * Forms * -------------------------------------------------- @@ -5164,11 +5633,11 @@ input, button, select, textarea { -webkit-border-radius: 0; border-radius: 0; -webkit-box-flex: 1; - -webkit-flex: 1 0 220px; + -webkit-flex: 1 220px; -moz-box-flex: 1; - -moz-flex: 1 0 220px; - -ms-flex: 1 0 220px; - flex: 1 0 220px; + -moz-flex: 1 220px; + -ms-flex: 1 220px; + flex: 1 220px; -webkit-appearance: none; -moz-appearance: none; appearance: none; @@ -5252,12 +5721,6 @@ input, button, select, textarea { margin-left: 10.66667px; } .input-label { - -webkit-box-flex: 1; - -webkit-flex: 1 0 100px; - -moz-box-flex: 1; - -moz-flex: 1 0 100px; - -ms-flex: 1 0 100px; - flex: 1 0 100px; display: table; padding: 7px 10px 7px 0px; max-width: 200px; @@ -5322,7 +5785,7 @@ textarea, input[type="text"], input[type="password"], input[type="datetime"], in .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; } -input, textarea { +.item-input input, .item-input textarea { width: 100%; } textarea { @@ -5345,7 +5808,7 @@ input[type="radio"], input[type="checkbox"] { margin: 0; line-height: normal; } -input[type="file"], input[type="image"], input[type="submit"], input[type="reset"], input[type="button"], input[type="radio"], input[type="checkbox"] { +.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"] { @@ -5553,37 +6016,38 @@ input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="rad margin: -5px; padding: 5px; } .toggle input:checked + .track { - border-color: #387ef5; - background-color: #387ef5; } + 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.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; } @@ -5592,17 +6056,17 @@ input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="rad .toggle .track { -webkit-transition-timing-function: ease-in-out; transition-timing-function: ease-in-out; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; + -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: 54px; - height: 32px; - border: solid 2px #E5E5E5; + width: 51px; + height: 31px; + border: solid 2px #e6e6e6; border-radius: 20px; - background-color: #E5E5E5; + background-color: #fff; content: ' '; cursor: pointer; pointer-events: none; } @@ -5615,46 +6079,105 @@ input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="rad /* the handle (circle) thats inside the toggle's track area */ /* also the handle's appearance when it is "off" */ .toggle .handle { - -webkit-transition: 0.2s ease-in-out; - transition: 0.2s ease-in-out; + -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: 28px; - height: 28px; - border-radius: 28px; + width: 27px; + height: 27px; + border-radius: 27px; background-color: #fff; top: 7px; - left: 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: -22px; - padding: 19px 35px; + left: -21.5px; + padding: 18.5px 34px; content: " "; } .toggle input:checked + .track .handle { - -webkit-transform: translate3d(22px, 0, 0); - transform: translate3d(22px, 0, 0); + -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: 102px; } + padding-right: 99px; } .item-toggle.item-complex { padding-right: 0; } .item-toggle .toggle { position: absolute; - top: 8px; + top: 10px; right: 16px; z-index: 3; } .toggle input:disabled + .track { opacity: 0.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 * -------------------------------------------------- @@ -5704,7 +6227,7 @@ input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="rad * Range * -------------------------------------------------- */ -input[type="range"] { +.range input { display: inline-block; overflow: hidden; margin-top: 5px; @@ -5720,7 +6243,7 @@ input[type="range"] { background-size: 99% 2px; background-repeat: no-repeat; -webkit-appearance: none; } - input[type="range"]::-webkit-slider-thumb { + .range input::-webkit-slider-thumb { position: relative; width: 28px; height: 28px; @@ -5730,7 +6253,7 @@ input[type="range"] { cursor: pointer; -webkit-appearance: none; border: 0; } - input[type="range"]::-webkit-slider-thumb:before { + .range input::-webkit-slider-thumb:before { /* what creates the colorful line on the left side of the slider */ position: absolute; top: 13px; @@ -5739,7 +6262,7 @@ input[type="range"] { height: 2px; background: #444; content: ' '; } - input[type="range"]::-webkit-slider-thumb:after { + .range input::-webkit-slider-thumb:after { /* create a larger (but hidden) hit area */ position: absolute; top: -15px; @@ -6400,6 +6923,11 @@ a.button { -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; } @@ -6705,13 +7233,14 @@ a.button { .click-block { position: absolute; top: 0; + right: 0; + bottom: 0; left: 0; - z-index: 99999; - width: 100%; - height: 100%; opacity: 0; + z-index: 99999; -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); } + transform: translate3d(0, 0, 0); + overflow: hidden; } .click-block-hide { -webkit-transform: translate3d(-9999px, 0, 0); @@ -6761,6 +7290,18 @@ a.button { .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 * -------------------------------------------------- @@ -6856,6 +7397,23 @@ a.button { .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; } + +.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; } + /** * Platform * -------------------------------------------------- @@ -6873,7 +7431,7 @@ a.button { top: 64px; } .platform-ios.platform-cordova:not(.fullscreen) .has-subheader { top: 108px; } -.platform-ios.platform-cordova:not(.fullscreen) .has-tabs-top { +.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; } @@ -6941,12 +7499,12 @@ a.button { opacity: 1; } } [nav-view-transition="ios"] [nav-view="entering"], [nav-view-transition="ios"] [nav-view="leaving"] { - -webkit-transition-duration: 450ms; - transition-duration: 450ms; - -webkit-transition-timing-function: cubic-bezier(0.3, 0.9, 0.4, 1); - transition-timing-function: cubic-bezier(0.3, 0.9, 0.4, 1); - -webkit-transition-property: opacity, -webkit-transform; - transition-property: opacity, transform; } + -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"] { @@ -6955,10 +7513,10 @@ a.button { z-index: 2; } [nav-bar-transition="ios"] .title, [nav-bar-transition="ios"] .buttons, [nav-bar-transition="ios"] .back-text { - -webkit-transition-duration: 450ms; - transition-duration: 450ms; - -webkit-transition-timing-function: cubic-bezier(0.3, 0.9, 0.4, 1); - transition-timing-function: cubic-bezier(0.3, 0.9, 0.4, 1); + -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"] { @@ -6998,6 +7556,18 @@ a.button { [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; } diff --git a/www/lib/ionic/css/ionic.min.css b/www/lib/ionic/css/ionic.min.css index bf25494..348841f 100644 --- a/www/lib/ionic/css/ionic.min.css +++ b/www/lib/ionic/css/ionic.min.css @@ -2,7 +2,7 @@ * Copyright 2014 Drifty Co. * http://drifty.com/ * - * Ionic, v1.0.0-beta.14 + * Ionic, v1.0.0-beta.14-nightly-1102 * A powerful HTML5 mobile app framework. * http://ionicframework.com/ * @@ -11,8 +11,13 @@ * Licensed under the MIT license. Please see LICENSE for more information. * *//*! - Ionicons, v1.5.2 + 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 -*/@font-face{font-family:Ionicons;src:url(../fonts/ionicons.eot?v=1.5.2);src:url(../fonts/ionicons.eot?v=1.5.2#iefix) format("embedded-opentype"),url(../fonts/ionicons.ttf?v=1.5.2) format("truetype"),url(../fonts/ionicons.woff?v=1.5.2) format("woff"),url(../fonts/ionicons.svg?v=1.5.2#Ionicons) format("svg");font-weight:400;font-style:normal}.ion,.ion-alert-circled:before,.ion-alert:before,.ion-android-add-contact:before,.ion-android-add:before,.ion-android-alarm:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down-left:before,.ion-android-arrow-down-right:before,.ion-android-arrow-forward:before,.ion-android-arrow-up-left:before,.ion-android-arrow-up-right:before,.ion-android-battery:before,.ion-android-book:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-chat:before,.ion-android-checkmark:before,.ion-android-clock:before,.ion-android-close:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-data:before,.ion-android-developer:before,.ion-android-display:before,.ion-android-download:before,.ion-android-drawer:before,.ion-android-dropdown:before,.ion-android-earth:before,.ion-android-folder:before,.ion-android-forums:before,.ion-android-friends:before,.ion-android-hand:before,.ion-android-image:before,.ion-android-inbox:before,.ion-android-information:before,.ion-android-keypad:before,.ion-android-lightbulb:before,.ion-android-locate:before,.ion-android-location:before,.ion-android-mail:before,.ion-android-microphone:before,.ion-android-mixer:before,.ion-android-more:before,.ion-android-note:before,.ion-android-playstore:before,.ion-android-printer:before,.ion-android-promotion:before,.ion-android-reminder:before,.ion-android-remove:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share:before,.ion-android-social-user:before,.ion-android-social:before,.ion-android-sort:before,.ion-android-stair-drawer:before,.ion-android-star:before,.ion-android-stopwatch:before,.ion-android-storage:before,.ion-android-system-back:before,.ion-android-system-home:before,.ion-android-system-windows:before,.ion-android-timer:before,.ion-android-trash:before,.ion-android-user-menu:before,.ion-android-volume: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-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-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-cube:before,.ion-disc:before,.ion-document-text:before,.ion-document:before,.ion-drag:before,.ion-earth:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email: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-flask:before,.ion-folder:before,.ion-fork-repo:before,.ion-fork:before,.ion-forward:before,.ion-funnel:before,.ion-game-controller-a:before,.ion-game-controller-b:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer: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-icon-social-google-plus-outline:before,.ion-icon-social-google-plus:before,.ion-image:before,.ion-images:before,.ion-information-circled:before,.ion-information:before,.ion-ionic:before,.ion-ios7-alarm-outline:before,.ion-ios7-alarm:before,.ion-ios7-albums-outline:before,.ion-ios7-albums:before,.ion-ios7-americanfootball-outline:before,.ion-ios7-americanfootball:before,.ion-ios7-analytics-outline:before,.ion-ios7-analytics:before,.ion-ios7-arrow-back:before,.ion-ios7-arrow-down:before,.ion-ios7-arrow-forward:before,.ion-ios7-arrow-left:before,.ion-ios7-arrow-right:before,.ion-ios7-arrow-thin-down:before,.ion-ios7-arrow-thin-left:before,.ion-ios7-arrow-thin-right:before,.ion-ios7-arrow-thin-up:before,.ion-ios7-arrow-up:before,.ion-ios7-at-outline:before,.ion-ios7-at:before,.ion-ios7-barcode-outline:before,.ion-ios7-barcode:before,.ion-ios7-baseball-outline:before,.ion-ios7-baseball:before,.ion-ios7-basketball-outline:before,.ion-ios7-basketball:before,.ion-ios7-bell-outline:before,.ion-ios7-bell:before,.ion-ios7-bolt-outline:before,.ion-ios7-bolt:before,.ion-ios7-bookmarks-outline:before,.ion-ios7-bookmarks:before,.ion-ios7-box-outline:before,.ion-ios7-box:before,.ion-ios7-briefcase-outline:before,.ion-ios7-briefcase:before,.ion-ios7-browsers-outline:before,.ion-ios7-browsers:before,.ion-ios7-calculator-outline:before,.ion-ios7-calculator:before,.ion-ios7-calendar-outline:before,.ion-ios7-calendar:before,.ion-ios7-camera-outline:before,.ion-ios7-camera:before,.ion-ios7-cart-outline:before,.ion-ios7-cart:before,.ion-ios7-chatboxes-outline:before,.ion-ios7-chatboxes:before,.ion-ios7-chatbubble-outline:before,.ion-ios7-chatbubble:before,.ion-ios7-checkmark-empty:before,.ion-ios7-checkmark-outline:before,.ion-ios7-checkmark:before,.ion-ios7-circle-filled:before,.ion-ios7-circle-outline:before,.ion-ios7-clock-outline:before,.ion-ios7-clock:before,.ion-ios7-close-empty:before,.ion-ios7-close-outline:before,.ion-ios7-close:before,.ion-ios7-cloud-download-outline:before,.ion-ios7-cloud-download:before,.ion-ios7-cloud-outline:before,.ion-ios7-cloud-upload-outline:before,.ion-ios7-cloud-upload:before,.ion-ios7-cloud:before,.ion-ios7-cloudy-night-outline:before,.ion-ios7-cloudy-night:before,.ion-ios7-cloudy-outline:before,.ion-ios7-cloudy:before,.ion-ios7-cog-outline:before,.ion-ios7-cog:before,.ion-ios7-compose-outline:before,.ion-ios7-compose:before,.ion-ios7-contact-outline:before,.ion-ios7-contact:before,.ion-ios7-copy-outline:before,.ion-ios7-copy:before,.ion-ios7-download-outline:before,.ion-ios7-download:before,.ion-ios7-drag:before,.ion-ios7-email-outline:before,.ion-ios7-email:before,.ion-ios7-expand:before,.ion-ios7-eye-outline:before,.ion-ios7-eye:before,.ion-ios7-fastforward-outline:before,.ion-ios7-fastforward:before,.ion-ios7-filing-outline:before,.ion-ios7-filing:before,.ion-ios7-film-outline:before,.ion-ios7-film:before,.ion-ios7-flag-outline:before,.ion-ios7-flag:before,.ion-ios7-folder-outline:before,.ion-ios7-folder:before,.ion-ios7-football-outline:before,.ion-ios7-football:before,.ion-ios7-gear-outline:before,.ion-ios7-gear:before,.ion-ios7-glasses-outline:before,.ion-ios7-glasses:before,.ion-ios7-heart-outline:before,.ion-ios7-heart:before,.ion-ios7-help-empty:before,.ion-ios7-help-outline:before,.ion-ios7-help:before,.ion-ios7-home-outline:before,.ion-ios7-home:before,.ion-ios7-infinite-outline:before,.ion-ios7-infinite:before,.ion-ios7-information-empty:before,.ion-ios7-information-outline:before,.ion-ios7-information:before,.ion-ios7-ionic-outline:before,.ion-ios7-keypad-outline:before,.ion-ios7-keypad:before,.ion-ios7-lightbulb-outline:before,.ion-ios7-lightbulb:before,.ion-ios7-location-outline:before,.ion-ios7-location:before,.ion-ios7-locked-outline:before,.ion-ios7-locked:before,.ion-ios7-loop-strong:before,.ion-ios7-loop:before,.ion-ios7-medkit-outline:before,.ion-ios7-medkit:before,.ion-ios7-mic-off:before,.ion-ios7-mic-outline:before,.ion-ios7-mic:before,.ion-ios7-minus-empty:before,.ion-ios7-minus-outline:before,.ion-ios7-minus:before,.ion-ios7-monitor-outline:before,.ion-ios7-monitor:before,.ion-ios7-moon-outline:before,.ion-ios7-moon:before,.ion-ios7-more-outline:before,.ion-ios7-more:before,.ion-ios7-musical-note:before,.ion-ios7-musical-notes:before,.ion-ios7-navigate-outline:before,.ion-ios7-navigate:before,.ion-ios7-paper-outline:before,.ion-ios7-paper:before,.ion-ios7-paperplane-outline:before,.ion-ios7-paperplane:before,.ion-ios7-partlysunny-outline:before,.ion-ios7-partlysunny:before,.ion-ios7-pause-outline:before,.ion-ios7-pause:before,.ion-ios7-paw-outline:before,.ion-ios7-paw:before,.ion-ios7-people-outline:before,.ion-ios7-people:before,.ion-ios7-person-outline:before,.ion-ios7-person:before,.ion-ios7-personadd-outline:before,.ion-ios7-personadd:before,.ion-ios7-photos-outline:before,.ion-ios7-photos:before,.ion-ios7-pie-outline:before,.ion-ios7-pie:before,.ion-ios7-play-outline:before,.ion-ios7-play:before,.ion-ios7-plus-empty:before,.ion-ios7-plus-outline:before,.ion-ios7-plus:before,.ion-ios7-pricetag-outline:before,.ion-ios7-pricetag:before,.ion-ios7-pricetags-outline:before,.ion-ios7-pricetags:before,.ion-ios7-printer-outline:before,.ion-ios7-printer:before,.ion-ios7-pulse-strong:before,.ion-ios7-pulse:before,.ion-ios7-rainy-outline:before,.ion-ios7-rainy:before,.ion-ios7-recording-outline:before,.ion-ios7-recording:before,.ion-ios7-redo-outline:before,.ion-ios7-redo:before,.ion-ios7-refresh-empty:before,.ion-ios7-refresh-outline:before,.ion-ios7-refresh:before,.ion-ios7-reload:before,.ion-ios7-reloading,.ion-ios7-reloading:before,.ion-ios7-reverse-camera-outline:before,.ion-ios7-reverse-camera:before,.ion-ios7-rewind-outline:before,.ion-ios7-rewind:before,.ion-ios7-search-strong:before,.ion-ios7-search:before,.ion-ios7-settings-strong:before,.ion-ios7-settings:before,.ion-ios7-shrink:before,.ion-ios7-skipbackward-outline:before,.ion-ios7-skipbackward:before,.ion-ios7-skipforward-outline:before,.ion-ios7-skipforward:before,.ion-ios7-snowy:before,.ion-ios7-speedometer-outline:before,.ion-ios7-speedometer:before,.ion-ios7-star-half:before,.ion-ios7-star-outline:before,.ion-ios7-star:before,.ion-ios7-stopwatch-outline:before,.ion-ios7-stopwatch:before,.ion-ios7-sunny-outline:before,.ion-ios7-sunny:before,.ion-ios7-telephone-outline:before,.ion-ios7-telephone:before,.ion-ios7-tennisball-outline:before,.ion-ios7-tennisball:before,.ion-ios7-thunderstorm-outline:before,.ion-ios7-thunderstorm:before,.ion-ios7-time-outline:before,.ion-ios7-time:before,.ion-ios7-timer-outline:before,.ion-ios7-timer:before,.ion-ios7-toggle-outline:before,.ion-ios7-toggle:before,.ion-ios7-trash-outline:before,.ion-ios7-trash:before,.ion-ios7-undo-outline:before,.ion-ios7-undo:before,.ion-ios7-unlocked-outline:before,.ion-ios7-unlocked:before,.ion-ios7-upload-outline:before,.ion-ios7-upload:before,.ion-ios7-videocam-outline:before,.ion-ios7-videocam:before,.ion-ios7-volume-high:before,.ion-ios7-volume-low:before,.ion-ios7-wineglass-outline:before,.ion-ios7-wineglass:before,.ion-ios7-world-outline:before,.ion-ios7-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-loading-a,.ion-loading-a:before,.ion-loading-b,.ion-loading-b:before,.ion-loading-c,.ion-loading-c:before,.ion-loading-d,.ion-loading-d:before,.ion-location:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-looping,.ion-looping: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-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-refreshing,.ion-refreshing:before,.ion-reply-all:before,.ion-reply:before,.ion-ribbon-a:before,.ion-ribbon-b: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-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-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-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-instagram-outline:before,.ion-social-instagram:before,.ion-social-linkedin-outline:before,.ion-social-linkedin:before,.ion-social-pinterest-outline:before,.ion-social-pinterest:before,.ion-social-reddit-outline:before,.ion-social-reddit:before,.ion-social-rss-outline:before,.ion-social-rss:before,.ion-social-skype-outline:before,.ion-social-skype:before,.ion-social-tumblr-outline:before,.ion-social-tumblr:before,.ion-social-tux: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-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-youtube-outline:before,.ion-social-youtube: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-trash-a:before,.ion-trash-b:before,.ion-trophy: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-ios7-reloading,.ion-loading-a,.ion-loading-b,.ion-loading-c,.ion-loading-d,.ion-looping,.ion-refreshing,.ion-spin{-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;-o-animation:spin 1s infinite linear;animation:spin 1s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.ion-loading-a{-webkit-animation-timing-function:steps(8,start);-moz-animation-timing-function:steps(8,start);animation-timing-function:steps(8,start)}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-contact:before{content:"\f2c6"}.ion-android-alarm:before{content:"\f2c8"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down-left:before{content:"\f2cb"}.ion-android-arrow-down-right:before{content:"\f2cc"}.ion-android-arrow-forward:before{content:"\f30f"}.ion-android-arrow-up-left:before{content:"\f2cd"}.ion-android-arrow-up-right:before{content:"\f2ce"}.ion-android-battery:before{content:"\f2cf"}.ion-android-book:before{content:"\f2d0"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkmark:before{content:"\f2d5"}.ion-android-clock:before{content:"\f2d6"}.ion-android-close:before{content:"\f2d7"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-data:before{content:"\f2da"}.ion-android-developer:before{content:"\f2db"}.ion-android-display:before{content:"\f2dc"}.ion-android-download:before{content:"\f2dd"}.ion-android-drawer:before{content:"\f310"}.ion-android-dropdown:before{content:"\f2de"}.ion-android-earth:before{content:"\f2df"}.ion-android-folder:before{content:"\f2e0"}.ion-android-forums:before{content:"\f2e1"}.ion-android-friends:before{content:"\f2e2"}.ion-android-hand:before{content:"\f2e3"}.ion-android-image:before{content:"\f2e4"}.ion-android-inbox:before{content:"\f2e5"}.ion-android-information:before{content:"\f2e6"}.ion-android-keypad:before{content:"\f2e7"}.ion-android-lightbulb:before{content:"\f2e8"}.ion-android-locate:before{content:"\f2e9"}.ion-android-location:before{content:"\f2ea"}.ion-android-mail:before{content:"\f2eb"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-mixer:before{content:"\f2ed"}.ion-android-more:before{content:"\f2ee"}.ion-android-note:before{content:"\f2ef"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-printer:before{content:"\f2f1"}.ion-android-promotion:before{content:"\f2f2"}.ion-android-reminder:before{content:"\f2f3"}.ion-android-remove:before{content:"\f2f4"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-social:before{content:"\f2fa"}.ion-android-social-user:before{content:"\f2f9"}.ion-android-sort:before{content:"\f2fb"}.ion-android-stair-drawer:before{content:"\f311"}.ion-android-star:before{content:"\f2fc"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-storage:before{content:"\f2fe"}.ion-android-system-back:before{content:"\f2ff"}.ion-android-system-home:before{content:"\f300"}.ion-android-system-windows:before{content:"\f301"}.ion-android-timer:before{content:"\f302"}.ion-android-trash:before{content:"\f303"}.ion-android-user-menu:before{content:"\f312"}.ion-android-volume:before{content:"\f304"}.ion-android-wifi:before{content:"\f305"}.ion-aperture:before{content:"\f313"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-asterisk:before{content:"\f314"}.ion-at:before{content:"\f10f"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bonfire:before{content:"\f315"}.ion-bookmark:before{content:"\f26b"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-cash:before{content:"\f316"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-closed-captioning:before{content:"\f317"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-cube:before{content:"\f318"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-fireball:before{content:"\f319"}.ion-flag:before{content:"\f279"}.ion-flame:before{content:"\f31a"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-flask:before{content:"\f138"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-funnel:before{content:"\f31b"}.ion-game-controller-a:before{content:"\f13b"}.ion-game-controller-b:before{content:"\f13c"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-happy:before{content:"\f31c"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-heart-broken:before{content:"\f31d"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-icon-social-google-plus:before{content:"\f146"}.ion-icon-social-google-plus-outline:before{content:"\f145"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios7-alarm:before{content:"\f14d"}.ion-ios7-alarm-outline:before{content:"\f14c"}.ion-ios7-albums:before{content:"\f14f"}.ion-ios7-albums-outline:before{content:"\f14e"}.ion-ios7-americanfootball:before{content:"\f31f"}.ion-ios7-americanfootball-outline:before{content:"\f31e"}.ion-ios7-analytics:before{content:"\f321"}.ion-ios7-analytics-outline:before{content:"\f320"}.ion-ios7-arrow-back:before{content:"\f150"}.ion-ios7-arrow-down:before{content:"\f151"}.ion-ios7-arrow-forward:before{content:"\f152"}.ion-ios7-arrow-left:before{content:"\f153"}.ion-ios7-arrow-right:before{content:"\f154"}.ion-ios7-arrow-thin-down:before{content:"\f27e"}.ion-ios7-arrow-thin-left:before{content:"\f27f"}.ion-ios7-arrow-thin-right:before{content:"\f280"}.ion-ios7-arrow-thin-up:before{content:"\f281"}.ion-ios7-arrow-up:before{content:"\f155"}.ion-ios7-at:before{content:"\f157"}.ion-ios7-at-outline:before{content:"\f156"}.ion-ios7-barcode:before{content:"\f323"}.ion-ios7-barcode-outline:before{content:"\f322"}.ion-ios7-baseball:before{content:"\f325"}.ion-ios7-baseball-outline:before{content:"\f324"}.ion-ios7-basketball:before{content:"\f327"}.ion-ios7-basketball-outline:before{content:"\f326"}.ion-ios7-bell:before{content:"\f159"}.ion-ios7-bell-outline:before{content:"\f158"}.ion-ios7-bolt:before{content:"\f15b"}.ion-ios7-bolt-outline:before{content:"\f15a"}.ion-ios7-bookmarks:before{content:"\f15d"}.ion-ios7-bookmarks-outline:before{content:"\f15c"}.ion-ios7-box:before{content:"\f15f"}.ion-ios7-box-outline:before{content:"\f15e"}.ion-ios7-briefcase:before{content:"\f283"}.ion-ios7-briefcase-outline:before{content:"\f282"}.ion-ios7-browsers:before{content:"\f161"}.ion-ios7-browsers-outline:before{content:"\f160"}.ion-ios7-calculator:before{content:"\f285"}.ion-ios7-calculator-outline:before{content:"\f284"}.ion-ios7-calendar:before{content:"\f163"}.ion-ios7-calendar-outline:before{content:"\f162"}.ion-ios7-camera:before{content:"\f165"}.ion-ios7-camera-outline:before{content:"\f164"}.ion-ios7-cart:before{content:"\f167"}.ion-ios7-cart-outline:before{content:"\f166"}.ion-ios7-chatboxes:before{content:"\f169"}.ion-ios7-chatboxes-outline:before{content:"\f168"}.ion-ios7-chatbubble:before{content:"\f16b"}.ion-ios7-chatbubble-outline:before{content:"\f16a"}.ion-ios7-checkmark:before{content:"\f16e"}.ion-ios7-checkmark-empty:before{content:"\f16c"}.ion-ios7-checkmark-outline:before{content:"\f16d"}.ion-ios7-circle-filled:before{content:"\f16f"}.ion-ios7-circle-outline:before{content:"\f170"}.ion-ios7-clock:before{content:"\f172"}.ion-ios7-clock-outline:before{content:"\f171"}.ion-ios7-close:before{content:"\f2bc"}.ion-ios7-close-empty:before{content:"\f2bd"}.ion-ios7-close-outline:before{content:"\f2bb"}.ion-ios7-cloud:before{content:"\f178"}.ion-ios7-cloud-download:before{content:"\f174"}.ion-ios7-cloud-download-outline:before{content:"\f173"}.ion-ios7-cloud-outline:before{content:"\f175"}.ion-ios7-cloud-upload:before{content:"\f177"}.ion-ios7-cloud-upload-outline:before{content:"\f176"}.ion-ios7-cloudy:before{content:"\f17a"}.ion-ios7-cloudy-night:before{content:"\f308"}.ion-ios7-cloudy-night-outline:before{content:"\f307"}.ion-ios7-cloudy-outline:before{content:"\f179"}.ion-ios7-cog:before{content:"\f17c"}.ion-ios7-cog-outline:before{content:"\f17b"}.ion-ios7-compose:before{content:"\f17e"}.ion-ios7-compose-outline:before{content:"\f17d"}.ion-ios7-contact:before{content:"\f180"}.ion-ios7-contact-outline:before{content:"\f17f"}.ion-ios7-copy:before{content:"\f182"}.ion-ios7-copy-outline:before{content:"\f181"}.ion-ios7-download:before{content:"\f184"}.ion-ios7-download-outline:before{content:"\f183"}.ion-ios7-drag:before{content:"\f185"}.ion-ios7-email:before{content:"\f187"}.ion-ios7-email-outline:before{content:"\f186"}.ion-ios7-expand:before{content:"\f30d"}.ion-ios7-eye:before{content:"\f189"}.ion-ios7-eye-outline:before{content:"\f188"}.ion-ios7-fastforward:before{content:"\f18b"}.ion-ios7-fastforward-outline:before{content:"\f18a"}.ion-ios7-filing:before{content:"\f18d"}.ion-ios7-filing-outline:before{content:"\f18c"}.ion-ios7-film:before{content:"\f18f"}.ion-ios7-film-outline:before{content:"\f18e"}.ion-ios7-flag:before{content:"\f191"}.ion-ios7-flag-outline:before{content:"\f190"}.ion-ios7-folder:before{content:"\f193"}.ion-ios7-folder-outline:before{content:"\f192"}.ion-ios7-football:before{content:"\f329"}.ion-ios7-football-outline:before{content:"\f328"}.ion-ios7-gear:before{content:"\f195"}.ion-ios7-gear-outline:before{content:"\f194"}.ion-ios7-glasses:before{content:"\f197"}.ion-ios7-glasses-outline:before{content:"\f196"}.ion-ios7-heart:before{content:"\f199"}.ion-ios7-heart-outline:before{content:"\f198"}.ion-ios7-help:before{content:"\f19c"}.ion-ios7-help-empty:before{content:"\f19a"}.ion-ios7-help-outline:before{content:"\f19b"}.ion-ios7-home:before{content:"\f32b"}.ion-ios7-home-outline:before{content:"\f32a"}.ion-ios7-infinite:before{content:"\f19e"}.ion-ios7-infinite-outline:before{content:"\f19d"}.ion-ios7-information:before{content:"\f1a1"}.ion-ios7-information-empty:before{content:"\f19f"}.ion-ios7-information-outline:before{content:"\f1a0"}.ion-ios7-ionic-outline:before{content:"\f1a2"}.ion-ios7-keypad:before{content:"\f1a4"}.ion-ios7-keypad-outline:before{content:"\f1a3"}.ion-ios7-lightbulb:before{content:"\f287"}.ion-ios7-lightbulb-outline:before{content:"\f286"}.ion-ios7-location:before{content:"\f1a6"}.ion-ios7-location-outline:before{content:"\f1a5"}.ion-ios7-locked:before{content:"\f1a8"}.ion-ios7-locked-outline:before{content:"\f1a7"}.ion-ios7-loop:before{content:"\f32d"}.ion-ios7-loop-strong:before{content:"\f32c"}.ion-ios7-medkit:before{content:"\f289"}.ion-ios7-medkit-outline:before{content:"\f288"}.ion-ios7-mic:before{content:"\f1ab"}.ion-ios7-mic-off:before{content:"\f1a9"}.ion-ios7-mic-outline:before{content:"\f1aa"}.ion-ios7-minus:before{content:"\f1ae"}.ion-ios7-minus-empty:before{content:"\f1ac"}.ion-ios7-minus-outline:before{content:"\f1ad"}.ion-ios7-monitor:before{content:"\f1b0"}.ion-ios7-monitor-outline:before{content:"\f1af"}.ion-ios7-moon:before{content:"\f1b2"}.ion-ios7-moon-outline:before{content:"\f1b1"}.ion-ios7-more:before{content:"\f1b4"}.ion-ios7-more-outline:before{content:"\f1b3"}.ion-ios7-musical-note:before{content:"\f1b5"}.ion-ios7-musical-notes:before{content:"\f1b6"}.ion-ios7-navigate:before{content:"\f1b8"}.ion-ios7-navigate-outline:before{content:"\f1b7"}.ion-ios7-paper:before{content:"\f32f"}.ion-ios7-paper-outline:before{content:"\f32e"}.ion-ios7-paperplane:before{content:"\f1ba"}.ion-ios7-paperplane-outline:before{content:"\f1b9"}.ion-ios7-partlysunny:before{content:"\f1bc"}.ion-ios7-partlysunny-outline:before{content:"\f1bb"}.ion-ios7-pause:before{content:"\f1be"}.ion-ios7-pause-outline:before{content:"\f1bd"}.ion-ios7-paw:before{content:"\f331"}.ion-ios7-paw-outline:before{content:"\f330"}.ion-ios7-people:before{content:"\f1c0"}.ion-ios7-people-outline:before{content:"\f1bf"}.ion-ios7-person:before{content:"\f1c2"}.ion-ios7-person-outline:before{content:"\f1c1"}.ion-ios7-personadd:before{content:"\f1c4"}.ion-ios7-personadd-outline:before{content:"\f1c3"}.ion-ios7-photos:before{content:"\f1c6"}.ion-ios7-photos-outline:before{content:"\f1c5"}.ion-ios7-pie:before{content:"\f28b"}.ion-ios7-pie-outline:before{content:"\f28a"}.ion-ios7-play:before{content:"\f1c8"}.ion-ios7-play-outline:before{content:"\f1c7"}.ion-ios7-plus:before{content:"\f1cb"}.ion-ios7-plus-empty:before{content:"\f1c9"}.ion-ios7-plus-outline:before{content:"\f1ca"}.ion-ios7-pricetag:before{content:"\f28d"}.ion-ios7-pricetag-outline:before{content:"\f28c"}.ion-ios7-pricetags:before{content:"\f333"}.ion-ios7-pricetags-outline:before{content:"\f332"}.ion-ios7-printer:before{content:"\f1cd"}.ion-ios7-printer-outline:before{content:"\f1cc"}.ion-ios7-pulse:before{content:"\f335"}.ion-ios7-pulse-strong:before{content:"\f334"}.ion-ios7-rainy:before{content:"\f1cf"}.ion-ios7-rainy-outline:before{content:"\f1ce"}.ion-ios7-recording:before{content:"\f1d1"}.ion-ios7-recording-outline:before{content:"\f1d0"}.ion-ios7-redo:before{content:"\f1d3"}.ion-ios7-redo-outline:before{content:"\f1d2"}.ion-ios7-refresh:before{content:"\f1d6"}.ion-ios7-refresh-empty:before{content:"\f1d4"}.ion-ios7-refresh-outline:before{content:"\f1d5"}.ion-ios7-reload:before,.ion-ios7-reloading:before{content:"\f28e"}.ion-ios7-reverse-camera:before{content:"\f337"}.ion-ios7-reverse-camera-outline:before{content:"\f336"}.ion-ios7-rewind:before{content:"\f1d8"}.ion-ios7-rewind-outline:before{content:"\f1d7"}.ion-ios7-search:before{content:"\f1da"}.ion-ios7-search-strong:before{content:"\f1d9"}.ion-ios7-settings:before{content:"\f339"}.ion-ios7-settings-strong:before{content:"\f338"}.ion-ios7-shrink:before{content:"\f30e"}.ion-ios7-skipbackward:before{content:"\f1dc"}.ion-ios7-skipbackward-outline:before{content:"\f1db"}.ion-ios7-skipforward:before{content:"\f1de"}.ion-ios7-skipforward-outline:before{content:"\f1dd"}.ion-ios7-snowy:before{content:"\f309"}.ion-ios7-speedometer:before{content:"\f290"}.ion-ios7-speedometer-outline:before{content:"\f28f"}.ion-ios7-star:before{content:"\f1e0"}.ion-ios7-star-half:before{content:"\f33a"}.ion-ios7-star-outline:before{content:"\f1df"}.ion-ios7-stopwatch:before{content:"\f1e2"}.ion-ios7-stopwatch-outline:before{content:"\f1e1"}.ion-ios7-sunny:before{content:"\f1e4"}.ion-ios7-sunny-outline:before{content:"\f1e3"}.ion-ios7-telephone:before{content:"\f1e6"}.ion-ios7-telephone-outline:before{content:"\f1e5"}.ion-ios7-tennisball:before{content:"\f33c"}.ion-ios7-tennisball-outline:before{content:"\f33b"}.ion-ios7-thunderstorm:before{content:"\f1e8"}.ion-ios7-thunderstorm-outline:before{content:"\f1e7"}.ion-ios7-time:before{content:"\f292"}.ion-ios7-time-outline:before{content:"\f291"}.ion-ios7-timer:before{content:"\f1ea"}.ion-ios7-timer-outline:before{content:"\f1e9"}.ion-ios7-toggle:before{content:"\f33e"}.ion-ios7-toggle-outline:before{content:"\f33d"}.ion-ios7-trash:before{content:"\f1ec"}.ion-ios7-trash-outline:before{content:"\f1eb"}.ion-ios7-undo:before{content:"\f1ee"}.ion-ios7-undo-outline:before{content:"\f1ed"}.ion-ios7-unlocked:before{content:"\f1f0"}.ion-ios7-unlocked-outline:before{content:"\f1ef"}.ion-ios7-upload:before{content:"\f1f2"}.ion-ios7-upload-outline:before{content:"\f1f1"}.ion-ios7-videocam:before{content:"\f1f4"}.ion-ios7-videocam-outline:before{content:"\f1f3"}.ion-ios7-volume-high:before{content:"\f1f5"}.ion-ios7-volume-low:before{content:"\f1f6"}.ion-ios7-wineglass:before{content:"\f294"}.ion-ios7-wineglass-outline:before{content:"\f293"}.ion-ios7-world:before{content:"\f1f8"}.ion-ios7-world-outline:before{content:"\f1f7"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before,.ion-loading-a:before{content:"\f29a"}.ion-load-b:before,.ion-loading-b:before{content:"\f29b"}.ion-load-c:before,.ion-loading-c:before{content:"\f29c"}.ion-load-d:before,.ion-loading-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before,.ion-looping:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-merge:before{content:"\f33f"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-mouse:before{content:"\f340"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-network:before{content:"\f341"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-outlet:before{content:"\f342"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-planet:before{content:"\f343"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-podium:before{content:"\f344"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-pull-request:before{content:"\f345"}.ion-qr-scanner:before{content:"\f346"}.ion-quote:before{content:"\f347"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before,.ion-refreshing:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-ribbon-a:before{content:"\f348"}.ion-ribbon-b:before{content:"\f349"}.ion-sad:before{content:"\f34a"}.ion-scissors:before{content:"\f34b"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-foursquare:before{content:"\f34d"}.ion-social-foursquare-outline:before{content:"\f34c"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-google:before{content:"\f34f"}.ion-social-google-outline:before{content:"\f34e"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-instagram:before{content:"\f351"}.ion-social-instagram-outline:before{content:"\f350"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-usd:before{content:"\f353"}.ion-social-usd-outline:before{content:"\f352"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-toggle:before{content:"\f355"}.ion-toggle-filled:before{content:"\f354"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-trophy:before{content:"\f356"}.ion-umbrella:before{content:"\f2b7"}.ion-university:before{content:"\f357"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-wand:before{content:"\f358"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"}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}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-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:"Helvetica Neue",Roboto,sans-serif;line-height:20px;text-rendering:optimizeLegibility;-webkit-backface-visibility:hidden;-webkit-user-drag: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;width:auto;height:auto}.menu .scroll-content.scroll-content-false,.scroll-content-false{z-index:11}.scroll-view{position:relative;display:block;overflow:hidden;margin-top:-1px}.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}::-webkit-scrollbar{display:none}.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}@keyframes refresh-spin{0%{transform:translate3d(0,0,0) rotate(0)}100%{transform:translate3d(0,0,0) rotate(180deg)}}@-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-back{0%{transform:translate3d(0,0,0) rotate(180deg)}100%{transform:translate3d(0,0,0) rotate(0)}}@-webkit-keyframes refresh-spin-back{0%{-webkit-transform:translate3d(0,0,0) rotate(180deg)}100%{-webkit-transform:translate3d(0,0,0) rotate(0)}}.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;-webkit-transform-style:preserve-3d;backface-visibility:hidden;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 .2s;transition:-webkit-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)}ion-infinite-scroll{height:60px;width:100%;opacity:0;-webkit-transition:opacity .25s;transition:opacity .25s;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.active{opacity:1}.overflow-scroll{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch;top:0;right:0;bottom:0;left:0;position:absolute}.overflow-scroll .scroll{position:static;height:100%;-webkit-transform:translate3d(0,0,0)}.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}.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:"Helvetica Neue",Roboto,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.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 300ms ease-in-out;transition:background-color 300ms 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,.5)}.action-sheet-wrapper{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:all ease-in-out 300ms;transition:all ease-in-out 300ms;position:absolute;bottom:0;width:100%}.action-sheet-up{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.action-sheet{margin-left:15px;margin-right:15px;width:auto;z-index:11;overflow:hidden}.action-sheet .button{display:block;padding:1px;width:100%;border-radius:0;background-color:transparent;color:#387ef5;font-size:18px}.action-sheet .button.destructive{color:#ef473a}.action-sheet-title{padding:10px;color:#666;text-align:center;font-size:12px}.action-sheet-group{margin-bottom:5px;border-radius:3px;background-color:#fff}.action-sheet-group .button{border-width:1px 0 0;border-radius:0}.action-sheet-group .button.active{background-color:transparent;color:inherit}.action-sheet-group .button:first-child:last-child{border-width:0}.action-sheet-open,.action-sheet-open.modal-open .modal{pointer-events:none}.action-sheet-open .action-sheet-backdrop{pointer-events:auto}.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;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:#0c63ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c63ee,#0c63ee 50%,transparent 50%);color:#fff}.bar.bar-positive .title{color:#fff}.bar.bar-positive.bar-footer{background-image:linear-gradient(180deg,#0c63ee,#0c63ee 50%,transparent 50%)}.bar.bar-calm{border-color:#0a9ec7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9ec7,#0a9ec7 50%,transparent 50%);color:#fff}.bar.bar-calm .title{color:#fff}.bar.bar-calm.bar-footer{background-image:linear-gradient(180deg,#0a9ec7,#0a9ec7 50%,transparent 50%)}.bar.bar-assertive{border-color:#e42012;background-color:#ef473a;background-image:linear-gradient(0deg,#e42012,#e42012 50%,transparent 50%);color:#fff}.bar.bar-assertive .title{color:#fff}.bar.bar-assertive.bar-footer{background-image:linear-gradient(180deg,#e42012,#e42012 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,#0c63ee 50%,transparent 50%)}.bar.bar-energized{border-color:#e6b400;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b400,#e6b400 50%,transparent 50%);color:#fff}.bar.bar-energized .title{color:#fff}.bar.bar-energized.bar-footer{background-image:linear-gradient(180deg,#e6b400,#e6b400 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{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{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{padding-right:2px;padding-left:2px;font-size:20px;line-height:32px}.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{vertical-align:top;font-size:32px;line-height:32px}.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{font-size:32px;line-height:32px}.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{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}.bar .buttons-right span{margin-left:5px}.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}.bar-light .button{border-color:#ddd;background-color:#fff;color:#444}.bar-light .button:hover{color:#444;text-decoration:none}.bar-light .button.activated,.bar-light .button.active{border-color:#ccc;background-color:#fafafa;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#b2b2b2;background-color:#f8f8f8;color:#444}.bar-stable .button:hover{color:#444;text-decoration:none}.bar-stable .button.activated,.bar-stable .button.active{border-color:#a2a2a2;background-color:#e5e5e5;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#0c63ee;background-color:#387ef5;color:#fff}.bar-positive .button:hover{color:#fff;text-decoration:none}.bar-positive .button.activated,.bar-positive .button.active{border-color:#0c63ee;background-color:#0c63ee;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#0a9ec7;background-color:#11c1f3;color:#fff}.bar-calm .button:hover{color:#fff;text-decoration:none}.bar-calm .button.activated,.bar-calm .button.active{border-color:#0a9ec7;background-color:#0a9ec7;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#e42012;background-color:#ef473a;color:#fff}.bar-assertive .button:hover{color:#fff;text-decoration:none}.bar-assertive .button.activated,.bar-assertive .button.active{border-color:#e42012;background-color:#e42012;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#28a54c;background-color:#33cd5f;color:#fff}.bar-balanced .button:hover{color:#fff;text-decoration:none}.bar-balanced .button.activated,.bar-balanced .button.active{border-color:#28a54c;background-color:#28a54c;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#e6b400;background-color:#ffc900;color:#fff}.bar-energized .button:hover{color:#fff;text-decoration:none}.bar-energized .button.activated,.bar-energized .button.active{border-color:#e6b400;background-color:#e6b400;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#6b46e5;background-color:#886aea;color:#fff}.bar-royal .button:hover{color:#fff;text-decoration:none}.bar-royal .button.activated,.bar-royal .button.active{border-color:#6b46e5;background-color:#6b46e5;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#111;background-color:#444;color:#fff}.bar-dark .button:hover{color:#fff;text-decoration:none}.bar-dark .button.activated,.bar-dark .button.active{border-color:#000;background-color:#262626;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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{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}.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:#0c63ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c63ee,#0c63ee 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:#0a9ec7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9ec7,#0a9ec7 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:#e42012;background-color:#ef473a;background-image:linear-gradient(0deg,#e42012,#e42012 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:#e6b400;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b400,#e6b400 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;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;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;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;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;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;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;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;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;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;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,#0c63ee,#0c63ee 50%,transparent 50%);border-color:#0c63ee}.tabs-background-calm .tabs,.tabs-background-calm>.tabs{background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9ec7,#0a9ec7 50%,transparent 50%);border-color:#0a9ec7}.tabs-background-assertive .tabs,.tabs-background-assertive>.tabs{background-color:#ef473a;background-image:linear-gradient(0deg,#e42012,#e42012 50%,transparent 50%);border-color:#e42012}.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,#e6b400,#e6b400 50%,transparent 50%);border-color:#e6b400}.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:all .1s ease;-moz-transition:all .1s ease;-ms-transition:all .1s ease;-o-transition:all .1s ease;transition:all .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:0;margin-bottom:-2px;border-width:0 0 2px!important;border-style:solid}.tabs-top.tabs-striped .tab-item .badge{-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.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:"Helvetica Neue",Roboto,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 .icon,.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .icon{display:inline-block;vertical-align:top;margin-top:-.1em}.tabs-icon-left.tabs .tab-item .icon:before,.tabs-icon-left>.tabs .tab-item .icon:before,.tabs-icon-right.tabs .tab-item .icon:before,.tabs-icon-right>.tabs .tab-item .icon: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}.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{pointer-events:none}.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{-webkit-transition:background-color 300ms ease-in-out;transition:background-color 300ms ease-in-out;position:fixed;top:0;left:0;z-index:10;width:100%;height:100%;background-color:transparent}.modal-backdrop.active{background-color:rgba(0,0,0,.5)}.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%;overflow:visible;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-tabs-top{top:93px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top{top:137px}}.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)}.platform-ios .popover,.platform-ios .popover .bar-header{border-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}}.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-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;padding:0;font-weight:400;font-size:11px}.popup-body{padding:10px;overflow:scroll}.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{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;font-size:16px;font-weight:400}.item h3{margin:0 0 4px;font-size:14px}.item h4{margin:0 0 4px;font-size:12px}.item h5,.item h6{margin:0 0 3px;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:#0c63ee;background-color:#387ef5;color:#fff}.item.item-calm{border-color:#0a9ec7;background-color:#11c1f3;color:#fff}.item.item-assertive{border-color:#e42012;background-color:#ef473a;color:#fff}.item.item-balanced{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item.item-energized{border-color:#e6b400;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.active,.item-complex.activated .item-content,.item-complex.active .item-content,.item.activated,.item.active{border-color:#ccc;background-color:#D9D9D9}.item .item-content.activated.item-light,.item .item-content.active.item-light,.item-complex.activated .item-content.item-light,.item-complex.active .item-content.item-light,.item.activated.item-light,.item.active.item-light{border-color:#ccc;background-color:#fafafa}.item .item-content.activated.item-stable,.item .item-content.active.item-stable,.item-complex.activated .item-content.item-stable,.item-complex.active .item-content.item-stable,.item.activated.item-stable,.item.active.item-stable{border-color:#a2a2a2;background-color:#e5e5e5}.item .item-content.activated.item-positive,.item .item-content.active.item-positive,.item-complex.activated .item-content.item-positive,.item-complex.active .item-content.item-positive,.item.activated.item-positive,.item.active.item-positive{border-color:#0c63ee;background-color:#0c63ee}.item .item-content.activated.item-calm,.item .item-content.active.item-calm,.item-complex.activated .item-content.item-calm,.item-complex.active .item-content.item-calm,.item.activated.item-calm,.item.active.item-calm{border-color:#0a9ec7;background-color:#0a9ec7}.item .item-content.activated.item-assertive,.item .item-content.active.item-assertive,.item-complex.activated .item-content.item-assertive,.item-complex.active .item-content.item-assertive,.item.activated.item-assertive,.item.active.item-assertive{border-color:#e42012;background-color:#e42012}.item .item-content.activated.item-balanced,.item .item-content.active.item-balanced,.item-complex.activated .item-content.item-balanced,.item-complex.active .item-content.item-balanced,.item.activated.item-balanced,.item.active.item-balanced{border-color:#28a54c;background-color:#28a54c}.item .item-content.activated.item-energized,.item .item-content.active.item-energized,.item-complex.activated .item-content.item-energized,.item-complex.active .item-content.item-energized,.item.activated.item-energized,.item.active.item-energized{border-color:#e6b400;background-color:#e6b400}.item .item-content.activated.item-royal,.item .item-content.active.item-royal,.item-complex.activated .item-content.item-royal,.item-complex.active .item-content.item-royal,.item.activated.item-royal,.item.active.item-royal{border-color:#6b46e5;background-color:#6b46e5}.item .item-content.activated.item-dark,.item .item-content.active.item-dark,.item-complex.activated .item-content.item-dark,.item-complex.active .item-content.item-dark,.item.activated.item-dark,.item.active.item-dark{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{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-positive>.item-content{border-color:#0c63ee;background-color:#387ef5;color:#fff}.item-complex.item-positive>.item-content.active,.item-complex.item-positive>.item-content:active{border-color:#0c63ee;background-color:#0c63ee}.item-complex.item-calm>.item-content{border-color:#0a9ec7;background-color:#11c1f3;color:#fff}.item-complex.item-calm>.item-content.active,.item-complex.item-calm>.item-content:active{border-color:#0a9ec7;background-color:#0a9ec7}.item-complex.item-assertive>.item-content{border-color:#e42012;background-color:#ef473a;color:#fff}.item-complex.item-assertive>.item-content.active,.item-complex.item-assertive>.item-content:active{border-color:#e42012;background-color:#e42012}.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-energized>.item-content{border-color:#e6b400;background-color:#ffc900;color:#fff}.item-complex.item-energized>.item-content.active,.item-complex.item-energized>.item-content:active{border-color:#e6b400;background-color:#e6b400}.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-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-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%;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%;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%}.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%}.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-right-editing.item-right-editable .item-content,.list-right-editing .item-right-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,.81,.24,1);transition-timing-function:cubic-bezier(0.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 125ms;transition:all ease-in-out 125ms;position:absolute;top:0;right:0;z-index:0;width:75px;height:100%;background:inherit;padding-left:20px;display:none;opacity:0;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,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;z-index:3}.item-right-edit.visible.active{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.list-right-editing .item-right-edit{-webkit-transition-delay:125ms;transition-delay:125ms}.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:1}.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}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:"Helvetica Neue",Roboto,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 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;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}.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{-webkit-box-flex:1;-webkit-flex:1 0 100px;-moz-box-flex:1;-moz-flex:1 0 100px;-ms-flex:1 0 100px;flex:1 0 100px;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;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-floating-label{display:block;background-color:transparent;box-shadow:none}.item-floating-label .input-label{position:relative;padding:5px 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=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],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=date],.platform-android input[type=datetime-local],.platform-android input[type=month],.platform-android input[type=time],.platform-android input[type=week],.platform-ios input[type=date],.platform-ios input[type=datetime-local],.platform-ios input[type=month],.platform-ios input[type=time],.platform-ios input[type=week]{padding-top:8px}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=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{border:0}input[type=checkbox],input[type=radio]{margin:0;line-height:normal}input[type=button],input[type=checkbox],input[type=file],input[type=image],input[type=radio],input[type=reset],input[type=submit]{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=checkbox][disabled],input[type=checkbox][readonly],input[type=radio][disabled],input[type=radio][readonly]{background-color:transparent}.checkbox{position:relative;display:inline-block;padding: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}.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:#387ef5;background-color:#387ef5}.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:.2s;transition-duration:.2s;-webkit-transition-property:background-color,border;transition-property:background-color,border;display:inline-block;box-sizing:border-box;width:54px;height:32px;border:2px solid #E5E5E5;border-radius:20px;background-color:#E5E5E5;content:' ';cursor:pointer;pointer-events:none}.platform-android4_2 .toggle .track{-webkit-background-clip:padding-box}.toggle .handle{-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out;position:absolute;display:block;width:28px;height:28px;border-radius:28px;background-color:#fff;top:7px;left:7px}.toggle .handle:before{position:absolute;top:-4px;left:-22px;padding:19px 35px;content:" "}.toggle input:checked+.track .handle{-webkit-transform:translate3d(22px,0,0);transform:translate3d(22px,0,0);background-color:#fff}.item-toggle.active{box-shadow:none}.item-toggle,.item-toggle.item-complex .item-content{padding-right:102px}.item-toggle.item-complex{padding-right:0}.item-toggle .toggle{position:absolute;top:8px;right:16px;z-index:3}.toggle input:disabled+.track{opacity:.6}.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~.item-content{background:#f7f7f7}.item-radio input:checked~.radio-icon{visibility:visible}.platform-android.grade-b .item-radio,.platform-android.grade-c .item-radio{-webkit-animation:androidCheckedbugfix infinite 1s}@-webkit-keyframes androidCheckedbugfix{from,to{padding:0}}input[type=range]{display:inline-block;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)) center/99% 2px no-repeat;background:linear-gradient(to right,#ccc 0,#ccc 100%) center/99% 2px no-repeat;-webkit-appearance:none}input[type=range]::-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}input[type=range]::-webkit-slider-thumb:before{position:absolute;top:13px;left:-2001px;width:2000px;height:2px;background:#444;content:' '}input[type=range]::-webkit-slider-thumb:after{position:absolute;top:-15px;left:-15px;padding:30px;content:' '}.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-stable input::-webkit-slider-thumb:before{background:#b2b2b2}.range.range-positive input::-webkit-slider-thumb:before{background:#387ef5}.range.range-calm input::-webkit-slider-thumb:before{background:#11c1f3}.range.range-balanced input::-webkit-slider-thumb:before{background:#33cd5f}.range.range-assertive input::-webkit-slider-thumb:before{background:#ef473a}.range.range-energized input::-webkit-slider-thumb:before{background:#ffc900}.range.range-royal input::-webkit-slider-thumb:before{background:#886aea}.range.range-dark input::-webkit-slider-thumb:before{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}.item-select{position:relative}.item-select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;right:0;padding:14px 48px 16px 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:#656565}.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:#b2b2b2;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:2px;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{border-color:#a2a2a2;background-color:#e5e5e5;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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;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:#ddd;background-color:#fff;color:#444}.button.button-light:hover{color:#444;text-decoration:none}.button.button-light.activated,.button.button-light.active{border-color:#ccc;background-color:#fafafa;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#b2b2b2;background-color:#f8f8f8;color:#444}.button.button-stable:hover{color:#444;text-decoration:none}.button.button-stable.activated,.button.button-stable.active{border-color:#a2a2a2;background-color:#e5e5e5;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#0c63ee;background-color:#387ef5;color:#fff}.button.button-positive:hover{color:#fff;text-decoration:none}.button.button-positive.activated,.button.button-positive.active{border-color:#0c63ee;background-color:#0c63ee;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#0a9ec7;background-color:#11c1f3;color:#fff}.button.button-calm:hover{color:#fff;text-decoration:none}.button.button-calm.activated,.button.button-calm.active{border-color:#0a9ec7;background-color:#0a9ec7;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#e42012;background-color:#ef473a;color:#fff}.button.button-assertive:hover{color:#fff;text-decoration:none}.button.button-assertive.activated,.button.button-assertive.active{border-color:#e42012;background-color:#e42012;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#28a54c;background-color:#33cd5f;color:#fff}.button.button-balanced:hover{color:#fff;text-decoration:none}.button.button-balanced.activated,.button.button-balanced.active{border-color:#28a54c;background-color:#28a54c;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#e6b400;background-color:#ffc900;color:#fff}.button.button-energized:hover{color:#fff;text-decoration:none}.button.button-energized.activated,.button.button-energized.active{border-color:#e6b400;background-color:#e6b400;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#6b46e5;background-color:#886aea;color:#fff}.button.button-royal:hover{color:#fff;text-decoration:none}.button.button-royal.activated,.button.button-royal.active{border-color:#6b46e5;background-color:#6b46e5;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#111;background-color:#444;color:#fff}.button.button-dark:hover{color:#fff;text-decoration:none}.button.button-dark.activated,.button.button-dark.active{border-color:#000;background-color:#262626;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:2px 0 0 2px}.button-bar>.button:last-child{border-right-width:1px;border-radius:0 2px 2px 0}.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+.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-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-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-user-drag:none;-ms-touch-action:none;-ms-content-zooming:none}.click-block{position:absolute;top:0;left:0;z-index:99999;width:100%;height:100%;opacity:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.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}.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:#0c63ee}.calm,a.calm{color:#11c1f3}.calm-bg{background-color:#11c1f3}.calm-border{border-color:#0a9ec7}.assertive,a.assertive{color:#ef473a}.assertive-bg{background-color:#ef473a}.assertive-border{border-color:#e42012}.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:#e6b400}.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}.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-tabs-top{top:113px}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-subheader.has-tabs-top{top:157px}.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,.7,.1,1) 400ms;transition:all cubic-bezier(0.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(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:450ms;transition-duration:450ms;-webkit-transition-timing-function:cubic-bezier(0.3,.9,.4,1);transition-timing-function:cubic-bezier(0.3,.9,.4,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,transform}[nav-view-transition=ios][nav-view-direction=back],[nav-view-transition=ios][nav-view-direction=forward]{background-color:#000}[nav-view-transition=ios] [nav-view=active],[nav-view-transition=ios][nav-view-direction=back] [nav-view=leaving],[nav-view-transition=ios][nav-view-direction=forward] [nav-view=entering]{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] .back-text,[nav-bar-transition=ios] .buttons,[nav-bar-transition=ios] .title{-webkit-transition-duration:450ms;transition-duration:450ms;-webkit-transition-timing-function:cubic-bezier(0.3,.9,.4,1);transition-timing-function:cubic-bezier(0.3,.9,.4,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: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(0.4,.6,.2,1);transition-timing-function:cubic-bezier(0.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=back] [nav-view=leaving],[nav-view-transition=android][nav-view-direction=forward] [nav-view=entering]{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] .buttons,[nav-bar-transition=android] .title{-webkit-transition-duration:200ms;transition-duration:200ms;-webkit-transition-timing-function:cubic-bezier(0.4,.6,.2,1);transition-timing-function:cubic-bezier(0.4,.6,.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:0 0}[nav-bar-transition=android] [nav-bar=cached]{display:block}[nav-bar-transition=android] [nav-bar=cached] .header-item,[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 + + 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.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:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-circle:before{content:"\f359"}.ion-android-alarm-clock:before{content:"\f35a"}.ion-android-alert:before{content:"\f35b"}.ion-android-apps:before{content:"\f35c"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down:before{content:"\f35d"}.ion-android-arrow-dropdown:before{content:"\f35f"}.ion-android-arrow-dropdown-circle:before{content:"\f35e"}.ion-android-arrow-dropleft:before{content:"\f361"}.ion-android-arrow-dropleft-circle:before{content:"\f360"}.ion-android-arrow-dropright:before{content:"\f363"}.ion-android-arrow-dropright-circle:before{content:"\f362"}.ion-android-arrow-dropup:before{content:"\f365"}.ion-android-arrow-dropup-circle:before{content:"\f364"}.ion-android-arrow-forward:before{content:"\f30f"}.ion-android-arrow-up:before{content:"\f366"}.ion-android-attach:before{content:"\f367"}.ion-android-bar:before{content:"\f368"}.ion-android-bicycle:before{content:"\f369"}.ion-android-boat:before{content:"\f36a"}.ion-android-bookmark:before{content:"\f36b"}.ion-android-bulb:before{content:"\f36c"}.ion-android-bus:before{content:"\f36d"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-cancel:before{content:"\f36e"}.ion-android-car:before{content:"\f36f"}.ion-android-cart:before{content:"\f370"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkbox:before{content:"\f374"}.ion-android-checkbox-blank:before{content:"\f371"}.ion-android-checkbox-outline:before{content:"\f373"}.ion-android-checkbox-outline-blank:before{content:"\f372"}.ion-android-checkmark-circle:before{content:"\f375"}.ion-android-clipboard:before{content:"\f376"}.ion-android-close:before{content:"\f2d7"}.ion-android-cloud:before{content:"\f37a"}.ion-android-cloud-circle:before{content:"\f377"}.ion-android-cloud-done:before{content:"\f378"}.ion-android-cloud-outline:before{content:"\f379"}.ion-android-color-palette:before{content:"\f37b"}.ion-android-compass:before{content:"\f37c"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-contract:before{content:"\f37d"}.ion-android-create:before{content:"\f37e"}.ion-android-delete:before{content:"\f37f"}.ion-android-desktop:before{content:"\f380"}.ion-android-document:before{content:"\f381"}.ion-android-done:before{content:"\f383"}.ion-android-done-all:before{content:"\f382"}.ion-android-download:before{content:"\f2dd"}.ion-android-drafts:before{content:"\f384"}.ion-android-exit:before{content:"\f385"}.ion-android-expand:before{content:"\f386"}.ion-android-favorite:before{content:"\f388"}.ion-android-favorite-outline:before{content:"\f387"}.ion-android-film:before{content:"\f389"}.ion-android-folder:before{content:"\f2e0"}.ion-android-folder-open:before{content:"\f38a"}.ion-android-funnel:before{content:"\f38b"}.ion-android-globe:before{content:"\f38c"}.ion-android-hand:before{content:"\f2e3"}.ion-android-hangout:before{content:"\f38d"}.ion-android-happy:before{content:"\f38e"}.ion-android-home:before{content:"\f38f"}.ion-android-image:before{content:"\f2e4"}.ion-android-laptop:before{content:"\f390"}.ion-android-list:before{content:"\f391"}.ion-android-locate:before{content:"\f2e9"}.ion-android-lock:before{content:"\f392"}.ion-android-mail:before{content:"\f2eb"}.ion-android-map:before{content:"\f393"}.ion-android-menu:before{content:"\f394"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-microphone-off:before{content:"\f395"}.ion-android-more-horizontal:before{content:"\f396"}.ion-android-more-vertical:before{content:"\f397"}.ion-android-navigate:before{content:"\f398"}.ion-android-notifications:before{content:"\f39b"}.ion-android-notifications-none:before{content:"\f399"}.ion-android-notifications-off:before{content:"\f39a"}.ion-android-open:before{content:"\f39c"}.ion-android-options:before{content:"\f39d"}.ion-android-people:before{content:"\f39e"}.ion-android-person:before{content:"\f3a0"}.ion-android-person-add:before{content:"\f39f"}.ion-android-phone-landscape:before{content:"\f3a1"}.ion-android-phone-portrait:before{content:"\f3a2"}.ion-android-pin:before{content:"\f3a3"}.ion-android-plane:before{content:"\f3a4"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-print:before{content:"\f3a5"}.ion-android-radio-button-off:before{content:"\f3a6"}.ion-android-radio-button-on:before{content:"\f3a7"}.ion-android-refresh:before{content:"\f3a8"}.ion-android-remove:before{content:"\f2f4"}.ion-android-remove-circle:before{content:"\f3a9"}.ion-android-restaurant:before{content:"\f3aa"}.ion-android-sad:before{content:"\f3ab"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-share-alt:before{content:"\f3ac"}.ion-android-star:before{content:"\f2fc"}.ion-android-star-half:before{content:"\f3ad"}.ion-android-star-outline:before{content:"\f3ae"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-subway:before{content:"\f3af"}.ion-android-sunny:before{content:"\f3b0"}.ion-android-sync:before{content:"\f3b1"}.ion-android-textsms:before{content:"\f3b2"}.ion-android-time:before{content:"\f3b3"}.ion-android-train:before{content:"\f3b4"}.ion-android-unlock:before{content:"\f3b5"}.ion-android-upload:before{content:"\f3b6"}.ion-android-volume-down:before{content:"\f3b7"}.ion-android-volume-mute:before{content:"\f3b8"}.ion-android-volume-off:before{content:"\f3b9"}.ion-android-volume-up:before{content:"\f3ba"}.ion-android-walk:before{content:"\f3bb"}.ion-android-warning:before{content:"\f3bc"}.ion-android-watch:before{content:"\f3bd"}.ion-android-wifi:before{content:"\f305"}.ion-aperture:before{content:"\f313"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-asterisk:before{content:"\f314"}.ion-at:before{content:"\f10f"}.ion-backspace:before{content:"\f3bf"}.ion-backspace-outline:before{content:"\f3be"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bonfire:before{content:"\f315"}.ion-bookmark:before{content:"\f26b"}.ion-bowtie:before{content:"\f3c0"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-cash:before{content:"\f316"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-closed-captioning:before{content:"\f317"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-crop:before{content:"\f3c1"}.ion-cube:before{content:"\f318"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-easel:before{content:"\f3c2"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-email-unread:before{content:"\f3c3"}.ion-erlenmeyer-flask:before{content:"\f3c5"}.ion-erlenmeyer-flask-bubbles:before{content:"\f3c4"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-fireball:before{content:"\f319"}.ion-flag:before{content:"\f279"}.ion-flame:before{content:"\f31a"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-funnel:before{content:"\f31b"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-happy:before{content:"\f31c"}.ion-happy-outline:before{content:"\f3c6"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-heart-broken:before{content:"\f31d"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios-alarm:before{content:"\f3c8"}.ion-ios-alarm-outline:before{content:"\f3c7"}.ion-ios-albums:before{content:"\f3ca"}.ion-ios-albums-outline:before{content:"\f3c9"}.ion-ios-americanfootball:before{content:"\f3cc"}.ion-ios-americanfootball-outline:before{content:"\f3cb"}.ion-ios-analytics:before{content:"\f3ce"}.ion-ios-analytics-outline:before{content:"\f3cd"}.ion-ios-arrow-back:before{content:"\f3cf"}.ion-ios-arrow-down:before{content:"\f3d0"}.ion-ios-arrow-forward:before{content:"\f3d1"}.ion-ios-arrow-left:before{content:"\f3d2"}.ion-ios-arrow-right:before{content:"\f3d3"}.ion-ios-arrow-thin-down:before{content:"\f3d4"}.ion-ios-arrow-thin-left:before{content:"\f3d5"}.ion-ios-arrow-thin-right:before{content:"\f3d6"}.ion-ios-arrow-thin-up:before{content:"\f3d7"}.ion-ios-arrow-up:before{content:"\f3d8"}.ion-ios-at:before{content:"\f3da"}.ion-ios-at-outline:before{content:"\f3d9"}.ion-ios-barcode:before{content:"\f3dc"}.ion-ios-barcode-outline:before{content:"\f3db"}.ion-ios-baseball:before{content:"\f3de"}.ion-ios-baseball-outline:before{content:"\f3dd"}.ion-ios-basketball:before{content:"\f3e0"}.ion-ios-basketball-outline:before{content:"\f3df"}.ion-ios-bell:before{content:"\f3e2"}.ion-ios-bell-outline:before{content:"\f3e1"}.ion-ios-body:before{content:"\f3e4"}.ion-ios-body-outline:before{content:"\f3e3"}.ion-ios-bolt:before{content:"\f3e6"}.ion-ios-bolt-outline:before{content:"\f3e5"}.ion-ios-book:before{content:"\f3e8"}.ion-ios-book-outline:before{content:"\f3e7"}.ion-ios-bookmarks:before{content:"\f3ea"}.ion-ios-bookmarks-outline:before{content:"\f3e9"}.ion-ios-box:before{content:"\f3ec"}.ion-ios-box-outline:before{content:"\f3eb"}.ion-ios-briefcase:before{content:"\f3ee"}.ion-ios-briefcase-outline:before{content:"\f3ed"}.ion-ios-browsers:before{content:"\f3f0"}.ion-ios-browsers-outline:before{content:"\f3ef"}.ion-ios-calculator:before{content:"\f3f2"}.ion-ios-calculator-outline:before{content:"\f3f1"}.ion-ios-calendar:before{content:"\f3f4"}.ion-ios-calendar-outline:before{content:"\f3f3"}.ion-ios-camera:before{content:"\f3f6"}.ion-ios-camera-outline:before{content:"\f3f5"}.ion-ios-cart:before{content:"\f3f8"}.ion-ios-cart-outline:before{content:"\f3f7"}.ion-ios-chatboxes:before{content:"\f3fa"}.ion-ios-chatboxes-outline:before{content:"\f3f9"}.ion-ios-chatbubble:before{content:"\f3fc"}.ion-ios-chatbubble-outline:before{content:"\f3fb"}.ion-ios-checkmark:before{content:"\f3ff"}.ion-ios-checkmark-empty:before{content:"\f3fd"}.ion-ios-checkmark-outline:before{content:"\f3fe"}.ion-ios-circle-filled:before{content:"\f400"}.ion-ios-circle-outline:before{content:"\f401"}.ion-ios-clock:before{content:"\f403"}.ion-ios-clock-outline:before{content:"\f402"}.ion-ios-close:before{content:"\f406"}.ion-ios-close-empty:before{content:"\f404"}.ion-ios-close-outline:before{content:"\f405"}.ion-ios-cloud:before{content:"\f40c"}.ion-ios-cloud-download:before{content:"\f408"}.ion-ios-cloud-download-outline:before{content:"\f407"}.ion-ios-cloud-outline:before{content:"\f409"}.ion-ios-cloud-upload:before{content:"\f40b"}.ion-ios-cloud-upload-outline:before{content:"\f40a"}.ion-ios-cloudy:before{content:"\f410"}.ion-ios-cloudy-night:before{content:"\f40e"}.ion-ios-cloudy-night-outline:before{content:"\f40d"}.ion-ios-cloudy-outline:before{content:"\f40f"}.ion-ios-cog:before{content:"\f412"}.ion-ios-cog-outline:before{content:"\f411"}.ion-ios-color-filter:before{content:"\f414"}.ion-ios-color-filter-outline:before{content:"\f413"}.ion-ios-color-wand:before{content:"\f416"}.ion-ios-color-wand-outline:before{content:"\f415"}.ion-ios-compose:before{content:"\f418"}.ion-ios-compose-outline:before{content:"\f417"}.ion-ios-contact:before{content:"\f41a"}.ion-ios-contact-outline:before{content:"\f419"}.ion-ios-copy:before{content:"\f41c"}.ion-ios-copy-outline:before{content:"\f41b"}.ion-ios-crop:before{content:"\f41e"}.ion-ios-crop-strong:before{content:"\f41d"}.ion-ios-download:before{content:"\f420"}.ion-ios-download-outline:before{content:"\f41f"}.ion-ios-drag:before{content:"\f421"}.ion-ios-email:before{content:"\f423"}.ion-ios-email-outline:before{content:"\f422"}.ion-ios-eye:before{content:"\f425"}.ion-ios-eye-outline:before{content:"\f424"}.ion-ios-fastforward:before{content:"\f427"}.ion-ios-fastforward-outline:before{content:"\f426"}.ion-ios-filing:before{content:"\f429"}.ion-ios-filing-outline:before{content:"\f428"}.ion-ios-film:before{content:"\f42b"}.ion-ios-film-outline:before{content:"\f42a"}.ion-ios-flag:before{content:"\f42d"}.ion-ios-flag-outline:before{content:"\f42c"}.ion-ios-flame:before{content:"\f42f"}.ion-ios-flame-outline:before{content:"\f42e"}.ion-ios-flask:before{content:"\f431"}.ion-ios-flask-outline:before{content:"\f430"}.ion-ios-flower:before{content:"\f433"}.ion-ios-flower-outline:before{content:"\f432"}.ion-ios-folder:before{content:"\f435"}.ion-ios-folder-outline:before{content:"\f434"}.ion-ios-football:before{content:"\f437"}.ion-ios-football-outline:before{content:"\f436"}.ion-ios-game-controller-a:before{content:"\f439"}.ion-ios-game-controller-a-outline:before{content:"\f438"}.ion-ios-game-controller-b:before{content:"\f43b"}.ion-ios-game-controller-b-outline:before{content:"\f43a"}.ion-ios-gear:before{content:"\f43d"}.ion-ios-gear-outline:before{content:"\f43c"}.ion-ios-glasses:before{content:"\f43f"}.ion-ios-glasses-outline:before{content:"\f43e"}.ion-ios-grid-view:before{content:"\f441"}.ion-ios-grid-view-outline:before{content:"\f440"}.ion-ios-heart:before{content:"\f443"}.ion-ios-heart-outline:before{content:"\f442"}.ion-ios-help:before{content:"\f446"}.ion-ios-help-empty:before{content:"\f444"}.ion-ios-help-outline:before{content:"\f445"}.ion-ios-home:before{content:"\f448"}.ion-ios-home-outline:before{content:"\f447"}.ion-ios-infinite:before{content:"\f44a"}.ion-ios-infinite-outline:before{content:"\f449"}.ion-ios-information:before{content:"\f44d"}.ion-ios-information-empty:before{content:"\f44b"}.ion-ios-information-outline:before{content:"\f44c"}.ion-ios-ionic-outline:before{content:"\f44e"}.ion-ios-keypad:before{content:"\f450"}.ion-ios-keypad-outline:before{content:"\f44f"}.ion-ios-lightbulb:before{content:"\f452"}.ion-ios-lightbulb-outline:before{content:"\f451"}.ion-ios-list:before{content:"\f454"}.ion-ios-list-outline:before{content:"\f453"}.ion-ios-location:before{content:"\f456"}.ion-ios-location-outline:before{content:"\f455"}.ion-ios-locked:before{content:"\f458"}.ion-ios-locked-outline:before{content:"\f457"}.ion-ios-loop:before{content:"\f45a"}.ion-ios-loop-strong:before{content:"\f459"}.ion-ios-medical:before{content:"\f45c"}.ion-ios-medical-outline:before{content:"\f45b"}.ion-ios-medkit:before{content:"\f45e"}.ion-ios-medkit-outline:before{content:"\f45d"}.ion-ios-mic:before{content:"\f461"}.ion-ios-mic-off:before{content:"\f45f"}.ion-ios-mic-outline:before{content:"\f460"}.ion-ios-minus:before{content:"\f464"}.ion-ios-minus-empty:before{content:"\f462"}.ion-ios-minus-outline:before{content:"\f463"}.ion-ios-monitor:before{content:"\f466"}.ion-ios-monitor-outline:before{content:"\f465"}.ion-ios-moon:before{content:"\f468"}.ion-ios-moon-outline:before{content:"\f467"}.ion-ios-more:before{content:"\f46a"}.ion-ios-more-outline:before{content:"\f469"}.ion-ios-musical-note:before{content:"\f46b"}.ion-ios-musical-notes:before{content:"\f46c"}.ion-ios-navigate:before{content:"\f46e"}.ion-ios-navigate-outline:before{content:"\f46d"}.ion-ios-nutrition:before{content:"\f470"}.ion-ios-nutrition-outline:before{content:"\f46f"}.ion-ios-paper:before{content:"\f472"}.ion-ios-paper-outline:before{content:"\f471"}.ion-ios-paperplane:before{content:"\f474"}.ion-ios-paperplane-outline:before{content:"\f473"}.ion-ios-partlysunny:before{content:"\f476"}.ion-ios-partlysunny-outline:before{content:"\f475"}.ion-ios-pause:before{content:"\f478"}.ion-ios-pause-outline:before{content:"\f477"}.ion-ios-paw:before{content:"\f47a"}.ion-ios-paw-outline:before{content:"\f479"}.ion-ios-people:before{content:"\f47c"}.ion-ios-people-outline:before{content:"\f47b"}.ion-ios-person:before{content:"\f47e"}.ion-ios-person-outline:before{content:"\f47d"}.ion-ios-personadd:before{content:"\f480"}.ion-ios-personadd-outline:before{content:"\f47f"}.ion-ios-photos:before{content:"\f482"}.ion-ios-photos-outline:before{content:"\f481"}.ion-ios-pie:before{content:"\f484"}.ion-ios-pie-outline:before{content:"\f483"}.ion-ios-pint:before{content:"\f486"}.ion-ios-pint-outline:before{content:"\f485"}.ion-ios-play:before{content:"\f488"}.ion-ios-play-outline:before{content:"\f487"}.ion-ios-plus:before{content:"\f48b"}.ion-ios-plus-empty:before{content:"\f489"}.ion-ios-plus-outline:before{content:"\f48a"}.ion-ios-pricetag:before{content:"\f48d"}.ion-ios-pricetag-outline:before{content:"\f48c"}.ion-ios-pricetags:before{content:"\f48f"}.ion-ios-pricetags-outline:before{content:"\f48e"}.ion-ios-printer:before{content:"\f491"}.ion-ios-printer-outline:before{content:"\f490"}.ion-ios-pulse:before{content:"\f493"}.ion-ios-pulse-strong:before{content:"\f492"}.ion-ios-rainy:before{content:"\f495"}.ion-ios-rainy-outline:before{content:"\f494"}.ion-ios-recording:before{content:"\f497"}.ion-ios-recording-outline:before{content:"\f496"}.ion-ios-redo:before{content:"\f499"}.ion-ios-redo-outline:before{content:"\f498"}.ion-ios-refresh:before{content:"\f49c"}.ion-ios-refresh-empty:before{content:"\f49a"}.ion-ios-refresh-outline:before{content:"\f49b"}.ion-ios-reload:before{content:"\f49d"}.ion-ios-reverse-camera:before{content:"\f49f"}.ion-ios-reverse-camera-outline:before{content:"\f49e"}.ion-ios-rewind:before{content:"\f4a1"}.ion-ios-rewind-outline:before{content:"\f4a0"}.ion-ios-rose:before{content:"\f4a3"}.ion-ios-rose-outline:before{content:"\f4a2"}.ion-ios-search:before{content:"\f4a5"}.ion-ios-search-strong:before{content:"\f4a4"}.ion-ios-settings:before{content:"\f4a7"}.ion-ios-settings-strong:before{content:"\f4a6"}.ion-ios-shuffle:before{content:"\f4a9"}.ion-ios-shuffle-strong:before{content:"\f4a8"}.ion-ios-skipbackward:before{content:"\f4ab"}.ion-ios-skipbackward-outline:before{content:"\f4aa"}.ion-ios-skipforward:before{content:"\f4ad"}.ion-ios-skipforward-outline:before{content:"\f4ac"}.ion-ios-snowy:before{content:"\f4ae"}.ion-ios-speedometer:before{content:"\f4b0"}.ion-ios-speedometer-outline:before{content:"\f4af"}.ion-ios-star:before{content:"\f4b3"}.ion-ios-star-half:before{content:"\f4b1"}.ion-ios-star-outline:before{content:"\f4b2"}.ion-ios-stopwatch:before{content:"\f4b5"}.ion-ios-stopwatch-outline:before{content:"\f4b4"}.ion-ios-sunny:before{content:"\f4b7"}.ion-ios-sunny-outline:before{content:"\f4b6"}.ion-ios-telephone:before{content:"\f4b9"}.ion-ios-telephone-outline:before{content:"\f4b8"}.ion-ios-tennisball:before{content:"\f4bb"}.ion-ios-tennisball-outline:before{content:"\f4ba"}.ion-ios-thunderstorm:before{content:"\f4bd"}.ion-ios-thunderstorm-outline:before{content:"\f4bc"}.ion-ios-time:before{content:"\f4bf"}.ion-ios-time-outline:before{content:"\f4be"}.ion-ios-timer:before{content:"\f4c1"}.ion-ios-timer-outline:before{content:"\f4c0"}.ion-ios-toggle:before{content:"\f4c3"}.ion-ios-toggle-outline:before{content:"\f4c2"}.ion-ios-trash:before{content:"\f4c5"}.ion-ios-trash-outline:before{content:"\f4c4"}.ion-ios-undo:before{content:"\f4c7"}.ion-ios-undo-outline:before{content:"\f4c6"}.ion-ios-unlocked:before{content:"\f4c9"}.ion-ios-unlocked-outline:before{content:"\f4c8"}.ion-ios-upload:before{content:"\f4cb"}.ion-ios-upload-outline:before{content:"\f4ca"}.ion-ios-videocam:before{content:"\f4cd"}.ion-ios-videocam-outline:before{content:"\f4cc"}.ion-ios-volume-high:before{content:"\f4ce"}.ion-ios-volume-low:before{content:"\f4cf"}.ion-ios-wineglass:before{content:"\f4d1"}.ion-ios-wineglass-outline:before{content:"\f4d0"}.ion-ios-world:before{content:"\f4d3"}.ion-ios-world-outline:before{content:"\f4d2"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before{content:"\f29a"}.ion-load-b:before{content:"\f29b"}.ion-load-c:before{content:"\f29c"}.ion-load-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-lock-combination:before{content:"\f4d4"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-merge:before{content:"\f33f"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-mouse:before{content:"\f340"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-network:before{content:"\f341"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-outlet:before{content:"\f342"}.ion-paintbrush:before{content:"\f4d5"}.ion-paintbucket:before{content:"\f4d6"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-planet:before{content:"\f343"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-podium:before{content:"\f344"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-pull-request:before{content:"\f345"}.ion-qr-scanner:before{content:"\f346"}.ion-quote:before{content:"\f347"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-ribbon-a:before{content:"\f348"}.ion-ribbon-b:before{content:"\f349"}.ion-sad:before{content:"\f34a"}.ion-sad-outline:before{content:"\f4d7"}.ion-scissors:before{content:"\f34b"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-angular:before{content:"\f4d9"}.ion-social-angular-outline:before{content:"\f4d8"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-chrome:before{content:"\f4db"}.ion-social-chrome-outline:before{content:"\f4da"}.ion-social-codepen:before{content:"\f4dd"}.ion-social-codepen-outline:before{content:"\f4dc"}.ion-social-css3:before{content:"\f4df"}.ion-social-css3-outline:before{content:"\f4de"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-euro:before{content:"\f4e1"}.ion-social-euro-outline:before{content:"\f4e0"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-foursquare:before{content:"\f34d"}.ion-social-foursquare-outline:before{content:"\f34c"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-google:before{content:"\f34f"}.ion-social-google-outline:before{content:"\f34e"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-html5:before{content:"\f4e3"}.ion-social-html5-outline:before{content:"\f4e2"}.ion-social-instagram:before{content:"\f351"}.ion-social-instagram-outline:before{content:"\f350"}.ion-social-javascript:before{content:"\f4e5"}.ion-social-javascript-outline:before{content:"\f4e4"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-markdown:before{content:"\f4e6"}.ion-social-nodejs:before{content:"\f4e7"}.ion-social-octocat:before{content:"\f4e8"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-python:before{content:"\f4e9"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-sass:before{content:"\f4ea"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-snapchat:before{content:"\f4ec"}.ion-social-snapchat-outline:before{content:"\f4eb"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitch:before{content:"\f4ee"}.ion-social-twitch-outline:before{content:"\f4ed"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-usd:before{content:"\f353"}.ion-social-usd-outline:before{content:"\f352"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-whatsapp:before{content:"\f4f0"}.ion-social-whatsapp-outline:before{content:"\f4ef"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-yen:before{content:"\f4f2"}.ion-social-yen-outline:before{content:"\f4f1"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-soup-can:before{content:"\f4f4"}.ion-soup-can-outline:before{content:"\f4f3"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-toggle:before{content:"\f355"}.ion-toggle-filled:before{content:"\f354"}.ion-transgender:before{content:"\f4f5"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-trophy:before{content:"\f356"}.ion-tshirt:before{content:"\f4f7"}.ion-tshirt-outline:before{content:"\f4f6"}.ion-umbrella:before{content:"\f2b7"}.ion-university:before{content:"\f357"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-wand:before{content:"\f358"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"}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}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-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:"Helvetica Neue",Roboto,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;width:auto;height:auto}.menu .scroll-content.scroll-content-false,.scroll-content-false{z-index:11}.scroll-view{position:relative;display:block;overflow:hidden;margin-top:-1px}.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}.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 .icon:before,ion-infinite-scroll .spinner{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}ion-infinite-scroll:not(.active) .icon:before,ion-infinite-scroll:not(.active) .spinner{-webkit-transform:translate3d(-1000px,0,0);transform:translate3d(-1000px,0,0)}.overflow-scroll{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch;top:0;right:0;bottom:0;left:0;position:absolute}.overflow-scroll .scroll{position:static;height:100%;-webkit-transform:translate3d(0,0,0)}.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}.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:"Helvetica Neue",Roboto,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.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;width:100%}.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}.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;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:#0c63ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c63ee,#0c63ee 50%,transparent 50%);color:#fff}.bar.bar-positive .title{color:#fff}.bar.bar-positive.bar-footer{background-image:linear-gradient(180deg,#0c63ee,#0c63ee 50%,transparent 50%)}.bar.bar-calm{border-color:#0a9ec7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9ec7,#0a9ec7 50%,transparent 50%);color:#fff}.bar.bar-calm .title{color:#fff}.bar.bar-calm.bar-footer{background-image:linear-gradient(180deg,#0a9ec7,#0a9ec7 50%,transparent 50%)}.bar.bar-assertive{border-color:#e42012;background-color:#ef473a;background-image:linear-gradient(0deg,#e42012,#e42012 50%,transparent 50%);color:#fff}.bar.bar-assertive .title{color:#fff}.bar.bar-assertive.bar-footer{background-image:linear-gradient(180deg,#e42012,#e42012 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,#0c63ee 50%,transparent 50%)}.bar.bar-energized{border-color:#e6b400;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b400,#e6b400 50%,transparent 50%);color:#fff}.bar.bar-energized .title{color:#fff}.bar.bar-energized.bar-footer{background-image:linear-gradient(180deg,#e6b400,#e6b400 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{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{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{padding-right:2px;padding-left:2px;font-size:20px;line-height:32px}.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{vertical-align:top;font-size:32px;line-height:32px}.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{font-size:32px;line-height:32px}.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{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 .bar .back-button .icon:before{font-size:24px}.platform-android .bar .title{font-size:19px;line-height:43px}.bar-light .button{border-color:#ddd;background-color:#fff;color:#444}.bar-light .button:hover{color:#444;text-decoration:none}.bar-light .button.activated,.bar-light .button.active{border-color:#ccc;background-color:#fafafa;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#b2b2b2;background-color:#f8f8f8;color:#444}.bar-stable .button:hover{color:#444;text-decoration:none}.bar-stable .button.activated,.bar-stable .button.active{border-color:#a2a2a2;background-color:#e5e5e5;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#0c63ee;background-color:#387ef5;color:#fff}.bar-positive .button:hover{color:#fff;text-decoration:none}.bar-positive .button.activated,.bar-positive .button.active{border-color:#0c63ee;background-color:#0c63ee;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#0a9ec7;background-color:#11c1f3;color:#fff}.bar-calm .button:hover{color:#fff;text-decoration:none}.bar-calm .button.activated,.bar-calm .button.active{border-color:#0a9ec7;background-color:#0a9ec7;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#e42012;background-color:#ef473a;color:#fff}.bar-assertive .button:hover{color:#fff;text-decoration:none}.bar-assertive .button.activated,.bar-assertive .button.active{border-color:#e42012;background-color:#e42012;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#28a54c;background-color:#33cd5f;color:#fff}.bar-balanced .button:hover{color:#fff;text-decoration:none}.bar-balanced .button.activated,.bar-balanced .button.active{border-color:#28a54c;background-color:#28a54c;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#e6b400;background-color:#ffc900;color:#fff}.bar-energized .button:hover{color:#fff;text-decoration:none}.bar-energized .button.activated,.bar-energized .button.active{border-color:#e6b400;background-color:#e6b400;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#6b46e5;background-color:#886aea;color:#fff}.bar-royal .button:hover{color:#fff;text-decoration:none}.bar-royal .button.activated,.bar-royal .button.active{border-color:#6b46e5;background-color:#6b46e5;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#111;background-color:#444;color:#fff}.bar-dark .button:hover{color:#fff;text-decoration:none}.bar-dark .button.activated,.bar-dark .button.active{border-color:#000;background-color:#262626;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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}.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:#0c63ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c63ee,#0c63ee 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:#0a9ec7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9ec7,#0a9ec7 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:#e42012;background-color:#ef473a;background-image:linear-gradient(0deg,#e42012,#e42012 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:#e6b400;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b400,#e6b400 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;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;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;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;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;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;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;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;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;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;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,#0c63ee,#0c63ee 50%,transparent 50%);border-color:#0c63ee}.tabs-background-calm .tabs,.tabs-background-calm>.tabs{background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9ec7,#0a9ec7 50%,transparent 50%);border-color:#0a9ec7}.tabs-background-assertive .tabs,.tabs-background-assertive>.tabs{background-color:#ef473a;background-image:linear-gradient(0deg,#e42012,#e42012 50%,transparent 50%);border-color:#e42012}.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,#e6b400,#e6b400 50%,transparent 50%);border-color:#e6b400}.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!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,.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:"Helvetica Neue",Roboto,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 .icon,.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .icon{display:inline-block;vertical-align:top;margin-top:-.1em}.tabs-icon-left.tabs .tab-item .icon:before,.tabs-icon-left>.tabs .tab-item .icon:before,.tabs-icon-right.tabs .tab-item .icon:before,.tabs-icon-right>.tabs .tab-item .icon: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}.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{pointer-events:none}.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{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%}.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%;overflow:visible;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-tabs-top{top:93px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top{top:137px}.modal-backdrop{-webkit-transition:background-color 300ms ease-in-out;transition:background-color 300ms ease-in-out;background-color:transparent}.modal-backdrop.active{background-color:rgba(0,0,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}.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}}.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-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;padding:0;font-weight:400;font-size:11px}.popup-body{padding:10px;overflow:scroll}.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{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;font-size:16px;font-weight:400}.item h3{margin:0 0 4px;font-size:14px}.item h4{margin:0 0 4px;font-size:12px}.item h5,.item h6{margin:0 0 3px;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:#0c63ee;background-color:#387ef5;color:#fff}.item.item-calm{border-color:#0a9ec7;background-color:#11c1f3;color:#fff}.item.item-assertive{border-color:#e42012;background-color:#ef473a;color:#fff}.item.item-balanced{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item.item-energized{border-color:#e6b400;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.active,.item-complex.activated .item-content,.item-complex.active .item-content,.item.activated,.item.active{border-color:#ccc;background-color:#D9D9D9}.item .item-content.activated.item-light,.item .item-content.active.item-light,.item-complex.activated .item-content.item-light,.item-complex.active .item-content.item-light,.item.activated.item-light,.item.active.item-light{border-color:#ccc;background-color:#fafafa}.item .item-content.activated.item-stable,.item .item-content.active.item-stable,.item-complex.activated .item-content.item-stable,.item-complex.active .item-content.item-stable,.item.activated.item-stable,.item.active.item-stable{border-color:#a2a2a2;background-color:#e5e5e5}.item .item-content.activated.item-positive,.item .item-content.active.item-positive,.item-complex.activated .item-content.item-positive,.item-complex.active .item-content.item-positive,.item.activated.item-positive,.item.active.item-positive{border-color:#0c63ee;background-color:#0c63ee}.item .item-content.activated.item-calm,.item .item-content.active.item-calm,.item-complex.activated .item-content.item-calm,.item-complex.active .item-content.item-calm,.item.activated.item-calm,.item.active.item-calm{border-color:#0a9ec7;background-color:#0a9ec7}.item .item-content.activated.item-assertive,.item .item-content.active.item-assertive,.item-complex.activated .item-content.item-assertive,.item-complex.active .item-content.item-assertive,.item.activated.item-assertive,.item.active.item-assertive{border-color:#e42012;background-color:#e42012}.item .item-content.activated.item-balanced,.item .item-content.active.item-balanced,.item-complex.activated .item-content.item-balanced,.item-complex.active .item-content.item-balanced,.item.activated.item-balanced,.item.active.item-balanced{border-color:#28a54c;background-color:#28a54c}.item .item-content.activated.item-energized,.item .item-content.active.item-energized,.item-complex.activated .item-content.item-energized,.item-complex.active .item-content.item-energized,.item.activated.item-energized,.item.active.item-energized{border-color:#e6b400;background-color:#e6b400}.item .item-content.activated.item-royal,.item .item-content.active.item-royal,.item-complex.activated .item-content.item-royal,.item-complex.active .item-content.item-royal,.item.activated.item-royal,.item.active.item-royal{border-color:#6b46e5;background-color:#6b46e5}.item .item-content.activated.item-dark,.item .item-content.active.item-dark,.item-complex.activated .item-content.item-dark,.item-complex.active .item-content.item-dark,.item.activated.item-dark,.item.active.item-dark{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{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-positive>.item-content{border-color:#0c63ee;background-color:#387ef5;color:#fff}.item-complex.item-positive>.item-content.active,.item-complex.item-positive>.item-content:active{border-color:#0c63ee;background-color:#0c63ee}.item-complex.item-calm>.item-content{border-color:#0a9ec7;background-color:#11c1f3;color:#fff}.item-complex.item-calm>.item-content.active,.item-complex.item-calm>.item-content:active{border-color:#0a9ec7;background-color:#0a9ec7}.item-complex.item-assertive>.item-content{border-color:#e42012;background-color:#ef473a;color:#fff}.item-complex.item-assertive>.item-content.active,.item-complex.item-assertive>.item-content:active{border-color:#e42012;background-color:#e42012}.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-energized>.item-content{border-color:#e6b400;background-color:#ffc900;color:#fff}.item-complex.item-energized>.item-content.active,.item-complex.item-energized>.item-content:active{border-color:#e6b400;background-color:#e6b400}.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-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-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}.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}@-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}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:"Helvetica Neue",Roboto,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}.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;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-floating-label{display:block;background-color:transparent;box-shadow:none}.item-floating-label .input-label{position:relative;padding:5px 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;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}.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:2px solid #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~.item-content{background:#f7f7f7}.item-radio input:checked~.radio-icon{visibility:visible}.platform-android.grade-b .item-radio,.platform-android.grade-c .item-radio{-webkit-animation:androidCheckedbugfix infinite 1s}@-webkit-keyframes androidCheckedbugfix{from,to{padding:0}}.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)) center no-repeat;background:linear-gradient(to right,#ccc 0,#ccc 100%) center no-repeat;background-size:99% 2px;-webkit-appearance:none}.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{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-stable input::-webkit-slider-thumb:before{background:#b2b2b2}.range.range-positive input::-webkit-slider-thumb:before{background:#387ef5}.range.range-calm input::-webkit-slider-thumb:before{background:#11c1f3}.range.range-balanced input::-webkit-slider-thumb:before{background:#33cd5f}.range.range-assertive input::-webkit-slider-thumb:before{background:#ef473a}.range.range-energized input::-webkit-slider-thumb:before{background:#ffc900}.range.range-royal input::-webkit-slider-thumb:before{background:#886aea}.range.range-dark input::-webkit-slider-thumb:before{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}.item-select{position:relative}.item-select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;right:0;padding:14px 48px 16px 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:#656565}.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:#b2b2b2;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:2px;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{border-color:#a2a2a2;background-color:#e5e5e5;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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;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:#ddd;background-color:#fff;color:#444}.button.button-light:hover{color:#444;text-decoration:none}.button.button-light.activated,.button.button-light.active{border-color:#ccc;background-color:#fafafa;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#b2b2b2;background-color:#f8f8f8;color:#444}.button.button-stable:hover{color:#444;text-decoration:none}.button.button-stable.activated,.button.button-stable.active{border-color:#a2a2a2;background-color:#e5e5e5;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#0c63ee;background-color:#387ef5;color:#fff}.button.button-positive:hover{color:#fff;text-decoration:none}.button.button-positive.activated,.button.button-positive.active{border-color:#0c63ee;background-color:#0c63ee;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#0a9ec7;background-color:#11c1f3;color:#fff}.button.button-calm:hover{color:#fff;text-decoration:none}.button.button-calm.activated,.button.button-calm.active{border-color:#0a9ec7;background-color:#0a9ec7;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#e42012;background-color:#ef473a;color:#fff}.button.button-assertive:hover{color:#fff;text-decoration:none}.button.button-assertive.activated,.button.button-assertive.active{border-color:#e42012;background-color:#e42012;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#28a54c;background-color:#33cd5f;color:#fff}.button.button-balanced:hover{color:#fff;text-decoration:none}.button.button-balanced.activated,.button.button-balanced.active{border-color:#28a54c;background-color:#28a54c;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#e6b400;background-color:#ffc900;color:#fff}.button.button-energized:hover{color:#fff;text-decoration:none}.button.button-energized.activated,.button.button-energized.active{border-color:#e6b400;background-color:#e6b400;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#6b46e5;background-color:#886aea;color:#fff}.button.button-royal:hover{color:#fff;text-decoration:none}.button.button-royal.activated,.button.button-royal.active{border-color:#6b46e5;background-color:#6b46e5;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:#111;background-color:#444;color:#fff}.button.button-dark:hover{color:#fff;text-decoration:none}.button.button-dark.activated,.button.button-dark.active{border-color:#000;background-color:#262626;box-shadow:inset 0 1px 4px rgba(0,0,0,.1)}.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:2px 0 0 2px}.button-bar>.button:last-child{border-right-width:1px;border-radius:0 2px 2px 0}.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-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-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-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:#0c63ee}.calm,a.calm{color:#11c1f3}.calm-bg{background-color:#11c1f3}.calm-border{border-color:#0a9ec7}.assertive,a.assertive{color:#ef473a}.assertive-bg{background-color:#ef473a}.assertive-border{border-color:#e42012}.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:#e6b400}.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}.collection-repeat-after-container{z-index:0;display:block}.collection-repeat-after-container.horizontal{display:inline-block}.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.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 index 52b1e577b8e2c154c6b5bf791ae3d7ef35aa212b..92a3f20a39267ae7f45144f412a995a663730360 100644 GIT binary patch delta 49037 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

?l?zYc(=BAsTxrsQI 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 diff --git a/www/lib/ionic/fonts/ionicons.svg b/www/lib/ionic/fonts/ionicons.svg index 5c8c909..49fc8f3 100644 --- a/www/lib/ionic/fonts/ionicons.svg +++ b/www/lib/ionic/fonts/ionicons.svg @@ -1,11 +1,11 @@ -Created by FontForge 20120731 at Mon Jun 16 14:44:31 2014 +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) @@ -19,189 +19,307 @@ Created by Adam Bradley with FontForge 2.0 (http://fontforge.sf.net) panose-1="2 0 6 3 0 0 0 0 0 0" ascent="448" descent="-64" - bbox="-0.5 -64.0026 512.487 448" + bbox="-0.54049 -64 512.487 448" underline-thickness="25.6" underline-position="-51.2" - unicode-range="U+F100-F358" + unicode-range="U+F100-F4F7" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - +d="M160 128c-38 0 -69 31 -69 69v150c0 38 31 69 69 69s69 -31 69 -69v-150c0 -38 -31 -69 -69 -69zM281 203h39c0 -78 -62 -142 -137 -153v-82h-46v82c-75 10 -137 75 -137 153h39c0 -69 58 -116 121 -116s121 47 121 116z" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -276,10 +401,8 @@ d="M438 256c6 0 10 -4 10 -10v-108c0 -6 -4 -10 -10 -10h-37v-54c0 -6 -4 -10 -10 -1 +d="M80 256h240v-224c0 -9 -7 -16 -16 -16h-208c-9 0 -16 7 -16 16v224zM296 104v48c0 4 -4 8 -8 8s-8 -4 -8 -8v-48c0 -4 4 -8 8 -8s8 4 8 8zM288 176c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8zM381 416c3 0 3 -2 3 -3s-2 -3 -3 -5s-13 -20 -13 -40v-336 +c0 -35 -29 -64 -64 -64h-208c-35 0 -64 29 -64 64v307c0 32 -2 33 -32 37c0 12 11 40 65 40h316zM336 368c0 5 0 16 1 16h-273c-1 0 -3 0 -4 -1c5 -7 4 -32 4 -44v-307c0 -18 14 -32 32 -32h210c17 0 30 14 30 32v336z" /> + @@ -324,8 +451,8 @@ h192v-16h-192zM64 96v16h96v-16h-96zM320 96v48h64v-48h-64z" /> d="M0 352h512v-256h-512v256zM193 128c-20 23 -33 58 -33 96s13 73 33 96h-97c0 -35 -29 -64 -64 -64v-80c27 0 48 -21 48 -48h113zM298 187c3 4 4 9 4 15c0 3 0 5 -1 8s-2 6 -4 8s-4 4 -7 6s-6 4 -10 5c-1 0 -4 1 -7 2s-5 0 -8 1v31c2 -1 5 -2 7 -3c4 -3 6 -7 7 -13h20 c0 5 -2 9 -4 13s-5 8 -9 11s-9 5 -14 6c-2 1 -5 2 -7 2v9h-18v-9c-2 0 -4 -1 -6 -2c-5 -1 -10 -2 -14 -5s-7 -6 -9 -10s-4 -9 -4 -14c0 -3 0 -5 1 -8s2 -5 4 -7s5 -5 8 -7s7 -4 12 -5c3 -1 6 0 8 -1v-35c-3 1 -6 2 -9 4s-5 4 -6 7s-2 6 -2 9h-20c0 -5 2 -11 4 -16 c3 -5 6 -8 10 -11s9 -6 15 -7c3 -1 5 -2 8 -2v-9h18v9c3 0 6 1 9 2c5 1 10 2 14 5s7 7 10 11zM480 176v80c-35 0 -64 29 -64 64h-97c20 -23 33 -58 33 -96s-13 -73 -33 -96h113c0 27 22 48 48 48zM64 224c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32z -M384 224c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32zM273 213c2 -1 4 -2 6 -4s3 -5 3 -9c0 -2 0 -4 -1 -6s-2 -4 -4 -5s-5 -3 -8 -4c-1 0 -2 -1 -4 -1v31c3 -1 6 -1 8 -2zM236 257c1 2 3 3 5 4s4 2 6 2v-26c-4 1 -7 3 -9 5s-4 4 -4 8c0 3 1 5 2 7zM0 64 -v16h512v-16h-512zM0 32v16h512v-16h-512z" /> +M384 224c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32zM273 213c2 -1 4 -2 6 -4s3 -5 3 -9c0 -2 0 -4 -1 -6s-2 -4 -4 -5s-5 -3 -8 -4c-1 0 -2 -1 -4 -1v31c3 -1 6 -1 8 -2zM236 257c1 2 3 3 5 4s4 2 6 2v-26c-4 1 -7 3 -9 5s-4 4 -4 8c0 3 1 5 2 7zM0 32 +v32h512v-32h-512z" /> @@ -358,14 +485,13 @@ d="M170 192v0v0l-167 174c-4 4 -4 12 0 16l30 30c4 4 12 5 16 1l204 -213c2 -2 3 -5 +d="M80 288c2 20 10 35 28 40l1 1c12 3 21 7 21 20v21c0 26 21 46 46 46s46 -20 46 -46v-21c0 -13 9 -18 21 -21h2c18 -5 25 -20 27 -40h-192zM176 384c-8 0 -13 -6 -13 -14s5 -14 13 -14s14 6 14 14s-6 14 -14 14zM325 384c15 0 27 -12 27 -28v-360c0 -16 -12 -28 -27 -28 +h-149h-148c-15 0 -28 12 -28 28v360c0 16 13 28 28 28h73v-13c0 -11 -9 -19 -19 -19h-37c-7 0 -12 -6 -12 -13v-327c0 -6 5 -12 11 -12h265c6 0 11 6 11 12v327c0 7 -5 13 -12 13h-37c-10 0 -20 8 -20 19v13h74zM64 224v32h112v-32h-112zM64 32v32h160v-32h-160zM64 96v32 +h129v-32h-129zM64 160v32h208v-32h-208z" /> +d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c10 10 19 21 26 33l-27 16l8 14l27 -16c13 25 21 52 22 81h-32v16h32c-1 29 -9 56 -22 81l-27 -16l-8 14l27 16c-7 12 -16 23 -26 33s-21 19 -33 26l-16 -27l-14 8 +l16 27c-25 13 -52 21 -81 22v-32h-16v32c-29 -1 -56 -9 -81 -22l16 -27l-14 -8l-16 27c-12 -7 -23 -16 -33 -26s-19 -21 -26 -33l27 -16l-8 -14l-27 16c-13 -25 -21 -52 -22 -81h32v-16h-32c1 -29 9 -56 22 -81l27 16l8 -14l-27 -16c7 -12 16 -23 26 -33s21 -19 33 -26 +l16 27l14 -8l-16 -27c25 -13 52 -21 81 -22v32h16v-32c29 1 56 9 81 22l-16 27l14 8l16 -27c12 7 23 16 33 26zM368 207v-32h-117c-6 -9 -16 -15 -27 -15c-18 0 -32 14 -32 32c0 12 6 22 16 28v68h32v-68c5 -3 9 -8 12 -13h116z" /> @@ -406,6 +532,8 @@ s9 5 9 10v150z" /> d="M0 32v64h64v-64h-64zM96 32v128h64v-128h-64zM192 32v224h64v-224h-64zM288 32v320h64v-320h-64z" /> + @@ -421,33 +549,36 @@ d="M287 279c1 -3 1 -5 1 -9v-244c0 -13 -9 -26 -21 -26h-243c-12 0 -24 13 -24 26v33 +d="M325 322c2 -4 7 -12 3 -15c-3 -2 -10 -2 -13 5s0 11 -5 9s-7 3 -6 4c1 2 3 3 5 4c0 2 -4 8 2 7c4 -1 12 -10 14 -14zM344 277v0v0zM403 251c0 0 -2 0 0 0v0zM224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM141 19l8 -4 +c3 -1 6 -2 10 -3c14 -5 28 -8 43 -10c28 -3 56 -1 83 8c15 5 30 11 43 20c6 4 6 16 10 24c8 16 -2 33 12 47c12 14 4 19 4 34c0 10 8 18 4 29c-1 4 -7 -3 -9 1c-5 7 -21 1 -28 2c-13 2 -24 14 -33 23c-5 5 0 20 1 26c4 15 0 33 19 38c5 1 5 9 10 11c5 1 10 3 15 4 +c9 1 17 -2 26 -2c10 0 14 -5 22 -11c7 -6 13 -3 22 -5c7 0 0 5 -2 8c-3 2 -6 2 -8 2c-16 4 -23 22 -36 30c-6 3 -9 2 -11 0c-1 -1 1 -12 1 -12c-1 -3 -10 -4 -13 -5c-9 -2 -29 17 -15 22c4 1 27 5 24 15c-3 6 2 13 -5 14c-8 1 -7 7 -15 8c-5 1 -5 11 -5 14c0 9 2 6 9 7 +c-17 11 -37 19 -57 24c-1 -3 -5 -12 -8 -12c-5 -1 -6 0 -9 -3c-9 -10 -16 -28 -25 -7c-4 11 5 19 2 28h-6h-3c6 -12 -5 -18 -8 -19c-8 0 -10 5 -17 4c-4 -1 -7 4 -11 2s-13 -8 -14 -12c-3 -12 6 -13 14 -6c6 6 17 12 25 6c6 -5 5 -9 5 -14s-1 -18 -9 -16c-4 1 -7 6 -11 3 +c-8 -7 -18 -6 -29 -9c-10 -2 -16 -6 -25 -9c-8 -3 -11 -4 -12 -12c0 -2 0 -14 -3 -15c-5 -2 -8 22 -22 20c-12 -1 -30 -13 -25 -28c2 -5 28 -3 10 -14c-2 -1 2 -17 2 -20c1 -8 13 -18 21 -10c6 6 6 5 14 2c15 -8 33 -15 45 -27c6 -6 9 -24 17 -28c9 -5 19 -5 26 -14 +c6 -7 -2 -19 -8 -23c-4 -2 -12 -24 -16 -29c-2 -4 -12 -6 -16 -7c-3 0 -7 -9 -9 -11c-7 -7 -8 -13 -17 -19c-18 -12 -22 -23 -18 -44c2 -8 5 -13 11 -16zM100 46l2 -2c7 -6 15 -11 23 -16c-21 21 -23 49 -21 78l3 24c1 3 -4 7 -4 11c0 10 0 5 -8 13c-4 4 -10 11 -12 17 +c-7 16 1 30 10 43c9 14 -7 20 -10 32c-1 6 -7 6 -6 12c1 7 -4 5 -9 9c-12 8 -1 20 -7 26c-43 -70 -36 -162 16 -224c1 -1 0 -1 1 -2h1c3 -4 6 -8 9 -11s7 -6 10 -9z" /> + +d="M381 259l-250 -251l-91 91l251 250zM440 360c12 -12 11 -32 -2 -45l-45 -45l-91 91l45 45c13 13 33 14 45 2zM32 85l85 -85l-117 -32z" /> + + + @@ -475,9 +606,6 @@ c0 -65 36 -121 90 -150c6 -3 13 -7 19 -9c2 -1 3 -1 5 -2c9 -3 19 -5 29 -7c9 -2 18 l53 -52l-36 -41zM178 58l38 113h-85l139 155l-38 -113h85z" /> - - - +d="M224 416c124 0 224 -36 224 -80c0 -8 -3 -15 -9 -22v0c-35 -43 -151 -179 -151 -218v-4v-83v0c0 -23 -29 -41 -64 -41s-64 18 -64 41v0v87c0 39 -117 177 -149 216v0c-7 8 -11 16 -11 24c0 44 100 80 224 80zM224 288c92 0 176 22 176 48s-83 48 -176 48 +s-176 -22 -176 -48s84 -48 176 -48z" /> - + - - @@ -565,463 +681,554 @@ d="M448 195c2 -124 -97 -225 -221 -227s-225 97 -227 221s97 225 221 227s225 -97 22 - - - - - - - + + - - - - - - - - - - - - - - - - - - - - + + + + - - + + - - + + - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - + + - - - - - - - - - - - - - - + + - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - - + + + + - - - - - - - - - - - - + + + + + + - - + + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - + + - - - - - - - - - - + + + + - - - - - - - + + - - - - + - - - - - - - - - - - - + - - - - + + - - - - - + + - - - - - - - + + - - - - - - - - - - - + + - - - - - - - - - - - - - - + + - - - - - - - - + + - - - - - + + + + + - - - + + + d="M84 341c-21 0 -37 17 -37 38s16 37 37 37s37 -16 37 -37s-16 -38 -37 -38zM121 333c28 0 47 -24 47 -48v-114c0 -22 -32 -22 -32 0v105h-5v-286c0 -28 -41 -31 -43 0v165h-1h-7v-165c-1 -29 -43 -30 -43 0v286h-6v-105c0 -22 -31 -22 -31 0v114c0 24 19 48 47 48h37h37z " /> +d="M441 311c4 -3 7 -8 7 -14v-281c0 -6 -2 -11 -7 -14c-2 -1 -5 -2 -7 -2c-3 0 -6 0 -8 2l-97 66l-97 -66c-5 -3 -10 -3 -15 0l-97 66l-97 -66c-5 -3 -10 -3 -15 0s-8 8 -8 14v281c0 6 3 11 7 14l105 71c5 3 10 3 15 0l97 -66l98 66c5 3 10 3 15 0zM103 95v242l-71 -50v-242 +zM135 95l73 -49v129l-4 -11c-7 2 -13 6 -20 10l8 13c5 -3 11 -6 16 -8v109l-73 49v-101c4 -2 9 -4 13 -7l-10 -13c-1 1 -2 1 -3 2v-123zM240 46l73 49v109c0 -1 -1 -1 -1 -2l-6 -6l-12 11l6 6c3 3 5 7 8 10l5 -5v119l-73 -49v-112h7l3 -15c-3 0 -6 -1 -9 -1h-1v-114zM416 46 +v242l-71 49v-88c3 1 5 1 8 2l4 -16c-4 -1 -8 -1 -12 -3v-137zM97 227c-3 -1 -11 -5 -14 -7l-11 12c4 3 8 6 12 8c3 2 6 3 9 4l5 -15c-2 -1 1 -1 -1 -2zM265 182c5 3 10 5 15 10l11 -12c-6 -6 -12 -10 -19 -13zM67 192v-1l-15 5v1c2 7 4 13 9 20l13 -9c-4 -5 -5 -10 -7 -16z +M166 210c3 -4 7 -8 11 -11l-11 -12c-4 4 -8 9 -12 13l-3 3l12 11c1 -1 2 -3 3 -4zM376 218l-11 12l10 10l-10 10l11 12l10 -11l11 11l11 -12l-10 -10l10 -10l-11 -12l-11 11z" /> @@ -1443,6 +1656,11 @@ c-12 0 -23 -3 -33 -9l-80 138c35 20 73 31 113 31s78 -10 113 -30l-81 -139c-10 6 -2 + + +d="M315 318c10 -4 12 -13 9 -20l-148 -330s-143 320 -148 331s2 16 9 19c39 18 90 28 139 28s96 -9 139 -28zM112 256c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM176 109c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM240 224 +c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM342 382c6 -3 10 -6 10 -13c0 -1 0 -3 -1 -5l-8 -19c-3 -5 -8 -9 -14 -9c-1 0 -3 1 -6 2c-41 18 -95 30 -147 30s-102 -11 -147 -30c-3 -1 -4 -2 -6 -2c-6 0 -11 4 -14 9l-8 19s-1 2 -1 5c0 8 6 12 10 14 +c49 21 107 33 166 33s118 -13 166 -34z" /> @@ -1521,21 +1737,16 @@ d="M48 324v-68h-48v68c0 33 28 60 61 60h67v-48h-68c-7 0 -12 -5 -12 -12zM356 384c3 c0 -7 5 -12 12 -12z" /> - + - + - + + + + + + + + + @@ -1629,19 +1869,25 @@ d="M113 371l79 -66l-114 -71l-78 63zM27 295l52 -42l86 53l-53 46zM306 235l78 -63l- l-78 -63l-114 71l79 66zM219 305l86 -52l52 42l-85 56z" /> + + - - + + + + @@ -1685,12 +1935,32 @@ h48c9 0 16 7 16 16zM337 32c9 0 15 7 15 16v176h-52c3 -10 4 -21 4 -32c0 -30 -11 -5 d="M112 192c0 53 27 80 80 80s80 -27 80 -80s-27 -80 -80 -80s-80 27 -80 80zM113 271c-14 -14 -23 -29 -28 -47h-85v112c0 13 4 25 14 34s22 14 35 14h288c13 0 24 -5 33 -14s14 -21 14 -34v-112h-84c-5 18 -14 33 -28 47c-22 22 -49 33 -80 33s-57 -11 -79 -33zM352 300 v39c0 4 -2 7 -4 9s-5 4 -9 4h-38c-4 0 -7 -2 -9 -4s-4 -5 -4 -9v-39c0 -4 2 -7 4 -9s5 -3 9 -3h38c4 0 7 1 9 3s4 5 4 9zM272 113c22 22 32 48 32 79h80v-144c0 -13 -5 -24 -14 -34s-20 -14 -33 -14h-288c-13 0 -24 4 -34 14s-15 21 -15 34v144h81c0 -31 10 -57 32 -79 s48 -33 79 -33s58 11 80 33z" /> + + + + + + + + + - + + + + + + + + + - + + @@ -1845,11 +2171,16 @@ h-208c-15 0 -15 3 -17 15l-19 242c-1 12 0 15 17 15h246z" /> + + +d="M224 384l224 -111l-92 -60l-132 -85l-160 102v-198l-32 16v203l-32 21zM358 192l10 -82c-16 -12 -112 -78 -144 -110c-32 32 -128 98 -144 110l9 82l135 -88z" /> diff --git a/www/lib/ionic/fonts/ionicons.ttf b/www/lib/ionic/fonts/ionicons.ttf index cc67b2f57bb0b00578a93d611c68cb977c48e8fe..c4e4632486d863337c1c73478ddb3c20726c55a0 100644 GIT binary patch delta 73255 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�nIJ5iS zS~)wk_CBcnzIF|dAS|-8*FMZYDA!}F1*jQ=`B|K0*e3R&XGAWJ)gpu~I!B2SS{{eI z@mdxbEEbpHbxDFuejn@}96eFI2^Y|q0ho>A(A^}JeK=77ayEY1H6Vwzi|qbguQF%* zHVyW4XJP^RvkI;#`4OT(ZKKqy^bX*SLK@3|{x}a*(AFIB_;?1*3qb=8;ln=V9dDBr z-^i7_-tFl7y&I-)1V#w!yKVQb2}PGRZcNV|;-iYU`bloPJWAtLjtc)!ARY+B7o6os zNEHTjA(0UD02~83y} zq^ZldKFKqcTo5=1ycHA`php;CWf>I}${nysivuQMXKgnfP}A+w8V*G+l(PvK%F5E2 zcrfA0ybma9Lue5r_Aj+s868I#=+w^sx1AoC?_VZ#o|6G{1&mX@yS>-NN; zmha4onBQ>8+7*SCOe|_B@qEkvmV8_>qK0LJy^-*ynYA6c);8>sUC~$ub>Zxrm-%Gi zZ2QOffAXeU1pDXw0}ze}kb2k-m_Dx#d2*&N@A@MiD@0WOx?j)#<_Vn}9rGPVT(7=! z_AV~|X8zYMJ??DcdiArjsk86-BmOr=<@@|T)LcbUmF#m)90Qes z`-r^6zKM5)IF@~j{de|}~8( z_Aq-R!Y?YX!FRJhs@u%uNBCjhR^d6`h`hpGERPH6ChHQ3dd znz#*ut4_oqclv#TM+D@&z`Q!<2o-cqcWcL)rs^8PD@9i+u5#&$>nL*>y307q3{yAE zqs$a^6H%2VR3yQYj-yGEZbV>4cI+rn%$sl@-7NwQ!G2*kbdj`=NrHqnc~|YeqQ`su z|HqB%_pSWSH=f(l#s~3#kk9fxdS_;e3%dLKHkH-5q_RWZ2LU>3-;%1m3^Ll zl6?ZP?^En`h?;LhygY>%xSMrC(V=6wyMf;C z#7z(r^yNl{QZHhdf!qLM8NzI7f;|XxfZc>6LB)v_(E4y4ntBmgbn#9R0gghgEE5XS z#!xUJlqeo4=gO6V2pTTnb~IZ8E9=d1Js=?^g#btB$2@_UCEQDp46dh!GSK4c0E(w7 zNnS=1N2n9>N=^tifcxM9@CbAt6ujK45&-2m4Y-P<212+@EL=+m=OW+Be zf5b}>dO|U@T>UfNQ1Ob{44%Y`GGY%Rt5N=0=wRUwBk@WMZmXgQUP_s-#yXHzpc)shX&19z-s{X?fVK z3FQBi#W7_~lPK=c5QgXoECjPTC;_%bPJ;X4DncO(e#PP*f%}BGX80)HS_dv*+pa%7LP=Wi&xf`Jg7mng^xVmzgA}sMuL0uO#5rGuW#cdIUx$p)M zCnEI0rJD>P!{-5h%R=?+wvXNo)#xeBDMQo`VDs28CUde#_^R0&cIUdnGh{lqIByaEl>n#FP9$ zgQh}CxR0Roj6aFMxy^*UL`iRoc@4?s^}8&uSP}6EK3UaFRS*nG_n4aO4$9mMacVwO zkwl1FFg);9R9OlVK8^?vZ<_#d!9N-+$s7>&;v0uW0svMOxLx~7_R`;PU zMV(NHrMS%(PIrE6V8nj7?O}YLrpd!lvCwhs!t;EEKL$+@M;7$hCy=-iI3P|h6l^nM zcae$00*<_iEqlMfBUXdmQr}A2vc5T1(JlN1%Kd5>z6D{t*|dZ4!fQvOEF!`Y%Z9S~ zbUw|WG#UccKMOP%X~X1U)A&$j&((WUd?Z}`3BTG1RR2Fpg7I{~$a_51&s91*KNxZB zL5LsVCt)Kx?V=3#kdLG8a~n<+8$;WG#o*JZ792qe4&RQl0c*2Fv)B?!Bkch|S z`0B*dPbcsGcH7;UC+>CxfWwy%>xirYO7RUf*R36~KEnRPfDT~kfaqR@ga~rka5sTN zNs>N|nNAi#CyP+5(DA~F-|2ARw~dX+A151=i6%JQ(MSmSJ-Da%AS7M@LE+w-)In`ShXs($fXNSN1Z zLG39US-0JRM4b@D^9bW)iBE_mO|}~|Mv(xcNWkaT6xPTaDNc4$q7(tt^*m+hd`NT< zvcym7ZnwT%`IcLs(%l|O@9Ms$OZDdOa@N1KOnY0K-FnwG-CermM3$&?xY4R3atbad zY@okT77!kS6&VhNtilt9DpV+>RDf~pW{M*2XTU5bAtooJgq`qv3@IW3|n`~Lkhv3(bt$FHVxBGy7- zS5R0Vn#VSKOGFiqnb8!)f@7ki18)uIel(U5uek>bXv;C zKT>;euUb{KZkh3&tmMFPlU)yK?Ca0fGJod#w)V8fWv_G%X1Jc+6q;QT2pDT z)6Owe8(!&{xwDqvpYJnkVh4l3sh)l0KcSJU*$8Pzet&*oxV8FX?~c)qz(jFi?^D}u zxM7?9FTzk^taW%tZ|63-rG5Lc8*bR;Xv12BWU=ivRUHBBh}wD><*FBNKegn^20JYB z)6X}CDzcFOQ1VMaAVX-rzAvsD1D;%2`e7As!!6CFLcMP&(PA3tvJ;>0l42g z5GIsakKGA;REUH;aH!Ehg>if-4#(5uIC7NPK591;&Dm6G?3%s`kwSra~36H_ggjrs?dF>#BOH`6oQDNZI4Hybeuk0d z7bAk-<$?(nWv|s1{iBBHF@L7Jg}jx|y26^vbqK!J2V6nP>#98TabjQmu_V3;CkO%8 z$C9!S=d3kxYA8N<#4UCP@F2n|P7j70J&Bdl^Pmf0c{14FEBb*Qt{FHoZ{d)vrt>Oa zg8ZIyuN7K#JR2nu9?LpFqGgE~fqDQYZ^Y7e)k01T-)- za#)UI3BDHTe}25HYrKp5(rI;JYunZZb#397_Z~cW??G;2Z`Zhc;~wXb|Bamo??quq zDVlhIMMx~f+U$HN81P#r0AxOXn!h7BkBR}sCz9gZ=nNp++pmJD!JikJSeU@ouz9nT%|2ZNyywWk3`q1ISCZt| zu(dy)MGbM<=F{9}-#-1m@8v4?(`{{zxR~Q(5K1&^4_jP7%2@<#DvYCoI!qb(iPAhA zTdHomX};Es7>h=N0q7=wHm6v{7Wgv#$O+Z4EPxl0Ox?b5|EcsXYN3C4-@Z-5`!ec# z_TIQ@)83)Col2jwl+3kGHN%G7=Q9X;3&o!P4&E>Gw(4_y<%weP ziB&uf3eO>$_rpURW?R{SUFvQ@I8#o<;9L8FRte(xGL&buvc(?R+}=7Yp}{+_Z5LP2 zl7aC8M#?*3*BD0-N$uW&a*1$-s1cYh90^Q)JP4bu3HmI2c3)^f zlZvw1!FlJUyHsDOU#rN@zR!=gw~rQ|&M4XhynIV4Yg$?Hg(Q7KmouVQ^NO#uOY&`M z8*OVFt%)Xu_q6~IGGzNT74^eLvIOsmu_JztCsg}0iaJp4=SwTQZz{B&{o?7$p}wK7 z$7h}Q&!8*G>?+TIA5$on)pCA}C%GE=((BTv-aa(+_EYJpsYe&wZ+xSB;Za-@E)A;r z5~?{NUNP3h4%xHdh)5!!2Y?PBr5MOIDJmda94rFDCHF{Xd`<@%D9F2Y*eF>5XebL4 z@wgu}xOh{%sj`>FI81 z4u{+>jgO(cGICM#%Wv&QC28=-8v;(dtvemS3;@$1phsH^5?#qL205q=+Ch9VXAclQ z+V%NNES8CVB-F$E0pUv^3aivT&Qd4@8L{DGgf-YYL0Yg zy77rLTSMv6&YkZGy=HdsaAR|5SI4#^N49lLg_|1>56+%F_+wt+XUCrB|0wQ*6U^2k z4djmS0-@9>$gnBgKn=i#X?o&4FcFMz$6`Is7~yG(GV*0E)uN22>ruwp7k|l*AkHEqi{$Q|*~pT8zZQk@;X!z{_ot`Bkhbk!YG` zO-+eCS)OQ0Y)7)6LbLbM*$4kGPc(7j?>Q&xsgNM~B9iau@}K{P$9~s46Yu5y%b$Ib zAHto(|H(7?->Jy<2bPcjC!fPPU-(a+?fYHMK|X%Y-u>n`pFDZ&*!;XCEw@$qR^GgP zs>$KePZ#(RNqP4pCr&(aVtGmu8Y)e>rl#Cl!&-GLZ5&M9 z?d(c>%HzW8L?|IB#|a`-R2_k=f%GpZPi`XbC}?W)i1oNbV&!n8bUwL#D{@|&2M2n( zve{g7#@`$;y%%k61i6IrKyPh^EINQGMW*C_25=F1KD0!bQ3+0VZ9ANt^>dt@^8FJM z@N=M4vM$SB!)%KC4c@JKCEzih%`LgjZbAcms=2GH^NMu+0MEs9>TH~=M8#+ZGg9|N zBJOQoARF;SA_k<$nYPZRnZs0YFhBwx$%ciJmU-syNuWM76PXMD( z(&RvQCw%mFyb(svaokPUNf< zc+8SGju1gS2?zmN8iGWPV~Q%HrU5~hRN`3Us11@uYDS*eHnw?ap!dqsbg|H!O*Z5F^I934O0==kQH5=>W6@azGP%cFVoJ2M-7|5(lCKi?!KA_rLI}~0&fwhE3a z1*E)F_MqbTxVc+w(2|p)c!$gKg~I<^R>OZ0(va9KtJhO`OX&RGLsp+2Q)wgl8l z5w%f69jE~JYmDw_6}fjvEm?2LiVu1K`to~yF&l7Uu=<@`at@r3;4M}Oqp9BMY!3?G+txG5X3|n27Qe8-3ast@KaTK6KKxH25aZ4e%YO>$E zE{`8_D;cppN@~vmC`L(SVU8$BT%5*C0xns`*OAaYKkV-Au1o84g~FkwCB{y__}PZ7S$3cOTDKvvh{xrZ2$-7lYJw8= zg>}S!0z5O5kZusUX)cI+VpdQNfKeoFPo)|gfj61U_dUSl6-qan0TbcU#R5UrDi|R| zIuxzAS+wAYMes%J=JY5iVGca7NB|&hr=A8gg_$qT%wSrWnYo)LGaRgj=P}1B{%9u_ z@PU9X`ZN`d#ci<05q*Ha#L)EM(c%cWFd*m$EXRL|SgSR7l%K4=cy|&&>8p_ygQly+ zNT@Of%i1Y;pg@W#NIr>{S-kyU8H~;K11gIvH3+R`YCo)kr^Iac=wM z0uNL5zvtP7)e*WNPGdGMZ{yO+GbjPtoRwd~h6~OeU-5>gXMWUFfiur@&h?&OSTLPC z7z+z8y)FW$LeYw-bX}@Pmp=%?W)OMSV1^oeGmY6A&;TC3p&0=`(3-VpiU4D%)E)}A ztUnb>K^LcoTB=JkXj>49jj!`^@ka1+`^ynzrk#?|v1>jqj@4@QL4{Co0?EIewH(Ae zzgl-;Lu)=QtKj4d=h#p93XqG<_7Hf_5;(QT(F#G<15XvaAOS`VwON%#7&kEAh@3%g zl*%VVp+Ep%6XXoyi6aUj^r?nL(K5C{M_?P=epo8f7hg_oziwOaj#9ESk#hSh9?Y@E z?Vt2)+t%~TY;SM&m*He0^5riR*6b`g8>!wvEK7(>NL6gI%TN&TSjJ)6WxfUFMGDFB zSpX@^b5I%}X5j^3z841yJDiM$9~eV956~SwFGA`5l2|E~(@#Imm!3X(ft{RMEmnX0 z^hb-ukKSJ>aIp=-aBjNl1VhA~YJ=CgiQQ;l7XyOR0D>R5ItZELa4EOYI|C^Pu#T4_ zz}4prj&zi)2%z4Bq63vM2eu%RNV_qU#C@PSN@8Uq8XYY6mAbpyi_x}dn?E0MXdR|6 zT4WT{k*2+{I1b zBB7wkUicyZJbx$4pymv-XY9aGA=lEJY77v|vA0Xm-2z}&4`PfV5)D5L=M7Go8@amU z;F#!0>Vy6RwxfCzl!X^0O{QFhoWJhg&G72?Az!bgZ*zl%- ze!$Y*o$c+#Y(ASudDEHJwAJbhqAFC7Wgep_b(kZy;Gn4Fi~8W@6DosmAXJX@i^y=( z8a{ABa7Gw?$>7Gga&gNx7fjoV=UfQzOS~(e@9fIux{FIoMKwGW3N`l@t}664hr<1) znZG*wu%;`L=Q=Ci-ygTG^HktCs1Fy5ZEZZXzqNIL^?Bs5^Ft;8QB=OQXut#_8U+Wx)p2TX zvX90pA(*#Dum+LVZiv8FXvrYO%@t|f091}ALLWg1myp=JTX(@3M~;`cW*lUhY3OQs z4@1M--r3pKW?7v*oju)MZ5?gsbJ3hlG+BT%V-eHiM^y$MkmOCgg#I;7w=q;;Kq&bN z0bpUm2kKB?pNu_ee7QC=*lpToI6l?(bRw6i{yLY)Egj!wFEwTPf?Zv;d3dle*kJf4 zCj5rGy`k_0+aADyIefyq`mSg>cFY>i_9ff!2PxnwAkGCyGS9kzd=IlpdwaHGf(ZiK zg9#uz3VG0dMnlup;eklH4A_>Syxo`~M1nd&j5IhnI6OEUL_3X^0wW>tub|*Yh2De! z6$k$mda&krX4jWGMW{Zf@vhCwc*utS!OF~Fe*-waqFWE?o{xGkb&DQF9(Nd7-*Bd| zV+&tt$eM~`W*feOPE>}NC*>Fp(=;z4{|-Jav3H%%O()P3ZKKf(u!7w}h%P)Pas@Rv zTGTj%fz(2Ugi=d=1Wef5waz9ox|peX69Ka~*@=2%-SbH6P9!R{JJdaGP6DK+H-9sVh_KtRk*VbPO^Z^Fv zk#!-a*O#0)NV-g-$VO-Rz7EJmcVB=W!K_1x{y18Ffv9SM|8%B5=547T^Ql*@kmy`4 zy@J`wt3v12ga;AM&DLU)gi7Z72S zixaYhL~cMveUq&sPg`m0(yT$H#Aks?Bd4;SU!nEc^)>84$#M1i4Q1%8aeEB;Mgb}b zT{4lOL-aC^*92_{Uj^F`EX;vDf%ZA=^d*3MBJoK@QKCxJYAHpOK(UOftmftZgXE}W zYkUT%{ZQ7rY5Z*B+Y8(%t`*_i-~N%aY2~9Ib+Q;JQL*~mC53wVRLLvLHsG|UjS@bw zn)u+Z#AR8gZ)4+hVq^Q2(U?Z;O(ve+LIi>eM}06}=J^S6s9XX$1hQFwScaLaJvs6z zb(B~Ieg%qX@4##AXPTb9hDY0|jUOoFQsLR}w_fZ77$E0_y35F%Lsesf3`q-=EHOjBok@C?uw zYwc73cOcLHE~nakbQWki0Q?B=+i+Utx7-p4WFnE^EYXr^X-5Cv6#9x%kZXF;AVNIk zCVb(N{MIml7VzNOxFf5+fCbJ=f7aUg5)aDR_N?6Rcf0-W`wQnP1t<6QmrkwOWW_@b z4I#JRzqdfi%Fj|EJ1gNi5pS%hnjx}ZAsp;XuOo#8|x z?CQxhcBo=3*AlO5`#(suC$inyhFot;t$C)9DWWuclojnl2p4^rdC}X0|tLblM$Rq+FqTJ!B4RC2q3gzg;3PxznXrrg|gO#8JVu=GTGj3>fwX zI;uh^is({TZ*LF*ang}Sf|ri;-ql#IrISVlz-p!5uFhf`Vc5w8H32`EZ}kQcAk#$N z3#D&p(Me3MW$^}1f7~CaAe0NP?!IlTJ?9B%y5EaTQmyVW6&lTi-Dk2_oF$!gkV722iNw;Aag^a~aOc%1^-UEu_omy_^V$kLK1 zYMcmo3#Jq(t{K=hY)S@T^<2>B3;MQx>VXG7^#HeK&(8iWR(-+eu=>EK-gYMltr&pu zs96H_C{_E@nV-(^dw@N8eI+lJf6Civ#ar^>a0niM+=hgRcy!fN#py1cLR%B1!|2`N zm}KE9=dC!Iw3;{BU?&M=Jn_m$%-J5p09l@xh9ygdnSx7PbDcTG=7`5qoW(7eV4kY3 z&NQ58DE{IX7MK@&M+$#bvO4i11RDt#%?;ieAuxDjC+X#^A&Cf6rl|=y4!q1K!eGpW zV_{JBe4xF685iQ{Aik#k$>juNk9;zUsW?hiV>mq2_R+S7=>8TzQGJrHz+3odE8d+- zfnCGnpopCN#V?#fJr8j`=J4a87fq@@e4GG@m(oud^AQQ(-G@ATV9nF5;r^xkD#AF2 z{rBd@MgG_lf;)tEGZn;mi+CkyF04Z!=N&#Zu3?<@AaX+sDL80tDZ+u)QU;Sh@JRBJ zdy~~)-IKWbSE+lFyzk-U!^!G@yf!(%Ir-Y8^LjDqL@U^fI-;P<3!ttskXrNQd;U39 z{q;SmoBugk{mnf|r!HV@p;c4{FHsn5A4L`Jdc`VHD!s1h5fR}EVW4X&UxlE+LkfQ7 zE5UP5KmGJCzf9Kg%Q5$jH@cP4KG+Fq$>IYgg9r3ep(8Nj@IC$D@axRb8TM2GLK)}w*Dqo@Ngl31kl0l zsUUjljv)-DXWC73CR7j#V;#n%Ig@A%SY$rrS_?u1jD$z0Na970Xc2iB$E0E-8CJ3@ zNukU;yT?ProqdT!U*~XWynCpnC3C8G~UzHzpcHyp`p8d zTYpo}czb*G?4eAhw=LV9ZfZ(*XWM!+ha^pd{-KJ5n2kzq*a!Q`Jya{r#hcV`OP8b}2Wkp10P{es;w(FuXGQja{d!G7JO~B>^07gVo`&AJ zhEP=W`MEPtL_81?Jtmlw9%C+Mg+=sV7Pw28qqD#`fH#i{zP(UrMxRs4Dg=Y4KYmwp z1)+NV&ul~hT(TUpH4&~YP=@g`OJY6CL79%ohGiZt6bdW&V)8|r6`psde5txr#2=^W z1y(E`Xlt7-7N1^Qzyp$+PoZTmu!@C;M824K2~Lw24#T5E)WO87FHdSV*a@5|oOs0p z;DB=0KonZ?vMmtbom#Syt2oS)0N}FF{ovj~(~^R%k;xt^uDYrZyZ8wg-#}pO{$HPQ z{SRaqNdb1F#4}i;{1G5wlm(z17B9l^L69jJF^<1!)fj-0#0zzPkN27qW% zM;Z(!fD2`VATA65<)r>M&i_Eo@BfT|4yLABL3a}Ip!?j0kEhJ!E^;fw7 z3vIxmiL#Tn;YU{(z6CV|T|LbT>U|dZM)brG7vOcngJuE}k`B0lnM8gkz=a08**OX~ z0&e(e^{BQJuG7Wec2* zv{$YhefHVW>lRk=x8$^UG;rv5(!yEx4^wB{cvS-!pNBJ*^17NUpyT#^!oV-#9#3ONNc?0T<25_ zYC`w^E$0#x5d}1#PBk?~8=`Pr{60fRCv6f%CBh=WB3b~~WC^7z)g4iS4dKIZ0BUPp zAowSywj`^o$t_b3;BW%d>Vy2m=Nvd9KS4K_|>op zB8H6Pce&KpEZqbKmxvC6uUR@Kt9Rg5uIlGBp|zuxoDDusiv>ZfK3#3EqAX-JZ4}7H z(wfzT*ua3A1GNc&fw274FVJyZf;`Eq+`wgkp#&*1)B+>f0%J)|#oE^{7EiXdJyE18 zg_!J}e1)aqA@zWJhAPzp>MHUpT_I@M&L9XTVyV|fU8Kmnm&R#`0ECJhfEIiVz+cc= zi1Hn!Mcuyyw!OW*y{EmWwUEsOV`>1DH*MOKiC&v-a>(O7$#}}+Zft#1^wvjY-Q;fpv;69Y2H)PyH8?IEy|yY@nNwFC?U$r4R5H^y|gjYog2GFBUFYOCe0s%^2`|FH|wfR7OeP+W2 zsd`3JeA2mJ^;a8izNU*&1#o5M8R*PHu>rDF^D8U9x4+$oH~Kc8ZTqN9@Oa2f`dJPs zklht~S2Hq%LaM=yk$zaR5pNTL8OBOM)kQ(kg9_9^V(y>|qZ4mahdNoB$mcoBx98j2 zS`$sd0BW|M`w?yjvf#TlAy_DNabgI-ks;zh0$IWc;(xTg0el1Wc>Nz2qM1s&u05~m z?HMcFXmy}(%}VQV$0XRnd{S12ns4_QpjdcrZyr+RNx#SE+Szq`TPW0ad)H2v&r^M` z6^mI;^~Y1)jHiC5E*4RSfxfwNdhke z+yuLbZV4hsO2H{>IbW7Tc`7lg9X-WgWukjO%=7MObM?7ab1ceRo{a=x6+4E_m}T)@ z)xX8AQ0pD(gdJTz{57xS^Z1=&J4&N2dIJC3?bfi*WvCU{F3Lc?q+qpj#enjzmkT_t zbqUtX6Z&%$=x|MH>&3X?qJ(NU@7kcT{4fYp_GAQ^`B+qtFj5Ja>xgd&b9JEBqi}kl zGEl5Jt>zwKw&or&hM^dNZ4pj@42-3t*&=qiEcF7`NEV$)%2__U9%?`M;3rm!-${Ju zVDZ5R9lKUbzf}0_%0X;~W3z_)kP53AE{eyxkkds>=H>2)FD!aoZV!gFWnie9NY5!D zJqQX5k?v(fl6NCuFreV(5rPFo8ZiePFrW$bD%;*(D3EC*EjTn->TU08@2Yfm6pDpn zTWd>mGO^L#S*FX_peCa=HA#V*N|hINn=}zUd3{&4roTxElWI%FF@` zc0D;+S=q2F<@~J=wB!tcb8+0I%T^sjUkjCV$g2VEd6&JjgW$+41ry6rjIU4`R^um)4phG0W1JGAnYI&vFz%mr~Q!jjK z2I>Ajr@tw{mRx>-_r#i;W3Y^WM%EF_JFdE+dXD$>UbE!&tKS89zW!;?r3MC44UNfx zfe=C&=vhX?J)$k1gXSVF*}#Y{$aQeWQ0vg!6s82pNJJbk9O$ee>YynQcMm2-+};p( z_&;^8x4G`zf?4B~5wFH^IQ#K3_~gvs;LPBA?|z`VWZNlxR;GQ`j5yO!=x^VO(TecXyhEq=<1Rv!a?dTx$Z|Ar>t{4NO+ zSA(Ta!BW$W(2W>1z=5EUM|HeB%+|a-^6<=E4$raX)**_oLu%waIe;ayW7fZKxCdW( zX&LG_wfV~F&TkJ_4nJ^srch8r<+kjbyVL3JG+()TOW)&NooZ}y+ky0!*Q7hs=}w5* zF-1#I+8996js*h_i=jqyL*M2a(J)EqBSPR%UWM(TZ%q?N(5a_;W~O^(1^I@R#qQga zNz+UwZ|^Qtj^9Qq_cr9wNFWY${G5F#fdSS~xBVeM^dtuP29^r!pKu8ecM~g|s%I9O+`%fz zZw_FEFT`^*7uZZL{`~5>3yi07@rP$;ACBihcUa8Xmc3 z<5wWqi+;!Q-%SWf&504wvuF9)K_OQ8(18*3l=C|@$yyM|3)nDn;6u*UYk?n$5ML8M z!y>}!o%RktdO*s2+{Z;5jsW}u;I~Laa7GzhprXXCK|^6kZ=&iUE^`pYPyogl?je$S zQ62^ByF7+o78eJ6ij+gyGC_&K@R_!)-cIwH%{z}B+d0|S_wF6Jf%5e9=FZ&UB;sk> zP(b%)cKWa0zO}N(3FgDk)x`jh)oBJO_xl`oC<@kgKnG%jPF^&^5cTmQ&uE~G>!O=0 zjkkE`d@S~^1L-FdPd=IWZ{2Pyo}BJBk}>z#ZjqTHQ|(DZGO< z6T*! ziR4&dS-`+EIcGt5*KzD>jw{+B3mdJ2hK%8Uodv@B|!A|4+@N~5c zH~qE?`$QVV93b-L*Qd)jXn`I5KH1!Cz4S&Ezis;krPCeQ)@;=o|hE#@2+;RT=IJQ9fqKyCQ8Pk+$h}&cJp!W0#*&dD(O3 z>;{NFo@>pu7V?z*rA~#xK*;Y8ndqjE`sBc}j_c^SE&e*giX!#3T1LxPKXr96)o_6| zq>443+T!9jYD_icsWPSKl9gfu=!?bVbEWDxoc!*63k#2}Es*pflzQr}#{4IzgmCqm z8~3371`~M_F<|*Tcw(p#CKZ}N^F^Pd7Re>Igm$8Q#E(5_N!R?wxPF-h5Dx1n?(zW3`$hE2WDZucsAT1I{rY{c{mBP(B zRnci+Yb-?>kSoOilrkj7B3uQ~6)PL~io1^Q;x)SBDG(E@*z?zIJmt6)pR(=tb;9ED zUAvAuT*U`*SOOozwjrsSnTEwg#;u8MwQY=W!(vg>t)R;iM}HPk9ET0D{QwehI7EW6 zcPfZn(4hk%wMc4J6eck6f0M5%8Z%|TW4WEM7)*yyzHIeJ2#>_ra1mh3;g#{ju_o_C z4|*KT)E4>m3tPMMiFmSia%AtG>W48IS=id!;%tE)pxZ7%fx20ZUwWlonF8Mj!)k!_ zjB)@yb*Tor!J)>A)AhwQ*CG_MERTn?P&9<(9Wh1&evjz^R}pzxH+R(lq*}fJ9M@6= z^{-U_*3qLM+Nq4}JaXpNq4-wd8EfX2Lh70xz}xg<3?V3i4Q;uGy=m|uoTd+VLvXs0)f;|1 zUTd{}wAz3kChDmZ;32N6H{5~RppHtA^649z>WTvcJavKH_*^MNt+dui1qUlwT3A2< zsj}4|HllZ-cogO#@k8Ud5aVbbJ;jg^gQ>zmE*L0<267=ZT;Y?PIT|HK1R%3Q7+Vu> za>hz=w8}<|4Uk$WTPyV%(6#|!`y`A)ZXIO11Yo16VFSokD==H5*whC5fDb+njslJL zktT=Y1d06wS^|+d;Cp}yfH02=Efa*Fy7UGmaN!~2t{nvs^4}|=W5P%=mHnpu?wmu1yzi8 z(wvP#q44pRR5AhbF#4`?J66L>fLFuuhT~R4M}X6DhCs0)4oZ5Z1>qjb3s!f20G;0g z(2#flB&{$;4wxOlO0Wk9@B^E>?Ad6_`()|6(P*K$Ga0(}M;-z+5tZX zsQ#^Ts0$ZE%aN2v35vQX=ze>4*6tb}?z%+czwf*Gp__dj-n~cndYx8tj+;=?Dtg`> zwD*UR!Uak~!@2pqE6%EuL`(PA{X2N1PWKNr8z9a+jp#{TKtAO(??Ny*l*VZ3z`}*y-)+sLpfK-OE`D#i^!isELDte)jhMW zV4ekre+KZ&#^@Gm7x!>Rn?Xgw9Rk5n0KqK-^o{XLfq8?%>lou)hT9{7mB0v1{(i>| zJ9gZ_J@4+mKIM@&j(WtXwB5PyZ3za5R7H7x{2pwI-oslleYvhuAt_!0L zmeQ48(LzQ$;{yeTlG?u~A~&fCyLMp`62)E9iV|L14=c*_2R#@=?YV%@WAIa_LM^;4 zAbYFN1>Fk^o&az2-U%6p1z~zx5W-m8wTn)ts|h%H*9Sep3oO{As~-ONI~uEBM?_pP zmzGROz)?1i6#S3^V*HNg#vr=VkO+uY2ir0a3y8+Qn^@D-@lIkBc!NrHeA6;K)|VV}#Fkzx07jG76(vZ}dr03neSk9o}?#`zEnxsHIb zFC9vzg7H~Puo~PUS@P#q^hxEue+j0Nq3A9*el{lS^@ajr#0%Sf^h+if6yMtWQ!u2= zOestq`Z3^nLsmX|XmIG@7&!Up{f?0uF-(6{ z&tM2iSuwm4PmYrfKz*sZo%=2JbEZMMDc6D{tMj$_R(ht;+a@%tl`3V(Pkihf6Ao?;OToY4K!3baT=-#V%Jjyi970(_FZmD>- zr=TP$VTsbQl;ikg(7t*Kc4P7qqdod$`jHUP3KBge9l|f(SV1&tU|kL+5JOO_fk?I- zC}I3*JYF|nK$orR0-&s^8n-`b^qg`O<&Ml#T?`n5< z^|2W|yrYKeUW~}v*fs3KcDN(2qMA+=8^R#{OIKi&D!eeniU$0eUigHfDlGsrz}S%r zXz(<;1++B=A;9|q9AAMxlVwMr$@?+>o(xZ?L}$U<#lYdOblOYKLc~atn%%!|@1B`W z16`f5sMIF6IAZN>UW{=8jVWt!40alJc?UcgE1!lZ zm5_{fO~#TKmlIF^=}+sbhOt$nYSxwa?t^PDUZ;35%4i%( zFitA+7jOmfQx2klF(H~XbWp@-o{Dsv+7o#XM1^0zP&MVNhRjVls>bzeD74y#fgW9MKbtPT^w}$$`%G0hxtX)Wo~)AhvzHUPh5kS zI{+5W8C8LL@i7r#J`6UryT~Ty>}WE1`09hRyQX$*!|&(~CQHelLVl#=0&fsXjOuvb znBa8U?a$GG6Jew=5P(I(Ao4-^j{uS+ix{e4Qz;GOS0n9G52jKiA1=WTfV+eNQo!{i zYe8eBz(!!;@mK3()#{ku(-XpvIl1q1%iI?j^GY{H?AZ1AO$@}a7vSr2wF{%_7Vo`xhk)DwULNAU5m9SKYry2}&64nT{>+Cq-6=W)z}HZ^07C69 zHpp%uZ|;WcuRF4E?cr;#p1*4D(7^+>#;_YdN{C-;nw;1{zwAao*)*~lza`fn>%7Fc zl2`3SZ*|i;IABEzc{xzz2@xU$Ox7tnop{j(D&YuV&7MpEY%MG~<^w}*VU32K!9uAw z5Bq!h*Xg21-SjT`V%VaoWC4Sq2=V;KXV;hh7jlTa($<_9>Y8>39#vf7%-RC4>{;9S zsz!HHWWzVyC#$IkSnifQeY$$=$lpFMYGTI*spA*?@Z&nmE1D2oK75L+m2jw= zq84(kH;yP!$b$&_63Iu(h)*2xT`t<%`lX_U*9S`T%gOeCijVpyooA>x&+~GR6W;jT zp^EtEOT>5D|EO5~#hP?Cz6Dx->6?hWrQ*k+V`$}d%MEhO*-t_R3a4YEUpnhL&Ogkb z`Tpnw(%F8uU<-8^I>V;e9qfH@Q~j3d+&bNJC~n${IRz^`qqaZddr*N_}~Ng zzkbK|ajMnyi+S|ZMV;u>8);R=_uhBw%@f<8q5kL(Klbz=JoS+e|Nejb;0NBnRJr%H z_q^uScb>ZC*wGtrpaw(jh1yDnx560!fg3DsRjvR^04EURxWoCRv9S^NApY5nxQ9WP zVrAlv+h?xaIcep)jx@s;YYD-u0PHVHfFvdQeLh%-9`eE{xODpJfY6B7=d>D{Im?*P zNa4;3hW~4!pQFnm(Of~pf@MNGLW`@JH8WIvLoN2 z?RaJrdty2CSaz;qCK)Hr#ECYWWRi?0%Q$x8-5gf3Np>je4g$tOCU(iq~(oyK|64TNSu=5 zAP9R<+q^Q=BTSf2YtME*XtS|-@4Mgi&L4UEQ%^o28k~#8H%Vw}8m^~5aQ;W%|Gtwq9Xoo2Ez1F!p=E-W`B`R(W_J*0Z;3r$PI3j}=7ji9 zv3JFfdf>W8Ai%rvU+70Wq|F{#= zbVp`rCi&hIwmqq~^T+9@yomF14y`cfBJ{~uT&({F;)+*3`SNEk(AT^VFCTsEp8cM< zANz(Dv1s~OKsr)5;Z!qnHy$rGgCCL_Y8)J`P6tb(0UWV?(v;->OZ$8@5ma%X^a%Lf z4SH&{*Ck?J_M?Ui6oamdYFF0GSad#;CuwQAV=ydQiv-w?+MfOQJa%;XVXsZUfeZ4q!=d*YVQBpl+r?51G>MgHo7CG!zUPUfuT4%hM4TQ<*)4mazNx0v`1*pfJjmjW*qsXu7o z5uva=mJgi@3@Ct-%xEAdeWIm=<)u8N;USzvNAf@&(49YYQ2ONjw)t&%EY0G>zoovmuXQrKF1R+!M9*=YlbmZiDL#$5@@wzSqbb+8G{U>ex1$tyslS_Xp_$*Jw6?)hRY-uWc;Aez$aP&afFD zZx-^YM8I+zQ^OIYX07G@*YDlFw0XvZrZpdOX`~!TdKu;pK3lAhdvN1e(EEDu_&T+& zQR#SjJ!*F`T8yOgX`E>3k?xh629LskgTPd3Oe!^AK|n$(vVm?`lDc;4SUeo^45>}* zez&YD@;TaukI1t=cwX%*ZuH07+ZDVQ@nXW`Qn9kD$PABIoqKB_dfh4IJ-)-&^(10j zZdO&;->lJ%NEFOWMSUTLk}+C{&XoiG`u(%rOM&bt(sE$!gZ9|8hxvMZ!c`>sR^7M| ziSHj$fyNFW5@0)BjGu6*XjR}G)>HLVx?ESg+v)h?UV6REsO*7Ou}g}i^R%>!Z{Bu9 z_4xtCGLhlXK{EL}o!CQXXJ_&`G*j=t>-gb=X3!G)mL?X-KIUM2=Ik`=}$2;|EVS9ljB46N+}hGon?yzaH0fooRD6Z z#OHpXoFV2|FJhsf+SJ-3u zQ5p%F>KrgC*XLDYI0j6;?-!E(VnBZcvSVW04r4K^rCK$Yb-AF0HC)h!i8~E91a2Y> z4>GXDQpUE{g%m>5=4L8IpU1V)>~7#XWMkMPQ9KC!CZOV+CXgD$->4EY6s1OIdq;ZJ zDV7jTL`$4sIVTl#8=}2#R{_p8kDqWkbT)|AVaa3QqiIdvYe7J5q1)tK)q&!R+a7cI z0_3ZIUOvDFz2^{rusmgTj-()DQ!GC>-Xt4^Q@QzPetr9=`q(oWM-?cbI@%qbTW8CV zd@oc*5M-&tJhK&_6ioSwZ3MTh3_vc%-R^)+bl!pi`~)Nj$Tc1ir3oEva7HWXb6Ymg z&rMHGj1MiKuSLw2LNu3=(7?O%{n{_z`4m#3e zOWfWp#y0&g!i$v3kIuXOW_qqL?vA_13mX#Xw9Jq0N<_12qDESc%5IqZeb@5fL}6|d z0tG{LSByZg7}2%d6@`WZQjqEvOf}#bQCN{kPgTL!`qN)!ILd)TkNh7ya2K zO1zMMQNybWvR&GoJ|Kb$O5N>siKHMfALj``ABiaFyW-&AtK{VmWMhNzK}Vv_5NI&K z{Md9V^0K?#BOCsKUR^j<5t+MVQwD@Z|E|7$^;Th%UoEcv#MOJadSB|+qIU7F9dpL> zU%Xod^oyU^J*uAn#e3DHaq;VW?sJJ)asPG%l_1vUIE~G1O;4o_j}LkKdOTFY9BEo_pjC51oCmdw&X} zASyx%o|s|A82N^^G&h8yi^5sYaVsI0Q<%QOWkB+u6PGaY_@aS`&+%pgf8w^~!IJDi z%Y^L%Pll5i^0Ln$)bpy30Q%{D=6EOZ%+pVQyyz#S=*l_{@Ps$W!tL69X=P zAr-Z%fxKR=>H~qA6-$=YR_nttGml(cg`qBBj!M!aa6{DDD!?cZ`!fa@85IXb@yCn>u2&I&-l{Wq0)6{ zywUQL`Eop&|AHqJFPQ#;RK%(TxI)>;Q_@(f=r^S(T`5b!^p%n^Pc=9oMa>7Qo@lDz zGYg5JcR616u*xt-a(Q@;Qe@0*WWbV3rDq5}=N5(1p-HcW6(VDZ*vq0gbwPV_fw%U2?vbZV5MY+{y8V5Tt zr5tk{n2x)0!@Ri7rX>QB%MiZtv0Q2;rA?LSrL0L9)lSDR2Ut^=4lH2{Y-Q>oz~Ydt zI1vZv?APHbZn;F*V?NoEN=JFZ0AKSC5v$(N{Z8 zkp8fFA(BcYDveBK&`z(@;XrTL3v#xlxx~lOz`B$)e))Bh;Zj(roF-Oh-7z=a)--ky z`;IPFlh{LT5%P0m9)T#UH$)x~5S`%vF-YkQYP>eSG%l z%x1aenYTmk8k|G2Ay{vw?KIFa?N$=?{1I(6=;X`WHOX4j>ghrXKunj7Q(;5R&RXuNhcjJ3(F)4M{ADNb3nZ zifhdD1vKA*{!^dRh(3)KVdraKr|b0v;J*LiuXMaKbo*_~%Xgo-?Vj83>BTpek1Zd& z@rDEY#pOE~#Z=amwj919YJS z<0Q`(a6wBankqQmhdv^fw&$7sZ%p0rKt`?hXDClHXvxLMuxC+bsqXPc zwjxiq%uKkF9rdAUKCtB1dRC5d*Tf6H>4HwjO+Jdxc8>quDkCK7pnpL4&_QmM4i zsf?w@elf)#{%`20^4d$Z<+e`eH#?nkrP6I<$?;TbJoy-pHTv+#k4HfrLLmbg}e;{i3}6;@kUg z{d*3|dq8Q#@gh^lD%BUjlGxH&K=qS-x{LTSbAk?nUg5t2OOLI1-0Wf#fwIC72W2Ie z)ecQdCj34=Zbgvqgv&-~Ye<%Hig>krmsX{CtG`&qkba)L9Mm~eYl4Ln_tz4Fu zY#}lBoq`*O{D2R1W2X;%cMlKZ3;I}*`dKYv^h=A*wjhE9x(1lHm4G3#8Yy>5&%IE3 zu{%jhaff6jwLCfbV(En!N+qRndnI6grY;WFt@PRUScl#+qu zxO`c_929Nx;!ofA6YeflZ)B^SC&6WXysQtGbx?at`<2cmP9mCv6?uFxQ!xBVtZcvM zcr7(x;Cgq5Nm(nYuokewf#cOg-XJ3GB;Z$KIm3iVN(k}Gkzz30gHrdO8tUMHz`1rz zPD;tpZCgN)jwvw)_dpI&hCcyw)dl&lBmyG zx&Hdh+H>~gWapayFKOq`U*P{Whj?4-ie%*Xucu$^{G1kW2i<|-nE@nr-9a3U$Uiuh zR!QXz9Q{tEL7!`QqreEH(qdV|!h#jDf?_0td|a=t3gI+E4bZvs#88KFQcpWyrH@p@ytbgh>)xIo zE2kn1yAE}DYlC#R7z{3=Vq9;`EE+M{V@&|dKtEj^mgK;PbZ5~`rdV+WpvT(FTHT&o z*|p*^D z$ZZ%u=r+3C$LkgJ`xb}VVe)fGW{!E&ag}TGh7+_qcs#ie0C!8E3T(( zyZh^pbRV%J&8B_s!H{2so0H6NJ!GC#Ye=i$HX3&PV~g4!eYuijR+C&Ni5FZia4I0e zE1Jv3748!9m52g`BfQU1(s4Zg5M&00m77llHGFQS7 zwRBipxE?ym0H^;27wli}cxPl{Vq~Pzs8$y@fo7ean4X#(86UyiZ45W?*;VW0vPB}@ zlB=XuV_+f$_5!JR{xhKolOCgqFII7d0Oql{}B3CG~nI#&WEmT zw+r@Jr{T7GH-5pl`=h)3GrTww?P3^a^b=>R=7qmZOxYo$L>5j2CDQGn%0;NT*A&Wk_{Gw#I1p-ujm+qBQRqZ$Uh^;kM2~LHy_M6(*v`gA^d~K5A zghADPhR2HbJN&Jwxb~}@-DLb@a*4Xxr?qIYRE(C+)Ccv_fLS_KRRajjCQc8jbUf=z zuZ)i9S+ufGX|Y^9mOHJbD#;Z7H+N8V12uQx1Xa-})*2_MiDI-+1R<%R5R)LZYf567 z>A!iL1>FS^W8BBR#?yLyIj?eBrkTr}m{7x7(;jY~h$sL!DG7=wL_GLA9(7sQq-eJ!*&APS=}OIhCO!hG3;}5*oFC(*B3` zU$uYG{$Be#?QgUfwZG8*FYVjfpVDprllJer+AnI)YhTtbYCo&}wDwclC$x`i&wvSe zzxF=(*WN-Ao}wU6X%A^<>HGIE0#0F{AJqaZw49ZmQN}{~h6^L5Lelj6&14~;NT&5hGUc-11bS1gZzT?g!pyb3DiCshNP$)jY&u+ z4e}VjK=2KiY$}(KcOtq%D$eb@KUxU{D)5%Y;GglB5fASf>@42m8J2g-Q9Bl|^p2sV z?)`s5S$LoDR-_=yi==%4Wd+R7gP_V?MO&g(P7Lm1tL^RDF!{A9>&6tbIRuCeU2Q#m(C4NhmrT(QmBg5eHH zEtgUYaex;uJ7LrnUr3dt83u4mQ60*>CE4gwOQ}fEI8CKCj9?^{T=p42e#rQfxApXB zENI-tn@uAa8&w7^Fwv`P|JvipqP!>~?;QNJllS|sX^*Np^|jfba`_^jgt{+U@dv7Q z%cIaNitGNA=a=z~sC3%xw@DZ6QpxHwk&HA#CT-Su1qAx{{5g#1&`_WOsHT7C3H1)o zxHs=bEpWtYjK_T(54o(3{w&dR>N^wjN2u0-+XXkZ&kQ*At=E*(0%E7jjL=_6_pn^u z$^!SO)_te;Ar_Y}s$6IG{3$&Ye4p}#7G{aqUwD88Zud|H&xiIiKY1HDaVZ7W8YU*$y!Wdch2NYz0dlV#_w!iI4%1 zgA{aI2V7C;K3FrLH@R601^{IRMTKcy6gJm6Cf5yyd}p|D(B}t*@mg25Pdk?eqx7J?+xLSz! zC!M8qMkWDgb~xOh5a5B*=le6k5WV~bXY9M2dEh_3Y}kM8n$fOD*1qQq@Su!$I>9O0+-jUT_9ljUo4}Gr$;D`XPpu z&lzC9a?PlM>f9MhUB;5~e2l?k_6O3jYetWlSnL2U;onM-Dmo*Ag9QTeAW$J=B%Cvt)M?D;E^0+#sQH$u9<4de8Sc<#;C^CV!s_h=t1G5@7?l zUqtG%JKalqcbFJj4vSJ9Q_>5-rrWkRv?3K1_dw@e8)__Cq0s6hU%XVjqAm9kmI?UPvvF~)+WYC#-r<$bTe6nU3ER&j{2sn)qr`A33z4oHVC) z?ccd0dM5g)F2URO#$9u3-CuMK>`cVf)c?72z%@4=-!_q)1o2QBiGOmWG_Uu8dTTH0 zorY>`B{rICP7S^{InmKm3mc!@xKZuiZB935cTUBd8yC`xts&Ler;_hgL#^@DzRM-I zd+qCL(4L;Q2N^8{ny!E#h265Qjdy94n>)v6TjL`=^Z`JbbV#UyJW}_D$5>(w0e9sw zKpcS!Go&Z>tKUViM_gxrGC3ov#+Yv*Q~}Py(;`{ui{=& zZ?CSXH}orM;5Dm;&V!#pJJe-z8HX06$_~DT2kd%w_vbtBPb)hGt*9M3kyHUK2wMGw z%NdliRGvuq;)Vx=6%@h3oT!uLc_OCZD+mL})r1gLTnmxI8rllG_V3%Wd3I)Obg(v% zSK5(-`;P6uao6_E*KfIg!~D!bcXojQSZl1+tk*^cM=GU!b)cF-O9g}$;1O)oTn26; z8Kon{IGK(}jN%uyS@KC0#~olBWNAE9d&7?3!2U_xL+&)MSrA@tP)Bg(m- zK>?oazFFnLOq##pAx;uQ8<5A7&fhA}Y=8D!jrsgQ{af{c{Cs14>(=pa$)6YagnY37 z`G(*2*N5x!m)~K(1eIdtnW5oqE|(o1nz0v8bvmaOsdedy+99XryME?%5lZW5yVU}` z$jo>LU@tO^;7VA*V{gE@i?)}c!*g$vVs#1%D=Ht--Kg@x*6&-vL#`R5;htdH@w)>| z2ngR_OB&H9;XU{omko4v^R!$zU;=;q=U=&V_}YuY?RZ8C3(WEr7Y%s)r(d(Y-PbBG z#J$r?Tc;+6nvflA+q!#c_u>LDikV4VL!iVbh9(+=RYz(jf#wdXd4A=KJ3zi(jvNi^ zEM3m>1-F+hTsZv1QG_nRbZUBrE`j3{`>u;|7>CP4Qe5aH{dd&CD~-It=@?G`NVu!! zIj2`lJN=~B!i&xkHQsC8M|)kulyl9h(eDZV`eAxe%rh&mX?p=ClxY7I%|XidmWUC& zI&an9(|PCJ%Q|@hOA!^0t7t47J%MK?=CNZ}0CBAJ;_xF8l{;r$#NmM|0Tz@b_>;p< zS4e8XL^60Hh2T;kae#+J;4mJ*L}1rj-}2@++;`8dWDebQ?E1Z3fyr;)G(S5{Z4cJU zB|*{24|KaD>olv$K8$xASM+jZoiog4*qHV$QO4-{Q|P?JWCxi*t%K=aWXCCaKu*xw zdFWz~hcK&Iby!gNM;nRVE(cVAA!G;Uoxi_VN~J&<*X!TD=HN|mak{O{NUXFey{Qx% z$zVUb>`0>&4Ei_DZS)6&rH0}5xcqi48^AT&oN3}B3}kDz--SGY%NN8un@mO)(~FU0 z(zcOQ`#a}LOU~cxQ(1r1e`9n0G>xwLqGhF(tO(Iit zq+VC2eu$P>`?Ax9zj;jqIu+Y*;s2-Zex16#!D$DBle+?jZy!*3c4!`s5_uq5<_F5j9kfpk=%qJhz!R#)5;Ky!TId&9brf}!+ z#~yj}#`(!{PhboFPOmTQJrPnq9B76Ql6NLp1{R|W^cR}T!v7vrezz%eEdoOa$g2w+ zCY~19^~}@nd(RWyN6)?CtXOjBb&e0qU;_NJo)W=eaJ))w%(1@BL#tg|b-Vz{Lw#xdOn1`;Hi%MoxU85+q(50O4^E*2)8Hykztk$9qO2h1OInw^M8 z0=JYhp>!w_AXlhV;!hyK%SZQb49)gIKI{ii5f19S4N)DBe&LSw8$Gp>sz*{59h7Fa zd!_K}Vy;)1HXNP`2eeR@P@}_VOKhqaYIJVIxvkaJm#9Nv7Awo#hmgEE536!R9M!HK zl6Rq z#w;_Gn;;mP%$G8GzdxTTai{E9uiS0AlSuhRLI$P{J8$?H`4m!i&g_%6a7uP+ocOg=Nt#$Szfe(BjkXacE4sX-6XP?UG2e++X!}Xn^TnxTl;+n;?bL zka9?UW?-PuY!u#>tdx_fRI*%2js%D02*(>uj&p?LyxTjjTm$eS+ z4LQQ`v2l(Uip?hP^^PiE@o2G7cuPEJ3i!o{;wWT zHN7i)>)!nJN{rC^JMTf?mB6S0gSCsKYrnt&eR1dyeX^2Al{kfol_yj%gvG0QVu}=S z;_0EJMAX=9(McU5HXVLYr8C|2h;FVy*FF2M0($J(?`=@-9>^sXb<}xd;DH2(CGa}= z6;c;>|5rgWr&jE>)zwS#^O9DQALr;lYFhaWHMw@1WK?X z4nhbDR;Y~t+IOG>pk&8HuoWtHqLsx0X5iTn>Q3Mo0Hi{kkA5r5g90{3z)Dy zQEOPV;_w!1kuk)=`pjRyH-j=mET4xhS@H{e5jw}77XUSG>T%rxQ}-?3 z)Mxf^O0Fq0bFXYvBB4#V1o5tI(VqRldsY0dSYD)8+1gzx!us~^$oe-v-utc#*IfVJ z-jy}e@ke#w-00;&35e~6&Y{wP?v*sCei8uK|7U*t*OCJ)wBpy>$Acy9V=17kxDDaS z&!nGu$NTGD2TLw&bu0j4qbbk)+NF6Yq%S?!+S~f>+T|znQ8ZTUQt9%GFYX@Mym@5z z?!i`T?cxhBT!@C!R=I4YLxobmL3;X%e((aq8HyB&f-@~zLF-e zmA02D|L&{B{x!-8t2ZUSAU80$dszzo{6A*&Zz~~iX9Bp7{Xv9sLrPGEgx5(b>TO8S zpm2ozNH7A#!=EKOnNDm$a7vo758sPmLk*4YpH4uJ=kQZgtE?Q2whZESN-}d;K_n+9 z)n)^eQujUlaOvR=zlWViAJlNGC4QX;<=Vb|e#g7ty<@)r__e)z^Lsz|LH_g}ouy*E z(8HaE2xVL?Wa!z4{z%2!>4Xrg@RdT9d$llEzuNicSAEy>p@-CA{o=p*(VzEpaeuDT z-KMlRYpdF)I-l%5_UQ7K`H^N72mZc2yK(%!=@2CWOM8J`UQ; z&juOwXlS93&LZ%Jh=5nN%ZOFKk@T+n?mct5866viJGtHrI?ygLi+URuGM-ovd-jjB zM~3!Dh^(BIQDDTfOiGUexb3W@%-Ood%1Mqf3+ZgN(Iqu&su%v6!fb-#jfq5-+D5fb z4)JuV#fAyYGZ1eY0SGhR1=7?;VQ>`k&tgc z$;RdmGRr(LpYldV!MID2z2p+7M+2dd+uJ1ziU2FDluEY^&z(`yM%+Fk0K>oU$1Geu#&E>TSj`EEJU|ptO zP!Yb5xN@|y6PkN;B?xE|j)l3&HuomwNH@LpLdaN%yai6K2WMrR$n4hZ6T|e1MyJMd zUn}NQF~1wHf?6UrG2&7k`X@4C?9brR(@Ak-BstCEzS<@;PE)Km36H(@Xwy+adaH() zsytqYZEN5SQjw-N=85wvF4f3mIqHj2hd14o-brdi8jAQ`!IMCUR5p~leS zV&=uQa5NsqKaRRU^Z*ah&|zDJqM`1tPkel9=c`}&;&Y$<^v6H```|riZoh5imSZ=~}l@NkAm)n|fy$h;vOcL|U@Dr-dqRfGIqO-~xR^y15%)p0r)HBAjs* z2iPk1LaJ{j2sFi6TyYUl1cn551OrTp!GU&*SCr8byi2Mj?mgbALJRn~kN7H??Gazs zXAOisZmeYS9~jAyMbf=Hz4lMY5L=#bo^YBw?DmA|!=@EV0y;FINJ+bQBua)63r5{> zVA!zMC|4fO1IQ5Q4-7pXH2nFM&7=I*LN+S!U4VEj z8vI2Oz5oY`Y2@NoBp5S{Qle-CNdyUHbi*bX9E|^uTp>o*@mMyIG2A=SahN1(P)evy zcFbd>V})D{S)L<|@ERewc)GMrHS;wDKh)qrlPN+y5-ku9(>-=I3D53NoNAXtUHHJ@ zg7i6bk)d+?MsI3jG~t7sAu&3U^7@F|1_Fli{udQaH3tTjill4#hT2!PNwX;?2V(ei z3+xT9cH%Pj!#?s?@k?-3ujk%?GDChhtnEwy0+#by2S72foS~|8qD$!4dzfS1T?h78 zD>ok5fAYZ1dv+~tUDzn;MkCEitJ-Qb>a{SkCa>&peNW)k9+r|W^|BuIIz0$SRIi6X zzTiSp^GV;j_iza4Om#UfdIFdUw# z)*8$6Qz^oS%Uh;i)NQ*kx2Ikj|MS0_f!{e?+qp%iN@vc$j9GdCL{5TE<(1SC7xH22 zA@>xk8mAFqRxi_l&vlZ9dgjG^qT4}J+(#I&YP-lky>dh7f3Dxei|a+cTGZ8Exs-No zaoBPJ!M{vla_oNhYS3XfD)=FHHu2}^vNdD%71t|y@O>T%>Xrar2u@fr_MS7+67sH`RCV}$oO!VyD7;*%r9^*7?o##MWTU?~4VtCF(b~ zZmb7`^`d2h z|5{a|?k>4ywx&PqEq~wp`2mHO!f7RX#|qC(lsru1;-7!+Q<6HNF3@hsQ?b)dNbVIL zV~Xq6w}{jXBjpP8AH#sewF6h7RhlNwK>#Eq*m4DEvIy_0hC+D2NUd{l*DLX9b>SuL zg3`{v>&18di~}3QdQlfHtX;m)RizKVYwg8%siuQ{6T8LfOirN;Vr;es;{w^%24*BX zwtFeQcmx@;>)jgK6z*#m8N5LfL?xZfh`8+$4a2;Fldn-*cfn4UmYs6Uz-yb1D^dZ@ zUhq{OBA#__Lw`tJ)Lv;`+1`E%u{!)CO=$e)Jg&ZWovMj)r5qZvB z;!u?=D-ExshWu!$ERsv*wadjIl1HQwT~;fl5{u&}gNe7jEx|+d`GZycgRnb%;k(vm zamQ&)2&)pQHJG1u;?`)ehHtsolf$iF#*7SeSpZWVQ z-zWYWI#S1(0LDNd>;_wW65#uN+H7a~-n;L*^Y&Zein#HH!v_!S+p}xy=K0p-cpfi7 zhjR62rydNbT8Tzr#RvH;vnsrwy^Rcv*|J#@5$Cx!p+@EhhhbU{w&w;}t(cf)Zf?s; z2a*L3yj;MVYs+6J{=!j*w2IS&M?u0ba)fY-%EK@-HxmYyT9{g_o?zd*nFM1oJJDqBavMVg63nG)MfY?@hD9vG%Q*HDP5`B5 zVB&fh)E+P{F6L|`tQZs|W*!jN8eHGJT9Z(>%-Yrb+}L|TY=u^nz7Lm zY-?P@)VIW=rP?H!@sKx{YpwK1=E$M+@Q)rkk{P+BJU%^qbh1{8CKgDh6cdS-r(*b_ zR#&w$wYpox+RLogBZE~XfW+OMxhAN*w!$OhS}GNFqq6}(m&DDOhxIe0!-C;+VM+lX z<}Szwk?O<6rK?>-jYu*#9LZH6lN*$Zz*K*EbuGGjRh5bhb?HoHmeJdzcS#pe$@6Z5TR6&{9mO%J$E0KM9)jL;Dk z)DIuj{lP;dW?D3|PM}h?g6MNd-&*^MqN`C*Vn;pBHv7JT?D}tGw(Y$2+N8R|HV9ynn~`EsJ^R zMpKbO-VQrqZ|qH)h|QNnR}DN~CfeB<^V#M(HH6bLHP?VqmU)@}PRsEYo}AP=`N&g0 z_td;@={{Ac){oY!1?A(_yt)w5OC>!N$mQIC0tbraA-hqoWq6g#1$ys=7@Qt9SPX+JX>cVD)GE$x3dS49jOcoSxU#XCGup>YH!m1se=*GsAtp3 z1ZeshK%-O2us5lQwz!~oz3_}F?}HEAd572S_6Mv!>~$H=f)GlnE4UnN&4$B>Jwn9R zBBwzf1pN2nUSll@3I5Jwo1U9BJE|gHJ0gnoD(q#w4hI4b4o{E?;Q$SN(77Z`ZV-lD zxn}oYbkXCT@L^0it29o#2qH7gnk*4^?YM+^cv!#1SC}VcZ0I)ayo7F2e-qbRfr^!efz$ z7j;;b79mkD>WOxp?VEa{pa%o-&Hrk1JP_3L7-A5WW_&6WuaznxRV$X0X@3S#a90%` z@@~=h1VQT1n)H)+{{6i!mzw?bY|80uZ<*P=@cD(!GeB%rdiV9a@eQdjc77^cDdtie zH>PsMid`v{l4-6Vvx9o2q6hgleCiflca4VZl&E?JGro=s3L<6+XF5F0n066|fth;l43?`sqGgru>@EnG^3lgk zIFoNUcgf>7_uK_JGJ1(ep+l~g2Rn#!61+cfwy?XCSHf&;LY;iel6g*s662{4+3kwq zS|D90`XOgCbfW-cQ(L;p~AH_Dm2yK%XU?{vN2pSh`L8QB09a zyVr&6o#u1vP|PtwJ7$SGBGWfwRmCFSU3P<$upJkNi^EMv(%udk-GZyYVxW_!JTjYV z8BT|Uo0zO&X9GS(;wtq6Y4(&`Qn93_+=)4Mi*TPxhiz1>-&H2`!PJ{O)T6F;`#vIf z?KjPHH=rSTbiG3S=CA&)x*+tvPHi1Uj;|;*(%+B@RX3b7P5$^k+AX9zcTiO{RCx- z6Xh9r=8u2fvp0sN^7MNAY4?Ba1*Ys?TlXYCJOctLg=bOMQ!8APM1 z&%FKDr-J(k92kc*!)xrUR-XCyzdkY5I$tVXd)!KC-SAG7U`rAl63Zq!v;St+?jyE&h?^w(R9#jSs$`yt6r4Z2)|DUUBoU`3bR z`jwj?Xpgrmi!}id@t&5vCSz*7>C5aluVW5kc zaHL8^z2Og>|FQSK@4fGN=h^%3yZ4?m5aADl;Db#64G%pCztmGttiJ8hM_@1aLaM#A zSNZlU|C6d4GRPFGuw~lIJ}B(-uTTZ+o)r_7Dw!owyY!t1NEU_1M)n3EyRt)J`vjOu z%N3GcKV}g;E$a$Sxz2UHivimF0axq(5SKgNDL(!5(;s@8V8P>Wx&5|VSA{IkSH|t}yYPaC{cwjv7aPV~??(a#HgjJ%=q2iCS!okDyy;52()h3;;-{&?D9c$c zf7Fh9*`#u^pXTFauRG(q_-Pg1aCG_X+2x}fre?3ZZWi6fEQ~2@=lJ?lZ~q;>{>ZtL zQNPst7F=K_rWC>$Btb#XSjc&;znC>IqoBxaE&>ev|+ky@>Mx zmFY;#z5D}c3b;LiuqV*|^rxLU>TlIo)w|hy4{CL-(ka%F%jqQJ(6Vj;QAYrcF(?S9 zLXO1$005^pv|P*-xDja18d6yNpK{AYGRMqOnT6VTj)a?shc%+zs{8k;=fFRZ=v*^Q%}pczR8YmNDT7*Bp7rVOiLn2oAc z&8bGKarqY-ANo+^7cP(g?9Yy?`P^f<=IZKC9~oAwJN|5W`OofL?ykMKvZCx4=jT;= z?Yk>1cfBf+0uh&Hb^>~bE){%YS_gY@3*kPLEyaIG^HC$37Dl2G8abT(K<@|?_lwZ- zt5&=9W&HpBFXx+^xyLRYKYn?+|D}9o_q+4b4zjJejG1tO^;c9%Yvh2iI3plL?9pVS z;fBWyjQ>)V?bTLNX9+V4=RFG&*w{146`y9MPfG`^hCUonC**P z!5+6OU5icJCj1FW2ZWrQZU~VLI~X`^$cJDdtI9_E?O%C2|1Te#opVo>K9)KhZOk_s z^S^y;X)fxY&h1ZM+kG-?`oxArEIH{)- za>K6v4R_^^OBhGnwEH@DPfn0KG^#xAZ38rT75lb^TNtl_xwKJviulF1zD%cyZ5*3g zjZLk=P-4rXponm|F?nza(}PRjRViYw*Q8#`t;q@dA-=TYoNKQ51yjZNbb=@ji#$AOyhE?@|@qV?v+D zDXWv2rR&+np+u72VM66@l$-H0vkGOH1Y7>BodwhlgjtVd)xO27L3)4hoL}Y}&R#gr z7d-WI*JiByn5c^6$c<}rFkjq6^@C7jcXGoK7;T0J%h?Q^;-(RG>RxtQ5)u>_3*m*C z7X6&rp6af5K|x9dGs`#Hj^)*6x(De=wXz_)MF&wDf#+A2@_wB=HO%JHX&L9F#vHCL zf>?Z@(f;3!#bSemMgHjS%1Og2ZP!mWb?Q0ZY#2r(0Gxd#(6kX$xtV zUaK66dl1K|pMAU^yI&H z>g-1jdR$JU1ZfoSvWG?icft{q;C^w zS(C2WIrFURQP)>of3x;$s=HeK#3xj~u=ce=_h3H1zZnj9rdv~o*X|!1ORE!WpRLJk z)msy!a57aVwLAZ9lHibu*G(8k2SxM^NE0GUhIx`xBtAkBiI4PnCD~aTXvf#Co@d_O zKdt+!^Nv3+HK01QV(b?K6FO06aThP!ywb(YPYYtp*ye$|p< zZ~q@tt?5oU+}xjc?0}x7v`M>F`(o#376~SA1mL+r1^v*C1iOb+G?G{DXbw-|VHGny zOBoeNlSmd|vVhzm{5So~2WQO8+#fWF##_;>=h72p@!K%UZtzCqL#InMI!HlxCr z5Q{lhbnLJeGh@3pFDPwY%I)Zpg9p|%+?F~E-CH-`IzI=hXmkh!LXl+KSi~k`f@16@ zwJFOs1AoqdPB0J_ul|FG;sHl#$dp~*tZ!275w-rnoF&dewztzM$7KZdmjxc5Uvkx_ z9U^2*F9(#5nfCkL1GTbUso3&ct{s?an6o)txb|JfJ+}R@e$FP_d7x!B;Gpuh8)KFC zdY*dRdUJWa(e}35KRL~hTFs@W(eVjS@|&AZ=R8#_799?T?Z_m*`d~C>RXuiKt9M|) zn4FvpR0h0T18>gC(>FsOP4`~6W(S4$F$Y0K9$y7jjXxGW2yAn}8>H5vXyC`yZnOunk+}+z^S75IJY%8@9W>zPqtgW`N6Tu zd#tCPn+*2KoTJSCH#>Kt_XITAw8*HCkZ(p?>}*Pj?6bKAwK4PFs{=ulo*1((x7)Q3 zbIE&qZbM7EA60d{zOq%wqi9o`wsTU4*V_eSY`LFx6+g>JjuJ!#C% zx=}j5GFG4e@#)sH`TV{HqnNLEtl)kD<1(YzenW!4)VawB#S+%Kj>76I$Es<ULeIH+g;C+@A7=nI_UH1?w)i&c zXFb0m3?I@iD2LzPd15D-GdsFygq*kz(35`xw2$kiNzo)v(Clt(Rkzwo-X4)loKvKq zu}SorK-ImPA5-W=5a1x4z@;Q$BC%Krm>7oxeAw8vXLn)1wol!B{Koy)?>@cf^!B9| z_=165gu&R6TznjMLc#HwA^92rNVbI9h0C5RV}hm}>xaiuyw3fTi*bDFp}rUYR9 zioqrEEJA~N;}6F5?c~=JKptI zwvTRjyg5131%5Hmnt{qRE7Akfs5)lL2{#iI4Hewi|*U&sZTIIUs!R9=UsYevU8$nix&Jd)Zu-@CbmfLv zw6qd7#R^7DPOFGLK~g?K9k4SmWz)Jl&kc6BLc7K;nQ#wSF^kMT=r@kTN5uT%+9!`L z*|oUTE@57+I2loP&W5!RBtit@5WI^61lc2 zf4@0DJUq|u`*wDR=ZDowH1v`t#}$8H(k^Y^eraWHZiSz#WBB9jbnntGbo@6Rf%Rtx z29XFQrCEO4_%2PaXN5@zj{y2eJrAa2y}Qs96R41&a@qPyTghJRh)lXjBF$@H)cL5a z-2c4K9`7XYI(_oQ@uPMi}>GGPhc!xtkj0K9o`-uW@PZ>Vr$_aisdF-=w$w`+?E$K2}k9uYiVMCy;flc^v zUFZMD480kRv)Rq2!pWgX%3ht4>^QQTHCg)H4;=dI4-QwfFJUR82O2%|WLIY&`8L8=9 z3yUk2gbvCb&*VzYE&0nQd;{U6hrv>YCKK83lr1*je?jN{97F32?ndfUU1 z&`M7Sy*{58O-8Txb3v~tD|-2PTgB}Sgd-U*C_FP?>zLU{ESMlm)aw=?TX1xHvN@DU zSMou$_PR^M*+4urJgr*;Zci4i%L(W8f)K+Z?2_4urg~w5bjM5F2sPh`z;R;B`P&=*EjtI}pTVY4R~9nKLv zn>@mIwOQ|B0_Q+4Z`LvKEg57o`kqMS!^w){F`!U`RFF_CNxKd6$umZYWl~`lAs!Vfh<%(QS@4I;va3F@G?>%Ba5UXe-;bXSfq>dsq|Ai*onrLy5nWGsZl?q}2pe4Nwd z{N6D*Hws28$y-3eEq5x813@k$1Js&>9wLRAy4dB2d`8CG`ZH28&|VJVZ;)f{Iq@aP z^Hfrfayd#hhr2BZI?hb^-SJA@@`ls6Zp&V?jU4QPHPbCvk%iLosrsPXOhxuwC#smFuOeoVENl;0$@ZBedT!Ef1)X z0El^aFquRVrTuBA2VI>sv@Zv4f^6ty5bEM=hJ2O z`*&);t6hdP^t)gg{@V+`b)QiQ-HL{rep5JTgv$rERm&OE4u9eO9m9+ag6nZFEvbmw zD&!<(U6s!a-kF`!%0gh0&X2||~Kk;}%7nA?CC#hpqy5$@Dsjr93l-}%m;{E4Q0 z=eyte?w|kJpM3jIzWt})`sRQB{onh>fBeOt|8n==Ui{fFKKJ>b7D?sLe&&;(_{g(P za>jWAO7DK>k36yZ(1UlK=63HyS^0#cN;TgSO)Eg)l|*DXIue_zNah3LEV4Atl$IiE!W#Bs}U9Rm0APQ5Y9+W?{%t(*A{ z$I;35qKos6Z}dH7&LqgRtz&_BcvG}3KxJN229=d2MuNIeDv*&!7e9- z$UX{yU5f*`@q5ggT}N1!oDULj1SK3{uox=j4U?chxP4GgVwK^L;g0Y=kOMd4)9(&9 z!Znu_R)7=O=|Iwi^S^i@rZoFB$YH|WbWJU;rahoQ&j zUXRNR;6?w&<8epPTvptp^lc8yoidHMB8`kM2p6%3geq6nH@DXw8`+q|a^ue8q;t^Y zNjU+d#@^T$#hs~C*a*=1!DZxfAi%hu1bjHs)!k7aCY~OyL>cr_nVy8-mVH8G)5wRN zqD#pOnBJJ&7?S-V_yEMyPipVcKHT{b(rQN19`myR=}T$4g^fLZMoZc$o9J>7&M3vU zO1ZIH+-$JS(-fUtQscB1$#hkmjr$2Lg?RM==r!1atFU$=$^?ciFZBNGn^P(4u!aM2 z*Sp>+a?p>zNfz2ceRQ)FRP%79hzF(>=RCpntxi zdlKG!-QiH{JDO807&0Cim(%OiH0tu}^r-ItN|$QTabLUNuKjt)>kWC2UFmVDB~S0j z>vV+fm7ef@JHpuOb+A8jBnLb4ebP-*v(D>&Ke@nE-NWK%v=4M_VCOEPdnVu@x?WEn zuY0UB<~UPtkqx^Ae;sF${%)`@_lSpt1#2G3L{4yHz8Ws#3V`lT8%XUiynv|FMqgL5uX5}ZM-tFxWhkK7UlV!x!aWtBU#U}KW|ah~+< zsLL&}ef5zb$!=S8Q=HQI@QqNqUg5|=z>=+ADbx$smgYjg9Q}e^qRLxclFUbKEwplB_9?qtr2BdO0}_OW>40D};r( zjJ$56>x)OTY-7T73!?<8l8t-Ts|q!L3M+yDK~kxN1!C&S4{vDaJZ5ZjFfcN?Z@%5W z{N*Q}IMHrB)-0*I8Mnow#|7PS93N!nM1Y#BC~e@5d&4XeVb%bIQB2psKqg@wXt%GQ z84ZRu#5TBO>$mUv_Kn>ycXN$5&n`#?)s-lhfXb&jUw5&5!pzEWW>RSG<@kS@@al<1rO6l@a})b)5}(6xF@P-*ZkvK3E{Z0Eq-xN+3W& z*kn(#8;H6|c9#GFBBU5=#HgrTdUVc( z$QhlJ0K#s%TTU%V=TbQ|ttMy6Dg`^Cax86kzqq(~9D9`H@dV_o3hYY4^OCp8EBUW7 z%-c9qc-NEnbSAk$d&V)FWAxOAQ!En+^JERpAJxTK%(_M{2=%i6#oQ5BR^4`6)s-XW z#!I@oLS0>BT2=qy(4^u}Pfw_LQt0p-Zw!>~8ywtMT2x(8#QA}zR`Fcs4H~(jT#5y; zdAu8eB7VbjPYmZyKmmWyaKdBm1-I=`9~;K5;>Oo=BCC;oYUVQBFqC6yZohHB&f{*lbQ_ zylm;Udy++J#ckF)R zdTi$v1lY%@0J$93t((8B`KejLU}VuU6pbvJmrP!?d~s?~a$a)Yyku(&Crv$nPNS_G zJ(@3TyCKHd(e}glru;{+>_QzW$>Yr<_kvIjXQe2~tsj;*Wu)S7XBtD_sk*Ld{Q6|X zz3m%r$eY69UY)0PKd|c~_1Sp^f0ymhbKUCH{Q0Zrzr3ki@3b0n43(@X{5n3Ej*&UZQ}P7kdX-3m4ZJI*?D3Z z#{lQsvcs0K$KSAdhWq-YKG~=G=|! zHIa4Z*?%=|@WZUuR=`?24ayZSgoKD0AcY{jPKBSzLt(j!M!j2x+FO`Nc;Wd%E* zPMBC@%7f*mX5xhW*)^}{=NHeIxoYN&V%c};^qHfnit;q?c#r0fH1;mwgk{BJ(&eW( zuwBl`g4`ZHNE|k5?ATE*xhFr!j_xN)-L4Dpk2|lZw7jB%d(K^MGd!O%>`pKTD`S_l zbNZy5+`@v;%o!7NRG}LyBbS2*jG=i5ut!Eta3Q=G3}1q%7JlkY+X+(gVg z3$qV<0s(jJ3FIWA5!X*|7KhU<=6e9e#ie|{$5YaM&u2UNpM9~Z;UKP&N_I?hBU-S; zIQBQo-i;eOE;2;1ncxP@;yv;k7eVnl( z=$>blj|uRHOwRao$BiA%$=LGwz1=dQWCR~##rQqVS6O(AgdHU!TQxbqE5tW+Q|^*Em?aLN zGFHJ}Q~bcw?5mal9cs*7QvG}09KnQxr%pX5J7ma*2oaSzdxc|E51SuQ!EE!>vzKJo z#_O*=_vU4zn%)6N=5l|BzYyN)!W_5YbuQEq^;>WALjAUZN_+RU>l%%;ck2>8Ek`Y8 zul4>VZY0OOS>B_a+UCZX8uMQ3)Dyk#r8?mCb?RL9Z-UxIxzH7Gh;A8v zi1a^)*>slStSldHMusRs#xqn8)la3*3f=OM&dwVEKOp>=ole`r95Ztf5?(rZS>|v*JN6$0Xj*a7aC}{FH=g zhVFnkxx5S&qg?v4luL8*0V)W7xEw`VRKzet#e8zj{10GU`T&(a>yt6GBA4gX@8rGK z&Ph{{VYwLN)X*|tw&h{<&Meg96KO7v0pZm02qz8j26NxcAy(UFC1Xn~U@$FVn#d z2`u658RmNFPF?1`)S-ua)l8Z?R5QEB{*M+j*%n)ta5fwsJ9qp(-2AkZA8=Qjaoz)+ zJdd+2pID@e%UsE!5)8Qma?}9R2E4ZxYxYrttL^=%Q-3qXo9<=2ewOV7&W%&Yf$=;( z<<-E1O~Aw;#Shq|5`c>c9t0+*fsa@|KHfm>11fl&D_C#pAz<1rpz<`}#^al@2AJ6i zRCQ7PK=mnLb`y0B2ytDt)jaQOPXKkS9A-ruqPT(vuBd^PBSC5ah!SW{2AIpR=`e5} z)6S1l1U#Pr7xYq0i){s(+bE{Bq^XlYD_5520FwFC9$;P$#XJ^6TPM%^`Ak?4qPW6^ zE2*PEJLB#9fklijrk1eGl78UAL0}p6(OzJA6VSzS7gqxx+W}k>1-dr?mmUIEtfdBk z%XR}jrNEWtz{+mmD(-=6Snrwxz^V#9?Py8?tJ%mJ;@r>!+(^P+#&7NgZaEFC`~b@@kQR z8@M-4rM3h26#@5i_uRh=*t`jNpouyHJXlVxq?rETAn*_yeuxeCS&H?xgec}cOlXf= z?i~fTG5$E~Y-j#w4**a015dGBe++nfG&6ygsP%!%!1gXW{{L^qfD_+d<7rXE@e;fulggWEhN1!fcnM;|rVms7j?G%@LI;pKt zmvd#8AA-7q?OkyS>dJ1Yl|4{br7YCdZ0s7Yd=;Rs%|NXla*pv&^go|sHd3U-vRaXDmohGJ;S!2Im+Yzxfs;v z_CxI`rM5$T9ux^bKLGWGZm2KzLhY=8`VuQW%kbIbP|w{%vwRxrD{SnmgxF2MZ%}(O zP~Tb!wU7DFZ-jcG2kJ%EdvOQU{xsA}T~OaeYi#KUxFDi4@qW@u4osi36FPSX^su$Oxlu~BQwN~)*(o@GGY5lZSa1TmkPQsy z@^GdFXlVirN90pI(4%^xi`Z~+HT39q>KK~G_s zshg3~(^zQwPUso?p=UC2<_TzClyvnP=vi#ICO|b&-PA7V*)fV`LmkvX=-N%tbwTJb z%Y_-YTcPW@brEh%v<sCVF+7G>+>Faku zZ`ca`@q^H}Ge5O)JM<@_)F2~$(CIdcl|I=EeOD1R08Iy@@9u{FG|Sw}%A14G53$~s z4D`c0p&toBZ`}a>DC>M?BechQ+X(a+!5=>b{RHc8=P!Oh52%}Y*UkND^x%5r-2h%= z3byRsv_hZYcpQ8`y%u%eEj_w2$Ihy)^PcR{kEnsYb(d?7&}c3(-R4rW!dzy0%;n|^ zbER2nt}<7fYs@NhtyyiZGi%KC<_2@4=`}Z*o6Rj|tyyPoHS5g=^Ko;Vx!r6upD=fr zlu4UUnmf&1W|R4px!Zi&++*%F_nG_6X7hk~&^%=N%og*odBkirkDAXI&ulY~nbhOv z3A5dN);wvRGX3Uh^NjhN*v zXXfYTi1~&2rTI5=)cmT@{Mx*3j+r;iZ}z@*mHvS$Xv|x8!?nrUaI^QbYxF#C#wuO8 zci;7Tdd}W$H|tvEy?Kk~)a2Phb*+Bky4Ggz=C!)=LP?HC{p`48$K!rH5t1-0p_Nd| zC0Zoj>W9gYci%cayKE@xHxmxkXS2hh25-)-dXh?dciyU3cqi8DS5tmYz29KCzFFda z!{K_rrEtBpRG*Oiq#ri;fZ>K(iPuT!1BV-YU{290=?xP48y;>*`CA@t5P${&Xb^w~ z0ca3_1_5XgfQSG@1Rx>+>`CvAN;o0_e7VVw3qV8wQV{`&2tY&tA_5Q*fQSG@1c3c4 zvJFNBASwV+0f-7fQ~;s^5EX!^50DB+1t2N_Q2~ewKvV#t0uU8|r~otyK%)RO3P7U( zGzvhY05l3fV-_Hl3^xiuqX0AtK%)RO3P7U(GzvhY05l6gvj8*;K(hce3qZ2~Gz&np z14!{0H48wq05l6gvj8*;K(hce3qZ2~v{dW0?;A=EdtOY04)O0Dgdnl&?*3}0?;Y|tpd<00IiX{RQ5yEDgbhM2)7DAs{phL zK&t?>3P7s>#04NO0C53`3qV`|;sOvCfOtgCf4KmKed%)Ia z0a8g@D*&|uP%8kn0#GXewE|Ep0JQ>8D*$x@P$vL&0#GLabplW)0Cf(4=fCC4yY4Ko zbplW)0CfUTCjfN_=f4dLKv)360uUB} zumFSwAS?i30SF6#6#y#$RsgI3SOKsCU>p4N-&z5%0$>He3V;;=D*#pitN>U6s26~G z0jL*%dI6{xfO-L_Z}885c5d`{RlNX+AF$#FY`p-8AF$#FtoQ+2F96~PtoQ-Gxb3&w zAOPYAtoQ-jkn&Fh_5qiI0w8|CiXX7z2dwx3D}KO=AF$#FtoQ+r=i|30e!z+!u;K@- z_yNlSx22!}h##=x2dwx3D}KO=AF$#FtoQ*de!z+!u;K@-_yH?^z=|KR;s;Vz41pCx zV8stu@dH-;fE7Pr#Sd8V16KTi6+d9b4_NU7R{Ve!KVZcVSlnw0V{sM ziXX7z2dwx3D}KO=AF$#FtoQ*de!z+!u+9&-?|&nw0V{sMiXX7z2dwx3D}KO=AF$#FtoQ*d We!z|vLtw=a*koky*Ei_Vh5rDNd5i4; delta 48904 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 diff --git a/www/lib/ionic/fonts/ionicons.woff b/www/lib/ionic/fonts/ionicons.woff index 1d7b977e41ddc32780f4a6353dda862fcc2e1754..5f3a14e0a5ca6d20cc4fac708979e807b0d51bc3 100644 GIT binary patch literal 67904 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

  • F(S(gioucm()OHA z)b@(jQUpS^seEF$P)@-V5-6YaHZMG1Xf)O_^cq&d&E8I*uWi0bNX5HbxxlC`BHhJd4Un?R*f*rb~t@PU2Uk#?X-Br)AB=b#Yu*GAI}F7 z4x~ttqjF3u-t0CP34%>@YGif2|Mw4>tjSrTA#nyPV88$`r6i7zt42px0~KKdIhnBP z;bfkHz7d$;{7qSuWF{e&)tYgVWmxt$!4L@CMd153gsi=|zTQjuL}nyTLKJdVAUyOf z$1<8AW+g!rh{y@tE5y0r{X}3T!ibXaM+#3YJ|U*$n=ljTNlr%0TbVnF2~?mpphwAr zKyzoJXw7(3OZ0tdHM3+0D~3J+tth)L1zdxZuz10ku0|Ad9pV>gF>vN&8Y@h|Fm+Et2VCwigZcn4FQg`OiO3DYAKqf}_2LqjV- zNR$0!2p5l323`1Rpb&YjyuaVyFVD^S77?@uHJ+I6euH~)&`aLV2?)r*v6Aq=c$vNS z&J(98G7C#!2F?jw05g|_U-P;7nWl3=wj>Av#B9W{+8-$?yuN?X6b!>QKv^V(|PhELvBbRQB0R4=JM%BOerv zQmtMxL?S11xs}%7L2o0v)zR3sgA9Z;_Xg(iM))F> ztwhR9p+iJ~NlSss#)B?!Q>X&-D%~mtWaT0|w;O~m^kQhwTkpsVlVe(W{?MWMvNkrk zAa}f(5}!?W)QN_o$#WBGCz<6-GyR{vQFk*Ha>LD-BrUj6sASx8*4iqG&CB!GTroGT zOwP?sD${dI$KgPbEjEZVujVmYM&R=5yh9qrEV&+NZ9Qdt?vb-+A2~~IzuquXbwbXZ zw+6IzQ0ImJSZzh>%}Uv3&`l*n_D;bMsC_B*So;I z&&GDe?tpu9Eavbl)n-`gJ{aZ+t3s=}ak>|IQ)8?-LIF@rt1xBv_7C;ty5v*qlB4;$ z2GcQB`{b$N-hUSahCDPemRp!TuDMSLYP>YqA=eJh-Ivj_!N@0`RS)buGB`^19$}NkoFyg{%Tx*u!;$klN)2}llvw^Jm&c-6rjF=0Nsh@mX@)7lDl|zEa9BoS zp=ePrLqX##Q?cU=vCV0gZ0F+~ig*yEm<*Q@ni`77sFAIN1vJZ0%OAE;d}k9~yy;<< zA;v4OtY@D=$)tb*)Cv(pgj zu}-GljScs0q~JgOwExt=A8SyK-3{j8D!9Aw5b5F9dTiS@eDtjD=2K5W3FP?O-saLr zZNDaTkEf3y$LRwRvot#IA)Y{(GcUxmqKWIfoi8xVX#%|C8DQ;>SVx2hVgE&hVV2?d z0g{!Z{$CythIPu(a%h$o>PHRINwEnGQV_rSa`)Y~qwpQ&00USo&9{oRF!2SIEdN3f z4)p(0l1TOd+(b)cq}v2~yC#ICG283q3bVxafTa%sxTqZJePPEfgt=V7v7P-@sfGPT zTX>Z=_dsX45PN}K6?;wWebk#{5CeBPD5TLqJv<$Kp_elzW2SJ3ag;oeYY0O;yPYjG ztnv=rtHF815u*`0BNur)FZ+SZil%Dou44tMz>8~&s<>7;RNE%}xyi-J={ZwXG+MNI+zQ;`kVNo2gZX)21OIJWPlY#pQDtQC>-IdrTb z9Ivp3VM-!PcotYnkTEz#;>3rDpc@pfUlMIE6_hjSz_m14k_G{~n?{ff3U;uquKTX#mIVwk8w{=+v`Lhz{wIK z->(answgst{pVzYaxOXOKP}-V1KY|-vP3Yu3C~HQCc~H`ao&boSW&x+moW9W$Z4u( z+HuX5L4bs@XL^1j?IsOf5<#>vXL+LwHNaGxM1(#DnU#2!fWY=JWmzti=VLwKDSDBA z=TM$+qc^7C@~NL#t6k>9d?_@>2>t2M=W4mvBe7-J_MbKU(vh3WgF^+Z1AT zkU(&-p&^|3&6F_%Lv{Pv(GBKl+Ww4@4f&9C_tluq2L7a#2Z(s*)sh9@*4m3uZuEGd z0W5FJu3{OQX~EFcSWFZrnu4d0{?D$xh-2e?z+g%OPxckdR&6bA7zU%Tx+0k(C#&o? zmu``CUp6JrH+3U0T-7x-UyjRSl237D=_WBQ!=-_%8@g{o2^NedPZk3{!Tbuj`c9EN zup));$XtE51iuWyd(j$EJ;4+WQIa%Ww=GjM4b_otMEGYt-o-ouFIr0y(Gn$#ky#zs zBO6~2Ud4lpcs9WYFdBbHylIJWX+9~af$SUjcD8Hirk#*1DXB=eEHO;L$3@wd9Ub4! z_TW9;Kr|&~#GY!$PR5=ba6xmF2|^)juH!bL6Hw;5>_+gLIkb#*sWymy4>qB8DCl}! z48M)8hkoBtLiAM<F?9!8S;PUw@GA5Ti~tsT3Wt`C?_xWK zuCp>@Nzkk0ogCp+hH-h1MJGjDc2oo3#)UOSl0+P&sz;P0^kV|bHlSbOWei^qR3XVz z-;ym`cWDH+9xzL=pbp2iRYPy`~W@kuU*fV~O zXYYNTm*^fAvPYJnxZ3zEcgUQCiE*HvDv5c+eCuvfEhd6$sdb#2N@+_wZSdEQv;@r* z5X^UIWHHvqL*%j$-cu-3j4G@mYS!t%rU(H7QnU_5y25#Ydyxk!IiBCGdfkJhoXdK7 zU*d>cyCG(43<;6Z!fp70Gw^pC#q7a$cO;&4|qWoTC^p#@MNx(M%Pbtk=}JlPt2V$~sJv^w(L7*LmQs80MVe z8Rz<8{f@{dm@Xoy}l^RmSZ9Q~lhPg&@cu zI$E}GNjgq!n?DZqIK9kUG5_9s-2Kx$`yq#j$kg&cu}_CC}TBcn6e~H%!is|Ae}JjLa4ZT z8XEr{Ov8AGhDp8)jH>W5u-ClC@Cw8DtjjAZQvkL`(C)zNKoD4#q;sx{d}{$%4Mv2k zSzcBdRpwd2XMhp{4^rSnkf%v#*)P#J`|F^&Oug!pk1IA&<@@udB;D^3TlqNgtGWqi z3zn7e>n{6o9#cf#&jE9+s=(gx|@98#5`PRm;vATfNy>*sd;1#+0gQ@_&k7>Cg1Gi^y*2d)*Tuai`fi~Wi2cKA`4=6 zakR=?ND>qPt<7K-u-YAv7IjxwbxbWQs})=sNROYBP9h15@Huo6&j%n@yn@NC;OPKP z>Gw101!B7qhFK|K?Q~{vQwmL?Q+VRUo+uN6O*ON+o>@h^pNii2RP@8^o9ls%GI^HF zXCeK%pQ=ypkKe64)xdpE~f|YfE zY=^rjHM__wT&$g`@+M!+?65e6U!1+%G7@OMSeU0#Vn_R1Y_Bw*Y43`o{!|&UgMW`q zmy*fSw1h+nm8WKB2cH~-=xjEdL4$uQepf@STow)fWv00GoipH_i#D9db{eMAU)+2CZmh0ixGHJR9DM5a25GCM_D(-W?ak_`BigeYz~`d0l$9E(xb2M;u9V zy1HAdg(aOgPU9}pH?+YEnu$N6QBy-1%}~|BCs9iX>w^~r1$9qoJg=P?{0YkFPq^+A zVPWv!6=lpXr~?o7F9^i+dDOXhHSi6mpKp6~Z4kus?i<$@g*?!$RNDq5I?<>*+x1s)0(jW^JW zu6K1E%sIQT+0X}g9^t-7fqm#%*VTQy(6!##v%SH&jg7NIy`WznLwtXT9@6tmD|k7p zkSpLk&XAm8AsS~{+t^rl-F|NZSI{QNp;h7)lOqs{O&^O3_c44XGzsf0pVUHNKZIu} zYqh~@&8?;H)Qp4%fajv}ENq`^M_a#b$`l*DHu~@HN61)spj_3de5CCVHGIAB@Q;uor8V1>$*Yd_`onS zTVhlRz%PPajW-CUdBh6~)dpvgJ2(d+U}0j1Pj%b`_?#Tnx?A5*@INEDL_v#OfaEz*Uo^ap3pQR>Lo9m)h`tC^8j=sN0Vhz~VSJ-kKKs3PBn7@oaaZDLnD zdzOqOBVxbZKU-U?_3?jyyIR|h=LM8y0ar8E@<#7K%a2kvbQ8lr9j*3O2mMt%)9+yp ztiqJPhk9N7V&OB_bqA+$&!f6voZY=p8F;>5kL2QL*s(2QazKv2>jE;y6MV9K04BFk z8RCJ-llQ!j-}7Y9bB^G?bG|;Os8JesN&ZFUyP=HAWwld{yW~8v7!DA5t z-4TjJLYQ}^sfF^PgeBe}T8S&QWr1S^KEen$(41gMc(WVi4$R&^JVqF}LiF6Z zh$1sH3@fH{8lIU{l)+iIra>x9Td+rNzn01Cnilt@VQpPOq(P_BXrTk-sJ2Q=~!4 zBM2c5*jnM~5@1sJMsh>o!@!`)E5Mp*vycxnGpI}!Tk8(2$s+0LyOUUM4S9G@CyK0$ zXt#W@)p+qE4?onKacQ2#Uw?>f*`OIlq9Y7qGpKjXj&gxUw50G;5f)4Na>eWHxc#Q? z$}1qAByA&F+<^eq9)78^S1(oyl<^4l4HPE$JfNllIEF*4%q|-9 zZ-~5>h5h5kL>r0(sTXuierkG~F)S(?Z}lIaBU9=(0SMF@3L8(7yr>s_&&&UZfJ1GW z*Xxt`Nd$t#ZurykGjBECFmEhkKKnE4^(T$T;ru0h2aIiC!KWsOc>|a_93T3C`jmX1 z*gss%kHOgD#}HI$%k$^?F`=JC6chqq>Pr2n4C_Vtd?R-~+<*TG*#R)c5n zeosF#)G1MbeXW4k{5as_=hUM|hkwYOIN45f66X*M3&tq&&Nv@bhH_8+(t{7KKltD$ zCNuTvI5l_#?yNtEGLwaD!yI#hhBqBs4sT>JlRs zoy@GhP)g59R))_M_SHtZ=^^cvAYL0LeFX)y7x1j@0`z^Gkf;1H(DzooU>(>>Na+6i zfe!UMn2;x*++OI|_bCCmsU?3D$(>&eFI=2)%^Z3NN+0~gsOaz_E*hbvS594kSxEo0 zS|Q(PmoYImCZ=>*4bjg`Eqd1U4i~s&M=+O4vFseR4TBHblt6@m<#GV^5j1MSyVOQa zqmL?w4yzsg7cbtXb_&|GyfDeiFDQo(E4W?lMj>CZI0Y${qss-W{?zQM97 zJ08#5wondBl02KzMS)Wb#l~hSuHvt*rRlPgu4E9cS(>I766Lm+wM`d^ZuJgUmOWlj z`6yELLT)-{Mk@@RoRU~1sNng?bd3&iw%io-q7+fn|2}!zlECH$J7h%d_dbO!ZIjn6TsPjnJse3+}3|O zH%B%LK#%VMd474@vURuSFqV;5s6O>J>OIu^sgGiwhrwP&2!3Hym`4+)S@Wp10_ZKB z;J1RBSu|m+1zt=ms5Or!jJfc<1`iSf_%Zp}hLHshcoX(r%@s7ta+G$S7*b%tR zG2Mk8D*#qp*q3X*FITuQPy!@!yIxg4Klaz=zpr?7~f6Gb71?DniGrBJvVStgM~pn3@CnHqyvk*goDfjTv&l412oYJpm!4&a&mE!4du-ztL6NZzzzs2k680^A$NM`m>v2wo%T z`pQJfhd=6|6oWy+1|?SqklgtOF}MXKJb}~%vtgc?G+_s-pknZj%cRx?cQP~6Wu}E{~+%! zSNG=gd#mN$vc^~U?yd5;ccFY9acX68@t5&2K1#=8O9)nR8AHvWYD6_cRkV@G6nRZw z6q`9fCC)X)MP1{Ie(aDDzxHEJ-9X(=-S-l_0;6Jho8jx^o0z;{8At*O+5B|xV&k&J0PFR@6%sf&J0SlKA zu(O^aj3oHE;%I$y8-8vS2?)PU^C+-m=>#?{AcqkF6~BOeMCD(kI$u-1R?&66S9y`D z2x&D{Nh_%jrPMTd(w69n6s;n zQ?*aw{VfEd%=ae?V%i(T`?u8rWG$f(0SDj$fTfXGWAoro=AfEB*Z^alk9rWi&$<6F z%DdmkS@*ktjW2GDbDf+!Esp1b#k{Z4AIT}5R-42GZUUG-kB3-W*n*QDsJF8pS(~dg z7?xut4x;>WX4EshsLAmRVi-Ja=Xkm?GZ)Og?p-@_S#VpSLzA(4;`mKC*f9Aix{ZB9fRk5Z7gFz8IJzoV{V^OoI_P zOcR4?o1~OwI0@H)X;gNMCeN2e!n7plvaOm1P=@JD&`ccYq*dKgO$Aqi){M(WYp*WR z32KxH{;U3qRL6-B)UQ^wRfrTKrIuHSY;=32!?kk&%#El$??$Vz_I-Hp?={q`4NkjA zADpfI)84_^EipF)k}pM8;3LgQ)QQZXNXsFh+^)WH&i&29wT-h~-E~oKu!(v&KjhZd z^loqa+OS08yn`MfjfjDnLomHCb-Av4=B#_JHt3_S3z^hv=iIYrahB8o)&MS+PXH&# zjq}mZf?XQP2-gNO0vokWa5=*{)g~|k6=L~H*1>Vb@YBL@{taEazlPkk+wg2!Idq6< zIp9q}`YoLw{ivfJIy8}wN^t%Bd_3PKA3~HrGuU_r9#%TK?q~3Ecu?(poPbO)1Y>#? zQRiV4!D{>}thB?guj`BCZ#%9L4;%oE%nHg0xt71K0rCY2?D_G*?}X6mtM}7KYPBQu z{#S!x-D_UI`K=qSq7Rfx2k5ItxCDNFDy$EcaxEf%5TOL;1vx!2%;E|0x#zk+JTZL! zg!a@^L?-It=WA4iL_?~%0(v7B ze^TwXcX_#l2U4$AKYo1n>RQ{LUMO7dB}%3F2tn}25)#BE)4`&^RLy82x`7{z7V~-h z*kU}R&)3^ps*q1i#j|G!u>b9V*|3l>!PG%F5@s~u>97uQ;!%Ab{iD@)0ss{d%U^)Z zHxjxIS(+jeqWG-@Z4e@sHH#+{h!b%WX!4d(pkz+d9sHeY2@ywsu5xCBz;~7Y@U9bA zCvQ8^@An^j3{j5_vChe}JXs%u2R2FK?kEvQ(yWp+fS6-bIf7)2r}G`o16>>unVPLI z!mkjXiskVrW;K!9J#(guLUU(p5UAno+#J&HAXu_@tfTJg`ughX{{6ik#GUD>`%m`) zNwz=kPf(r=tGsPMDzT;Q8O(y|S$Ot=3~u;(sx@AP2p;NtKfssIZsaYG(8ZSyAcd699G;M3Te)@d6e0>4Ll+KX3H*S|SgefCa z6)ZFYLaT3--E6d-R(^CnxOR?_8T^;y)0G`U*3ub!CRy1jNEw7Ol3A<7vX<$}JLaQ2 z>LH|m7$HUq3GaT_$7n{86!ydKWEDwxJ0FrpdH|o6pF+vSi@i`OL(F9A#UN(xZk&Gx z2^s_5G7HO0GzgfB=Lrt^V4H$Q2PWpkG(Cvqi~p})zAAG0nY`lOhGIEai&y-hx~~&z z`FcG9rm&8r8C6A@izryckKQeH*3`-500&Vr0E!>07X*cTktXdRWPZK*BjFVFkY%tzC$G zkgee_3}+-JUykUI=IJG(Xt#t;6JkTopghE&66!ozv}}N@RvrC}f(iidQ9>#R%%Ie* z)#z}2=PiaFP9Q23;-%Lx_|7*EzW<<1&%RLot0(tKs_}v*3F6guELke1?AVvzs1r{@ zS7+F`{()lBv1Q$ge3^Yh*WdWnM<3NAm5P4yAx%+LL9jz(e|0}DeV!^)(?nmnOt2P& zU`?k}C!}wwHdGZ15`^G~tKD)I=25|iRBxcmMM2VDFjQ&ZlMhc;Ze3p^wc8`@{EU3? z1D7k+7iRZ_Y(Y>}MSJLu$*R2ZA>EJ21%F?S=#M@c(E$T7G4k!Yj#{Per(R1vLA{gu zMd}mOXQ|(&{u}jm>O0h5QvXQ(1hFWLo2QHx&=NX~UV-jH4+HL*Z#6q|vcP>ePbR|r z&}kTs3;6|@PVOZJ`}{e0_WrSP8oTDTp=%t0AX*4 zo}Glw>UhNKtkEIgcko1GKuB-;k~|N67mLNd*j^64q5;iq+^NBu7hXdfPc;e90wIW0 z0;jUuD=4T8O!hHBpwcYaLYWWyE^Pvt{sJ`(VHvF;jdq50UnoOprKnBd0+wlyq{dm8 zw$&EEORh=_fv>gWn-CZBg;7M(jrYa61$_U=*%TDv>09ti*zP2 z=ZI`{ccMYli>2$Y&+TT=LJShcW+xKO#voB_0WrIC*RRjG8JklS&d#JPJ4So9BMZi7 z=$P#pg6!CBcV<2XDMGZ}gZs0J5IKWyS0aKkdkd$~3P*E%h#VjuixQyPe_hz586yf# zATbTkFJu&Ygh4b)T5uymBNe=aUS;G}H6Jk|QBK$)auE^VW9SfiOq_;0IYW<{dH-67 zm8AbyO9(tn_8pz2BQaS;g35h5qJ|QJfN&}^$_g9XnIRks?#@O-%-#5Ag$YGx5rf%3 z?=xB%yxz{jN!G^o{unVpds{<91;VW*#bM=$XrTv;yrLHLrii-0IK>fvkH#F1#dt** zWDau}eLNC}7Kq2VB0gg|>3=9mNyL0nJtT@jy)E>!VpU2>5~t4yUe%QGb&VBvDhW{p zX2+vS1oKqo**7GjGN%$|(?vws&rIMoUV%sQ+o@MkucMx%eu4Tp9yh2`!z=^?1ApGA zaG@dLya8c29E`@6wr@Z|-b~(hhF)JCcsqv!2)vM!?_YHM(m6Ia#5;g@Zp#~n?!W%} z;Jqp@O}sBl<@4SsbGP3kNSE1d25-~eSbWs)uM4`miM#z`(8s563!Wvtnk7B_zi;W# z&rkGYIx_e^>ARtzC!@=@^xNEidH!0(H_kUWjhAyO{L+@m!bACVcp{w->W+K=CmtHFM3yl&HOcDxpz z=QnKllrX#iUzjZ2X*r%?In9n!_TXa&Vb?hu77=L&mRKQtSUE2+c&zpu01@(6b^euR z>6m$+83+Fv!}@KTp1F2M&gSZuUwz;*;~wL6G%S;Mc3$2de34BbuuN3{ivwx4-7xpf z+cjqf5B26pX52-3xbSn1?s~}ELvtuush57vp6}Am?wxPmxf2~c$Tcdh19h{qb9ZdH zIfcBdko|LLs#$fe+H`q-@HJG@8x6gLm>?$Rm?v2*5dlYDiVuVb7pnLLYkJhL_&G}S5h|s-X-oaGsps;h9y+U6ARfESjnbQ5IuRp zgE5c5Hu`&Sgy$IG_7nNEwKZJe$2ktmC0qgTIGg)Jh#ntxqEWoRm23<6rz?pUyv0EfP9&3w>8S;M`FOW`e0dme z%de*rSp9V&nk||jjJ%tH?Qg-4{Ypg9CD4U876{m<Sv}&pp^&n(y;BK=T#w;JR?&+I z70*d33l%K(tBInnup&>ha!A*0JF*;Gj@Y)Yhh+B0q)eA=uXOT`lP{L%Ca&f7-Y78( zF-eLoFw%{C4;+x#aF~@2e3waIHn(p@WH?#o7;$Ca++}G7shXMMIgU@6no8aWpU+It zPgbbQF`p^?dgZxG;2wLC$T8a^${a11(eX>*%;2{OPyc9wp_3f{QJKF;Wv?fUVMyXd zpH&mbTi1u7Pu)iS{P}ph9bT{lxr2x{{>r)&c$<$WG9bzX-sSDl3O$i{h*DuZHL@K) z+&tc!pa3JGq46Gqv$uU!n%4&PnjeWC?;GzY(4i}2fiE5oV=*=yO-fk)6(M$)$O){J zjD{JS4u?54Vp_V&{j^lNWk%H7+_)CgELGG+*Toyv!l!Xp-LGEkMgUHFk}M|vF(-(+ z8IGb+hPYT14Vz%IF)VbPVo2DQ6iHFf#xyo4l+|KczsU11ZuJQO>wcnl&fhytIKks7!)(Mtq-Sm4(q17av2=^!7 z{0NU%0mUQAKN}7+iDaSN)=j-#E+i8STu2n%x~S$=vF_qaC%bcV-MQZ-+pihEoOG z%ea7Hh5Bo2YkFT_3wC`7=`=dS|4#S&+k8<9!#FOH9BPe1(*)~ILFV{+zyBgdVl=Gw za8|GgOm=-J0bixYmtYrQtpaXpoJ8v#;pBu-V7x_GwT#9}#$jZiky?@Xf`iQ&y1cc2 zssV7~!-eMV(@K+I6SPMYOiu?lkJ2 zZZV8d^y;|ZFQ?-1)SuePm_47=IAP9l<^)bl&fBr1opR$TMM=fop>6b#{+FQsB9vXM zWWPPHrTSRj5I|Er#L(^lbiy#e5$_Zhh=tu@O_nt|qVp(<($Sa^i=*iNME+VCuHPHh z?Q$Yw8&=F-PREmzm<%v(gJ<{o7Q&4H2xLoP_62O1zZ@?lwiLWXh}mjQ{KZT>5z}=G z(_tAlrsH=AY3JE0dl&eE_{Ceza)1!Q3(fYzavud=YY`w8B-Q~Y+W*9F9a_LTtXjDr!y5V^SGVQ*^Xo9 z^7c$<8m{2$UIkyrSMYUw*T0U~^wsH9>M`4Px{hs6Yg4Jzc~=NsH=whq0vd@+qpQ6z zLDgro*-UjV^9D1UF)ho?WKA#b!4-Ucu8OZ`vXu(H=U+u~_EJ)S5OuPzqeHx{d^Xh(Y=iGo=ctyD2YLQ`(WOU1HRGz`Yl z0Nh5?!b$w3S1y*~kWU!V6Ved8D#qx2k%&e&cb*^OtEivBGnSvF-c9`?u{ic;i|t`8 zw)kV;Sftps=O zCzTGK7-GUg%#|p$1J`d4t|5g?ACsZr3nheZ!GH4z_(c}xyZ9^OH68GqZQ?Hqu{x?R z2tjms_#rowVvT-ObTZe!_WC-XtQ7AlR+4yDXX$Pv>t-XaZiza2yxUt{T}9EU>9UY* zB2>?5+3BgB*IoB>VyRfK6pNL5v6K+BqPN!VuEDQd(riS(K!801Y)^Jnk8za2Q7t+J z0BQFM@R1tVh&hi|*VSDh%MEBgvz4-bx7&x`n8Lx&PtqW6ktw&>-VHHMoxuJMet;s) z2S2n1RyF#d-v_{|4e;Q`|H#!faO%EC*H_8kbFRBe{(|+X3zbK-`R&F+ej)fxYVb*X zF+aW$qDWzIrRR3>|8EaVndGM$M4JX25MO0BcHax5D&0CSgv|2~96FGT$8!h1aPsKE zVo|U4UQ29ZW-G~LC5cWSYVSR{BcI=Ka&P;lqq`f=G@JHiA8+hti5bilNk}yj3rGcf zC}X0y(JH|(_t*RRu21B3zn{wx^A+Np`W~YNVoO6zFMX?3aBPO`z}vVz3|n4qkrg5& zE)F&pmyRuMoM|3v{@q~n%_$?M$8aavJa_Kk%+k`#!Gon{bMPBy&#oIV>Og{|)xe2eTRZ@d*J?FRJy82wN56p1FR;P^PAODG6Vf+;K!p%VSMve1%eRHP&H;8o2V;#zXGbM#SEf&F!l z()jvA`10U47nG@KWkYGTl&L9AK!SGFgA21_ZSm3Tj^pjmT*si{)vrR52@Hz|@VgX& zwjw?ae%vxI@P7l_GyMMe&U9cfgdTY9Yu(p&@sI4}eqZmqecj(7cK`mx%ijL>%NB$E z^M?+l4!!ric;oL!F;@LDFHqvP{LjmA0>c6P=Vz$}uwLyH0B*w~rW0Tt(E_U~Ya9ry z<9pZ>NCyk10J9uKzJ|#jE4-M z50zd@IcvOj2P95nnTiyL&-OeDTqrc5jXda=Tk-Stn(m84=u{B;%Y< z*$D4EMlg6}5~ZhxFQN|eK-J^$9q4_{VVp!vk`RcXlqX7tH9SEkkov22;b=%%*b#L`urG*myt3~!T z0#a_;gVyVX4;1RK`Qissl}ZXW_w^cAuoGl-=Z5%1J`Dvj2OkB=xmc+mC8fHP#T_4& z_V5MDfd2h?y!k5BxC9a409k?heB`{jar8odyg6%fF1~_^-7@b!5Q)50+_2%(sQ2RV z!Q1c?y2v;KlA|(B`0qHUK+ZN3Q-NHHx=4el~jk(@^Tx z90onKKAFq8%}sx-xr+KWYU1%a589*-KMejcbc3^-LZd@qWr+jHmlavy^6lFGxuU3v zjMAMuR8H3S@$t;ApJfzbYG2J;QfOM`?f6``5@Qe6Z9}c6r*;y;hh<%)r1LXBKTo0~ z0`$zyQT$ub08s61Gl%UniQ=~NUj`5&*(JsyH%uI(%EZZ^$Z!%P77y%2j)(0rNz-}p z;fJ#L(BVbQhB9bW1rGdY3Ex|G;vTb!xS5}kD z3sO{Jf0q_*V`agyHv9E(B*<~y{V2^uqNxyK=J5GH7N`roKf|bF!#bDn#|mXW^vEM0 zdSvkT{+m!+#j@ffaOutDeULZ%7khu4j?fHz1Xefu!Ta;A&DEe>h>2Lo^VPl|M?(NK zKtJ|H(7kZ)@-<@f0Dw9?^p{Ko5?iB1R#hMdjsVexXjoKf6}&KV>b@~X-Qxv~AxON9 z733AloqD_BG_m;UU}*-+FJU~Am*r5iQ)U<%v0VDqs-zh#o3m(^K@1m_mb4%Q#LDIS%0)aTE$6OtB;&D>kcY8ZU{WARty?X+-Occ$b0jMMFTT8(t}L zcSkO#HD=}JZ^*G&V)?>R(a;ouZAECrVA16cJHyZnUrFooks>Pr@-8k=6ft>p z21Rgj9FGj|fELkso>LL8@_@~&bBAoW65F$`F}ov=u_F6WD`*?w^)$$IBTi4Sd4X_u z$mJ1>J0uV#3jGfgi(`$&Wxn^7M?* z;7cLH)g>P7<)y({z1HuaJGZfct37xYLTIA8KKKh>!uPL%k35!5dc(ho@+ZBVCd$YE zTTWm^IYjoIC={2qQ9E~TqO1X)a^OjzzD{OA>p`pu7r)1=#J54Bs8)#~?va9nx=-&2 zPraJ{$#u_vV6gFO?z(@aUsoL4HN!JB(AX*o9mYf5Z++|Oh37x;)vpdV?iuQ=`y}7t z+^t0Iqh8_rkC1sZG$HZR$K~-t5Iu*eweU;v@_olo>+2mwc9r)kuJRQ*t4#5{H=WMf z3KNbw?mI8lk9oS?zE9Wh$C)7f`y(Z*BsjsGNl(W)CX%yDQv2I zL<tPV=PCZ1Tw5oMgPJklwVkr?b3z>N)b zO9I59@OaQOf$9!y8w$MbDnk#?#H@i3ZrRBn)hi8>n(M8rQ% zgAnBoZZ|Li0M(#|(Cg)pmE41Zb7R2jM$&9SJPm=l>;G?R?-O#CSR#1v^pHDm5RR7n+MxX+Z*75t4t zj~W>}i)c|V*cpVLJ>JP_D#M6KmPuGOE!TO4-Qy#jipo=uh+Ucl*P=<`Z<9?FEv+AoLHraW-gWKL6ob%fMBJJJT)}H6L-{7ye zH(2w$7LqR5BA?sF^(|a3O|sV5#?SNxIQaUloC?MlAHRd5c2lpXK27~0^{)uL5OG(> zQ_+Pj(EdCYwaboQT_<2m+XhvqhQKSDV5h}n5vENfK-@+qyiFt~3>FUYGmc#VkdJZ)CdZv}J9xVx z^pJ(~q6H49o<^ieJ1yUkWSIsV6fnfX#f}fS;*}G^GkZz&5Ei*7v*}TB}aaV*QQ4F`X)z>AedD#XT zh1F9`$Y8@XGDKVrE}q1a9n0gA7(qh4zYq&{F)B!m%tjfSl|>ziA!H*qY)7IdLUvS( z;{vgONDBgwYzc`-k!4&_S5okIlf{CjA}BU~H8@p6oTv)4Vi-x))Uz}RmB*@>1GHdp zm^j)pc#%c;Ay<->jEu?EX|QyO7FDAp6<8&N>B3A?c)~r7j)W8;!_jJ0b>dP(qSHDL zUb?!VhM-LtmeBxiOcHJ|L#oT#s=?#$6=IN%Fl|WABo&Uwyf>0)ln0j)_z~9M@cme! zUQ2xvj~(^@!n@%$3AVA{!D-yTar)Lv_wa(yY-6dmaLJt+Exr7{`V~Bd(q!m$8Qkk= z6Z+JJyPbxc5#MWOdzaS39{ykMKC-Bg4#0~Ng2#0wgIv=`<;hnOv`nkhT0#EP%K%K> zX~U&urnTS?B$kO=(}K3epE=Vex}hwxMsae;|NB1LT3>I8E)#))LJ)BK;99Z>RSr}T zhv!7lmW)L65yrjq?JO%9s>W~}?eN4f9y1-cq6nZ5Ji%np^i*08kwY@j&>}>nWH=h} zyd(2!$iT1PzkJMeT@&I6uv4<=s=Usz915kAQ&Y)lB+&_6t|J;H+|ZoI)4TwYNkl=6 znb6KWBO7=}bC`Y^$mJzfz*4OqvISM*p*=WO<8c#VDOpzVyDrNy{4}PK6>x4tpF(Jh z8kxPlyk+$FRO2Djm;P#^KpXl%m5TA!8GU+6S}p*dJpyW z!MaQ0H0q!`Kx;L;)wkl+5#J)n1%N&Z5&!A#;EW&Mv0odUgP9dO@;@@E3^fIQ1t^Wb zQNs{Sz$x-U^Ud=iaEEUe&7V z&F9@(sTi-SpVPmNWu935h8^gkZ>a2CG?LIu;qXGC==B!s&Z$qI>aEnz(Yl^#Ur~0e z|M!my%WZj?`)O7PJysoa-1 zm1dPw3j0AMNLZBr5*Fws0nwp8{^~VvDO-C&QALib`>gUU%~zB|p>j6fY{v0RHnS<~Gg5r*JGV|VqSzjM)t|RxEw++s{4OPf8dd3a(TkAyc21vFPwa_rV zCeF4vG$X3HJ(Ax-%rs+g>aIan>n5C2TVfT14P&4|M@@?XMQ{_X&`WfI0X%$R8A@S7YSOVBJ zHuyx7lA~TTO^4}GEo?B{IHR8n{o|SS@2R-dMo!HpaS9 zf4y>kgs?pWxa5Tq%685w;d2Jpur&0BBUhUZ)CU`Y+KW^T_AY_Tr}Rxgf>|e)fHfV~ zIG@#wM;XF~>oF(0gNY`po|aQIpM`0*_|T7NAo3%Hs&Tw;zy8gPa*0fMwoQ?uu* z?{H~u4wg%EgUxKnjA{hkV-;c~ggz3o9)H}zJ0o~EaNpd-eX|_cOaZiVem;ox!oaT8 zB=dtP3GUcjM(7N{YUI?W%IFP7MIpL5$As4ITw+y?UYKKIOuEd)Ka;Gav&#IhDk@s| zE!F+!kT!V!gNky!79E!R6Wo4pBUTq%%AF{6ve0$ks$vgMJ3DBV-r1)4)ti?6BbCnV zq77(5hdcN@7EEsXF0cPPFAP5ZC62pU(T4c1E}ly*LIkO3V5@>l1v`s^u;pOlLKSlr zJi>iL>PFk~(P0IDHIGlzpdJZUckACxRpMrcWktGL$ig=|UTWbTQ!TnIBhqm@lQGd; z$(`Y8Jk!i(Ek4Zfkw`4*u^bmR6;*pZ3Qec&qS(WEuzP1&5wV3US&@fBn$4r!Yzd1( zbg|~8(PP=^934)Ev`SKyv4oTe>xw!Y?}l~#U$5!Qsm#luI#~DV;XYR*`u=gW2Z|#7 zAm@)2_(KQL=!YIhL%*b-rp-kAZ|Qccga4>@ySH>(Pq%*Dxw_rH8nIV*@WDeQRM8<~ z>GbJ|V^rI7d=LE1FXwX0^FpuF>2d-8)d$K2vgZcUPdR({;0qyKIEbfcZ z{A)f@<-j5f==^K49n;y(X1ntb`6Gte|zrZ9Jl2%@hyG;tZj)`K@*hg++wb1N%1t(e`z_Z^hfPA}>T2uoP#1f+MG9S9?9Lv(Z)i)jL3DA%TF%#;_+7Z!Xm@Fb$ zZGgB3u=HiG&~XYG1fEk(!E1sMS6~F+`DuYM@?-^d6dD5-jYgp{{)txT*xm-4DSKIV zY9a6VN0ns4ggd#y8~wNvA!}QR44%Pr8k#p4;ReJhVF^#G_+gZcH{ns-s=AFvy!3Xn z)NCe85x9cCSZ6}!wpbZ>w#ZuynMnr0GKT9a!`K+pWH$B^aWRCBM>y2O?%tLua0QZu86;oxphAb=TKUoVYD{-(!!xNImvgpE?i6 z%YVj)@fs%*iJa6WGW#6n$wBH`>Q?Fm^#Fbx*1O?-9hv46?^u9hX?L{1zTdY(!T(F( zMntA)et1&?6Ds&X*Ss(cwFuWdf_3dpTq%2Pl%gfNU600vIm4C|t?=4{rbvpw^NqZi zIP&Hr)p;+}Y-b1m8KEJrsm97YqteOV-g+z)Q#C%5RK8+|ytpduDso(cU)jlMac8gf zK75N8wPYb3Hs*90i^Vk39VyHv;@PTWIU&~#Iaall%yybHhpx954<1}xSV`J^Oqb+* zoeeRVFbJlO^r>(vq^p9+Mx7fDGOP+dsj`xDop6$ggp*lXP0?YIj}-NaV%l7GEQbPr zBY2zz96R9a`Meu5Yl1~X-gLLJ;Lj%N{Kw;(esEaD?)G|=CJ4WAOm2RHPI^KQAIBpn z0sSL}?LLIA{~5)tk7Dct`3Ho`%*u^7K7QlA!ifV1P85po6JC{n6&Jth@f&YknSE2? zz=;Ee;vHM_4M8-FlHiRq4F{e#pbAHQ=i#Xi$usw7-j2myZ>{Gz59e-#9NSa0htGS9 zI|A%b@MlwqB{0>>fklZ`z+z#p1$s;@0ORArG zZY=i86WaiDZG&L0DHC4lW1kO-!t<5UCuQQeJaG&Z;kkMlGZ4)2Ob$~uJjb%S84b=o z)4zgxuA3pVklOIz^zh&aiVVJw&~50NYfuLN@DV2##-XYhbEY%b_6_EKFzeIYIRwt3+qrELjEQ=oQm&i!~ZzoYT2tGd2@HdTng_ zUDqCs&)k-)Hl~l&imqYpR&3D!^J6R%=!-dAuY(Xz9uurF!q#dnvwoEv69PdmQKjJ1aS9IQ4dYa%hlw3q9hr(D(PaT;&qbvD593K%}jM!KK8E&h{TtY9j}rp zZX7#?pSWokf`Cwm58vPMXB<*>=3wtro4AQCPlXe~6-Xb4Yaftx=71H(C4c_al1 zBmAQOfWYW!27eR;n&rAt2x!Wwk}j#7%7>zRKvM`}OIl=DAuWaknh_$QJ$sa>NaJ@% zNKZV^aC@R5UJV|H;HS|peqN{PiN|TtRJz@e0gs2oCm2y+BdUteL|ZFf!6{I_Oy@)~ zN6VbbDcluBJu2bbsv2PhkM&AY@_~kO_Wpln2fbGBFI1 z73GjVk%yobi#QKKq&abnuK@CDoVwhP!)FZratX2%mJGu*NCT|}uH6BrMc^eC8A;#^ zJQ%_kwIS;xi0AVGd>IBm}nf+$W91wAmD3MBR?e&>lrTA*c=DU^?uvGgkAvqe1p zr(KuU)MS$9P%@p(P3c~)7{_PHr0U-bo88~(ntSNOQVODgD=OY=p()>_wEx7dN4vC0 z%XBKN>){kW5b5sGTYoKA(JQ%3hGZ1d=yI9X^cb9FGNg>0)9pHcg^sGanUYjRg}r!i zXyD3?cvPkKQpcz@>NOByz6lj3m*+=ydozK%DT$mEK@@`(%)hp2+F=gti3N7&CfbZR|&+iv@ z967qQd-u}OBRgaS`DZeaJ$k6y9j}#ckQixUh=J4W;He81i=&o4UM9%R9$Rvx0{DLPGz~XWPo^L}=ZJfu{ z)DsWP-2Vf}2Iuwcw@w{??6JeAt{kn6`FV|VaweW1JvCu-3tpo;M*gw>QVV=;tab+$ zond-KKBxscum-fuj_(NMo6R-R)s2Tg@^BLwqBG@4jlHzHr^ZRnlr0(GJbl+)2QPo+ zZ^mMx7z;}}n(JI~^+OL`eYlN8r-BpI*>ahm;i8gVam2x&o_N=ZyAE7_qY!fh!w?+V zVBR$1kx%RVrBDjiz+S6h!9rISy##%4iD79p91~xfu3r_LnDC}IF@}uEqWt)mL;KCG zK6%7`-H&)WM&r-I=mUuS0WN-f8z}TI8isM(;$UO<=kjXqlX*4&*_@jHLSD)ByR)<1 z*@ar6P%8iy?%*f8cSB;Mg%f=NCvt)Z+*wF@a{*EYex?_r?~cAD{-lc`JVGKJrQP-9KR}ZwGGq1n&c^qI^)Kf)CB-k&k3xbS z1Nsd9WBg7b_}0Jyg2+O<1ciPtojNA3-fq@;Ksp6Nd8-Y< z6@1h!FE4x(amP*p*}R7L!rfQ!^82Ash2u_Mk3N0s*pMED`-5+y^;5@mkq~=~#Z=!X zqOU`B(Df%dPPy|G-VEzHTGuqN+{i=B_Kwggbeh62>Rof&>iibt>tTGfV1@hlZb&bL z59*6xdn}4zP0fQXweCz9St|-LN_JDz{F(l0uXbm-?M2d+4A@JD0PTzRZKxwdgXBVD z3ylKt9cto%08{BTgnAC?yIxt}imU#!yUsv!9_Hq&hcXhmaNd?P0#DEk5S_X8yMu)}% z1pM0g=LUNt*t7Uop4dY=EUy#M9E9~Umbn{PX2XBz=(48k+A@*b#)miRV5UDftslfY zh$-T`TJ`h|{kW*fF`r~Q~a*HSlP{+yUZ$S@mxV<8Xd!aM}N^2!2l zcgSH`Cua_L9m999&I6QdHjseq`%W~z4amwOI(c1@^~Vk z?SM%GkN?4};3%%2CUR04Ut&ufhw#9nAN5lxSX#%a_F;bECj|{IvNmRp&$^p2BkqQD zqVRdhO60GB1dKNL9r6GZ*FPYH#V)>t*#lN=m{*RU1a*KChW&eyknvfZ2Tpa1zD0j+ zfRA~{t1@jEMeAmh=tA0g>Jh?JZS&d0g`1LwUZVb+n+DzQ= ziN4aOW}Q&@hv#1!#+Y`Aem;wP4 zVH5Ty{-+Io73Bwijz3Sv5Bz_@d~irxfN}vVfEOUm$2GuLnWk3&-=}7$Ae`-8h#po` zw9B>K7bZj-d?_e>tKKgOGDm?(LzdSet11gsT)yD6uVTW}V_KDxtp6bEmNyFegK zV9glN9-bb8IUM|nkGY`xAPpyx4yWCdxeI{Z8O_Q)bKl;%`KEgyypk~WQ z8*l^?6G$f^g%tn!kNxPHYe-ZevQE=QA46TtUBAzb?NtK15b#(Z#ul|C+hBeYNy=px4$KO$31!GK1H^>wwyY6<>JO-Zx|E0k6d^|q4tH= zPW;&4`FDqQdK*MfmM3TkmLGq{x3C8d_bvqWgOy}r-R2ee08MrY6#{6hdk*$`2P>+a zaJyYMA*+=ollu^7wm6xV?2uru+d{~ee(r<1{z1o;R54EV&0ul2=pLQ#Vt$ zQ+HFZ8d^lwebiwK;wySYD_8(Epao#5%>sc>6`X<(tqR+g1-F|dl2Z#V6q>%;&?6BV zZK5n}6P(sIV>=MZfn;(POfBIj9!7GaTyo@GL@&l-MK2+vD{rBtbf&`Gd^1zY$0ZHP z**x6SBRSbAxvq>3-$KjD+$cr4(scCHhg)U67~WTD#>44no0V8<2z++x^;cHQyhii+ z8BV%_r*)byS6c-!Qrn~NsTo3{RV@oN&Xd1F;%4$Z9YJEbTKC2YuBfQ7hO|emNNR2H zor;>M$z8P)k{V#~Fye6x&#?+rg`jKu9KI4uqc>2uVQKV!>JjSXRxU?~q)^WjFo3A- z6k2Ux*V^t_WfGhb7zWBkh|TC&M6uYyzox~L8xB!CGDP2qkDLA@yuk1ldBRskl2qjp z!$A`3J+yXYuSoAtByyJRUTzk$pNKn}UB^OOB2{Akofcw+qqG>y9~S8Sg+jrMW$U(< zGK+7v!Wkp~X^}q4lu~!Pwwb?CxegzOapH7|X&9NX)ffdge;5me5B2a&HJY8uBFo)MRd@rN^;?!^VOYm zVV36h$cUdU;^TX&c|o7s`G_o4t&opzzJb4C8$=HZm`U%Ueqmw_tTRL$YBzk84`Z9n z4%Y_r&jqq@y=_w<*eN_H%C>L7aMXnOtoHWJ5^92a!h;r?+z`a6Zg*{c4Xj``t0$^h z0?NGQ`0=+KKXLNt(UV6JOa{0(8|OuZRj_!gghLw3b74(46qaYTP*@I!B!!g)A;!fS zo?~NdOb{ei!inXuAu$507`iEOB(V~f6`WY&tR{>*p7PZ@ZnYh|APgp zlgEL8KRF5n+-fL7C?cq$E{nXViI!-}Y={nVA)XJ>j7qDlY>Ji?5;;*aL{*SYK{0T8 zLlQWFq*oY)Rv3Eg1EMDIq8b*}&c{CHkIO$qzm48bsZ&5p9{lpH@(OA@9qzSLJ0?S{CB z6DoR(|5CL-qe(jfi2#)wuzXeLm=An?hyw#Q&)``OU-%9J6B@@8xUrUh%|+3jAAkOt z4?p-IIDvxIIzQs@{h~Pt@qkMGgWxA0;=pjyr$sT6A%u75YhhvT3(_{u8%aX`3 zqQK~!)R6o+du)cg}}D5oQt12r2{phh{@k*kGg( zKH_+WQNfvl4X2Dh_Gj*Y1zD}H-5A1ME3Wc_07=898QyBItKhnWUA>S+E68&g!DBeD zAQY0wYkHes@P6SJyf184fBo01Xfb&zS?TxxkE7G5f7##mdVhOYZ*XpP73t>|7g22R zcdIv!v3ekH8qd|j#QG`7wyB_Ir}TG^yv1+au(xd} zjpWs_-#Bz{=m9r`)=9!w?7uZTHC6itr1AFcze~K8pL??MH}@VYWzyxCHOVu9a`Bg9 zAC_VRAUDt$@By%Sy+zz6n(zgHC`-Z+zud9CR^U!dZsKn-fOvhFQ1!3O9aow%euKqV zhTIP^;0*H}EqwKIb)O;YcPAdf^SyHWRu_d-HH38e>u#O@1fld^!#r{-!h&K8cPzb>rT*OR;205&n##0r<@jCfw?<#1tVldhV~x7lXN^-h)mpL)LY98 zD`Z6Gl^K@w@xfn_*XPHqc#X(~7V!|KwKY!cNu1V(@odp+Bbu{0nocZFSvEMfS{%dV zD&{>c#NcCu5_-a6!6}!HB+ymM35FRa`91O;ohC1puYU;mC*$`fOYq~`RFAp|e91cy z3dQr;1%pS2tTJ~1Jc}?Ce}4FRL<}F=_;~ag3phylh51kTOcHtRED~Cz4ZP0(#Vlt% zni25^i$u3Fg1eu-wL)XInH7&=yoiYT!@N3^vHj8He!;vBI6LO?wWfH4Wy-fQVrD6m zInAKfl$Ah;vv$%nYcDsU)=3(*R}z>-ww}cI5(-cAh`}A}p9u@zdX2~u7Kbp4rJjgc ztO1KdoXao?KMQ1<6S3-a%%=qC?B*dndVK{IJUqAdnxz~b6-v=u)Io(i?+|KitIe&k zuVbHMe=zt8>K8uzVU)@Yp3l7Tn*Xo0tBH~0xXxYGf7Sp0-80kkxAWKgJDi=~nWn@a zjg>V;TB1ZljgRRUdsXj!ui1Ql)o~WneEY?N z&u?wj$mN5-9y}5c57*3NXn&E@Ec!{V!U>bn3DWNnglt4|Li|gh{ZT=hXpAcry@!5Mmr6dPpuK}zpkkU^%2 zTCRFSNg_NebTkZpvczED`KK2KD{imn;<++-VLOv&=}sKEpA)aS?w9CS+$hOgxtwhm zxmILby|1#j|4_ZLGR_JuFTOd2gWODOQ^Rwe37qM)ma@JY`0JMAdJ{P5&=1r;bIp%w zt(G{MOw3*j#Nitayu5MbbAa_7;_CQg3Ys6U&bzz}!;^YdhHn6zuLBQc&!^4z z^UB_$w0(0x|9VFFEMk|GpbweK_pD~{bfXCtu6x1*-aEonel#0uhuet5`4QH@NRXA` z1=7HUT9jXIPdu+<*i!7|^_Kg3r^cLGy>^gyno+dcxBM_@buzWHcDkKpYKY5#-RobH;vqn5>CXr*B zUevH{r)#IRtQ{t{ZZzE3wv4Xsx(hF`oxtv%8=sDzibif|^maF&T-q6yZDaBkwd3tj z{Oa1>IjqoQihK32jE^sXco9TUbU4edja((?I zoPT<5{p32?_w9!QCKGsnDBRuMy}Li3@56EAe|VF81Ln!k2||qE=D5z#A@LNXTX^Cj z0Yp9+79eTPBO8_Ru`nlmg-jj3EP$5&BaYq}wMp3`=;i@D!PjYKJOmJKKVqx>qt9kc zwGB!$B9d=V3a>vG>8c;XJl05@c+K)59Nx`fuy-!iy_^(5uUmXSdM% zKAEODk)$NnKsyQRY4=fkBpaTOi^4V329~TpIz%y0DrA&-@rbu_U+HJn)^G_g%p<;( zv0&!7SsW)~g{Q#j@z)YX2U_rJmZs~PW&4`;x0a^)mZQP(M?FO|9j~qhUPEpU7IMQ2 ztjKdrP3eKEVQuclt7}oM*R(84e0sfMhW7fDsx5^zw3 z%N{f=+k>kwj-FgkT9D?8j7n$+$z<0I{Z_JmYG~K9wsb;KJQrm1c6RWK@XR1FMJjT4 zW-T6`4g9LjRBjVF0?F%>ATtPs4f6^Io2iWA``l2ONB?P29`!Wu6~HX~k&??esGz`x zsE3@PrHki0KMOMu0vGl8=snxH6*Zl>r--BU&3(Vw2zpVFt}yv3=o_Ag2qcmkWN+?| z^YJz&!we5ML@T#^oq7Ktb)yY2Yg;y1E!EQGt9xcwhJ{;qQcR3E#yv>dH2dcWR|kRUtyTPDS}oh+voD zDvE--7td#x_JsvPvT&S>W!gMX+F~A;crqoFOoC(zj`5Vl3b&G{r8Qw01+~0Nwqtpo z*(hc4RFu5%I*BnAs6nCTRG^kFf^cLgVQ-{rP7M^}6;19cauC;4O3aXolqtm51I-5Q z%U0x2j@*{6u+(UE6y3E?t2=GgJKeo>Wi(Xe#JljUfi|Y1s@qE3-Zj;@xcVuYP82cq zr6{pPN;O4^6&4Yq88jk?#zmv`OaCXI9n8i;z!sAfH-jC!5TdP_WqGvp8s zhC@e{xKbPvChl=V*eM#m;tu{4&IiRg6&g46sbo?{+s+#6nkIE^%`k~55kyd_vCx)k zW~~ONWJhWZ(h&GSq>60FwoAy^Uvt`2qozz^?oCYc_gA=RnDmm8oXiwQ@zrUtBH>Gh212=V}oCjzk$*pl6 ztS3A|l9$zWOG9uVqDXyx{t0($hyfzcx*`)8EEord8al$;04EWw?SB)9QuzS|9wIDlJFK<^~HrZo4pD274p-e~sOiJ(f2P{?pbpTiZMA)#Pbbru@HJd+TwX_%C*7 z+u>r_7s-r&Kjvp&dfC@GriI#9L7GF{U^JW0aqk$ze|OOxZ?V`X*AMPpTI_cxwQ;!1k_(Y~ks5vmgI52>?t|?2cRy|T*D2nHHHZA*!K*CA$;&a8zZ+`pDG`lf7 zefc;Zhbb(oRk>x!<$1;Kje?mbkowf|^1MT!DN2R>LV1A=rk;zb7 ziGlEiYos7OVPi;|&TwXnMUk1Vml%UK(Hi9TVX^)`RHzI!f}zBtFxz=SsKDJ&YvP8o zp+@yqOOj1A=8+vqB#v-QU##(nN@x+U9)py?&}>-_`a_>v;(`VV%#kePn?aT$2R4~p zaQ5~t?d{p0m|VYf{rV~EwT(C4*m%u4wHxm3P4@Pp-ypZ|O*-CWe}Ce2Cii~!v-`F0 zJb3V(n!7o0_xIi5#!?4gmgVs!`M-bnQQB2ZjfeL@pTEQRa94!6uq%8V^w;0QcodJ? z<|@;95voy%qmH=cp*&O6zD>|qb(BR_jLtIzMk4rv{$BZ9?dL^;6L7BtF5)&u|IW8U ze)rmi3)e3E@SRr(d-<)GVF0M5TU4%h>oVO+rN(eJAGUV>c%F_$b76|(XMOTMWA2OB zUUV6I>7AFzq>N`#AJprE&yE@^>VtGROdp7$#u^8g90eDz73UJuZQJTT4_%_C1oO}Qu z%}||3tb0DzA61tuuDtV-Wsf`5w$TQ4tKItG=_{1Tt@c=KcAMh3-C`%k|H_!RwtjVe z&8w<+^X9=n51KbY>-ItFF-^-?JTJQ0{I5ZiNwy~MN1mrRaqM97K0|EppVzQ*CLCD3 zT63_(%YAqkU-xl;L{uB>s>|r^tnIdhDqe^d(Zt&vw7kfwliKV#yjkp6U`>( z-+J!7)pg82NM!cP!GD(_oUn|);Py)x(?AH+uo6HK<7E1^ zt421W_D^j(%8aYbN_zPhZ+8(3)?IXOhnpMZTBj??qld!7kt}sP26O1S$sRlSH?qR^ zCLF`^$Vb4$=je!dLGB(W6_I_o@jmJD8(04qDQD;50001Z+I^2bPQySDg`e}MAR&|^ zY(WtUZ`PJ8cS%r0inQq+yiP17c4Ti9rK1F{g2V|p1Dt`D6VSo4vmikcuXg8~H{&Vu-u{kf-wqcL@+#K2rO{mIV4BekVdRW%+{<|l|54Su1FK) z$jDVJuw-4phlFD6v%_$05n{lV*xux~SE6JlscPz1z_`$n(Xm(@#4wIFVpK%&S|7wd zH7ha6Gc(DHr53(aqQ5d`8x95u)ud8onaE5Vx=iaqDQ@dnQpmIPHqS`2`h_WWd>3Xq zPIru_9uac?_dBWqTzKqrxfLm((VrWJ;%6=~a6RAkl^2}6-kh@wN@-mZ^sSs_9jn`5 zu8T6wGoh3xl~UrA+cyySaH0Ts+HIF(w4LV`Mzhvxo7zg<)Xsj_vsG`_wv7}iQ`<;V z+qUi0wr$(Sy|**}ZhrI|o#wVPo0Y zHjWLnacw*s-zKmLZ6cf4Cb3CvGMn6{uqkaSo7$$aX>E{AXVcpZHlxjCGutdSs|~i< zY<8Q&=CrwNZkxyEwfSs*Tfi2yg=~mbtXP_?YBj4{!Vz#&~VM|)e+SakI z^{j78+0wR*Eo;l!^0tDlXe-&uwu-H4tJ&(dhOKF9+1j>_t!wMq`nG{>XdBtawux7kD+157Hwy|w(JKNrd*$%d&?PNRKF1D);x7}=a+r##>y=-sW$M&`TY=1kz z4zz>pU^~PPwZrUiJHn2%qwHuKVIysn9b?DZady0&U?Dj&cClSzm)d1^xm{sb+EsS7U1QhUb#}eoU^m)LcC+1Lx7uxXyWL@T z+Ff?H-D9KeUc1lkw+HM&d&nNPN9<91%pSKV>`8mdp0;P~S$oc&w-@Y1d&yq5SL{`L z&0e=R>`i;i-nMt_U3<^ow-4+?`^Y}FPwZ3s%s#g->`VK~zP4}dTl>zww;$|B`^kQ` zU+h==&3?B(>`(j4{`UX=?{^O$%g6R{e4vl(R`eI}pTXYpBmu+QeR`y4)}&*gLbJU*|_=kxmlzMwDUL%ia})8$pK zdEFb{^o4y9U(^@##eE51(p%p4j(5H1eP7C#_GNroU(T2J6?{cs$yfGOd{tk~SNAo1 zO<&8`_H}$+U(eU~4SYl2$T#*)d{f`dH}@@kOW(@3_MyIwZ|mFn_CCya@Ev_8-`RKZ zU46Lk=DYhIzNhcyd;31VukYvk`vHESALIx7A%3VI=7;+cexx7eNBamL>7)D@Kh}@) z_FZ0X&3cu2?@~izC zzt*qw>-`45(Qopb{T9E~Z}Z#z4!_gy^1J;WAMN-0eSW_`;1Bvk{;)sdkNRW&xIf`f z`cwY2KjY8(bN;-);4k`1{<6Q~ulj5Ly1(IX`dj|CzvJ)vd;Y$E;2-)&`?sZ)^SI`@hQn?fw72{+Iv1&Ho?m|CRr5_y33WzvBOu^KfwYcWg|0BcaZA zY=>c7kG$}a7Q;XvnaM|%7)JWY1s|DW80sT?`N$SSjb+_0liOw(rghCso;Jgj?Rbu1 z^%=q9V=;#1XM{f=t1+zC5#T=NWT>JQsN@{j8+B!|;MoWZu};_IjS)7}I#d^nzJ1|h zUUjj5Y0}FGwQ0RilYT}hhV@KMdK#e`)_XPSYlQN(o~=o5Bh;_;eogv&L&2=4H|g;W z6|>&6NuO^hZR=T^^jbpd_K|HHV{_yWC$--&EbE$^JpG1g+wr`O)o%o=kHu{)eLhZ*A3oB#<-H!zpmh^N?G}P+rOn$t>!p^Tl`0)}8OTW(G$6G9H z&vh6-USnZ>uCw^@9t(TD4(`W`c39|jdOzN@!)9HF_TyDMtk!jAKi;*&F0VuS@vb=4GaICnxJT-ZNq*3iRQe}d8YG9=kd<-ou@l5 zcb@FL*m<_|{?^YI{ed5{)-}dI5dVRd;e~2Gme?R~}yp9u^SNc!>Zh}S} z-_!p7;*;tvKjd`xxp%+6_z2AWp^F9P{=f5&+OM}?m;b!8zOwVb@PGAr z{x^@dKdVl18=YHXO^?!bU=Kiq$SPm7)SH0)8XKID^$FN6hk3@HF7a9nG$oBa5 z`wawO%Y7*9&lkS0w$Ha__7Ag#61 zzn!f|)dbrg5cox@`ol}NOTBLnz6ZkP>Nnf(1EGKVq;o2BJ*_5}sO^lNv|ANO{ChIv zU%_^j^6nkcNA4=U6D!=_vD>x8yTtpB?xQ@x^6nQiK@cqYOARLNUxEcfH6WWqfzYD= zqmZ5<@ap=1#&`AC>w%pV1_s9e{~4GnZY3uqB&0Aj8E@-8*ZhL}bdS2@OHBsvzieL^ E0LEz`i~s-t literal 57276 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 - * - * 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 parametrized 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 action 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. 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}', name, action.isArray ? 'array' : 'object', - angular.isArray(data) ? 'array' : 'object'); - } - // 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 deleted file mode 100644 index 9f5e93f..0000000 --- a/www/lib/ionic/js/angular/angular-resource.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/* - AngularJS v1.3.6 - (c) 2010-2014 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 w=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 t(d,g){this.template=d;this.defaults=s({},f.defaults,g);this.urlParams={}}function v(x,g,l,m){function c(b,k){var c={};k=s({},g,k);r(k,function(a,k){u(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 w("badmember",e);for(var e=e.split("."),n=0,g=e.length;n')(scope); @@ -181,7 +192,7 @@ function($rootScope, $compile, $animate, $timeout, $ionicTemplateLoader, $ionicP var stateChangeListenDone = scope.cancelOnStateChange ? $rootScope.$on('$stateChangeSuccess', function() { scope.cancel(); }) : - angular.noop; + noop; // removes the actionSheet from the screen scope.removeSheet = function(done) { @@ -202,7 +213,7 @@ function($rootScope, $compile, $animate, $timeout, $ionicTemplateLoader, $ionicP element.remove(); // scope.cancel.$scope is defined near the bottom scope.cancel.$scope = sheetEl = null; - (done || angular.noop)(); + (done || noop)(); }); }; @@ -214,7 +225,7 @@ function($rootScope, $compile, $animate, $timeout, $ionicTemplateLoader, $ionicP $animate.addClass(element, 'active').then(function() { if (scope.removed) return; - (done || angular.noop)(); + (done || noop)(); }); $timeout(function() { if (scope.removed) return; @@ -317,86 +328,6 @@ jqLite.prototype.removeClass = function(cssClasses) { return this; }; - -/** - * @private - */ -IonicModule -.factory('$$ionicAttachDrag', [function() { - - return attachDrag; - - function attachDrag(scope, element, options) { - var opts = extend({}, { - getDistance: function() { return opts.element.prop('offsetWidth'); }, - onDragStart: angular.noop, - onDrag: angular.noop, - onDragEnd: angular.noop - }, options); - - var dragStartGesture = ionic.onGesture('dragstart', handleDragStart, element[0]); - var dragGesture = ionic.onGesture('drag', handleDrag, element[0]); - var dragEndGesture = ionic.onGesture('dragend', handleDragEnd, element[0]); - - scope.$on('$destroy', function() { - ionic.offGesture(dragStartGesture, 'dragstart', handleDragStart); - ionic.offGesture(dragGesture, 'drag', handleDrag); - ionic.offGesture(dragEndGesture, 'dragend', handleDragEnd); - }); - - var isDragging = false; - element.on('touchmove pointermove mousemove', function(ev) { - if (isDragging) ev.preventDefault(); - }); - element.on('touchend mouseup mouseleave', function(ev) { - isDragging = false; - }); - - var dragState; - function handleDragStart(ev) { - if (dragState) return; - if (opts.onDragStart() !== false) { - dragState = { - startX: ev.gesture.center.pageX, - startY: ev.gesture.center.pageY, - distance: opts.getDistance() - }; - } - } - function handleDrag(ev) { - if (!dragState) return; - var deltaX = dragState.startX - ev.gesture.center.pageX; - var deltaY = dragState.startY - ev.gesture.center.pageY; - var isVertical = ev.gesture.direction === 'up' || ev.gesture.direction === 'down'; - - if (isVertical && Math.abs(deltaY) > Math.abs(deltaX) * 2) { - handleDragEnd(ev); - return; - } - if (Math.abs(deltaX) > Math.abs(deltaY) * 2) { - isDragging = true; - } - - var percent = getDragPercent(ev.gesture.center.pageX); - opts.onDrag(percent); - } - function handleDragEnd(ev) { - if (!dragState) return; - var percent = getDragPercent(ev.gesture.center.pageX); - options.onDragEnd(percent, ev.gesture.velocityX); - - dragState = null; - } - - function getDragPercent(x) { - var delta = dragState.startX - x; - var percent = delta / dragState.distance; - return percent; - } - } - -}]); - /** * @ngdoc service * @name $ionicBackdrop @@ -500,7 +431,7 @@ IonicModule parentGet, unwatch; - switch(mode) { + switch (mode) { case '@': if (!attrs[attrName]) { return; @@ -632,6 +563,11 @@ function($document, $ionicBody, $timeout) { var CSS_HIDE = 'click-block-hide'; var cbEle, fallbackTimer, pendingShow; + function preventClick(ev) { + ev.preventDefault(); + ev.stopPropagation(); + } + function addClickBlock() { if (pendingShow) { if (cbEle) { @@ -640,6 +576,8 @@ function($document, $ionicBody, $timeout) { cbEle = $document[0].createElement('div'); cbEle.className = 'click-block'; $ionicBody.append(cbEle); + cbEle.addEventListener('touchstart', preventClick); + cbEle.addEventListener('mousedown', preventClick); } pendingShow = false; } @@ -654,516 +592,16 @@ function($document, $ionicBody, $timeout) { pendingShow = true; $timeout.cancel(fallbackTimer); fallbackTimer = $timeout(this.hide, autoExpire || 310); - ionic.requestAnimationFrame(addClickBlock); + addClickBlock(); }, hide: function() { pendingShow = false; $timeout.cancel(fallbackTimer); - ionic.requestAnimationFrame(removeClickBlock); - } - }; -}]); - -IonicModule -.factory('$collectionDataSource', [ - '$cacheFactory', - '$parse', - '$rootScope', -function($cacheFactory, $parse, $rootScope) { - function hideWithTransform(element) { - element.css(ionic.CSS.TRANSFORM, 'translate3d(-2000px,-2000px,0)'); - } - - function CollectionRepeatDataSource(options) { - var self = this; - this.scope = options.scope; - this.transcludeFn = options.transcludeFn; - this.transcludeParent = options.transcludeParent; - this.element = options.element; - - this.keyExpr = options.keyExpr; - this.listExpr = options.listExpr; - this.trackByExpr = options.trackByExpr; - - this.heightGetter = options.heightGetter; - this.widthGetter = options.widthGetter; - - this.dimensions = []; - this.data = []; - - this.attachedItems = {}; - this.BACKUP_ITEMS_LENGTH = 20; - this.backupItemsArray = []; - } - CollectionRepeatDataSource.prototype = { - setup: function() { - if (this.isSetup) return; - this.isSetup = true; - for (var i = 0; i < this.BACKUP_ITEMS_LENGTH; i++) { - this.detachItem(this.createItem()); - } - }, - destroy: function() { - this.dimensions.length = 0; - this.data = null; - this.backupItemsArray.length = 0; - this.attachedItems = {}; - }, - calculateDataDimensions: function() { - var locals = {}; - this.dimensions = this.data.map(function(value, index) { - locals[this.keyExpr] = value; - locals.$index = index; - return { - width: this.widthGetter(this.scope, locals), - height: this.heightGetter(this.scope, locals) - }; - }, this); - this.dimensions = this.beforeSiblings.concat(this.dimensions).concat(this.afterSiblings); - this.dataStartIndex = this.beforeSiblings.length; - }, - createItem: function() { - var item = {}; - - item.scope = this.scope.$new(); - this.transcludeFn(item.scope, function(clone) { - clone.css('position', 'absolute'); - item.element = clone; - }); - this.transcludeParent.append(item.element); - - return item; - }, - getItem: function(index) { - var item; - if ( (item = this.attachedItems[index]) ) { - //do nothing, the item is good - } else if ( (item = this.backupItemsArray.pop()) ) { - ionic.Utils.reconnectScope(item.scope); - } else { - item = this.createItem(); - } - return item; - }, - attachItemAtIndex: function(index) { - if (index < this.dataStartIndex) { - return this.beforeSiblings[index]; - } - // Subtract so we start at the beginning of this.data, after - // this.beforeSiblings. - index -= this.dataStartIndex; - - if (index > this.data.length - 1) { - return this.afterSiblings[index - this.dataStartIndex]; - } - - var item = this.getItem(index); - var value = this.data[index]; - - if (item.index !== index || item.scope[this.keyExpr] !== value) { - item.index = item.scope.$index = index; - item.scope[this.keyExpr] = value; - item.scope.$first = (index === 0); - item.scope.$last = (index === (this.getLength() - 1)); - item.scope.$middle = !(item.scope.$first || item.scope.$last); - item.scope.$odd = !(item.scope.$even = (index&1) === 0); - - //We changed the scope, so digest if needed - if (!$rootScope.$$phase) { - item.scope.$digest(); - } - } - this.attachedItems[index] = item; - - return item; - }, - destroyItem: function(item) { - item.element.remove(); - item.scope.$destroy(); - item.scope = null; - item.element = null; - }, - detachItem: function(item) { - delete this.attachedItems[item.index]; - - //If it's an outside item, only hide it. These items aren't part of collection - //repeat's list, only sit outside - if (item.isOutside) { - hideWithTransform(item.element); - // If we are at the limit of backup items, just get rid of the this element - } else if (this.backupItemsArray.length >= this.BACKUP_ITEMS_LENGTH) { - this.destroyItem(item); - // Otherwise, add it to our backup items - } else { - this.backupItemsArray.push(item); - hideWithTransform(item.element); - //Don't .$destroy(), just stop watchers and events firing - ionic.Utils.disconnectScope(item.scope); - } - - }, - getLength: function() { - return this.dimensions && this.dimensions.length || 0; - }, - setData: function(value, beforeSiblings, afterSiblings) { - this.data = value || []; - this.beforeSiblings = beforeSiblings || []; - this.afterSiblings = afterSiblings || []; - this.calculateDataDimensions(); - - this.afterSiblings.forEach(function(item) { - item.element.css({position: 'absolute', top: '0', left: '0' }); - hideWithTransform(item.element); - }); - }, - }; - - return CollectionRepeatDataSource; -}]); - - -IonicModule -.factory('$collectionRepeatManager', [ - '$rootScope', - '$timeout', -function($rootScope, $timeout) { - /** - * Vocabulary: "primary" and "secondary" size/direction/position mean - * "y" and "x" for vertical scrolling, or "x" and "y" for horizontal scrolling. - */ - function CollectionRepeatManager(options) { - var self = this; - this.dataSource = options.dataSource; - this.element = options.element; - this.scrollView = options.scrollView; - - this.isVertical = !!this.scrollView.options.scrollingY; - this.renderedItems = {}; - this.dimensions = []; - this.setCurrentIndex(0); - - //Override scrollview's render callback - this.scrollView.__$callback = this.scrollView.__callback; - this.scrollView.__callback = angular.bind(this, this.renderScroll); - - function getViewportSize() { return self.viewportSize; } - //Set getters and setters to match whether this scrollview is vertical or not - if (this.isVertical) { - this.scrollView.options.getContentHeight = getViewportSize; - - this.scrollValue = function() { - return this.scrollView.__scrollTop; - }; - this.scrollMaxValue = function() { - return this.scrollView.__maxScrollTop; - }; - this.scrollSize = function() { - return this.scrollView.__clientHeight; - }; - this.secondaryScrollSize = function() { - return this.scrollView.__clientWidth; - }; - this.transformString = function(y, x) { - return 'translate3d('+x+'px,'+y+'px,0)'; - }; - this.primaryDimension = function(dim) { - return dim.height; - }; - this.secondaryDimension = function(dim) { - return dim.width; - }; - } else { - this.scrollView.options.getContentWidth = getViewportSize; - - this.scrollValue = function() { - return this.scrollView.__scrollLeft; - }; - this.scrollMaxValue = function() { - return this.scrollView.__maxScrollLeft; - }; - this.scrollSize = function() { - return this.scrollView.__clientWidth; - }; - this.secondaryScrollSize = function() { - return this.scrollView.__clientHeight; - }; - this.transformString = function(x, y) { - return 'translate3d('+x+'px,'+y+'px,0)'; - }; - this.primaryDimension = function(dim) { - return dim.width; - }; - this.secondaryDimension = function(dim) { - return dim.height; - }; - } - } - - CollectionRepeatManager.prototype = { - destroy: function() { - this.renderedItems = {}; - this.render = angular.noop; - this.calculateDimensions = angular.noop; - this.dimensions = []; - }, - - /* - * Pre-calculate the position of all items in the data list. - * Do this using the provided width and height (primarySize and secondarySize) - * provided by the dataSource. - */ - calculateDimensions: function() { - /* - * For the sake of explanations below, we're going to pretend we are scrolling - * vertically: Items are laid out with primarySize being height, - * secondarySize being width. - */ - var primaryPos = 0; - var secondaryPos = 0; - var secondaryScrollSize = this.secondaryScrollSize(); - var previousItem; - - this.dataSource.beforeSiblings && this.dataSource.beforeSiblings.forEach(calculateSize, this); - var beforeSize = primaryPos + (previousItem ? previousItem.primarySize : 0); - - primaryPos = secondaryPos = 0; - previousItem = null; - - var dimensions = this.dataSource.dimensions.map(calculateSize, this); - var totalSize = primaryPos + (previousItem ? previousItem.primarySize : 0); - - return { - beforeSize: beforeSize, - totalSize: totalSize, - dimensions: dimensions - }; - - function calculateSize(dim) { - - //Each dimension is an object {width: Number, height: Number} provided by - //the dataSource - var rect = { - //Get the height out of the dimension object - primarySize: this.primaryDimension(dim), - //Max out the item's width to the width of the scrollview - secondarySize: Math.min(this.secondaryDimension(dim), secondaryScrollSize) - }; - - //If this isn't the first item - if (previousItem) { - //Move the item's x position over by the width of the previous item - secondaryPos += previousItem.secondarySize; - //If the y position is the same as the previous item and - //the x position is bigger than the scroller's width - if (previousItem.primaryPos === primaryPos && - secondaryPos + rect.secondarySize > secondaryScrollSize) { - //Then go to the next row, with x position 0 - secondaryPos = 0; - primaryPos += previousItem.primarySize; - } - } - - rect.primaryPos = primaryPos; - rect.secondaryPos = secondaryPos; - - previousItem = rect; - return rect; - } - }, - resize: function() { - var result = this.calculateDimensions(); - this.dimensions = result.dimensions; - this.viewportSize = result.totalSize; - this.beforeSize = result.beforeSize; - this.setCurrentIndex(0); - this.render(true); - this.dataSource.setup(); - }, - /* - * setCurrentIndex sets the index in the list that matches the scroller's position. - * Also save the position in the scroller for next and previous items (if they exist) - */ - setCurrentIndex: function(index, height) { - var currentPos = (this.dimensions[index] || {}).primaryPos || 0; - this.currentIndex = index; - - this.hasPrevIndex = index > 0; - if (this.hasPrevIndex) { - this.previousPos = Math.max( - currentPos - this.dimensions[index - 1].primarySize, - this.dimensions[index - 1].primaryPos - ); - } - this.hasNextIndex = index + 1 < this.dataSource.getLength(); - if (this.hasNextIndex) { - this.nextPos = Math.min( - currentPos + this.dimensions[index + 1].primarySize, - this.dimensions[index + 1].primaryPos - ); - } - }, - /** - * override the scroller's render callback to check if we need to - * re-render our collection - */ - renderScroll: ionic.animationFrameThrottle(function(transformLeft, transformTop, zoom, wasResize) { - if (this.isVertical) { - this.renderIfNeeded(transformTop); - } else { - this.renderIfNeeded(transformLeft); - } - return this.scrollView.__$callback(transformLeft, transformTop, zoom, wasResize); - }), - - renderIfNeeded: function(scrollPos) { - if ((this.hasNextIndex && scrollPos >= this.nextPos) || - (this.hasPrevIndex && scrollPos < this.previousPos)) { - // Math.abs(transformPos - this.lastRenderScrollValue) > 100) { - this.render(); - } - }, - /* - * getIndexForScrollValue: Given the most recent data index and a new scrollValue, - * find the data index that matches that scrollValue. - * - * Strategy (if we are scrolling down): keep going forward in the dimensions list, - * starting at the given index, until an item with height matching the new scrollValue - * is found. - * - * This is a while loop. In the worst case it will have to go through the whole list - * (eg to scroll from top to bottom). The most common case is to scroll - * down 1-3 items at a time. - * - * While this is not as efficient as it could be, optimizing it gives no noticeable - * benefit. We would have to use a new memory-intensive data structure for dimensions - * to fully optimize it. - */ - getIndexForScrollValue: function(i, scrollValue) { - var rect; - //Scrolling up - if (scrollValue <= this.dimensions[i].primaryPos) { - while ( (rect = this.dimensions[i - 1]) && rect.primaryPos > scrollValue) { - i--; - } - //Scrolling down - } else { - while ( (rect = this.dimensions[i + 1]) && rect.primaryPos < scrollValue) { - i++; - } - } - return i; - }, - /* - * render: Figure out the scroll position, the index matching it, and then tell - * the data source to render the correct items into the DOM. - */ - render: function(shouldRedrawAll) { - var self = this; - var i; - var isOutOfBounds = ( this.currentIndex >= this.dataSource.getLength() ); - // We want to remove all the items and redraw everything if we're out of bounds - // or a flag is passed in. - if (isOutOfBounds || shouldRedrawAll) { - for (i in this.renderedItems) { - this.removeItem(i); - } - // Just don't render anything if we're out of bounds - if (isOutOfBounds) return; - } - - var rect; - var scrollValue = this.scrollValue(); - // Scroll size = how many pixels are visible in the scroller at one time - var scrollSize = this.scrollSize(); - // We take the current scroll value and add it to the scrollSize to get - // what scrollValue the current visible scroll area ends at. - var scrollSizeEnd = scrollSize + scrollValue; - // Get the new start index for scrolling, based on the current scrollValue and - // the most recent known index - var startIndex = this.getIndexForScrollValue(this.currentIndex, scrollValue); - - // If we aren't on the first item, add one row of items before so that when the user is - // scrolling up he sees the previous item - var renderStartIndex = Math.max(startIndex - 1, 0); - // Keep adding items to the 'extra row above' until we get to a new row. - // This is for the case where there are multiple items on one row above - // the current item; we want to keep adding items above until - // a new row is reached. - while (renderStartIndex > 0 && - (rect = this.dimensions[renderStartIndex]) && - rect.primaryPos === this.dimensions[startIndex - 1].primaryPos) { - renderStartIndex--; - } - - // Keep rendering items, adding them until we are past the end of the visible scroll area - i = renderStartIndex; - while ((rect = this.dimensions[i]) && (rect.primaryPos - rect.primarySize < scrollSizeEnd)) { - doRender(i, rect); - i++; - } - - // Render two extra items at the end as a buffer - if (self.dimensions[i]) { - doRender(i, self.dimensions[i]); - i++; - } - if (self.dimensions[i]) { - doRender(i, self.dimensions[i]); - } - var renderEndIndex = i; - - // Remove any items that were rendered and aren't visible anymore - for (var renderIndex in this.renderedItems) { - if (renderIndex < renderStartIndex || renderIndex > renderEndIndex) { - this.removeItem(renderIndex); - } - } - - this.setCurrentIndex(startIndex); - - function doRender(dataIndex, rect) { - if (dataIndex < self.dataSource.dataStartIndex) { - // do nothing - } else { - self.renderItem(dataIndex, rect.primaryPos - self.beforeSize, rect.secondaryPos); - } - } - }, - renderItem: function(dataIndex, primaryPos, secondaryPos) { - // Attach an item, and set its transform position to the required value - var item = this.dataSource.attachItemAtIndex(dataIndex); - //console.log(dataIndex, item); - if (item && item.element) { - if (item.primaryPos !== primaryPos || item.secondaryPos !== secondaryPos) { - item.element.css(ionic.CSS.TRANSFORM, this.transformString( - primaryPos, secondaryPos - )); - item.primaryPos = primaryPos; - item.secondaryPos = secondaryPos; - } - // Save the item in rendered items - this.renderedItems[dataIndex] = item; - } else { - // If an item at this index doesn't exist anymore, be sure to delete - // it from rendered items - delete this.renderedItems[dataIndex]; - } - }, - removeItem: function(dataIndex) { - // Detach a given item - var item = this.renderedItems[dataIndex]; - if (item) { - item.primaryPos = item.secondaryPos = null; - this.dataSource.detachItem(item); - delete this.renderedItems[dataIndex]; - } + removeClickBlock(); } }; - - return CollectionRepeatManager; }]); - /** * @ngdoc service * @name $ionicGesture @@ -1517,7 +955,8 @@ function($rootScope, $state, $location, $window, $timeout, $ionicViewSwitcher, $ // the forward has a history for (x = tmp.stack.length - 1; x >= forwardView.index; x--) { // starting from the end destroy all forwards in this history from this point - tmp.stack[x].destroy(); + var stack_x = tmp.stack[x]; + stack_x && stack_x.destroy && stack_x.destroy(); tmp.stack.splice(x); } historyId = forwardView.historyId; @@ -1595,7 +1034,10 @@ function($rootScope, $state, $location, $window, $timeout, $ionicViewSwitcher, $ if (hist.stack[x].viewId == viewId) { action = 'dupNav'; direction = DIRECTION_NONE; - hist.stack[x - 1].forwardViewId = viewHistory.forwardView = null; + if (x > 0) { + hist.stack[x - 1].forwardViewId = null; + } + viewHistory.forwardView = null; viewHistory.currentView.index = viewHistory.backView.index; viewHistory.currentView.backViewId = viewHistory.backView.backViewId; viewHistory.backView = getBackView(viewHistory.backView); @@ -1614,7 +1056,7 @@ function($rootScope, $state, $location, $window, $timeout, $ionicViewSwitcher, $ action: action, direction: direction, historyId: historyId, - enableBack: !!(viewHistory.backView && viewHistory.backView.historyId === viewHistory.currentView.historyId), + enableBack: this.enabledBack(viewHistory.currentView), isHistoryRoot: (viewHistory.currentView.index === 0), ele: ele }; @@ -1702,10 +1144,9 @@ function($rootScope, $state, $location, $window, $timeout, $ionicViewSwitcher, $ * @description Gets the back view's title. * @returns {string} Returns the back view's title. */ - backTitle: function() { - if (viewHistory.backView) { - return viewHistory.backView.title; - } + backTitle: function(view) { + var backView = (view && getViewById(view.backViewId)) || viewHistory.backView; + return backView && backView.title; }, /** @@ -1764,6 +1205,12 @@ function($rootScope, $state, $location, $window, $timeout, $ionicViewSwitcher, $ viewHistory.backView && viewHistory.backView.go(); }, + + enabledBack: function(view) { + var backView = getBackView(view); + return !!(backView && backView.historyId === view.historyId); + }, + /** * @ngdoc method * @name $ionicHistory#clearHistory @@ -1847,7 +1294,7 @@ function($rootScope, $state, $location, $window, $timeout, $ionicViewSwitcher, $ nextViewOptions = nextViewOptions || {}; extend(nextViewOptions, opts); if (nextViewOptions.expire) { - nextViewExpireTimer = $timeout(function(){ + nextViewExpireTimer = $timeout(function() { nextViewOptions = null; }, nextViewOptions.expire); } @@ -2105,6 +1552,22 @@ function($rootScope, $state, $location, $document, $ionicPlatform, $ionicHistory * @returns {boolean} */ +/** + * @ngdoc method + * @name $ionicConfigProvider#form.checkbox + * @description Checkbox style. Android defaults to `square` and iOS defaults to `circle`. + * @param {string} value + * @returns {string} + */ + +/** + * @ngdoc method + * @name $ionicConfigProvider#form.toggle + * @description Toggle item style. Android defaults to `small` and iOS defaults to `large`. + * @param {string} value + * @returns {string} + */ + /** * @ngdoc method * @name $ionicConfigProvider#tabs.style @@ -2198,7 +1661,9 @@ IonicModule views: { maxCache: PLATFORM, forwardCache: PLATFORM, - transition: PLATFORM + transition: PLATFORM, + swipeBackEnabled: PLATFORM, + swipeBackHitWidth: PLATFORM }, navBar: { alignTitle: PLATFORM, @@ -2212,7 +1677,11 @@ IonicModule previousTitleText: PLATFORM }, form: { - checkbox: PLATFORM + checkbox: PLATFORM, + toggle: PLATFORM + }, + scrolling: { + jsScrolling: PLATFORM }, tabs: { style: PLATFORM, @@ -2234,7 +1703,9 @@ IonicModule views: { maxCache: 10, forwardCache: false, - transition: 'ios' + transition: 'ios', + swipeBackEnabled: true, + swipeBackHitWidth: 45 }, navBar: { @@ -2245,13 +1716,18 @@ IonicModule }, backButton: { - icon: 'ion-ios7-arrow-back', + icon: 'ion-ios-arrow-back', text: 'Back', previousTitleText: true }, form: { - checkbox: 'circle' + checkbox: 'circle', + toggle: 'large' + }, + + scrolling: { + jsScrolling: true }, tabs: { @@ -2278,7 +1754,8 @@ IonicModule setPlatformConfig('android', { views: { - transition: 'android' + transition: 'android', + swipeBackEnabled: false }, navBar: { @@ -2288,13 +1765,14 @@ IonicModule }, backButton: { - icon: 'ion-arrow-left-c', + icon: 'ion-android-arrow-back', text: false, previousTitleText: false }, form: { - checkbox: 'square' + checkbox: 'square', + toggle: 'small' }, tabs: { @@ -2314,42 +1792,45 @@ IonicModule // iOS Transitions // ----------------------- provider.transitions.views.ios = function(enteringEle, leavingEle, direction, shouldAnimate) { - shouldAnimate = shouldAnimate && (direction == 'forward' || direction == 'back'); - function setStyles(ele, opacity, x) { + function setStyles(ele, opacity, x, boxShadowOpacity) { var css = {}; - css[ionic.CSS.TRANSITION_DURATION] = shouldAnimate ? '' : 0; + css[ionic.CSS.TRANSITION_DURATION] = d.shouldAnimate ? '' : 0; css.opacity = opacity; + if (boxShadowOpacity > -1) { + css.boxShadow = '0 0 10px rgba(0,0,0,' + (d.shouldAnimate ? boxShadowOpacity * 0.45 : 0.3) + ')'; + } css[ionic.CSS.TRANSFORM] = 'translate3d(' + x + '%,0,0)'; ionic.DomUtil.cachedStyles(ele, css); } - return { + var d = { run: function(step) { if (direction == 'forward') { - setStyles(enteringEle, 1, (1 - step) * 99); // starting at 98% prevents a flicker - setStyles(leavingEle, (1 - 0.1 * step), step * -33); + setStyles(enteringEle, 1, (1 - step) * 99, 1 - step); // starting at 98% prevents a flicker + setStyles(leavingEle, (1 - 0.1 * step), step * -33, -1); } else if (direction == 'back') { - setStyles(enteringEle, (1 - 0.1 * (1 - step)), (1 - step) * -33); - setStyles(leavingEle, 1, step * 100); + setStyles(enteringEle, (1 - 0.1 * (1 - step)), (1 - step) * -33, -1); + setStyles(leavingEle, 1, step * 100, 1 - step); } else { // swap, enter, exit - setStyles(enteringEle, 1, 0); - setStyles(leavingEle, 0, 0); + setStyles(enteringEle, 1, 0, -1); + setStyles(leavingEle, 0, 0, -1); } }, - shouldAnimate: shouldAnimate + shouldAnimate: shouldAnimate && (direction == 'forward' || direction == 'back') }; + + return d; }; provider.transitions.navBar.ios = function(enteringHeaderBar, leavingHeaderBar, direction, shouldAnimate) { - shouldAnimate = shouldAnimate && (direction == 'forward' || direction == 'back'); function setStyles(ctrl, opacity, titleX, backTextX) { var css = {}; - css[ionic.CSS.TRANSITION_DURATION] = shouldAnimate ? '' : 0; + css[ionic.CSS.TRANSITION_DURATION] = d.shouldAnimate ? '' : 0; css.opacity = opacity === 1 ? '' : opacity; ctrl.setCss('buttons-left', css); @@ -2364,23 +1845,23 @@ IonicModule } function enter(ctrlA, ctrlB, step) { - if (!ctrlA) return; + if (!ctrlA || !ctrlB) return; var titleX = (ctrlA.titleTextX() + ctrlA.titleWidth()) * (1 - step); var backTextX = (ctrlB && (ctrlB.titleTextX() - ctrlA.backButtonTextLeft()) * (1 - step)) || 0; setStyles(ctrlA, step, titleX, backTextX); } function leave(ctrlA, ctrlB, step) { - if (!ctrlA) return; + if (!ctrlA || !ctrlB) return; var titleX = (-(ctrlA.titleTextX() - ctrlB.backButtonTextLeft()) - (ctrlA.titleLeftRight())) * step; setStyles(ctrlA, 1 - step, titleX, 0); } - return { + var d = { run: function(step) { var enteringHeaderCtrl = enteringHeaderBar.controller(); var leavingHeaderCtrl = leavingHeaderBar && leavingHeaderBar.controller(); - if (direction == 'back') { + if (d.direction == 'back') { leave(enteringHeaderCtrl, leavingHeaderCtrl, 1 - step); enter(leavingHeaderCtrl, enteringHeaderCtrl, 1 - step); } else { @@ -2388,8 +1869,11 @@ IonicModule leave(leavingHeaderCtrl, enteringHeaderCtrl, step); } }, - shouldAnimate: shouldAnimate + direction: direction, + shouldAnimate: shouldAnimate && (direction == 'forward' || direction == 'back') }; + + return d; }; @@ -2401,12 +1885,12 @@ IonicModule function setStyles(ele, x) { var css = {}; - css[ionic.CSS.TRANSITION_DURATION] = shouldAnimate ? '' : 0; + css[ionic.CSS.TRANSITION_DURATION] = d.shouldAnimate ? '' : 0; css[ionic.CSS.TRANSFORM] = 'translate3d(' + x + '%,0,0)'; ionic.DomUtil.cachedStyles(ele, css); } - return { + var d = { run: function(step) { if (direction == 'forward') { setStyles(enteringEle, (1 - step) * 99); // starting at 98% prevents a flicker @@ -2424,10 +1908,11 @@ IonicModule }, shouldAnimate: shouldAnimate }; + + return d; }; provider.transitions.navBar.android = function(enteringHeaderBar, leavingHeaderBar, direction, shouldAnimate) { - shouldAnimate = shouldAnimate && (direction == 'forward' || direction == 'back'); function setStyles(ctrl, opacity) { if (!ctrl) return; @@ -2446,7 +1931,7 @@ IonicModule setStyles(enteringHeaderBar.controller(), step); setStyles(leavingHeaderBar && leavingHeaderBar.controller(), 1 - step); }, - shouldAnimate: true + shouldAnimate: shouldAnimate && (direction == 'forward' || direction == 'back') }; }; @@ -2458,7 +1943,8 @@ IonicModule return { run: function(step) { provider.transitions.views.android(enteringEle, leavingEle, false, false).run(step); - } + }, + shouldAnimate: false }; }; @@ -2467,7 +1953,8 @@ IonicModule run: function(step) { provider.transitions.navBar.ios(enteringHeaderBar, leavingHeaderBar, false, false).run(step); provider.transitions.navBar.android(enteringHeaderBar, leavingHeaderBar, false, false).run(step); - } + }, + shouldAnimate: false }; }; @@ -2616,7 +2103,7 @@ var LOADING_SET_DEPRECATED = '$ionicLoading instance.setContent() has been depre */ IonicModule .constant('$ionicLoadingConfig', { - template: '' + template: '' }) .factory('$ionicLoading', [ '$ionicLoadingConfig', @@ -2633,8 +2120,9 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, var loaderInstance; //default values - var deregisterBackAction = angular.noop; - var deregisterStateListener = angular.noop; + var deregisterBackAction = noop; + var deregisterStateListener1 = noop; + var deregisterStateListener2 = noop; var loadingShowDelay = $q.when(); return { @@ -2673,10 +2161,8 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, template: LOADING_TPL, appendTo: $ionicBody.get() }) - .then(function(loader) { - var self = loader; - - loader.show = function(options) { + .then(function(self) { + self.show = function(options) { var templatePromise = options.templateUrl ? $ionicTemplateLoader.load(options.templateUrl) : //options.content: deprecated @@ -2684,19 +2170,19 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, self.scope = options.scope || self.scope; - if (!this.isShown) { + if (!self.isShown) { //options.showBackdrop: deprecated - this.hasBackdrop = !options.noBackdrop && options.showBackdrop !== false; - if (this.hasBackdrop) { + self.hasBackdrop = !options.noBackdrop && options.showBackdrop !== false; + if (self.hasBackdrop) { $ionicBackdrop.retain(); $ionicBackdrop.getElement().addClass('backdrop-loading'); } } if (options.duration) { - $timeout.cancel(this.durationTimeout); - this.durationTimeout = $timeout( - angular.bind(this, this.hide), + $timeout.cancel(self.durationTimeout); + self.durationTimeout = $timeout( + angular.bind(self, self.hide), +options.duration ); } @@ -2704,7 +2190,7 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, deregisterBackAction(); //Disable hardware back button while loading deregisterBackAction = $ionicPlatform.registerBackButtonAction( - angular.noop, + noop, PLATFORM_BACK_BUTTON_PRIORITY_LOADING ); @@ -2719,7 +2205,7 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, if (self.isShown) { self.element.addClass('visible'); ionic.requestAnimationFrame(function() { - if(self.isShown) { + if (self.isShown) { self.element.addClass('active'); $ionicBody.addClass('loading-active'); } @@ -2727,13 +2213,13 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, } }); - this.isShown = true; + self.isShown = true; }; - loader.hide = function() { + self.hide = function() { deregisterBackAction(); - if (this.isShown) { - if (this.hasBackdrop) { + if (self.isShown) { + if (self.hasBackdrop) { $ionicBackdrop.release(); $ionicBackdrop.getElement().removeClass('backdrop-loading'); } @@ -2743,11 +2229,11 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, !self.isShown && self.element.removeClass('visible'); }, 200); } - $timeout.cancel(this.durationTimeout); - this.isShown = false; + $timeout.cancel(self.durationTimeout); + self.isShown = false; }; - return loader; + return self; }); } return loaderInstance; @@ -2757,14 +2243,17 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, options = extend({}, $ionicLoadingConfig || {}, options || {}); var delay = options.delay || options.showDelay || 0; - //If loading.show() was called previously, cancel it and show with our new options - loadingShowDelay && $timeout.cancel(loadingShowDelay); - loadingShowDelay = $timeout(angular.noop, delay); + deregisterStateListener1(); + deregisterStateListener2(); + if (options.hideOnStateChange) { + deregisterStateListener1 = $rootScope.$on('$stateChangeSuccess', hideLoader); + deregisterStateListener2 = $rootScope.$on('$stateChangeError', hideLoader); + } + //If loading.show() was called previously, cancel it and show with our new options + $timeout.cancel(loadingShowDelay); + loadingShowDelay = $timeout(noop, delay); loadingShowDelay.then(getLoader).then(function(loader) { - if (options.hideOnStateChange) { - deregisterStateListener = $rootScope.$on('$stateChangeSuccess', hideLoader); - } return loader.show(options); }); @@ -2782,7 +2271,8 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, } function hideLoader() { - deregisterStateListener(); + deregisterStateListener1(); + deregisterStateListener2(); $timeout.cancel(loadingShowDelay); getLoader().then(function(loader) { loader.hide(); @@ -2942,12 +2432,10 @@ function($rootScope, $ionicBody, $compile, $timeout, $ionicPlatform, $ionicTempl self._isShown = true; self._deregisterBackButton = $ionicPlatform.registerBackButtonAction( - self.hardwareBackButtonClose ? angular.bind(self, self.hide) : angular.noop, + self.hardwareBackButtonClose ? angular.bind(self, self.hide) : noop, PLATFORM_BACK_BUTTON_PRIORITY_MODAL ); - self._isOpenPromise = $q.defer(); - ionic.views.Modal.prototype.show.call(self); $timeout(function() { @@ -3391,12 +2879,12 @@ IonicModule * var template = '

    My Popover Title

    Hello!
    '; * * $scope.popover = $ionicPopover.fromTemplate(template, { - * scope: $scope, + * scope: $scope * }); * * // .fromTemplateUrl() method * $ionicPopover.fromTemplateUrl('my-popover.html', { - * scope: $scope, + * scope: $scope * }).then(function(popover) { * $scope.popover = popover; * }); @@ -3439,7 +2927,7 @@ function($ionicModal, $ionicPosition, $document, $window) { }; function positionView(target, popoverEle) { - var targetEle = angular.element(target.target || target); + var targetEle = jqLite(target.target || target); var buttonOffset = $ionicPosition.offset(targetEle); var popoverWidth = popoverEle.prop('offsetWidth'); var popoverHeight = popoverEle.prop('offsetHeight'); @@ -3459,8 +2947,9 @@ function($ionicModal, $ionicPosition, $document, $window) { } // If the popover when popped down stretches past bottom of screen, - // make it pop up - if (buttonOffset.top + buttonOffset.height + popoverHeight > bodyHeight) { + // make it pop up if there's room above + if (buttonOffset.top + buttonOffset.height + popoverHeight > bodyHeight && + buttonOffset.top - popoverHeight > 0) { popoverCSS.top = buttonOffset.top - popoverHeight; popoverEle.addClass('popover-bottom'); } else { @@ -3883,7 +3372,7 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB subTitle: options.subTitle, cssClass: options.cssClass, $buttonTapped: function(button, event) { - var result = (button.onTap || angular.noop)(event); + var result = (button.onTap || noop)(event); event = event.originalEvent || event; //jquery events if (!event.defaultPrevented) { @@ -3906,7 +3395,7 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB }); }; self.hide = function(callback) { - callback = callback || angular.noop; + callback = callback || noop; if (!self.isShown) return callback(); self.isShown = false; @@ -3941,7 +3430,7 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB previousPopup.hide(); } - var resultPromise = $timeout(angular.noop, previousPopup ? config.stackPushDelay : 0) + var resultPromise = $timeout(noop, previousPopup ? config.stackPushDelay : 0) .then(function() { return popupPromise; }) .then(function(popup) { if (!previousPopup) { @@ -3982,7 +3471,7 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB $timeout(function() { $ionicBackdrop.release(); }, config.stackPushDelay || 0); - ($ionicPopup._backButtonActionDone || angular.noop)(); + ($ionicPopup._backButtonActionDone || noop)(); } return result; }); @@ -4120,7 +3609,7 @@ IonicModule var offsetParentBCR = { top: 0, left: 0 }; var offsetParentEl = parentOffsetEl(element[0]); if (offsetParentEl != $document[0]) { - offsetParentBCR = this.offset(angular.element(offsetParentEl)); + offsetParentBCR = this.offset(jqLite(offsetParentEl)); offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop; offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft; } @@ -4287,12 +3776,27 @@ IonicModule * @param {boolean=} shouldAnimate Whether the scroll should animate. */ 'anchorScroll', + /** + * @ngdoc method + * @name $ionicScrollDelegate#freezeScroll + * @description Does not allow this scroll view to scroll either x or y. + * @param {boolean=} shouldFreeze Should this scroll view be prevented from scrolling or not. + * @returns {object} If the scroll view is being prevented from scrolling or not. + */ + 'freezeScroll', + /** + * @ngdoc method + * @name $ionicScrollDelegate#freezeAllScrolls + * @description Does not allow any of the app's scroll views to scroll either x or y. + * @param {boolean=} shouldFreeze Should all app scrolls be prevented from scrolling or not. + */ + 'freezeAllScrolls', /** * @ngdoc method * @name $ionicScrollDelegate#getScrollView * @returns {object} The scrollView associated with this delegate. */ - 'getScrollView', + 'getScrollView' /** * @ngdoc method * @name $ionicScrollDelegate#$getByHandle @@ -4406,7 +3910,7 @@ IonicModule * - If false or 0 is given, the edge drag threshold is disabled, and dragging from anywhere on the content is allowed. * @returns {boolean} Whether the drag can start only from within the edge of screen threshold. */ - 'edgeDragThreshold', + 'edgeDragThreshold' /** * @ngdoc method * @name $ionicSideMenuDelegate#$getByHandle @@ -4433,7 +3937,7 @@ IonicModule * @usage * * ```html - * + * * * *
    @@ -4446,7 +3950,7 @@ IonicModule *
    *
    *
    - * + *
    * ``` * ```js * function MyCtrl($scope, $ionicSlideBoxDelegate) { @@ -4521,7 +4025,7 @@ IonicModule */ 'slidesCount', 'count', - 'loop', + 'loop' /** * @ngdoc method * @name $ionicSlideBoxDelegate#$getByHandle @@ -4860,10 +4364,11 @@ function($timeout, $document, $q, $ionicClickBlock, $ionicConfig, $ionicNavBarDe var isActiveTimer; var cachedAttr = ionic.DomUtil.cachedAttr; var transitionPromises = []; + var defaultTimeout = 1100; var ionicViewSwitcher = { - create: function(navViewCtrl, viewLocals, enteringView, leavingView) { + create: function(navViewCtrl, viewLocals, enteringView, leavingView, renderStart, renderEnd) { // get a reference to an entering/leaving element if they exist // loop through to see if the view is already in the navViewElement var enteringEle, leavingEle; @@ -4883,11 +4388,12 @@ function($timeout, $document, $q, $ionicClickBlock, $ionicConfig, $ionicNavBarDe }, loadViewElements: function(registerData) { - var viewEle, viewElements = navViewCtrl.getViewElements(); + var x, l, viewEle; + var viewElements = navViewCtrl.getViewElements(); var enteringEleIdentifier = getViewElementIdentifier(viewLocals, enteringView); var navViewActiveEleId = navViewCtrl.activeEleId(); - for (var x = 0, l = viewElements.length; x < l; x++) { + for (x = 0, l = viewElements.length; x < l; x++) { viewEle = viewElements.eq(x); if (viewEle.data(DATA_ELE_IDENTIFIER) === enteringEleIdentifier) { @@ -4901,7 +4407,7 @@ function($timeout, $document, $q, $ionicClickBlock, $ionicConfig, $ionicNavBarDe enteringEle = viewEle; } - } else if (viewEle.data(DATA_ELE_IDENTIFIER) === navViewActiveEleId) { + } else if (isDefined(navViewActiveEleId) && viewEle.data(DATA_ELE_IDENTIFIER) === navViewActiveEleId) { leavingEle = viewEle; } @@ -4919,15 +4425,14 @@ function($timeout, $document, $q, $ionicClickBlock, $ionicConfig, $ionicNavBarDe enteringEle.data(DATA_ELE_IDENTIFIER, enteringEleIdentifier); } - navViewCtrl.activeEleId(enteringEleIdentifier); + if (renderEnd) { + navViewCtrl.activeEleId(enteringEleIdentifier); + } registerData.ele = null; }, render: function(registerData, callback) { - // disconnect the leaving scope before reconnecting or creating a scope for the entering view - leavingEle && ionic.Utils.disconnectScope(leavingEle.scope()); - if (alreadyInDom) { // it was already found in the DOM, just reconnect the scope ionic.Utils.reconnectScope(enteringEle.scope()); @@ -4970,15 +4475,15 @@ function($timeout, $document, $q, $ionicClickBlock, $ionicConfig, $ionicNavBarDe callback && callback(); }, - transition: function(direction, enableBack) { - var deferred = $q.defer(); - transitionPromises.push(deferred.promise); - + transition: function(direction, enableBack, allowAnimate) { + var deferred; var enteringData = getTransitionData(viewLocals, enteringEle, direction, enteringView); var leavingData = extend(extend({}, enteringData), getViewData(leavingView)); enteringData.transitionId = leavingData.transitionId = transitionId; enteringData.fromCache = !!alreadyInDom; enteringData.enableBack = !!enableBack; + enteringData.renderStart = renderStart; + enteringData.renderEnd = renderEnd; cachedAttr(enteringEle.parent(), 'nav-view-transition', enteringData.transition); cachedAttr(enteringEle.parent(), 'nav-view-direction', enteringData.direction); @@ -4986,68 +4491,120 @@ function($timeout, $document, $q, $ionicClickBlock, $ionicConfig, $ionicNavBarDe // cancel any previous transition complete fallbacks $timeout.cancel(enteringEle.data(DATA_FALLBACK_TIMER)); - switcher.emit('before', enteringData, leavingData); - - // 1) get the transition ready and see if it'll animate + // get the transition ready and see if it'll animate var transitionFn = $ionicConfig.transitions.views[enteringData.transition] || $ionicConfig.transitions.views.none; - var viewTransition = transitionFn(enteringEle, leavingEle, enteringData.direction, enteringData.shouldAnimate); + var viewTransition = transitionFn(enteringEle, leavingEle, enteringData.direction, + enteringData.shouldAnimate && allowAnimate && renderEnd); if (viewTransition.shouldAnimate) { - // 2) attach transitionend events (and fallback timer) - enteringEle.on(TRANSITIONEND_EVENT, transitionComplete); - enteringEle.data(DATA_FALLBACK_TIMER, $timeout(transitionComplete, 1000)); - $ionicClickBlock.show(); + // attach transitionend events (and fallback timer) + enteringEle.on(TRANSITIONEND_EVENT, completeOnTransitionEnd); + enteringEle.data(DATA_FALLBACK_TIMER, $timeout(transitionComplete, defaultTimeout)); + $ionicClickBlock.show(defaultTimeout); + } + + if (renderStart) { + // notify the views "before" the transition starts + switcher.emit('before', enteringData, leavingData); + + // stage entering element, opacity 0, no transition duration + navViewAttr(enteringEle, VIEW_STATUS_STAGED); + + // render the elements in the correct location for their starting point + viewTransition.run(0); + } + + if (renderEnd) { + // create a promise so we can keep track of when all transitions finish + // only required if this transition should complete + deferred = $q.defer(); + transitionPromises.push(deferred.promise); } - // 3) stage entering element, opacity 0, no transition duration - navViewAttr(enteringEle, VIEW_STATUS_STAGED); + if (renderStart && renderEnd) { + // CSS "auto" transitioned, not manually transitioned + // wait a frame so the styles apply before auto transitioning + $timeout(onReflow, 16); + + } else if (!renderEnd) { + // just the start of a manual transition + // but it will not render the end of the transition + navViewAttr(enteringEle, 'entering'); + navViewAttr(leavingEle, 'leaving'); + + // return the transition run method so each step can be ran manually + return { + run: viewTransition.run, + cancel: function(shouldAnimate) { + if (shouldAnimate) { + enteringEle.on(TRANSITIONEND_EVENT, cancelOnTransitionEnd); + enteringEle.data(DATA_FALLBACK_TIMER, $timeout(cancelTransition, defaultTimeout)); + $ionicClickBlock.show(defaultTimeout); + } else { + cancelTransition(); + } + viewTransition.shouldAnimate = shouldAnimate; + viewTransition.run(0); + viewTransition = null; + } + }; - // 4) place the elements in the correct step to begin - viewTransition.run(0); + } else if (renderEnd) { + // just the end of a manual transition + // happens after the manual transition has completed + // and a full history change has happened + onReflow(); + } - // 5) wait a frame so the styles apply - $timeout(onReflow, 16); function onReflow() { - // 6) remove that we're staging the entering element so it can transition + // remove that we're staging the entering element so it can auto transition navViewAttr(enteringEle, viewTransition.shouldAnimate ? 'entering' : VIEW_STATUS_ACTIVE); navViewAttr(leavingEle, viewTransition.shouldAnimate ? 'leaving' : VIEW_STATUS_CACHED); - // 7) start the transition + // start the auto transition and let the CSS take over viewTransition.run(1); + // trigger auto transitions on the associated nav bars $ionicNavBarDelegate._instances.forEach(function(instance) { instance.triggerTransitionStart(transitionId); }); if (!viewTransition.shouldAnimate) { - // no animated transition + // no animated auto transition transitionComplete(); } } + // Make sure that transitionend events bubbling up from children won't fire + // transitionComplete. Will only go forward if ev.target == the element listening. + function completeOnTransitionEnd(ev) { + if (ev.target !== this) return; + transitionComplete(); + } function transitionComplete() { if (transitionComplete.x) return; transitionComplete.x = true; - enteringEle.off(TRANSITIONEND_EVENT, transitionComplete); + enteringEle.off(TRANSITIONEND_EVENT, completeOnTransitionEnd); $timeout.cancel(enteringEle.data(DATA_FALLBACK_TIMER)); leavingEle && $timeout.cancel(leavingEle.data(DATA_FALLBACK_TIMER)); - // 8) emit that the views have finished transitioning + // emit that the views have finished transitioning // each parent nav-view will update which views are active and cached switcher.emit('after', enteringData, leavingData); - // 9) resolve that this one transition (there could be many w/ nested views) - deferred.resolve(navViewCtrl); + // resolve that this one transition (there could be many w/ nested views) + deferred && deferred.resolve(navViewCtrl); - // 10) the most recent transition added has completed and all the active + // the most recent transition added has completed and all the active // transition promises should be added to the services array of promises if (transitionId === transitionCounter) { $q.all(transitionPromises).then(ionicViewSwitcher.transitionEnd); switcher.cleanup(enteringData); } + // tell the nav bars that the transition has ended $ionicNavBarDelegate._instances.forEach(function(instance) { instance.triggerTransitionEnd(); }); @@ -5056,6 +4613,20 @@ function($timeout, $document, $q, $ionicClickBlock, $ionicConfig, $ionicNavBarDe nextTransition = nextDirection = enteringView = leavingView = enteringEle = leavingEle = null; } + // Make sure that transitionend events bubbling up from children won't fire + // transitionComplete. Will only go forward if ev.target == the element listening. + function cancelOnTransitionEnd(ev) { + if (ev.target !== this) return; + cancelTransition(); + } + function cancelTransition() { + navViewAttr(enteringEle, VIEW_STATUS_CACHED); + navViewAttr(leavingEle, VIEW_STATUS_ACTIVE); + enteringEle.off(TRANSITIONEND_EVENT, cancelOnTransitionEnd); + $timeout.cancel(enteringEle.data(DATA_FALLBACK_TIMER)); + ionicViewSwitcher.transitionEnd([navViewCtrl]); + } + }, emit: function(step, enteringData, leavingData) { @@ -5075,6 +4646,12 @@ function($timeout, $document, $q, $ionicClickBlock, $ionicConfig, $ionicNavBarDe scope.$emit('$ionicView.leave', leavingData); } } + + } else if (scope && leavingData && leavingData.viewId) { + scope.$emit('$ionicNavView.' + step + 'Leave', leavingData); + if (step == 'after') { + scope.$emit('$ionicNavView.leave', leavingData); + } } }, @@ -5122,7 +4699,7 @@ function($timeout, $document, $q, $ionicClickBlock, $ionicConfig, $ionicNavBarDe }, transitionEnd: function(navViewCtrls) { - forEach(navViewCtrls, function(navViewCtrl){ + forEach(navViewCtrls, function(navViewCtrl) { navViewCtrl.transitionEnd(); }); @@ -5273,7 +4850,7 @@ function($provide) { //found nearest to body's scrollTop is set to scroll to an element //with that ID. $location.hash = function(value) { - if (angular.isDefined(value)) { + if (isDefined(value)) { $timeout(function() { var scroll = document.querySelector('.scroll-content'); if (scroll) @@ -5413,13 +4990,14 @@ function($scope, $element, $attrs, $q, $ionicConfig, $ionicHistory) { }; - self.resetBackButton = function() { + self.resetBackButton = function(viewData) { if ($ionicConfig.backButton.previousTitleText()) { var previousTitleEle = getEle(PREVIOUS_TITLE); if (previousTitleEle) { previousTitleEle.classList.remove(HIDE); - var newPreviousTitleText = $ionicHistory.backTitle(); + var view = (viewData && $ionicHistory.getViewById(viewData.viewId)); + var newPreviousTitleText = $ionicHistory.backTitle(view); if (newPreviousTitleText !== previousTitleText) { previousTitleText = previousTitleEle.innerHTML = newPreviousTitleText; @@ -5641,9 +5219,129 @@ function($scope, $element, $attrs, $q, $ionicConfig, $ionicHistory) { }]); +IonicModule +.controller('$ionInfiniteScroll', [ + '$scope', + '$attrs', + '$element', + '$timeout', + function($scope, $attrs, $element, $timeout) { + var self = this; + self.isLoading = false; -/** - * @ngdoc service + $scope.icon = function() { + return isDefined($attrs.icon) ? $attrs.icon : 'ion-load-d'; + }; + + $scope.spinner = function() { + return isDefined($attrs.spinner) ? $attrs.spinner : ''; + }; + + $scope.$on('scroll.infiniteScrollComplete', function() { + finishInfiniteScroll(); + }); + + $scope.$on('$destroy', function() { + if (self.scrollCtrl && self.scrollCtrl.$element) self.scrollCtrl.$element.off('scroll', self.checkBounds); + if (self.scrollEl && self.scrollEl.removeEventListener) { + self.scrollEl.removeEventListener('scroll', self.checkBounds); + } + }); + + // debounce checking infinite scroll events + self.checkBounds = ionic.Utils.throttle(checkInfiniteBounds, 300); + + function onInfinite() { + ionic.requestAnimationFrame(function() { + $element[0].classList.add('active'); + }); + self.isLoading = true; + $scope.$parent && $scope.$parent.$apply($attrs.onInfinite || ''); + } + + function finishInfiniteScroll() { + ionic.requestAnimationFrame(function() { + $element[0].classList.remove('active'); + }); + $timeout(function() { + if (self.jsScrolling) self.scrollView.resize(); + self.checkBounds(); + }, 30, false); + self.isLoading = false; + } + + // check if we've scrolled far enough to trigger an infinite scroll + function checkInfiniteBounds() { + if (self.isLoading) return; + var maxScroll = {}; + + if (self.jsScrolling) { + maxScroll = self.getJSMaxScroll(); + var scrollValues = self.scrollView.getValues(); + if ((maxScroll.left !== -1 && scrollValues.left >= maxScroll.left) || + (maxScroll.top !== -1 && scrollValues.top >= maxScroll.top)) { + onInfinite(); + } + } else { + maxScroll = self.getNativeMaxScroll(); + if (( + maxScroll.left !== -1 && + self.scrollEl.scrollLeft >= maxScroll.left - self.scrollEl.clientWidth + ) || ( + maxScroll.top !== -1 && + self.scrollEl.scrollTop >= maxScroll.top - self.scrollEl.clientHeight + )) { + onInfinite(); + } + } + } + + // determine the threshold at which we should fire an infinite scroll + // note: this gets processed every scroll event, can it be cached? + self.getJSMaxScroll = function() { + var maxValues = self.scrollView.getScrollMax(); + return { + left: self.scrollView.options.scrollingX ? + calculateMaxValue(maxValues.left) : + -1, + top: self.scrollView.options.scrollingY ? + calculateMaxValue(maxValues.top) : + -1 + }; + }; + + self.getNativeMaxScroll = function() { + var maxValues = { + left: self.scrollEl.scrollWidth, + top: self.scrollEl.scrollHeight + }; + var computedStyle = window.getComputedStyle(self.scrollEl) || {}; + return { + left: computedStyle.overflowX === 'scroll' || + computedStyle.overflowX === 'auto' || + self.scrollEl.style['overflow-x'] === 'scroll' ? + calculateMaxValue(maxValues.left) : -1, + top: computedStyle.overflowY === 'scroll' || + computedStyle.overflowY === 'auto' || + self.scrollEl.style['overflow-y'] === 'scroll' ? + calculateMaxValue(maxValues.top) : -1 + }; + }; + + // determine pixel refresh distance based on % or value + function calculateMaxValue(maximum) { + distance = ($attrs.distance || '2.5%').trim(); + isPercent = distance.indexOf('%') !== -1; + return isPercent ? + maximum * (1 - parseFloat(distance) / 100) : + maximum - parseFloat(distance); + } + +}]); + + +/** + * @ngdoc service * @name $ionicListDelegate * @module ionic * @@ -5811,7 +5509,7 @@ function($scope, $element, $attrs, $compile, $timeout, $ionicNavBarDelegate, $io ionic.DomUtil.cachedAttr(containerEle, 'nav-bar', isActive ? 'active' : 'cached'); var alignTitle = $attrs.alignTitle || $ionicConfig.navBar.alignTitle(); - var headerBarEle = jqLite('').addClass($attrs.class).attr('align-title', alignTitle); + var headerBarEle = jqLite('').addClass($attrs['class']).attr('align-title', alignTitle); if (isDefined($attrs.noTapScroll)) headerBarEle.attr('no-tap-scroll', $attrs.noTapScroll); var titleEle = jqLite('
    '); var navEle = {}; @@ -6002,6 +5700,7 @@ function($scope, $element, $attrs, $compile, $timeout, $ionicNavBarDelegate, $io self.transition(enteringHeaderBar, leavingHeaderBar, viewData); self.isInitialized = true; + navSwipeAttr(''); }; @@ -6017,17 +5716,39 @@ function($scope, $element, $attrs, $compile, $timeout, $ionicNavBarDelegate, $io ionic.DomUtil.cachedAttr($element, 'nav-bar-transition', viewData.navBarTransition); ionic.DomUtil.cachedAttr($element, 'nav-bar-direction', viewData.direction); - if (navBarTransition.shouldAnimate) { + if (navBarTransition.shouldAnimate && viewData.renderEnd) { navBarAttr(enteringHeaderBar, 'stage'); } else { navBarAttr(enteringHeaderBar, 'entering'); navBarAttr(leavingHeaderBar, 'leaving'); } - enteringHeaderBarCtrl.resetBackButton(); + enteringHeaderBarCtrl.resetBackButton(viewData); navBarTransition.run(0); + self.activeTransition = { + run: function(step) { + navBarTransition.shouldAnimate = false; + navBarTransition.direction = 'back'; + navBarTransition.run(step); + }, + cancel: function(shouldAnimate, speed) { + navSwipeAttr(speed); + navBarAttr(leavingHeaderBar, 'active'); + navBarAttr(enteringHeaderBar, 'cached'); + navBarTransition.shouldAnimate = shouldAnimate; + navBarTransition.run(0); + self.activeTransition = navBarTransition = null; + }, + complete: function(shouldAnimate, speed) { + navSwipeAttr(speed); + navBarTransition.shouldAnimate = shouldAnimate; + navBarTransition.run(1); + queuedTransitionEnd = transitionEnd; + } + }; + $timeout(enteringHeaderBarCtrl.align, 16); queuedTransitionStart = function() { @@ -6040,23 +5761,26 @@ function($scope, $element, $attrs, $compile, $timeout, $ionicNavBarDelegate, $io queuedTransitionEnd = function() { if (latestTransitionId == transitionId || !navBarTransition.shouldAnimate) { - for (var x = 0; x < headerBars.length; x++) { - headerBars[x].isActive = false; - } - enteringHeaderBar.isActive = true; - - navBarAttr(enteringHeaderBar, 'active'); - navBarAttr(leavingHeaderBar, 'cached'); - - queuedTransitionEnd = null; + transitionEnd(); } }; queuedTransitionStart = null; }; - queuedTransitionStart(); + function transitionEnd() { + for (var x = 0; x < headerBars.length; x++) { + headerBars[x].isActive = false; + } + enteringHeaderBar.isActive = true; + + navBarAttr(enteringHeaderBar, 'active'); + navBarAttr(leavingHeaderBar, 'cached'); + + self.activeTransition = navBarTransition = queuedTransitionEnd = null; + } + queuedTransitionStart(); }; @@ -6170,7 +5894,7 @@ function($scope, $element, $attrs, $compile, $timeout, $ionicNavBarDelegate, $io }; function deprecatedWarning(oldMethod, newMethod) { var warn = console.warn || console.log; - warn && warn('navBarController.' + oldMethod + ' is deprecated, please use ' + newMethod + ' instead'); + warn && warn.call(console, 'navBarController.' + oldMethod + ' is deprecated, please use ' + newMethod + ' instead'); } // END DEPRECATED ------- @@ -6200,6 +5924,10 @@ function($scope, $element, $attrs, $compile, $timeout, $ionicNavBarDelegate, $io ctrl && ionic.DomUtil.cachedAttr(ctrl.containerEle(), 'nav-bar', val); } + function navSwipeAttr(val) { + ionic.DomUtil.cachedAttr($element, 'nav-swipe', val); + } + $scope.$on('$destroy', function() { $scope.$parent.$hasHeader = false; @@ -6225,7 +5953,9 @@ IonicModule '$ionicNavViewDelegate', '$ionicHistory', '$ionicViewSwitcher', -function($scope, $element, $attrs, $compile, $controller, $ionicNavBarDelegate, $ionicNavViewDelegate, $ionicHistory, $ionicViewSwitcher) { + '$ionicConfig', + '$ionicScrollDelegate', +function($scope, $element, $attrs, $compile, $controller, $ionicNavBarDelegate, $ionicNavViewDelegate, $ionicHistory, $ionicViewSwitcher, $ionicConfig, $ionicScrollDelegate) { var DATA_ELE_IDENTIFIER = '$eleId'; var DATA_DESTROY_ELE = '$destroyEle'; @@ -6239,8 +5969,11 @@ function($scope, $element, $attrs, $compile, $controller, $ionicNavBarDelegate, var navBarDelegate; var activeEleId; var navViewAttr = $ionicViewSwitcher.navViewAttr; + var disableRenderStartViewId, disableAnimation; + var transitionDuration, transitionTiming; self.scope = $scope; + self.element = $element; self.init = function() { var navViewName = $attrs.name || ''; @@ -6256,10 +5989,23 @@ function($scope, $element, $attrs, $compile, $controller, $ionicNavBarDelegate, $element.data('$uiView', viewData); var deregisterInstance = $ionicNavViewDelegate._registerInstance(self, $attrs.delegateHandle); - $scope.$on('$destroy', deregisterInstance); + $scope.$on('$destroy', function() { + deregisterInstance(); + + // ensure no scrolls have been left frozen + if (self.isSwipeFreeze) { + $ionicScrollDelegate.freezeAllScrolls(false); + } + }); $scope.$on('$ionicHistory.deselect', self.cacheCleanup); + ionic.Platform.ready(function() { + if (ionic.Platform.isWebView() && $ionicConfig.views.swipeBackEnabled()) { + self.initSwipeBack(); + } + }); + return viewData; }; @@ -6274,7 +6020,10 @@ function($scope, $element, $attrs, $compile, $controller, $ionicNavBarDelegate, self.update(registerData); // begin rendering and transitioning - self.render(registerData, viewLocals, leavingView); + var enteringView = $ionicHistory.getViewById(registerData.viewId) || {}; + + var renderStart = (disableRenderStartViewId !== registerData.viewId); + self.render(registerData, viewLocals, enteringView, leavingView, renderStart, true); }; @@ -6310,19 +6059,22 @@ function($scope, $element, $attrs, $compile, $controller, $ionicNavBarDelegate, }; - self.render = function(registerData, viewLocals, leavingView) { - var enteringView = $ionicHistory.getViewById(registerData.viewId) || {}; - + self.render = function(registerData, viewLocals, enteringView, leavingView, renderStart, renderEnd) { // register the view and figure out where it lives in the various // histories and nav stacks, along with how views should enter/leave - var switcher = $ionicViewSwitcher.create(self, viewLocals, enteringView, leavingView); + var switcher = $ionicViewSwitcher.create(self, viewLocals, enteringView, leavingView, renderStart, renderEnd); // init the rendering of views for this navView directive switcher.init(registerData, function() { // the view is now compiled, in the dom and linked, now lets transition the views. // this uses a callback incase THIS nav-view has a nested nav-view, and after the NESTED // nav-view links, the NESTED nav-view would update which direction THIS nav-view should use - switcher.transition(self.direction(), registerData.enableBack); + + // kick off the transition of views + switcher.transition(self.direction(), registerData.enableBack, !disableAnimation); + + // reset private vars for next time + disableRenderStartViewId = disableAnimation = null; }); }; @@ -6334,6 +6086,7 @@ function($scope, $element, $attrs, $compile, $controller, $ionicNavBarDelegate, navBarDelegate = transitionData.navBarDelegate; var associatedNavBarCtrl = getAssociatedNavBarCtrl(); associatedNavBarCtrl && associatedNavBarCtrl.update(transitionData); + navSwipeAttr(''); } }; @@ -6362,12 +6115,23 @@ function($scope, $element, $attrs, $compile, $controller, $ionicNavBarDelegate, if (viewElement.data(DATA_DESTROY_ELE) || viewElement.data(DATA_NO_CACHE)) { // this element shouldn't stay cached $ionicViewSwitcher.destroyViewEle(viewElement); + } else { // keep in the DOM, mark as cached navViewAttr(viewElement, VIEW_STATUS_CACHED); + + // disconnect the leaving scope + ionic.Utils.disconnectScope(viewElement.scope()); } } } + + navSwipeAttr(''); + + // ensure no scrolls have been left frozen + if (self.isSwipeFreeze) { + $ionicScrollDelegate.freezeAllScrolls(false); + } }; @@ -6477,6 +6241,135 @@ function($scope, $element, $attrs, $compile, $controller, $ionicNavBarDelegate, }; + self.initSwipeBack = function() { + var swipeBackHitWidth = $ionicConfig.views.swipeBackHitWidth(); + var viewTransition, associatedNavBarCtrl, backView; + var deregDragStart, deregDrag, deregRelease; + var windowWidth, startDragX, dragPoints; + + function onDragStart(ev) { + if (!isPrimary) return; + + startDragX = getDragX(ev); + if (startDragX > swipeBackHitWidth) return; + + backView = $ionicHistory.backView(); + + if (!backView || backView.historyId !== $ionicHistory.currentView().historyId) return; + + if (!windowWidth) windowWidth = window.innerWidth; + + self.isSwipeFreeze = $ionicScrollDelegate.freezeAllScrolls(true); + + var registerData = { + direction: 'back' + }; + + dragPoints = []; + + var switcher = $ionicViewSwitcher.create(self, registerData, backView, $ionicHistory.currentView(), true, false); + switcher.loadViewElements(registerData); + switcher.render(registerData); + + viewTransition = switcher.transition('back', $ionicHistory.enabledBack(backView), true); + + associatedNavBarCtrl = getAssociatedNavBarCtrl(); + + deregDrag = ionic.onGesture('drag', onDrag, $element[0]); + deregRelease = ionic.onGesture('release', onRelease, $element[0]); + } + + function onDrag(ev) { + if (isPrimary && viewTransition) { + var dragX = getDragX(ev); + + dragPoints.push({ + t: Date.now(), + x: dragX + }); + + if (dragX >= windowWidth - 15) { + onRelease(ev); + + } else { + var step = Math.min(Math.max(getSwipeCompletion(dragX), 0), 1); + viewTransition.run(step); + associatedNavBarCtrl && associatedNavBarCtrl.activeTransition && associatedNavBarCtrl.activeTransition.run(step); + } + + } + } + + function onRelease(ev) { + if (isPrimary && viewTransition && dragPoints && dragPoints.length > 1) { + + var now = Date.now(); + var releaseX = getDragX(ev); + var startDrag = dragPoints[dragPoints.length - 1]; + + for (var x = dragPoints.length - 2; x >= 0; x--) { + if (now - startDrag.t > 200) { + break; + } + startDrag = dragPoints[x]; + } + + var isSwipingRight = (releaseX >= dragPoints[dragPoints.length - 2].x); + var releaseSwipeCompletion = getSwipeCompletion(releaseX); + var velocity = Math.abs(startDrag.x - releaseX) / (now - startDrag.t); + + // private variables because ui-router has no way to pass custom data using $state.go + disableRenderStartViewId = backView.viewId; + disableAnimation = (releaseSwipeCompletion < 0.03 || releaseSwipeCompletion > 0.97); + + if (isSwipingRight && (releaseSwipeCompletion > 0.5 || velocity > 0.1)) { + var speed = (velocity > 0.5 || velocity < 0.05 || releaseX > windowWidth - 45) ? 'fast' : 'slow'; + navSwipeAttr(disableAnimation ? '' : speed); + backView.go(); + associatedNavBarCtrl && associatedNavBarCtrl.activeTransition && associatedNavBarCtrl.activeTransition.complete(!disableAnimation, speed); + + } else { + navSwipeAttr(disableAnimation ? '' : 'fast'); + disableRenderStartViewId = null; + viewTransition.cancel(!disableAnimation); + associatedNavBarCtrl && associatedNavBarCtrl.activeTransition && associatedNavBarCtrl.activeTransition.cancel(!disableAnimation, 'fast'); + disableAnimation = null; + } + + } + + ionic.offGesture(deregDrag, 'drag', onDrag); + ionic.offGesture(deregRelease, 'release', onRelease); + + windowWidth = viewTransition = dragPoints = null; + + self.isSwipeFreeze = $ionicScrollDelegate.freezeAllScrolls(false); + } + + function getDragX(ev) { + return ionic.tap.pointerCoord(ev.gesture.srcEvent).x; + } + + function getSwipeCompletion(dragX) { + return (dragX - startDragX) / windowWidth; + } + + deregDragStart = ionic.onGesture('dragstart', onDragStart, $element[0]); + + $scope.$on('$destroy', function() { + ionic.offGesture(deregDragStart, 'dragstart', onDragStart); + ionic.offGesture(deregDrag, 'drag', onDrag); + ionic.offGesture(deregRelease, 'release', onRelease); + self.element = viewTransition = associatedNavBarCtrl = null; + }); + }; + + + function navSwipeAttr(val) { + ionic.DomUtil.cachedAttr($element, 'nav-swipe', val); + } + + function getAssociatedNavBarCtrl() { if (navBarDelegate) { for (var x=0; x < $ionicNavBarDelegate._instances.length; x++) { @@ -6490,6 +6383,322 @@ function($scope, $element, $attrs, $compile, $controller, $ionicNavBarDelegate, }]); +IonicModule +.controller('$ionicRefresher', [ + '$scope', + '$attrs', + '$element', + '$ionicBind', + '$timeout', + function($scope, $attrs, $element, $ionicBind, $timeout) { + var self = this, + isDragging = false, + isOverscrolling = false, + dragOffset = 0, + lastOverscroll = 0, + ptrThreshold = 60, + activated = false, + scrollTime = 500, + startY = null, + deltaY = null, + canOverscroll = true, + scrollParent, + scrollChild; + + if (!isDefined($attrs.pullingIcon)) { + $attrs.$set('pullingIcon', 'ion-android-arrow-down'); + } + + $scope.showSpinner = !isDefined($attrs.refreshingIcon) && $attrs.spinner != 'none'; + + $scope.showIcon = isDefined($attrs.refreshingIcon); + + $ionicBind($scope, $attrs, { + pullingIcon: '@', + pullingText: '@', + refreshingIcon: '@', + refreshingText: '@', + spinner: '@', + disablePullingRotation: '@', + $onRefresh: '&onRefresh', + $onPulling: '&onPulling' + }); + + function handleTouchend() { + // if this wasn't an overscroll, get out immediately + if (!canOverscroll && !isDragging) { + return; + } + // reset Y + startY = null; + // the user has overscrolled but went back to native scrolling + if (!isDragging) { + dragOffset = 0; + isOverscrolling = false; + setScrollLock(false); + return true; + } + isDragging = false; + dragOffset = 0; + + // the user has scroll far enough to trigger a refresh + if (lastOverscroll > ptrThreshold) { + start(); + scrollTo(ptrThreshold, scrollTime); + + // the user has overscrolled but not far enough to trigger a refresh + } else { + scrollTo(0, scrollTime, deactivate); + isOverscrolling = false; + } + return true; + } + + function handleTouchmove(e) { + // if multitouch or regular scroll event, get out immediately + if (!canOverscroll || e.touches.length > 1) { + return; + } + //if this is a new drag, keep track of where we start + if (startY === null) { + startY = parseInt(e.touches[0].screenY, 10); + } + + // how far have we dragged so far? + deltaY = parseInt(e.touches[0].screenY, 10) - startY; + + // if we've dragged up and back down in to native scroll territory + if (deltaY - dragOffset <= 0 || scrollParent.scrollTop !== 0) { + + if (isOverscrolling) { + isOverscrolling = false; + setScrollLock(false); + } + + if (isDragging) { + nativescroll(scrollParent,parseInt(deltaY - dragOffset, 10) * -1); + } + + // if we're not at overscroll 0 yet, 0 out + if (lastOverscroll !== 0) { + overscroll(0); + } + + return true; + + } else if (deltaY > 0 && scrollParent.scrollTop === 0 && !isOverscrolling) { + // starting overscroll, but drag started below scrollTop 0, so we need to offset the position + dragOffset = deltaY; + } + + // prevent native scroll events while overscrolling + e.preventDefault(); + + // if not overscrolling yet, initiate overscrolling + if (!isOverscrolling) { + isOverscrolling = true; + setScrollLock(true); + } + + isDragging = true; + // overscroll according to the user's drag so far + overscroll(parseInt((deltaY - dragOffset) / 3, 10)); + + // update the icon accordingly + if (!activated && lastOverscroll > ptrThreshold) { + activated = true; + ionic.requestAnimationFrame(activate); + + } else if (activated && lastOverscroll < ptrThreshold) { + activated = false; + ionic.requestAnimationFrame(deactivate); + } + } + + function handleScroll(e) { + // canOverscrol is used to greatly simplify the drag handler during normal scrolling + canOverscroll = (e.target.scrollTop === 0) || isDragging; + } + + function overscroll(val) { + scrollChild.style[ionic.CSS.TRANSFORM] = 'translateY(' + val + 'px)'; + lastOverscroll = val; + } + + function nativescroll(target, newScrollTop) { + // creates a scroll event that bubbles, can be cancelled, and with its view + // and detail property initialized to window and 1, respectively + target.scrollTop = newScrollTop; + var e = document.createEvent("UIEvents"); + e.initUIEvent("scroll", true, true, window, 1); + target.dispatchEvent(e); + } + + function setScrollLock(enabled) { + // set the scrollbar to be position:fixed in preparation to overscroll + // or remove it so the app can be natively scrolled + if (enabled) { + ionic.requestAnimationFrame(function() { + scrollChild.classList.add('overscroll'); + show(); + }); + + } else { + ionic.requestAnimationFrame(function() { + scrollChild.classList.remove('overscroll'); + hide(); + deactivate(); + }); + } + } + + $scope.$on('scroll.refreshComplete', function() { + // prevent the complete from firing before the scroll has started + $timeout(function() { + + ionic.requestAnimationFrame(tail); + + // scroll back to home during tail animation + scrollTo(0, scrollTime, deactivate); + + // return to native scrolling after tail animation has time to finish + $timeout(function() { + + if (isOverscrolling) { + isOverscrolling = false; + setScrollLock(false); + } + + }, scrollTime); + + }, scrollTime); + }); + + function scrollTo(Y, duration, callback) { + // scroll animation loop w/ easing + // credit https://gist.github.com/dezinezync/5487119 + var start = Date.now(), + from = lastOverscroll; + + if (from === Y) { + callback(); + return; /* Prevent scrolling to the Y point if already there */ + } + + // decelerating to zero velocity + function easeOutCubic(t) { + return (--t) * t * t + 1; + } + + // scroll loop + function scroll() { + var currentTime = Date.now(), + time = Math.min(1, ((currentTime - start) / duration)), + // where .5 would be 50% of time on a linear scale easedT gives a + // fraction based on the easing method + easedT = easeOutCubic(time); + + overscroll(parseInt((easedT * (Y - from)) + from, 10)); + + if (time < 1) { + ionic.requestAnimationFrame(scroll); + + } else { + + if (Y < 5 && Y > -5) { + isOverscrolling = false; + setScrollLock(false); + } + + callback && callback(); + } + } + + // start scroll loop + ionic.requestAnimationFrame(scroll); + } + + + self.init = function() { + scrollParent = $element.parent().parent()[0]; + scrollChild = $element.parent()[0]; + + if (!scrollParent.classList.contains('ionic-scroll') || + !scrollChild.classList.contains('scroll')) { + throw new Error('Refresher must be immediate child of ion-content or ion-scroll'); + } + + ionic.on('touchmove', handleTouchmove, scrollChild); + ionic.on('touchend', handleTouchend, scrollChild); + ionic.on('scroll', handleScroll, scrollParent); + + // cleanup when done + $scope.$on('$destroy', destroy); + }; + + function destroy() { + ionic.off('touchmove', handleTouchmove, scrollChild); + ionic.off('touchend', handleTouchend, scrollChild); + ionic.off('scroll', handleScroll, scrollParent); + scrollParent = null; + scrollChild = null; + } + + // DOM manipulation and broadcast methods shared by JS and Native Scrolling + // getter used by JS Scrolling + self.getRefresherDomMethods = function() { + return { + activate: activate, + deactivate: deactivate, + start: start, + show: show, + hide: hide, + tail: tail + }; + }; + + function activate() { + $element[0].classList.add('active'); + $scope.$onPulling(); + } + + function deactivate() { + // give tail 150ms to finish + $timeout(function() { + // deactivateCallback + $element.removeClass('active refreshing refreshing-tail'); + if (activated) activated = false; + }, 150); + } + + function start() { + // startCallback + $element[0].classList.add('refreshing'); + $scope.$onRefresh(); + } + + function show() { + // showCallback + $element[0].classList.remove('invisible'); + } + + function hide() { + // showCallback + $element[0].classList.add('invisible'); + } + + function tail() { + // tailCallback + $element[0].classList.add('refreshing-tail'); + } + + // for testing + self.__handleTouchmove = handleTouchmove; + self.__getScrollChild = function() { return scrollChild; }; + self.__getScrollParent= function() { return scrollParent; }; + } +]); + /** * @private */ @@ -6504,7 +6713,14 @@ IonicModule '$document', '$ionicScrollDelegate', '$ionicHistory', -function($scope, scrollViewOptions, $timeout, $window, $location, $document, $ionicScrollDelegate, $ionicHistory) { +function($scope, + scrollViewOptions, + $timeout, + $window, + $location, + $document, + $ionicScrollDelegate, + $ionicHistory) { var self = this; // for testing @@ -6528,7 +6744,7 @@ function($scope, scrollViewOptions, $timeout, $window, $location, $document, $io } ); - if (!angular.isDefined(scrollViewOptions.bouncing)) { + if (!isDefined(scrollViewOptions.bouncing)) { ionic.Platform.ready(function() { if (scrollView.options) { scrollView.options.bouncing = true; @@ -6559,31 +6775,24 @@ function($scope, scrollViewOptions, $timeout, $window, $location, $document, $io $scope.$on('$destroy', function() { deregisterInstance(); - scrollView.__cleanup(); + scrollView && scrollView.__cleanup && scrollView.__cleanup(); ionic.off('resize', resize, $window); $window.removeEventListener('resize', resize); - scrollViewOptions = null; - self._scrollViewOptions.el = null; - self._scrollViewOptions = null; $element.off('scroll', scrollFunc); - $element = null; - self.$element = null; - element = null; - self.element = null; - self.scrollView = null; - scrollView = null; + scrollView = self.scrollView = scrollViewOptions = self._scrollViewOptions = scrollViewOptions.el = self._scrollViewOptions.el = $element = self.$element = element = null; }); $timeout(function() { scrollView && scrollView.run && scrollView.run(); + $element.triggerHandler('scroll.init'); }); self.getScrollView = function() { - return self.scrollView; + return scrollView; }; self.getScrollPosition = function() { - return self.scrollView.getValues(); + return scrollView.getValues(); }; self.resize = function() { @@ -6593,14 +6802,12 @@ function($scope, scrollViewOptions, $timeout, $window, $location, $document, $io }; self.scrollTop = function(shouldAnimate) { - ionic.DomUtil.blurAll(); self.resize().then(function() { scrollView.scrollTo(0, 0, !!shouldAnimate); }); }; self.scrollBottom = function(shouldAnimate) { - ionic.DomUtil.blurAll(); self.resize().then(function() { var max = scrollView.getScrollMax(); scrollView.scrollTo(max.left, max.top, !!shouldAnimate); @@ -6608,35 +6815,30 @@ function($scope, scrollViewOptions, $timeout, $window, $location, $document, $io }; self.scrollTo = function(left, top, shouldAnimate) { - ionic.DomUtil.blurAll(); self.resize().then(function() { scrollView.scrollTo(left, top, !!shouldAnimate); }); }; self.zoomTo = function(zoom, shouldAnimate, originLeft, originTop) { - ionic.DomUtil.blurAll(); self.resize().then(function() { scrollView.zoomTo(zoom, !!shouldAnimate, originLeft, originTop); }); }; self.zoomBy = function(zoom, shouldAnimate, originLeft, originTop) { - ionic.DomUtil.blurAll(); self.resize().then(function() { scrollView.zoomBy(zoom, !!shouldAnimate, originLeft, originTop); }); }; self.scrollBy = function(left, top, shouldAnimate) { - ionic.DomUtil.blurAll(); self.resize().then(function() { scrollView.scrollBy(left, top, !!shouldAnimate); }); }; self.anchorScroll = function(shouldAnimate) { - ionic.DomUtil.blurAll(); self.resize().then(function() { var hash = $location.hash(); var elm = hash && $document[0].getElementById(hash); @@ -6656,36 +6858,27 @@ function($scope, scrollViewOptions, $timeout, $window, $location, $document, $io }); }; + self.freezeScroll = scrollView.freeze; - /** + self.freezeAllScrolls = function(shouldFreeze) { + for (var i = 0; i < $ionicScrollDelegate._instances.length; i++) { + $ionicScrollDelegate._instances[i].freezeScroll(shouldFreeze); + } + }; + + + /** * @private */ - self._setRefresher = function(refresherScope, refresherElement) { - var refresher = self.refresher = refresherElement; + self._setRefresher = function(refresherScope, refresherElement, refresherMethods) { + self.refresher = refresherElement; var refresherHeight = self.refresher.clientHeight || 60; - scrollView.activatePullToRefresh(refresherHeight, function() { - // activateCallback - refresher.classList.add('active'); - refresherScope.$onPulling(); - }, function() { - refresher.classList.remove('active'); - refresher.classList.remove('refreshing'); - refresher.classList.remove('refreshing-tail'); - }, function() { - // startCallback - refresher.classList.add('refreshing'); - refresherScope.$onRefresh(); - }, function() { - // showCallback - refresher.classList.remove('invisible'); - }, function() { - // hideCallback - refresher.classList.add('invisible'); - }, function() { - // tailCallback - refresher.classList.add('refreshing-tail'); - }); + scrollView.activatePullToRefresh( + refresherHeight, + refresherMethods + ); }; + }]); IonicModule @@ -6696,7 +6889,8 @@ IonicModule '$ionicPlatform', '$ionicBody', '$ionicHistory', -function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform, $ionicBody, $ionicHistory) { + '$ionicScrollDelegate', +function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform, $ionicBody, $ionicHistory, $ionicScrollDelegate) { var self = this; var rightShowing, leftShowing, isDragging; var startX, lastX, offsetX, isAsideExposed; @@ -6838,8 +7032,20 @@ function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform, $ionicBody, $io // add the CSS class "menu-open" if the percentage does not // equal 0, otherwise remove the class from the body element $ionicBody.enableClass((percentage !== 0), 'menu-open'); + + freezeAllScrolls(false); }; + function freezeAllScrolls(shouldFreeze) { + if (shouldFreeze && !self.isScrollFreeze) { + $ionicScrollDelegate.freezeAllScrolls(shouldFreeze); + + } else if (!shouldFreeze && self.isScrollFreeze) { + $ionicScrollDelegate.freezeAllScrolls(false); + } + self.isScrollFreeze = shouldFreeze; + } + /** * Open the menu the given pixel amount. * @param {float} amount the pixel amount to open the menu. Positive value for left menu, @@ -6969,6 +7175,10 @@ function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform, $ionicBody, $io self.exposeAside = function(shouldExposeAside) { if (!(self.left && self.left.isEnabled) && !(self.right && self.right.isEnabled)) return; self.close(); + //Trigger a resize if it changed + if (isAsideExposed !== shouldExposeAside) { + ionic.trigger('resize', null, window); + } isAsideExposed = shouldExposeAside; if (self.left && self.left.isEnabled) { // set the left marget width if it should be exposed @@ -6987,6 +7197,8 @@ function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform, $ionicBody, $io // End a drag with the given event self._endDrag = function(e) { + freezeAllScrolls(false); + if (isAsideExposed) return; if (isDragging) { @@ -6999,7 +7211,7 @@ function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform, $ionicBody, $io // Handle a drag event self._handleDrag = function(e) { - if (isAsideExposed) return; + if (isAsideExposed || !$scope.dragContent) return; // If we don't have start coords, grab and store them if (!startX) { @@ -7024,6 +7236,7 @@ function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform, $ionicBody, $io if (isDragging) { self.openAmount(offsetX + (lastX - startX)); + freezeAllScrolls(true); } }; @@ -7038,7 +7251,7 @@ function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform, $ionicBody, $io self.edgeThresholdEnabled = false; self.edgeDragThreshold = function(value) { if (arguments.length) { - if (angular.isNumber(value) && value > 0) { + if (isNumber(value) && value > 0) { self.edgeThreshold = value; self.edgeThresholdEnabled = true; } else { @@ -7076,7 +7289,7 @@ function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform, $ionicBody, $io $scope.sideMenuContentTranslateX = 0; - var deregisterBackButtonAction = angular.noop; + var deregisterBackButtonAction = noop; var closeSideMenu = angular.bind(self, self.close); $scope.$watch(function() { @@ -7105,6 +7318,9 @@ function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform, $ionicBody, $io self.content.element = null; self.content = null; } + + // ensure scrolls are unfrozen + freezeAllScrolls(false); }); self.initialize({ @@ -7118,6 +7334,434 @@ function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform, $ionicBody, $io }]); +(function(ionic) { + + var TRANSLATE32 = 'translate(32,32)'; + var STROKE_OPACITY = 'stroke-opacity'; + var ROUND = 'round'; + var INDEFINITE = 'indefinite'; + var DURATION = '750ms'; + var NONE = 'none'; + var SHORTCUTS = { + a: 'animate', + an: 'attributeName', + at: 'animateTransform', + c: 'circle', + da: 'stroke-dasharray', + os: 'stroke-dashoffset', + f: 'fill', + lc: 'stroke-linecap', + rc: 'repeatCount', + sw: 'stroke-width', + t: 'transform', + v: 'values' + }; + + var SPIN_ANIMATION = { + v: '0,32,32;360,32,32', + an: 'transform', + type: 'rotate', + rc: INDEFINITE, + dur: DURATION + }; + + function createSvgElement(tagName, data, parent, spinnerName) { + var ele = document.createElement(SHORTCUTS[tagName] || tagName); + var k, x, y; + + for (k in data) { + + if (angular.isArray(data[k])) { + for (x = 0; x < data[k].length; x++) { + if (data[k][x].fn) { + for (y = 0; y < data[k][x].t; y++) { + createSvgElement(k, data[k][x].fn(y, spinnerName), ele, spinnerName); + } + } else { + createSvgElement(k, data[k][x], ele, spinnerName); + } + } + + } else { + setSvgAttribute(ele, k, data[k]); + } + } + + parent.appendChild(ele); + } + + function setSvgAttribute(ele, k, v) { + ele.setAttribute(SHORTCUTS[k] || k, v); + } + + function animationValues(strValues, i) { + var values = strValues.split(';'); + var back = values.slice(i); + var front = values.slice(0, values.length - back.length); + values = back.concat(front).reverse(); + return values.join(';') + ';' + values[0]; + } + + var IOS_SPINNER = { + sw: 4, + lc: ROUND, + line: [{ + fn: function(i, spinnerName) { + return { + y1: spinnerName == 'ios' ? 17 : 12, + y2: spinnerName == 'ios' ? 29 : 20, + t: TRANSLATE32 + ' rotate(' + (30 * i + (i < 6 ? 180 : -180)) + ')', + a: [{ + fn: function() { + return { + an: STROKE_OPACITY, + dur: DURATION, + v: animationValues('0;.1;.15;.25;.35;.45;.55;.65;.7;.85;1', i), + rc: INDEFINITE + }; + }, + t: 1 + }] + }; + }, + t: 12 + }] + }; + + var spinners = { + + android: { + c: [{ + sw: 6, + da: 128, + os: 82, + r: 26, + cx: 32, + cy: 32, + f: NONE + }] + }, + + ios: IOS_SPINNER, + + 'ios-small': IOS_SPINNER, + + bubbles: { + sw: 0, + c: [{ + fn: function(i) { + return { + cx: 24 * Math.cos(2 * Math.PI * i / 8), + cy: 24 * Math.sin(2 * Math.PI * i / 8), + t: TRANSLATE32, + a: [{ + fn: function() { + return { + an: 'r', + dur: DURATION, + v: animationValues('1;2;3;4;5;6;7;8', i), + rc: INDEFINITE + }; + }, + t: 1 + }] + }; + }, + t: 8 + }] + }, + + circles: { + + c: [{ + fn: function(i) { + return { + r: 5, + cx: 24 * Math.cos(2 * Math.PI * i / 8), + cy: 24 * Math.sin(2 * Math.PI * i / 8), + t: TRANSLATE32, + sw: 0, + a: [{ + fn: function() { + return { + an: 'fill-opacity', + dur: DURATION, + v: animationValues('.3;.3;.3;.4;.7;.85;.9;1', i), + rc: INDEFINITE + }; + }, + t: 1 + }] + }; + }, + t: 8 + }] + }, + + crescent: { + c: [{ + sw: 4, + da: 128, + os: 82, + r: 26, + cx: 32, + cy: 32, + f: NONE, + at: [SPIN_ANIMATION] + }] + }, + + dots: { + + c: [{ + fn: function(i) { + return { + cx: 16 + (16 * i), + cy: 32, + sw: 0, + a: [{ + fn: function() { + return { + an: 'fill-opacity', + dur: DURATION, + v: animationValues('.5;.6;.8;1;.8;.6;.5', i), + rc: INDEFINITE + }; + }, + t: 1 + }, { + fn: function() { + return { + an: 'r', + dur: DURATION, + v: animationValues('4;5;6;5;4;3;3', i), + rc: INDEFINITE + }; + }, + t: 1 + }] + }; + }, + t: 3 + }] + }, + + lines: { + sw: 7, + lc: ROUND, + line: [{ + fn: function(i) { + return { + x1: 10 + (i * 14), + x2: 10 + (i * 14), + a: [{ + fn: function() { + return { + an: 'y1', + dur: DURATION, + v: animationValues('16;18;28;18;16', i), + rc: INDEFINITE + }; + }, + t: 1 + },{ + fn: function() { + return { + an: 'y2', + dur: DURATION, + v: animationValues('48;44;36;46;48', i), + rc: INDEFINITE + }; + }, + t: 1 + },{ + fn: function() { + return { + an: STROKE_OPACITY, + dur: DURATION, + v: animationValues('1;.8;.5;.4;1', i), + rc: INDEFINITE + }; + }, + t: 1 + }] + }; + }, + t: 4 + }] + }, + + ripple: { + f: NONE, + 'fill-rule': 'evenodd', + sw: 3, + circle: [{ + fn: function(i) { + return { + cx: 32, + cy: 32, + a: [{ + fn: function() { + return { + an: 'r', + begin: (i * -1) + 's', + dur: '2s', + v: '0;24', + keyTimes: '0;1', + keySplines: '0.1,0.2,0.3,1', + calcMode: 'spline', + rc: INDEFINITE + }; + }, + t: 1 + },{ + fn: function() { + return { + an: STROKE_OPACITY, + begin: (i * -1) + 's', + dur: '2s', + v: '.2;1;.2;0', + rc: INDEFINITE + }; + }, + t: 1 + }] + }; + }, + t: 2 + }] + }, + + spiral: { + defs: [{ + linearGradient: [{ + id: 'sGD', + gradientUnits: 'userSpaceOnUse', + x1: 55, y1: 46, x2: 2, y2: 46, + stop: [{ + offset: 0.1, + class: 'stop1' + }, { + offset: 1, + class: 'stop2' + }] + }] + }], + g: [{ + sw: 4, + lc: ROUND, + f: NONE, + path: [{ + stroke: 'url(#sGD)', + d: 'M4,32 c0,15,12,28,28,28c8,0,16-4,21-9' + }, { + d: 'M60,32 C60,16,47.464,4,32,4S4,16,4,32' + }], + at: [SPIN_ANIMATION] + }] + } + + }; + + var animations = { + + android: function(ele) { + var rIndex = 0; + var rotateCircle = 0; + var startTime; + var svgEle = ele.querySelector('g'); + var circleEle = ele.querySelector('circle'); + + function run() { + var v = easeInOutCubic(Date.now() - startTime, 650); + var scaleX = 1; + var translateX = 0; + var dasharray = (188 - (58 * v)); + var dashoffset = (182 - (182 * v)); + + if (rIndex % 2) { + scaleX = -1; + translateX = -64; + dasharray = (128 - (-58 * v)); + dashoffset = (182 * v); + } + + var rotateLine = [0, -101, -90, -11, -180, 79, -270, -191][rIndex]; + + setSvgAttribute(circleEle, 'da', Math.max(Math.min(dasharray, 188), 128)); + setSvgAttribute(circleEle, 'os', Math.max(Math.min(dashoffset, 182), 0)); + setSvgAttribute(circleEle, 't', 'scale(' + scaleX + ',1) translate(' + translateX + ',0) rotate(' + rotateLine + ',32,32)'); + + rotateCircle += 4.1; + if (rotateCircle > 359) rotateCircle = 0; + setSvgAttribute(svgEle, 't', 'rotate(' + rotateCircle + ',32,32)'); + + if (v >= 1) { + rIndex++; + if (rIndex > 7) rIndex = 0; + startTime = Date.now(); + } + + ionic.requestAnimationFrame(run); + } + + return function() { + startTime = Date.now(); + run(); + }; + + } + + }; + + function easeInOutCubic(t, c) { + t /= c / 2; + if (t < 1) return 1 / 2 * t * t * t; + t -= 2; + return 1 / 2 * (t * t * t + 2); + } + + + IonicModule + .controller('$ionicSpinner', [ + '$element', + '$attrs', + function($element, $attrs) { + var spinnerName, spinner; + + this.init = function() { + spinnerName = $attrs.icon || ionic.Platform.platform(); + spinner = spinners[spinnerName]; + if (!spinner) { + spinnerName = 'ios'; + spinner = spinners.ios; + } + + var container = document.createElement('div'); + createSvgElement('svg', { + viewBox: '0 0 64 64', + g: [spinners[spinnerName]] + }, container, spinnerName); + + // Specifically for animations to work, + // Android 4.3 and below requires the element to be + // added as an html string, rather than dynmically + // building up the svg element and appending it. + $element.html(container.innerHTML); + + this.start(); + + return spinnerName; + }; + + this.start = function() { + animations[spinnerName] && animations[spinnerName]($element[0])(); + }; + + }]); + +})(ionic); + IonicModule .controller('$ionicTab', [ '$scope', @@ -7193,14 +7837,14 @@ function($scope, $element, $ionicHistory) { if (tab.$tabSelected) { selectedTab = selectedTabIndex = null; tab.$tabSelected = false; - (tab.onDeselect || angular.noop)(); + (tab.onDeselect || noop)(); tab.$broadcast && tab.$broadcast('$ionicHistory.deselect'); } }; self.select = function(tab, shouldEmitEvent) { var tabIndex; - if (angular.isNumber(tab)) { + if (isNumber(tab)) { tabIndex = tab; if (tabIndex >= self.tabs.length) return; tab = self.tabs[tabIndex]; @@ -7231,7 +7875,7 @@ function($scope, $element, $ionicHistory) { //Use a funny name like $tabSelected so the developer doesn't overwrite the var in a child scope tab.$tabSelected = true; - (tab.onSelect || angular.noop)(); + (tab.onSelect || noop)(); if (shouldEmitEvent) { $scope.$emit('$ionicHistory.change', { @@ -7312,20 +7956,14 @@ function($scope, $element, $attrs, $compile, $rootScope, $ionicViewSwitcher) { navBarItems[n] = generateNavBarItem(navElementHtml[n]); } - navViewCtrl.beforeEnter({ + navViewCtrl.beforeEnter(extend(transData, { title: viewTitle, - direction: transData.direction, - transition: transData.transition, - navBarTransition: transData.navBarTransition, - transitionId: transData.transitionId, - shouldAnimate: transData.shouldAnimate, - enableBack: transData.enableBack, showBack: !attrTrue('hideBackButton'), navBarItems: navBarItems, navBarDelegate: navBarDelegateHandle || null, showNavBar: !attrTrue('hideNavBar'), hasHeaderBar: !!hasViewHeaderBar - }); + })); // make sure any existing observers are cleaned up deregisterFns(); @@ -7402,16 +8040,17 @@ IonicModule restrict: 'E', scope: true, replace: true, - link: function($scope, $element){ + link: function($scope, $element) { + var keyUp = function(e) { - if(e.which == 27) { + if (e.which == 27) { $scope.cancel(); $scope.$apply(); } }; var backdropClick = function(e) { - if(e.target == $element[0]) { + if (e.target == $element[0]) { $scope.cancel(); $scope.$apply(); } @@ -7426,15 +8065,13 @@ IonicModule }, template: '
    ' + '
    ' + - '
    ' + - '
    ' + + '
    ' + + '
    ' + '
    ' + - '' + + '' + + '' + '
    ' + - '
    ' + - '' + - '
    ' + - '
    ' + + '
    ' + '' + '
    ' + '
    ' + @@ -7498,313 +8135,934 @@ IonicModule }; }]); + /** * @ngdoc directive - * @module ionic - * @name collectionRepeat * @restrict A - * @codepen mFygh + * @name collectionRepeat + * @module ionic + * @codepen 7ec1ec58f2489ab8f359fa1a0fe89c15 * @description - * `collection-repeat` is a directive that allows you to render lists with - * thousands of items in them, and experience little to no performance penalty. - * - * Demo: + * `collection-repeat` allows an app to show huge lists of items much more performantly than + * `ng-repeat`. * - * The directive renders onto the screen only the items that should be currently visible. - * So if you have 1,000 items in your list but only ten fit on your screen, - * collection-repeat will only render into the DOM the ten that are in the current - * scroll position. + * It renders into the DOM only as many items as are currently visible. * - * Here are a few things to keep in mind while using collection-repeat: + * This means that on a phone screen that can fit eight items, only the eight items matching + * the current scroll position will be rendered. * - * 1. The data supplied to collection-repeat must be an array. - * 2. You must explicitly tell the directive what size your items will be in the DOM, using directive attributes. - * Pixel amounts or percentages are allowed (see below). - * 3. The elements rendered will be absolutely positioned: be sure to let your CSS work with - * this (see below). - * 4. Each collection-repeat list will take up all of its parent scrollView's space. - * If you wish to have multiple lists on one page, put each list within its own - * {@link ionic.directive:ionScroll ionScroll} container. - * 5. You should not use the ng-show and ng-hide directives on your ion-content/ion-scroll elements that - * have a collection-repeat inside. ng-show and ng-hide apply the `display: none` css rule to the content's - * style, causing the scrollView to read the width and height of the content as 0. Resultingly, - * collection-repeat will render elements that have just been un-hidden incorrectly. + * **The Basics**: * + * - The data given to collection-repeat must be an array. + * - If the `item-height` and `item-width` attributes are not supplied, it will be assumed that + * every item in the list has the same dimensions as the first item. + * - Don't use angular one-time binding (`::`) with collection-repeat. The scope of each item is + * assigned new data and re-digested as you scroll. Bindings need to update, and one-time bindings + * won't. * - * @usage - * - * #### Basic Usage (single rows of items) + * **Performance Tips**: * - * Notice two things here: we use ng-style to set the height of the item to match - * what the repeater thinks our item height is. Additionally, we add a css rule - * to make our item stretch to fit the full screen (since it will be absolutely - * positioned). + * - The iOS webview has a performance bottleneck when switching out `` attributes. + * To increase performance of images on iOS, cache your images in advance and, + * if possible, lower the number of unique images. We're working on [a solution](https://github.com/driftyco/ionic/issues/3194). * + * @usage + * #### Basic Item List ([codepen](http://codepen.io/ionic/pen/0c2c35a34a8b18ad4d793fef0b081693)) * ```html - * - *
    - *
    - * {% raw %}{{item}}{% endraw %} - *
    - *
    + * + * + * {% raw %}{{item}}{% endraw %} + * * * ``` - * ```js - * function ContentCtrl($scope) { - * $scope.items = []; - * for (var i = 0; i < 1000; i++) { - * $scope.items.push('Item ' + i); - * } * - * $scope.getItemHeight = function(item, index) { - * //Make evenly indexed items be 10px taller, for the sake of example - * return (index % 2) === 0 ? 50 : 60; - * }; - * } - * ``` - * ```css - * .my-item { - * left: 0; - * right: 0; - * } + * #### Grid of Images ([codepen](http://codepen.io/ionic/pen/5515d4efd9d66f780e96787387f41664)) + * ```html + * + * + * * ``` * - * #### Grid Usage (three items per row) - * + * #### Horizontal Scroller, Dynamic Item Width ([codepen](http://codepen.io/ionic/pen/67cc56b349124a349acb57a0740e030e)) * ```html * - *
    - * - *
    + *

    Available Kittens:

    + * + *
    + * + *
    + *
    *
    * ``` - * Percentage of total visible list dimensions. This example shows a 3 by 3 matrix that fits on the screen (3 rows and 3 colums). Note that dimensions are used in the creation of the element and therefore a measurement of the item cannnot be used as an input dimension. - * ```css - * .my-image-item img { - * height: 33%; - * width: 33%; - * } - * ``` - * - * @param {expression} collection-repeat The expression indicating how to enumerate a collection. These - * formats are currently supported: - * - * * `variable in expression` – where variable is the user defined loop variable and `expression` - * is a scope expression giving the collection to enumerate. - * - * For example: `album in artist.albums`. - * - * * `variable in expression track by tracking_expression` – You can also provide an optional tracking function - * which can be used to associate the objects in the collection with the DOM elements. If no tracking function - * is specified the collection-repeat associates elements by identity in the collection. It is an error to have - * more than one tracking function to resolve to the same key. (This would mean that two distinct objects are - * mapped to the same DOM element, which is not possible.) Filters should be applied to the expression, - * before specifying a tracking expression. - * - * For example: `item in items` is equivalent to `item in items track by $id(item)'. This implies that the DOM elements - * will be associated by item identity in the array. - * - * For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique - * `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements - * with the corresponding item in the array by identity. Moving the same object in array would move the DOM - * element in the same way in the DOM. - * - * For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this - * case the object identity does not matter. Two objects are considered equivalent as long as their `id` - * property is same. - * - * For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter - * to items in conjunction with a tracking expression. - * - * @param {expression} collection-item-width The width of the repeated element. Can be a number (in pixels) or a percentage. - * @param {expression} collection-item-height The height of the repeated element. Can be a number (in pixels), or a percentage. * + * @param {expression} collection-repeat The expression indicating how to enumerate a collection, + * of the format `variable in expression` – where variable is the user defined loop variable + * and `expression` is a scope expression giving the collection to enumerate. + * For example: `album in artist.albums` or `album in artist.albums | orderBy:'name'`. + * @param {expression=} item-width The width of the repeated element. The expression must return + * a number (pixels) or a percentage. Defaults to the width of the first item in the list. + * (previously named collection-item-width) + * @param {expression=} item-height The height of the repeated element. The expression must return + * a number (pixels) or a percentage. Defaults to the height of the first item in the list. + * (previously named collection-item-height) + * @param {number=} item-render-buffer The number of items to load before and after the visible + * items in the list. Default 3. Tip: set this higher if you have lots of images to preload, but + * don't set it too high or you'll see performance loss. + * @param {boolean=} force-refresh-images Force images to refresh as you scroll. This fixes a problem + * where, when an element is interchanged as scrolling, its image will still have the old src + * while the new src loads. Setting this to true comes with a small performance loss. */ -var COLLECTION_REPEAT_SCROLLVIEW_XY_ERROR = "Cannot create a collection-repeat within a scrollView that is scrollable on both x and y axis. Choose either x direction or y direction."; -var COLLECTION_REPEAT_ATTR_HEIGHT_ERROR = "collection-repeat expected attribute collection-item-height to be a an expression that returns a number (in pixels) or percentage."; -var COLLECTION_REPEAT_ATTR_WIDTH_ERROR = "collection-repeat expected attribute collection-item-width to be a an expression that returns a number (in pixels) or percentage."; -var COLLECTION_REPEAT_ATTR_REPEAT_ERROR = "collection-repeat expected expression in form of '_item_ in _collection_[ track by _id_]' but got '%'"; -IonicModule -.directive('collectionRepeat', [ - '$collectionRepeatManager', - '$collectionDataSource', - '$parse', -function($collectionRepeatManager, $collectionDataSource, $parse) { - return { - priority: 1000, - transclude: 'element', - terminal: true, - $$tlb: true, - require: ['^$ionicScroll', '^?ionNavView'], - controller: [function(){}], - link: function($scope, $element, $attr, ctrls, $transclude) { - var scrollCtrl = ctrls[0]; - var navViewCtrl = ctrls[1]; - var wrap = jqLite('
    '); - $element.parent()[0].insertBefore(wrap[0], $element[0]); - wrap.append($element); +IonicModule +.directive('collectionRepeat', CollectionRepeatDirective) +.factory('$ionicCollectionManager', RepeatManagerFactory); + +var ONE_PX_TRANSPARENT_IMG_SRC = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'; +var WIDTH_HEIGHT_REGEX = /height:.*?px;\s*width:.*?px/; +var DEFAULT_RENDER_BUFFER = 3; + +CollectionRepeatDirective.$inject = ['$ionicCollectionManager', '$parse', '$window', '$$rAF']; +function CollectionRepeatDirective($ionicCollectionManager, $parse, $window, $$rAF) { + return { + restrict: 'A', + priority: 1000, + transclude: 'element', + $$tlb: true, + require: '^$ionicScroll', + link: postLink + }; + + function postLink(scope, element, attr, scrollCtrl, transclude) { + var scrollView = scrollCtrl.scrollView; + var node = element[0]; + var containerNode = angular.element('
    ')[0]; + node.parentNode.replaceChild(containerNode, node); + + if (scrollView.options.scrollingX && scrollView.options.scrollingY) { + throw new Error("collection-repeat expected a parent x or y scrollView, not " + + "an xy scrollView."); + } + + var repeatExpr = attr.collectionRepeat; + var match = repeatExpr.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/); + if (!match) { + throw new Error("collection-repeat expected expression in form of '_item_ in " + + "_collection_[ track by _id_]' but got '" + attr.collectionRepeat + "'."); + } + var keyExpr = match[1]; + var listExpr = match[2]; + var heightData = {}; + var widthData = {}; + var computedStyleDimensions = {}; + var repeatManager; + + // attr.collectionBufferSize is deprecated + var renderBufferExpr = attr.itemRenderBuffer || attr.collectionBufferSize; + var renderBuffer = angular.isDefined(renderBufferExpr) ? + parseInt(renderBufferExpr) : + DEFAULT_RENDER_BUFFER; + + // attr.collectionItemHeight is deprecated + var heightExpr = attr.itemHeight || attr.collectionItemHeight; + // attr.collectionItemWidth is deprecated + var widthExpr = attr.itemWidth || attr.collectionItemWidth; + + //Height and width have four 'modes': + //1) Computed Mode + // - Nothing is supplied, so we getComputedStyle() on one element in the list and use + // that width and height value for the width and height of every item. This is re-computed + // every resize. + //2) Constant Mode, Static Integer + // - The user provides a constant number for width or height, in pixels. We parse it, + // store it on the `value` field, and it never changes + //3) Constant Mode, Percent + // - The user provides a percent string for width or height. The getter for percent is + // stored on the `getValue()` field, and is re-evaluated once every resize. The result + // is stored on the `value` field. + //4) Dynamic Mode + // - The user provides a dynamic expression for the width or height. This is re-evaluated + // for every item, stored on the `.getValue()` field. + if (!heightExpr && !widthExpr) { + heightData.computed = widthData.computed = true; + } else { + if (heightExpr) { + parseDimensionAttr(heightExpr, heightData); + } else { + heightData.computed = true; + } + if (!widthExpr) widthExpr = '"100%"'; + parseDimensionAttr(widthExpr, widthData); + } + + var afterItemsContainer = angular.element( + scrollView.__content.querySelector('.collection-repeat-after-container') + ); + if (!afterItemsContainer.length) { + var elementIsAfterRepeater = false; + var afterNodes = [].filter.call(scrollView.__content.childNodes, function(node) { + if (node.contains(containerNode)) { + elementIsAfterRepeater = true; + return false; + } + return elementIsAfterRepeater; + }); + afterItemsContainer = angular.element(''); + if (scrollView.options.scrollingX) { + afterItemsContainer.addClass('horizontal'); + } + afterItemsContainer.append(afterNodes); + scrollView.__content.appendChild(afterItemsContainer[0]); + } + + $$rAF(refreshDimensions); + scrollCtrl.$element.one('scroll.init', refreshDimensions); + + var onWindowResize = ionic.animationFrameThrottle(validateResize); + angular.element($window).on('resize', onWindowResize); + + scope.$on('$destroy', function() { + angular.element($window).off('resize', onWindowResize); + scrollCtrl.$element && scrollCtrl.$element.off('scroll.init', refreshDimensions); + + computedStyleNode && computedStyleNode.parentNode && + computedStyleNode.parentNode.removeChild(computedStyleNode); + computedStyleScope && computedStyleScope.$destroy(); + computedStyleScope = computedStyleNode = null; + + repeatManager && repeatManager.destroy(); + repeatManager = null; + }); + + // Make sure this resize actually changed the size of the screen + function validateResize() { + var h = scrollView.__clientHeight, w = scrollView.__clientWidth; + if (w && h && (validateResize.height !== h || validateResize.width !== w)) { + validateResize.height = h; + validateResize.width = w; + refreshDimensions(); + } + } + function refreshDimensions() { + if (heightData.computed || widthData.computed) { + computeStyleDimensions(); + } + + if (heightData.computed) { + heightData.value = computedStyleDimensions.height; + if (!heightData.value) { + throw new Error('collection-repeat tried to compute the height of repeated elements "' + + repeatExpr + '", but was unable to. Please provide the "item-height" attribute. ' + + 'http://ionicframework.com/docs/api/directive/collectionRepeat/'); + } + } else if (!heightData.dynamic && heightData.getValue) { + // If it's a constant with a getter (eg percent), we just refresh .value after resize + heightData.value = heightData.getValue(); + } + if (widthData.computed) { + widthData.value = computedStyleDimensions.width; + if (!widthData.value) { + throw new Error('collection-repeat tried to compute the width of repeated elements "' + + repeatExpr + '", but was unable to. Please provide the "item-width" attribute. ' + + 'http://ionicframework.com/docs/api/directive/collectionRepeat/'); + } + } else if (!widthData.dynamic && widthData.getValue) { + // If it's a constant with a getter (eg percent), we just refresh .value after resize + widthData.value = widthData.getValue(); + } + // Dynamic dimensions aren't updated on resize. Since they're already dynamic anyway, + // .getValue() will be used. + + if (!repeatManager) { + repeatManager = new $ionicCollectionManager({ + afterItemsNode: afterItemsContainer[0], + containerNode: containerNode, + heightData: heightData, + widthData: widthData, + forceRefreshImages: !!(isDefined(attr.forceRefreshImages) && attr.forceRefreshImages !== 'false'), + keyExpression: keyExpr, + listExpression: listExpr, + renderBuffer: renderBuffer, + scope: scope, + scrollView: scrollCtrl.scrollView, + transclude: transclude, + }); + } + repeatManager.refreshLayout(); + } + + function parseDimensionAttr(attrValue, dimensionData) { + if (!attrValue) return; + + var parsedValue; + // Try to just parse the plain attr value + try { + parsedValue = $parse(attrValue); + } catch(e) { + // If the parse fails and the value has `px` or `%` in it, surround the attr in + // quotes, to attempt to let the user provide a simple `attr="100%"` or `attr="100px"` + if (attrValue.trim().match(/\d+(px|%)$/)) { + attrValue = '"' + attrValue + '"'; + } + parsedValue = $parse(attrValue); + } + + var withoutQuotes = attrValue.replace(/(\'|\"|px|%)/g, '').trim(); + var isConstant = withoutQuotes.length && !/([a-zA-Z]|\$|:|\?)/.test(withoutQuotes); + dimensionData.attrValue = attrValue; + + // If it's a constant, it's either a percent or just a constant pixel number. + if (isConstant) { + var intValue = parseInt(parsedValue()); + + // For percents, store the percent getter on .getValue() + if (attrValue.indexOf('%') > -1) { + var decimalValue = intValue / 100; + dimensionData.getValue = dimensionData === heightData ? + function() { return Math.floor(decimalValue * scrollView.__clientHeight); } : + function() { return Math.floor(decimalValue * scrollView.__clientWidth); }; + } else { + // For static constants, just store the static constant. + dimensionData.value = intValue; + } + + } else { + dimensionData.dynamic = true; + dimensionData.getValue = dimensionData === heightData ? + function heightGetter(scope, locals) { + var result = parsedValue(scope, locals); + if (result.charAt && result.charAt(result.length - 1) === '%') + return Math.floor(parseInt(result) / 100 * scrollView.__clientHeight); + return parseInt(result); + } : + function widthGetter(scope, locals) { + var result = parsedValue(scope, locals); + if (result.charAt && result.charAt(result.length - 1) === '%') + return Math.floor(parseInt(result) / 100 * scrollView.__clientWidth); + return parseInt(result); + }; + } + } + + var computedStyleNode; + var computedStyleScope; + function computeStyleDimensions() { + if (!computedStyleNode) { + transclude(computedStyleScope = scope.$new(), function(clone) { + clone[0].removeAttribute('collection-repeat'); // remove absolute position styling + computedStyleNode = clone[0]; + }); + } + computedStyleScope[keyExpr] = ($parse(listExpr)(scope) || [])[0]; + containerNode.appendChild(computedStyleNode); + + var style = $window.getComputedStyle(computedStyleNode); + computedStyleDimensions.width = parseInt(style.width); + computedStyleDimensions.height = parseInt(style.height); + + containerNode.removeChild(computedStyleNode); + } + + } + +} + +RepeatManagerFactory.$inject = ['$rootScope', '$window', '$$rAF']; +function RepeatManagerFactory($rootScope, $window, $$rAF) { + var EMPTY_DIMENSION = { primaryPos: 0, secondaryPos: 0, primarySize: 0, secondarySize: 0 }; + + return function RepeatController(options) { + var afterItemsNode = options.afterItemsNode; + var containerNode = options.containerNode; + var forceRefreshImages = options.forceRefreshImages; + var heightData = options.heightData; + var widthData = options.widthData; + var keyExpression = options.keyExpression; + var listExpression = options.listExpression; + var renderBuffer = options.renderBuffer; + var scope = options.scope; + var scrollView = options.scrollView; + var transclude = options.transclude; + + var data = []; + + var getterLocals = {}; + var heightFn = heightData.getValue || function() { return heightData.value; }; + var heightGetter = function(index, value) { + getterLocals[keyExpression] = value; + getterLocals.$index = index; + return heightFn(scope, getterLocals); + }; + + var widthFn = widthData.getValue || function() { return widthData.value; }; + var widthGetter = function(index, value) { + getterLocals[keyExpression] = value; + getterLocals.$index = index; + return widthFn(scope, getterLocals); + }; + + var isVertical = !!scrollView.options.scrollingY; + + // We say it's a grid view if we're either dynamic or not 100% width + var isGridView = isVertical ? + (widthData.dynamic || widthData.value !== scrollView.__clientWidth) : + (heightData.dynamic || heightData.value !== scrollView.__clientHeight); + + var isStaticView = !heightData.dynamic && !widthData.dynamic; + + var PRIMARY = 'PRIMARY'; + var SECONDARY = 'SECONDARY'; + var TRANSLATE_TEMPLATE_STR = isVertical ? + 'translate3d(SECONDARYpx,PRIMARYpx,0)' : + 'translate3d(PRIMARYpx,SECONDARYpx,0)'; + var WIDTH_HEIGHT_TEMPLATE_STR = isVertical ? + 'height: PRIMARYpx; width: SECONDARYpx;' : + 'height: SECONDARYpx; width: PRIMARYpx;'; + + var estimatedHeight; + var estimatedWidth; + + var repeaterBeforeSize = 0; + var repeaterAfterSize = 0; + + var renderStartIndex = -1; + var renderEndIndex = -1; + var renderAfterBoundary = -1; + var renderBeforeBoundary = -1; + + var itemsPool = []; + var itemsLeaving = []; + var itemsEntering = []; + var itemsShownMap = {}; + var nextItemId = 0; + var estimatedItemsAcross; + + // view is a mix of list/grid methods + static/dynamic methods. + // See bottom for implementations. Available methods: + // + // getEstimatedPrimaryPos(i), getEstimatedSecondaryPos(i), getEstimatedIndex(scrollTop), + // calculateDimensions(toIndex), getDimensions(index), + // updateRenderRange(scrollTop, scrollValueEnd), onRefreshLayout(), onRefreshData() + var view = isVertical ? new VerticalViewType() : new HorizontalViewType(); + (isGridView ? GridViewType : ListViewType).call(view); + (isStaticView ? StaticViewType : DynamicViewType).call(view); + + var contentSizeStr = isVertical ? 'getContentHeight' : 'getContentWidth'; + var originalGetContentSize = scrollView.options[contentSizeStr]; + scrollView.options[contentSizeStr] = angular.bind(view, view.getContentSize); + + scrollView.__$callback = scrollView.__callback; + scrollView.__callback = function(transformLeft, transformTop, zoom, wasResize) { + var scrollValue = view.getScrollValue(); + if (renderStartIndex === -1 || + scrollValue + view.scrollPrimarySize > renderAfterBoundary || + scrollValue < renderBeforeBoundary) { + render(); + } + scrollView.__$callback(transformLeft, transformTop, zoom, wasResize); + }; + + var isLayoutReady = false; + var isDataReady = false; + this.refreshLayout = function(itemsAfterRepeater) { + estimatedHeight = heightGetter(0, data[0]); + estimatedWidth = widthGetter(0, data[0]); + + // Get the size of every element AFTER the repeater. We have to get the margin before and + // after the first/last element to fix a browser bug with getComputedStyle() not counting + // the first/last child's margins into height. + var style = getComputedStyle(afterItemsNode) || {}; + var firstStyle = afterItemsNode.firstElementChild && getComputedStyle(afterItemsNode.firstElementChild) || {}; + var lastStyle = afterItemsNode.lastElementChild && getComputedStyle(afterItemsNode.lastElementChild) || {}; + repeaterAfterSize = (parseInt(style[isVertical ? 'height' : 'width']) || 0) + + (firstStyle && parseInt(firstStyle[isVertical ? 'marginTop' : 'marginLeft']) || 0) + + (lastStyle && parseInt(lastStyle[isVertical ? 'marginBottom' : 'marginRight']) || 0); + + // Get the offsetTop of the repeater. + repeaterBeforeSize = 0; + var current = containerNode; + do { + repeaterBeforeSize += current[isVertical ? 'offsetTop' : 'offsetLeft']; + } while ( scrollView.__content.contains(current = current.offsetParent) ); + + (view.onRefreshLayout || angular.noop)(); + view.refreshDirection(); + + // Create the pool of items for reuse, setting the size to (estimatedItemsOnScreen) * 2, + // plus the size of the renderBuffer. + if (!isLayoutReady) { + var poolSize = Math.max(20, renderBuffer * 3); + for (var i = 0; i < poolSize; i++) { + itemsPool.push(new RepeatItem()); + } + } + + isLayoutReady = true; + if (isLayoutReady && isDataReady) { + forceRerender(); + } + }; + + + + this.refreshData = function(newData) { + newData || (newData = []); + + if (!angular.isArray(newData)) { + throw new Error("collection-repeat expected an array for '" + listExpression + "', " + + "but got a " + typeof value); + } + + data = newData; + (view.onRefreshData || angular.noop)(); + + isDataReady = true; + if (isLayoutReady && isDataReady) { + forceRerender(); + setTimeout(angular.bind(scrollView, scrollView.resize)); + } + }; + + var unwatch = scope.$watchCollection(listExpression, angular.bind(this, this.refreshData)); + this.destroy = function() { + render.destroyed = true; + unwatch(); + + itemsPool.forEach(function(item) { + item.scope.$destroy(); + item.scope = item.element = item.node = item.images = null; + }); + itemsPool.length = itemsEntering.length = itemsLeaving.length = 0; + itemsShownMap = {}; + + //Restore the scrollView's normal behavior and resize it to normal size. + scrollView.options[contentSizeStr] = originalGetContentSize; + scrollView.__callback = scrollView.__$callback; + scrollView.resize(); + + (view.onDestroy || angular.noop)(); + }; + + function forceRerender() { + return render(true); + } + function render(forceRerender) { + if (render.destroyed) return; + var i; + var item; + var dim; + var scope; + var scrollValue = view.getScrollValue(); + var scrollValueEnd = scrollValue + view.scrollPrimarySize; + + view.updateRenderRange(scrollValue, scrollValueEnd); + + renderStartIndex = Math.max(0, renderStartIndex - renderBuffer); + renderEndIndex = Math.min(data.length - 1, renderEndIndex + renderBuffer); + + for (i in itemsShownMap) { + if (i < renderStartIndex || i > renderEndIndex) { + item = itemsShownMap[i]; + delete itemsShownMap[i]; + itemsLeaving.push(item); + item.isShown = false; + item.scope.$broadcast('$collectionRepeatChange'); + } + } + + // Render indicies that aren't shown yet + // + // NOTE(ajoslin): this may sound crazy, but calling any other functions during this render + // loop will often push the render time over the edge from less than one frame to over + // one frame, causing visible jank. + // DON'T call any other functions inside this loop unless it's vital. + for (i = renderStartIndex; i <= renderEndIndex; i++) { + // We only go forward with render if the index is in data, the item isn't already shown, + // or forceRerender is on. + if (i >= data.length || (itemsShownMap[i] && !forceRerender)) continue; + + item = itemsShownMap[i] || (itemsShownMap[i] = itemsLeaving.length ? itemsLeaving.pop() : + itemsPool.length ? itemsPool.shift() : + new RepeatItem()); + itemsEntering.push(item); + item.isShown = true; + + scope = item.scope; + scope.$index = i; + scope[keyExpression] = data[i]; + scope.$first = (i === 0); + scope.$last = (i === (data.length - 1)); + scope.$middle = !(scope.$first || scope.$last); + scope.$odd = !(scope.$even = (i&1) === 0); + + if (scope.$$disconnected) ionic.Utils.reconnectScope(item.scope); + + dim = view.getDimensions(i); + if (item.secondaryPos !== dim.secondaryPos || item.primaryPos !== dim.primaryPos) { + item.node.style[ionic.CSS.TRANSFORM] = TRANSLATE_TEMPLATE_STR + .replace(PRIMARY, (item.primaryPos = dim.primaryPos)) + .replace(SECONDARY, (item.secondaryPos = dim.secondaryPos)); + } + if (item.secondarySize !== dim.secondarySize || item.primarySize !== dim.primarySize) { + item.node.style.cssText = item.node.style.cssText + .replace(WIDTH_HEIGHT_REGEX, WIDTH_HEIGHT_TEMPLATE_STR + .replace(PRIMARY, 1 + (item.primarySize = dim.primarySize)) + .replace(SECONDARY, (item.secondarySize = dim.secondarySize)) + ); + } + + } + + // If we reach the end of the list, render the afterItemsNode - this contains all the + // elements the developer placed after the collection-repeat + if (renderEndIndex === data.length - 1) { + dim = view.getDimensions(data.length - 1) || EMPTY_DIMENSION; + afterItemsNode.style[ionic.CSS.TRANSFORM] = TRANSLATE_TEMPLATE_STR + .replace(PRIMARY, dim.primaryPos + dim.primarySize) + .replace(SECONDARY, 0); + } + + while (itemsLeaving.length) { + item = itemsLeaving.pop(); + ionic.Utils.disconnectScope(item.scope); + itemsPool.push(item); + item.node.style[ionic.CSS.TRANSFORM] = 'translate3d(-9999px,-9999px,0)'; + item.primaryPos = item.secondaryPos = null; + } + + if (forceRefreshImages) { + for (i = 0, ii = itemsEntering.length; i < ii && (item = itemsEntering[i]); i++) { + if (!item.images) continue; + for (var j = 0, jj = item.images.length, img; j < jj && (img = item.images[j]); j++) { + var src = img.src; + img.src = ONE_PX_TRANSPARENT_IMG_SRC; + img.src = src; + } + } + } + if (forceRerender) { + var rootScopePhase = $rootScope.$$phase; + while (itemsEntering.length) { + item = itemsEntering.pop(); + if (!rootScopePhase) item.scope.$digest(); + } + } else { + digestEnteringItems(); + } + } + + function getNextItem() { + if (itemsLeaving.length) + return itemsLeaving.pop(); + else if (itemsPool.length) + return itemsPool.shift(); + return new RepeatItem(); + } + + function digestEnteringItems() { + var item; + var scope; + var len; + if (digestEnteringItems.running) return; + digestEnteringItems.running = true; + + $$rAF(function process() { + if( (len = itemsEntering.length) ) { + var rootScopePhase = $rootScope.$$phase; + var count = Math.floor(len / 1.25) || 1; + while (count && itemsEntering.length) { + item = itemsEntering.pop(); + if (item.isShown) { + count--; + if (!rootScopePhase) item.scope.$digest(); + } + } + $$rAF(process); + } else { + digestEnteringItems.running = false; + } + }); + } + + function RepeatItem() { + var self = this; + this.scope = scope.$new(); + this.id = 'item'+ (nextItemId++); + transclude(this.scope, function(clone) { + self.element = clone; + self.element.data('$$collectionRepeatItem', self); + // TODO destroy + self.node = clone[0]; + // Batch style setting to lower repaints + self.node.style[ionic.CSS.TRANSFORM] = 'translate3d(-9999px,-9999px,0)'; + self.node.style.cssText += ' height: 0px; width: 0px;'; + ionic.Utils.disconnectScope(self.scope); + containerNode.appendChild(self.node); + self.images = clone[0].getElementsByTagName('img'); + }); + } + + function VerticalViewType() { + this.getItemPrimarySize = heightGetter; + this.getItemSecondarySize = widthGetter; + + this.getScrollValue = function() { + return Math.max(0, Math.min(scrollView.__scrollTop - repeaterBeforeSize, + scrollView.__maxScrollTop - repeaterBeforeSize - repeaterAfterSize)); + }; + + this.refreshDirection = function() { + this.scrollPrimarySize = scrollView.__clientHeight; + this.scrollSecondarySize = scrollView.__clientWidth; + + this.estimatedPrimarySize = estimatedHeight; + this.estimatedSecondarySize = estimatedWidth; + this.estimatedItemsAcross = isGridView && + Math.floor(scrollView.__clientWidth / estimatedWidth) || + 1; + }; + } + function HorizontalViewType() { + this.getItemPrimarySize = widthGetter; + this.getItemSecondarySize = heightGetter; + + this.getScrollValue = function() { + return Math.max(0, Math.min(scrollView.__scrollLeft - repeaterBeforeSize, + scrollView.__maxScrollLeft - repeaterBeforeSize - repeaterAfterSize)); + }; + + this.refreshDirection = function() { + this.scrollPrimarySize = scrollView.__clientWidth; + this.scrollSecondarySize = scrollView.__clientHeight; + + this.estimatedPrimarySize = estimatedWidth; + this.estimatedSecondarySize = estimatedHeight; + this.estimatedItemsAcross = isGridView && + Math.floor(scrollView.__clientHeight / estimatedHeight) || + 1; + }; + } + + function GridViewType() { + this.getEstimatedSecondaryPos = function(index) { + return (index % this.estimatedItemsAcross) * this.estimatedSecondarySize; + }; + this.getEstimatedPrimaryPos = function(index) { + return Math.floor(index / this.estimatedItemsAcross) * this.estimatedPrimarySize; + }; + this.getEstimatedIndex = function(scrollValue) { + return Math.floor(scrollValue / this.estimatedPrimarySize) * + this.estimatedItemsAcross; + }; + } + + function ListViewType() { + this.getEstimatedSecondaryPos = function() { + return 0; + }; + this.getEstimatedPrimaryPos = function(index) { + return index * this.estimatedPrimarySize; + }; + this.getEstimatedIndex = function(scrollValue) { + return Math.floor((scrollValue) / this.estimatedPrimarySize); + }; + } - var scrollView = scrollCtrl.scrollView; - if (scrollView.options.scrollingX && scrollView.options.scrollingY) { - throw new Error(COLLECTION_REPEAT_SCROLLVIEW_XY_ERROR); + function StaticViewType() { + this.getContentSize = function() { + return this.getEstimatedPrimaryPos(data.length - 1) + this.estimatedPrimarySize + + repeaterBeforeSize + repeaterAfterSize; + }; + // static view always returns the same object for getDimensions, to avoid memory allocation + // while scrolling. This could be dangerous if this was a public function, but it's not. + // Only we use it. + var dim = {}; + this.getDimensions = function(index) { + dim.primaryPos = this.getEstimatedPrimaryPos(index); + dim.secondaryPos = this.getEstimatedSecondaryPos(index); + dim.primarySize = this.estimatedPrimarySize; + dim.secondarySize = this.estimatedSecondarySize; + return dim; + }; + this.updateRenderRange = function(scrollValue, scrollValueEnd) { + renderStartIndex = Math.max(0, this.getEstimatedIndex(scrollValue)); + + // Make sure the renderEndIndex takes into account all the items on the row + renderEndIndex = Math.min(data.length - 1, + this.getEstimatedIndex(scrollValueEnd) + this.estimatedItemsAcross - 1); + + renderBeforeBoundary = Math.max(0, + this.getEstimatedPrimaryPos(renderStartIndex)); + renderAfterBoundary = this.getEstimatedPrimaryPos(renderEndIndex) + + this.estimatedPrimarySize; + }; + } + + function DynamicViewType() { + var self = this; + var scrollViewSetDimensions = isVertical ? + function() { + scrollView.setDimensions(null, null, null, self.getContentSize(), true); + } : + function() { + scrollView.setDimensions(null, null, self.getContentSize(), null, true); + }; + var debouncedScrollViewSetDimensions = ionic.debounce(scrollViewSetDimensions, 25, true); + var calculateDimensions = isGridView ? calculateDimensionsGrid : calculateDimensionsList; + var dimensionsIndex; + var dimensions = []; + + + // Get the dimensions at index. {width, height, left, top}. + // We start with no dimensions calculated, then any time dimensions are asked for at an + // index we calculate dimensions up to there. + function calculateDimensionsList(toIndex) { + var i, prevDimension, dim; + for (i = Math.max(0, dimensionsIndex); i <= toIndex && (dim = dimensions[i]); i++) { + prevDimension = dimensions[i - 1] || EMPTY_DIMENSION; + dim.primarySize = self.getItemPrimarySize(i, data[i]); + dim.secondarySize = self.scrollSecondarySize; + dim.primaryPos = prevDimension.primaryPos + prevDimension.primarySize; + dim.secondaryPos = 0; + } } + function calculateDimensionsGrid(toIndex) { + var i, prevDimension, dim; + for (i = Math.max(dimensionsIndex, 0); i <= toIndex && (dim = dimensions[i]); i++) { + prevDimension = dimensions[i - 1] || EMPTY_DIMENSION; + dim.secondarySize = Math.min( + self.getItemSecondarySize(i, data[i]), + self.scrollSecondarySize + ); + dim.secondaryPos = prevDimension.secondaryPos + prevDimension.secondarySize; - var isVertical = !!scrollView.options.scrollingY; - if (isVertical && !$attr.collectionItemHeight) { - throw new Error(COLLECTION_REPEAT_ATTR_HEIGHT_ERROR); - } else if (!isVertical && !$attr.collectionItemWidth) { - throw new Error(COLLECTION_REPEAT_ATTR_WIDTH_ERROR); + if (i === 0 || dim.secondaryPos + dim.secondarySize > self.scrollSecondarySize) { + dim.rowStartIndex = i; + dim.secondaryPos = 0; + dim.primarySize = self.getItemPrimarySize(i, data[i]); + dim.primaryPos = prevDimension.primaryPos + prevDimension.primarySize; + } else { + dim.rowStartIndex = prevDimension.rowStartIndex; + dim.primarySize = prevDimension.primarySize; + dim.primaryPos = prevDimension.primaryPos; + } + } } - var heightParsed = $parse($attr.collectionItemHeight || '"100%"'); - var widthParsed = $parse($attr.collectionItemWidth || '"100%"'); + this.getContentSize = function() { + var dim = dimensions[dimensionsIndex] || EMPTY_DIMENSION; + return ((dim.primaryPos + dim.primarySize) || 0) + + this.getEstimatedPrimaryPos(data.length - dimensionsIndex - 1) + + repeaterBeforeSize + repeaterAfterSize; + }; + this.onDestroy = function() { + dimensions.length = 0; + }; - var heightGetter = function(scope, locals) { - var result = heightParsed(scope, locals); - if (isString(result) && result.indexOf('%') > -1) { - return Math.floor(parseInt(result) / 100 * scrollView.__clientHeight); + this.onRefreshData = function() { + // Make sure dimensions has as many items as data.length. + // This is to be sure we don't have to allocate objects while scrolling. + for (i = dimensions.length, len = data.length; i < len; i++) { + dimensions.push({}); } - return parseInt(result); + dimensionsIndex = -1; }; - var widthGetter = function(scope, locals) { - var result = widthParsed(scope, locals); - if (isString(result) && result.indexOf('%') > -1) { - return Math.floor(parseInt(result) / 100 * scrollView.__clientWidth); - } - return parseInt(result); + this.onRefreshLayout = function() { + dimensionsIndex = -1; }; + this.getDimensions = function(index) { + index = Math.min(index, data.length - 1); + + if (dimensionsIndex < index) { + // Once we start asking for dimensions near the end of the list, go ahead and calculate + // everything. This is to make sure when the user gets to the end of the list, the + // scroll height of the list is 100% accurate (not estimated anymore). + if (index > data.length * 0.9) { + calculateDimensions(data.length - 1); + dimensionsIndex = data.length - 1; + scrollViewSetDimensions(); + } else { + calculateDimensions(index); + dimensionsIndex = index; + debouncedScrollViewSetDimensions(); + } - var match = $attr.collectionRepeat.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/); - if (!match) { - throw new Error(COLLECTION_REPEAT_ATTR_REPEAT_ERROR - .replace('%', $attr.collectionRepeat)); - } - var keyExpr = match[1]; - var listExpr = match[2]; - var trackByExpr = match[3]; - - var dataSource = new $collectionDataSource({ - scope: $scope, - transcludeFn: $transclude, - transcludeParent: $element.parent(), - keyExpr: keyExpr, - listExpr: listExpr, - trackByExpr: trackByExpr, - heightGetter: heightGetter, - widthGetter: widthGetter - }); - var collectionRepeatManager = new $collectionRepeatManager({ - dataSource: dataSource, - element: scrollCtrl.$element, - scrollView: scrollCtrl.scrollView, - }); - - var listExprParsed = $parse(listExpr); - $scope.$watchCollection(listExprParsed, function(value) { - if (value && !angular.isArray(value)) { - throw new Error("collection-repeat expects an array to repeat over, but instead got '" + typeof value + "'."); } - rerender(value); - }); + return dimensions[index]; + }; - // Find every sibling before and after the repeated items, and pass them - // to the dataSource - var scrollViewContent = scrollCtrl.scrollView.__content; - function rerender(value) { - var beforeSiblings = []; - var afterSiblings = []; - var before = true; - - forEach(scrollViewContent.children, function(node, i) { - if ( ionic.DomUtil.elementIsDescendant($element[0], node, scrollViewContent) ) { - before = false; - } else { - if (node.hasAttribute('collection-repeat-ignore')) return; - var width = node.offsetWidth; - var height = node.offsetHeight; - if (width && height) { - var element = jqLite(node); - (before ? beforeSiblings : afterSiblings).push({ - width: node.offsetWidth, - height: node.offsetHeight, - element: element, - scope: element.isolateScope() || element.scope(), - isOutside: true - }); + var oldRenderStartIndex = -1; + var oldScrollValue = -1; + this.updateRenderRange = function(scrollValue, scrollValueEnd) { + var i; + var len; + var dim; + + // Calculate more dimensions than we estimate we'll need, to be sure. + this.getDimensions( this.getEstimatedIndex(scrollValueEnd) * 2 ); + + // -- Calculate renderStartIndex + // base case: start at 0 + if (oldRenderStartIndex === -1 || scrollValue === 0) { + i = 0; + // scrolling down + } else if (scrollValue >= oldScrollValue) { + for (i = oldRenderStartIndex, len = data.length; i < len; i++) { + if ((dim = this.getDimensions(i)) && dim.primaryPos + dim.primarySize >= scrollValue) { + break; } } - }); + // scrolling up + } else { + for (i = oldRenderStartIndex; i >= 0; i--) { + if ((dim = this.getDimensions(i)) && dim.primaryPos <= scrollValue) { + // when grid view, make sure the render starts at the beginning of a row. + i = isGridView ? dim.rowStartIndex : i; + break; + } + } + } - scrollView.resize(); - dataSource.setData(value, beforeSiblings, afterSiblings); - collectionRepeatManager.resize(); - } + renderStartIndex = Math.min(Math.max(0, i), data.length - 1); + renderBeforeBoundary = renderStartIndex !== -1 ? this.getDimensions(renderStartIndex).primaryPos : -1; - var requiresRerender; - function rerenderOnResize() { - rerender(listExprParsed($scope)); - requiresRerender = (!scrollViewContent.clientWidth && !scrollViewContent.clientHeight); - } + // -- Calculate renderEndIndex + var lastRowDim; + for (i = renderStartIndex + 1, len = data.length; i < len; i++) { + if ((dim = this.getDimensions(i)) && dim.primaryPos + dim.primarySize > scrollValueEnd) { - function viewEnter() { - if (requiresRerender) { - rerenderOnResize(); + // Go all the way to the end of the row if we're in a grid + if (isGridView) { + lastRowDim = dim; + while (i < len - 1 && + (dim = this.getDimensions(i + 1)).primaryPos === lastRowDim.primaryPos) { + i++; + } + } + break; + } } - } - scrollCtrl.$element.on('scroll.resize', rerenderOnResize); - ionic.on('resize', rerenderOnResize, window); - var deregisterViewListener; - if (navViewCtrl) { - deregisterViewListener = navViewCtrl.scope.$on('$ionicView.afterEnter', viewEnter); - } + renderEndIndex = Math.min(i, data.length - 1); + renderAfterBoundary = renderEndIndex !== -1 ? + ((dim = this.getDimensions(renderEndIndex)).primaryPos + dim.primarySize) : + -1; - $scope.$on('$destroy', function() { - collectionRepeatManager.destroy(); - dataSource.destroy(); - ionic.off('resize', rerenderOnResize, window); - (deregisterViewListener || angular.noop)(); - }); + oldScrollValue = scrollValue; + oldRenderStartIndex = renderStartIndex; + }; } + + }; -}]) -.directive({ - ngSrc: collectionRepeatSrcDirective('ngSrc', 'src'), - ngSrcset: collectionRepeatSrcDirective('ngSrcset', 'srcset'), - ngHref: collectionRepeatSrcDirective('ngHref', 'href') -}); -// Fix for #1674 -// Problem: if an ngSrc or ngHref expression evaluates to a falsy value, it will -// not erase the previous truthy value of the href. -// In collectionRepeat, we re-use elements from before. So if the ngHref expression -// evaluates to truthy for item 1 and then falsy for item 2, if an element changes -// from representing item 1 to representing item 2, item 2 will still have -// item 1's href value. -// Solution: erase the href or src attribute if ngHref/ngSrc are falsy. -function collectionRepeatSrcDirective(ngAttrName, attrName) { - return [function() { - return { - priority: '99', // it needs to run after the attributes are interpolated - link: function(scope, element, attr) { - attr.$observe(ngAttrName, function(value) { - if (!value) { - element[0].removeAttribute(attrName); - } - }); - } - }; - }]; } + + /** * @ngdoc directive * @name ionContent @@ -7852,7 +9110,8 @@ IonicModule '$timeout', '$controller', '$ionicBind', -function($timeout, $controller, $ionicBind) { + '$ionicConfig', +function($timeout, $controller, $ionicBind, $ionicConfig) { return { restrict: 'E', require: '^?ionNavView', @@ -7907,7 +9166,7 @@ function($timeout, $controller, $ionicBind) { }); $scope.direction = $scope.direction || 'y'; - if (angular.isDefined($attr.padding)) { + if (isDefined($attr.padding)) { $scope.$watch($attr.padding, function(newVal) { (innerElement || $element).toggleClass('padding', !!newVal); }); @@ -7915,7 +9174,8 @@ function($timeout, $controller, $ionicBind) { if ($attr.scroll === "false") { //do nothing - } else if(attr.overflowScroll === "true") { + } else if (attr.overflowScroll === "true" || !$ionicConfig.scrolling.jsScrolling()) { + // use native scrolling $element.addClass('overflow-scroll'); } else { var scrollViewOptions = { @@ -7943,7 +9203,7 @@ function($timeout, $controller, $ionicBind) { }); $scope.$on('$destroy', function() { - scrollViewOptions.scrollingComplete = angular.noop; + scrollViewOptions.scrollingComplete = noop; delete scrollViewOptions.el; innerElement = null; $element = null; @@ -8006,7 +9266,7 @@ IonicModule function checkAsideExpose() { var mq = $attr.exposeAsideWhen == 'large' ? '(min-width:768px)' : $attr.exposeAsideWhen; - sideMenuCtrl.exposeAside( $window.matchMedia(mq).matches ); + sideMenuCtrl.exposeAside($window.matchMedia(mq).matches); sideMenuCtrl.activeAsideResizing(false); } @@ -8016,9 +9276,7 @@ IonicModule } var debouncedCheck = ionic.debounce(function() { - $scope.$apply(function(){ - checkAsideExpose(); - }); + $scope.$apply(checkAsideExpose); }, 300, false); checkAsideExpose(); @@ -8034,7 +9292,7 @@ IonicModule }]); -var GESTURE_DIRECTIVES = 'onHold onTap onTouch onRelease onDrag onDragUp onDragRight onDragDown onDragLeft onSwipe onSwipeUp onSwipeRight onSwipeDown onSwipeLeft'.split(' '); +var GESTURE_DIRECTIVES = 'onHold onTap onDoubleTap onTouch onRelease onDrag onDragUp onDragRight onDragDown onDragLeft onSwipe onSwipeUp onSwipeRight onSwipeDown onSwipeLeft'.split(' '); GESTURE_DIRECTIVES.forEach(function(name) { IonicModule.directive(name, gestureDirective(name)); @@ -8074,6 +9332,22 @@ GESTURE_DIRECTIVES.forEach(function(name) { */ +/** + * @ngdoc directive + * @name onDoubleTap + * @module ionic + * @restrict A + * + * @description + * Double tap touch at a location. + * + * @usage + * ```html + * + * ``` + */ + + /** * @ngdoc directive * @name onTouch @@ -8439,7 +9713,9 @@ function headerFooterBarDirective(isHeader) { }); ctrl.align(); $scope.$on('$ionicHeader.align', function() { - ionic.requestAnimationFrame(ctrl.align); + ionic.requestAnimationFrame(function() { + ctrl.align(); + }); }); } else { @@ -8483,7 +9759,11 @@ function headerFooterBarDirective(isHeader) { * bottom. * @param {string=} distance The distance from the bottom that the scroll must * reach to trigger the on-infinite expression. Default: 1%. - * @param {string=} icon The icon to show while loading. Default: 'ion-loading-d'. + * @param {string=} spinner The {@link ionic.directive:ionSpinner} to show while loading. The SVG + * {@link ionic.directive:ionSpinner} is now the default, replacing rotating font icons. + * @param {string=} icon The icon to show while loading. Default: 'ion-load-d'. This is depreicated + * in favor of the SVG {@link ionic.directive:ionSpinner}. + * @param {boolean=} immediate-check Whether to check the infinite scroll bounds immediately on load. * * @usage * ```html @@ -8528,84 +9808,43 @@ function headerFooterBarDirective(isHeader) { */ IonicModule .directive('ionInfiniteScroll', ['$timeout', function($timeout) { - function calculateMaxValue(distance, maximum, isPercent) { - return isPercent ? - maximum * (1 - parseFloat(distance,10) / 100) : - maximum - parseFloat(distance, 10); - } return { restrict: 'E', - require: ['^$ionicScroll', 'ionInfiniteScroll'], - template: '', - scope: { - load: '&onInfinite' + require: ['?^$ionicScroll', 'ionInfiniteScroll'], + template: function($element, $attrs) { + if ($attrs.icon) return ''; + return ''; }, - controller: ['$scope', '$attrs', function($scope, $attrs) { - this.isLoading = false; - this.scrollView = null; //given by link function - this.getMaxScroll = function() { - var distance = ($attrs.distance || '2.5%').trim(); - var isPercent = distance.indexOf('%') !== -1; - var maxValues = this.scrollView.getScrollMax(); - return { - left: this.scrollView.options.scrollingX ? - calculateMaxValue(distance, maxValues.left, isPercent) : - -1, - top: this.scrollView.options.scrollingY ? - calculateMaxValue(distance, maxValues.top, isPercent) : - -1 - }; - }; - }], + scope: true, + controller: '$ionInfiniteScroll', link: function($scope, $element, $attrs, ctrls) { - var scrollCtrl = ctrls[0]; var infiniteScrollCtrl = ctrls[1]; - var scrollView = infiniteScrollCtrl.scrollView = scrollCtrl.scrollView; - - $scope.icon = function() { - return angular.isDefined($attrs.icon) ? $attrs.icon : 'ion-loading-d'; - }; - - var onInfinite = function() { - $element[0].classList.add('active'); - infiniteScrollCtrl.isLoading = true; - $scope.load(); - }; - - var finishInfiniteScroll = function() { - $element[0].classList.remove('active'); - $timeout(function() { - scrollView.resize(); - checkBounds(); - }, 0, false); - infiniteScrollCtrl.isLoading = false; - }; - - $scope.$on('scroll.infiniteScrollComplete', function() { - finishInfiniteScroll(); - }); - - $scope.$on('$destroy', function() { - if(scrollCtrl && scrollCtrl.$element)scrollCtrl.$element.off('scroll', checkBounds); - }); - - var checkBounds = ionic.animationFrameThrottle(checkInfiniteBounds); - - //Check bounds on start, after scrollView is fully rendered - $timeout(checkBounds, 0, false); - scrollCtrl.$element.on('scroll', checkBounds); - - function checkInfiniteBounds() { - if (infiniteScrollCtrl.isLoading) return; - - var scrollValues = scrollView.getValues(); - var maxScroll = infiniteScrollCtrl.getMaxScroll(); - - if ((maxScroll.left !== -1 && scrollValues.left >= maxScroll.left) || - (maxScroll.top !== -1 && scrollValues.top >= maxScroll.top)) { - onInfinite(); + var scrollCtrl = infiniteScrollCtrl.scrollCtrl = ctrls[0]; + var jsScrolling = infiniteScrollCtrl.jsScrolling = !!scrollCtrl; + // if this view is not beneath a scrollCtrl, it can't be injected, proceed w/ native scrolling + if (jsScrolling) { + infiniteScrollCtrl.scrollView = scrollCtrl.scrollView; + } else { + // grabbing the scrollable element, to determine dimensions, and current scroll pos + var scrollEl = ionic.DomUtil.getParentOrSelfWithClass($element[0].parentNode,'overflow-scroll'); + infiniteScrollCtrl.scrollEl = scrollEl; + // if there's no scroll controller, and no overflow scroll div, infinite scroll wont work + if (!scrollEl) { + throw 'Infinite scroll must be used inside a scrollable div'; } } + //bind to appropriate scroll event + if (jsScrolling) { + $scope.scrollingType = 'js-scrolling'; + scrollCtrl.$element.on('scroll', infiniteScrollCtrl.checkBounds); + } else { + infiniteScrollCtrl.scrollEl.addEventListener('scroll', infiniteScrollCtrl.checkBounds); + } + // Optionally check bounds on start after scrollView is fully rendered + var doImmediateCheck = isDefined($attrs.immediateCheck) ? $scope.$eval($attrs.immediateCheck) : true; + if (doImmediateCheck) { + $timeout(function() { infiniteScrollCtrl.checkBounds(); }); + } } }; }]); @@ -8641,6 +9880,7 @@ var ITEM_TPL_CONTENT = */ IonicModule .directive('ionItem', function() { + var nextId = 0; return { restrict: 'E', controller: ['$scope', '$element', function($scope, $element) { @@ -8649,31 +9889,40 @@ IonicModule }], scope: true, compile: function($element, $attrs) { - var isAnchor = angular.isDefined($attrs.href) || - angular.isDefined($attrs.ngHref) || - angular.isDefined($attrs.uiSref); + var isAnchor = isDefined($attrs.href) || + isDefined($attrs.ngHref) || + isDefined($attrs.uiSref); var isComplexItem = isAnchor || //Lame way of testing, but we have to know at compile what to do with the element /ion-(delete|option|reorder)-button/i.test($element.html()); - if (isComplexItem) { - var innerElement = jqLite(isAnchor ? ITEM_TPL_CONTENT_ANCHOR : ITEM_TPL_CONTENT); - innerElement.append($element.contents()); + if (isComplexItem) { + var innerElement = jqLite(isAnchor ? ITEM_TPL_CONTENT_ANCHOR : ITEM_TPL_CONTENT); + innerElement.append($element.contents()); - $element.append(innerElement); - $element.addClass('item item-complex'); - } else { - $element.addClass('item'); - } + $element.append(innerElement); + $element.addClass('item item-complex'); + } else { + $element.addClass('item'); + } - return function link($scope, $element, $attrs) { - $scope.$href = function() { - return $attrs.href || $attrs.ngHref; - }; - $scope.$target = function() { - return $attrs.target || '_self'; - }; + return function link($scope, $element, $attrs) { + var listCtrl; + $scope.$href = function() { + return $attrs.href || $attrs.ngHref; }; + $scope.$target = function() { + return $attrs.target || '_self'; + }; + + var content = $element[0].querySelector('.item-content'); + if (content) { + $scope.$on('$collectionRepeatChange', function() { + content && (content.style[ionic.CSS.TRANSFORM] = 'translate3d(0,0,0)'); + }); + } + }; + } }; }); @@ -8746,10 +9995,10 @@ IonicModule var input = el.querySelector('input, textarea'); var inputLabel = el.querySelector('.input-label'); - if ( !input || !inputLabel ) return; + if (!input || !inputLabel) return; var onInput = function() { - if ( input.value ) { + if (input.value) { inputLabel.classList.add('has-input'); } else { inputLabel.classList.remove('has-input'); @@ -8758,8 +10007,8 @@ IonicModule input.addEventListener('input', onInput); - var ngModelCtrl = angular.element(input).controller('ngModel'); - if ( ngModelCtrl ) { + var ngModelCtrl = jqLite(input).controller('ngModel'); + if (ngModelCtrl) { ngModelCtrl.$render = function() { input.value = ngModelCtrl.$viewValue || ''; onInput(); @@ -8966,7 +10215,7 @@ IonicModule var keyboardHeight = e.keyboardHeight || e.detail.keyboardHeight; element.css('bottom', keyboardHeight + "px"); scrollCtrl = element.controller('$ionicScroll'); - if ( scrollCtrl ) { + if (scrollCtrl) { scrollCtrl.scrollView.__container.style.bottom = keyboardHeight + keyboardAttachGetClientHeight(element[0]) + "px"; } } @@ -8977,7 +10226,7 @@ IonicModule } element.css('bottom', ''); - if ( scrollCtrl ) { + if (scrollCtrl) { scrollCtrl.scrollView.__container.style.bottom = ''; } } @@ -9062,6 +10311,14 @@ function keyboardAttachGetClientHeight(element) { * * ``` * +*```javascript +* app.controller('MyCtrl', function($scope) { +* $scope.shouldShowDelete = false; +* $scope.shouldShowReorder = false; +* $scope.listCanSwipe = true +* }); +*``` +* * @param {string=} delegate-handle The handle used to identify this list with * {@link ionic.service:$ionicListDelegate}. * @param type {string=} The type of list to use (list-inset or card) @@ -9082,15 +10339,16 @@ function($timeout) { controller: '$ionicList', compile: function($element, $attr) { var listEl = jqLite('
    ') - .append( $element.contents() ) - .addClass($attr.type); + .append($element.contents()) + .addClass($attr.type); + $element.append(listEl); return function($scope, $element, $attrs, ctrls) { var listCtrl = ctrls[0]; var scrollCtrl = ctrls[1]; - //Wait for child elements to render... + // Wait for child elements to render... $timeout(init); function init() { @@ -9102,9 +10360,9 @@ function($timeout) { onReorder: function(el, oldIndex, newIndex) { var itemScope = jqLite(el).scope(); if (itemScope && itemScope.$onReorder) { - //Make sure onReorder is called in apply cycle, - //but also make sure it has no conflicts by doing - //$evalAsync + // Make sure onReorder is called in apply cycle, + // but also make sure it has no conflicts by doing + // $evalAsync $timeout(function() { itemScope.$onReorder(oldIndex, newIndex); }); @@ -9116,7 +10374,7 @@ function($timeout) { }); $scope.$on('$destroy', function() { - if(listView) { + if (listView) { listView.deregister && listView.deregister(); listView = null; } @@ -9247,6 +10505,17 @@ IonicModule * * * ``` + * + * ### Button Hidden On Child Views + * By default, the menu toggle button will only appear on a root + * level side-menu page. Navigating in to child views will hide the menu- + * toggle button. They can be made visible on child pages by setting the + * enable-menu-with-back-views attribute of the {@link ionic.directive:ionSideMenus} + * directive to true. + * + * ```html + * + * ``` */ IonicModule .directive('menuToggle', function() { @@ -9282,7 +10551,7 @@ IonicModule restrict: 'E', transclude: true, replace: true, - controller: [function(){}], + controller: [function() {}], template: '' @@ -9337,7 +10606,7 @@ IonicModule * * ``` * - * With custom inner markup and custom click action, using {@link ionic.service:$ionicNavBarDelegate}: + * With custom inner markup and custom click action, using {@link ionic.service:$ionicHistory}: * * ```html * @@ -9348,9 +10617,9 @@ IonicModule * * ``` * ```js - * function MyCtrl($scope, $ionicNavBarDelegate) { + * function MyCtrl($scope, $ionicHistory) { * $scope.myGoBack = function() { - * $ionicNavBarDelegate.back(); + * $ionicHistory.goBack(); * }; * } * ``` @@ -9479,30 +10748,6 @@ IonicModule * to the top when tapped. Set no-tap-scroll to true to disable this behavior. * *
    - * - * ### Alternative Usage - * - * Alternatively, you may put ion-nav-bar inside of each individual view's ion-view element. - * This will allow you to have the whole navbar, not just its contents, transition every view change. - * - * This is similar to using a header bar inside your ion-view, except it will have all the power of a navbar. - * - * If you do this, simply put nav buttons inside the navbar itself; do not use ``. - * - * - * ```html - * - * - * - * - *
    - * - *
    - *
    - *
    - * ``` */ IonicModule .directive('ionNavBar', function() { @@ -9544,7 +10789,7 @@ IonicModule * example, a toggle button for a left side menu should be on the left side; in this case, * we'd recommend using `side="left"`, so it's always on the left, no matter the platform. * - * Note that `ion-nav-buttons` must be immediate descendants of the `ion-view` or + * ***Note*** that `ion-nav-buttons` must be immediate descendants of the `ion-view` or * `ion-nav-bar` element (basically, don't wrap it in another div). * * @usage @@ -9813,7 +11058,7 @@ IonicModule * This is good to do because the template will be cached for very fast loading, instead of * having to fetch them from the network. * - ## Caching + * ## Caching * * By default, views are cached to improve performance. When a view is navigated away from, its * element is left in the DOM, and its scope is disconnected from the `$watch` cycle. When @@ -9829,7 +11074,16 @@ IonicModule * are being disconnected from the watch cycle. Because scopes are not being destroyed and * recreated, controllers are not loading again on a subsequent viewing. If the app/controller * needs to know when a view has entered or has left, then view events emitted from the - * {@link ionic.directive:ionView} scope, such as `$ionicView.enter`, may be useful + * {@link ionic.directive:ionView} scope, such as `$ionicView.enter`, may be useful. + * + * By default, when navigating back in the history, the "forward" views are removed from the cache. + * If you navigate forward to the same view again, it'll create a new DOM element and controller + * instance. Basically, any forward views are reset each time. This can be configured using the + * {@link ionic.provider:$ionicConfigProvider}: + * + * ```js + * $ionicConfigProvider.views.forwardCache(true); + * ``` * * #### Disable cache globally * @@ -10025,7 +11279,7 @@ IonicModule return { restrict: 'E', compile: function(element) { - element.append( angular.element('
    ') ); + element.append(jqLite('
    ')); element.addClass('popover'); } }; @@ -10048,7 +11302,7 @@ IonicModule * Choose B * Choose C * ``` - * + * * @param {string=} name The name of the radio input. * @param {expression=} value The value of the radio input. * @param {boolean=} disabled The state of the radio input. @@ -10073,7 +11327,10 @@ IonicModule '', compile: function(element, attr) { - if(attr.icon) element.children().eq(2).removeClass('ion-checkmark').addClass(attr.icon); + if (attr.icon) { + element.children().eq(2).removeClass('ion-checkmark').addClass(attr.icon); + } + var input = element.find('input'); forEach({ 'name': attr.name, @@ -10149,59 +11406,65 @@ IonicModule * @param {expression=} on-pulling Called when the user starts to pull down * on the refresher. * @param {string=} pulling-icon The icon to display while the user is pulling down. - * Default: 'ion-arrow-down-c'. - * @param {string=} pulling-text The text to display while the user is pulling down. - * @param {string=} refreshing-icon The icon to display after user lets go of the - * refresher. - * @param {string=} refreshing-text The text to display after the user lets go of - * the refresher. + * Default: 'ion-android-arrow-down'. + * @param {string=} spinner The {@link ionic.directive:ionSpinner} icon to display + * after user lets go of the refresher. The SVG {@link ionic.directive:ionSpinner} + * is now the default, replacing rotating font icons. Set to `none` to disable both the + * spinner and the icon. + * @param {string=} refreshing-icon The font icon to display after user lets go of the + * refresher. This is depreicated in favor of the SVG {@link ionic.directive:ionSpinner}. * @param {boolean=} disable-pulling-rotation Disables the rotation animation of the pulling * icon when it reaches its activated threshold. To be used with a custom `pulling-icon`. * */ IonicModule -.directive('ionRefresher', ['$ionicBind', function($ionicBind) { +.directive('ionRefresher', [function() { return { restrict: 'E', replace: true, - require: '^$ionicScroll', + require: ['?^$ionicScroll', 'ionRefresher'], + controller: '$ionicRefresher', template: - '
    ' + + '', - compile: function($element, $attrs) { - if (angular.isUndefined($attrs.pullingIcon)) { - $attrs.$set('pullingIcon', 'ion-ios7-arrow-down'); - } - if (angular.isUndefined($attrs.refreshingIcon)) { - $attrs.$set('refreshingIcon', 'ion-loading-d'); - } - return function($scope, $element, $attrs, scrollCtrl) { - $ionicBind($scope, $attrs, { - pullingIcon: '@', - pullingText: '@', - refreshingIcon: '@', - refreshingText: '@', - disablePullingRotation: '@', - $onRefresh: '&onRefresh', - $onPulling: '&onPulling' - }); + link: function($scope, $element, $attrs, ctrls) { + + // JS Scrolling uses the scroll controller + var scrollCtrl = ctrls[0], + refresherCtrl = ctrls[1]; + + if (!!scrollCtrl) { + $element[0].classList.add('js-scrolling'); + + scrollCtrl._setRefresher( + $scope, + $element[0], + refresherCtrl.getRefresherDomMethods() + ); - scrollCtrl._setRefresher($scope, $element[0]); $scope.$on('scroll.refreshComplete', function() { $scope.$evalAsync(function() { scrollCtrl.scrollView.finishPullToRefresh(); }); }); - }; + + } else { + // Kick off native scrolling + refresherCtrl.init(); + } + } }; }]); @@ -10282,7 +11545,7 @@ function($timeout, $controller, $ionicBind) { }); $scope.direction = $scope.direction || 'y'; - if (angular.isDefined($attr.padding)) { + if (isDefined($attr.padding)) { $scope.$watch($attr.padding, function(newVal) { innerElement.toggleClass('padding', !!newVal); }); @@ -10541,6 +11804,7 @@ function($timeout, $ionicGesture, $window) { $element[0].style.width = ''; content.offsetX = 0; } + ionic.trigger('resize', null, window); }), setMarginRight: ionic.animationFrameThrottle(function(amount) { if (amount) { @@ -10612,6 +11876,11 @@ IonicModule * `ion-side-menu-content`, so that when the element is clicked, the opened side menu will * automatically close. * + * "Burger Icon" toggles can be added to the header with the {@link ionic.directive:menuToggle} + * attribute directive. Clicking the toggle will open and close the side menu like the `menu-close` + * directive. The side menu will automatically hide on child pages, but can be overridden with the + * enable-menu-with-back-views attribute mentioned below. + * * By default, side menus are hidden underneath their side menu content and can be opened by swiping * the content left or right or by toggling a button to show the side menu. Additionally, by adding the * {@link ionic.directive:exposeAsideWhen} attribute directive to an @@ -10683,7 +11952,7 @@ IonicModule $ionicBody.enableClass(isAsideExposed, 'aside-open'); }); - $scope.$on('$ionicView.beforeEnter', function(ev, d){ + $scope.$on('$ionicView.beforeEnter', function(ev, d) { if (d.historyId) { $scope.$activeHistoryId = d.historyId; } @@ -10730,7 +11999,7 @@ IonicModule * @param {boolean=} does-continue Whether the slide box should loop. * @param {boolean=} auto-play Whether the slide box should automatically slide. Default true if does-continue is true. * @param {number=} slide-interval How many milliseconds to wait to change slides (if does-continue is true). Defaults to 4000. - * @param {boolean=} show-pager Whether a pager should be shown for this slide box. + * @param {boolean=} show-pager Whether a pager should be shown for this slide box. Accepts expressions via `show-pager="{{shouldShow()}}"`. * @param {expression=} pager-click Expression to call when a pager is clicked (if show-pager is true). Is passed the 'index' variable. * @param {expression=} on-slide-changed Expression called whenever the slide is changed. Is passed an '$index' variable. * @param {expression=} active-slide Model to bind the current slide to. @@ -10787,7 +12056,7 @@ function($timeout, $compile, $ionicSlideBoxDelegate, $ionicHistory) { slider.enableSlide($scope.$eval($attrs.disableScroll) !== true); $scope.$watch('activeSlide', function(nv) { - if(angular.isDefined(nv)){ + if (isDefined(nv)) { slider.slide(nv); } }); @@ -10833,12 +12102,20 @@ function($timeout, $compile, $ionicSlideBoxDelegate, $ionicHistory) { '
    ', link: function($scope, $element, $attr, slideBoxCtrl) { - // If the pager should show, append it to the slide box - if($scope.$eval($scope.showPager) !== false) { - var childScope = $scope.$new(); - var pager = jqLite(''); - $element.append(pager); - $compile(pager)(childScope); + $attr.$observe('showPager', function(show) { + show = $scope.$eval(show); + getPager().toggleClass('hide', !show); + }); + + var pager; + function getPager() { + if (!pager) { + var childScope = $scope.$new(); + pager = jqLite(''); + $element.append(pager); + pager = $compile(pager)(childScope); + } + return pager; } } }; @@ -10851,7 +12128,7 @@ function($timeout, $compile, $ionicSlideBoxDelegate, $ionicHistory) { element.addClass('slider-slide'); return function($scope, $element, $attr) { }; - }, + } }; }) @@ -10865,8 +12142,8 @@ function($timeout, $compile, $ionicSlideBoxDelegate, $ionicHistory) { var selectPage = function(index) { var children = $element[0].children; var length = children.length; - for(var i = 0; i < length; i++) { - if(i == index) { + for (var i = 0; i < length; i++) { + if (i == index) { children[i].classList.add('active'); } else { children[i].classList.remove('active'); @@ -10890,6 +12167,200 @@ function($timeout, $compile, $ionicSlideBoxDelegate, $ionicHistory) { }); +/** +* @ngdoc directive +* @name ionSpinner +* @module ionic +* @restrict E + * + * @description + * The `ionSpinner` directive provides a variety of animated spinners. + * Spinners enables you to give your users feedback that the app is + * processing/thinking/waiting/chillin' out, or whatever you'd like it to indicate. + * By default, the {@link ionic.directive:ionRefresher} feature uses this spinner, rather + * than rotating font icons (previously included in [ionicons](http://ionicons.com/)). + * While font icons are great for simple or stationary graphics, they're not suited to + * provide great animations, which is why Ionic uses SVG instead. + * + * Ionic offers ten spinners out of the box, and by default, it will use the appropriate spinner + * for the platform on which it's running. Under the hood, the `ionSpinner` directive dynamically + * builds the required SVG element, which allows Ionic to provide all ten of the animated SVGs + * within 3KB. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    + * android + * + * + *
    + * ios + * + * + *
    + * ios-small + * + * + *
    + * bubbles + * + * + *
    + * circles + * + * + *
    + * crescent + * + * + *
    + * dots + * + * + *
    + * lines + * + * + *
    + * ripple + * + * + *
    + * spiral + * + * + *
    + * + * Each spinner uses SVG with SMIL animations, however, the Android spinner also uses JavaScript + * so it also works on Android 4.0-4.3. Additionally, each spinner can be styled with CSS, + * and scaled to any size. + * + * + * @usage + * The following code would use the default spinner for the platform it's running from. If it's neither + * iOS or Android, it'll default to use `ios`. + * + * ```html + * + * ``` + * + * By setting the `icon` attribute, you can specify which spinner to use, no matter what + * the platform is. + * + * ```html + * + * ``` + * + * ## Spinner Colors + * Like with most of Ionic's other components, spinners can also be styled using + * Ionic's standard color naming convention. For example: + * + * ```html + * + * ``` + * + * + * ## Styling SVG with CSS + * One cool thing about SVG is its ability to be styled with CSS! Some of the properties + * have different names, for example, SVG uses the term `stroke` instead of `border`, and + * `fill` instead of `background-color`. + * + * ```css + * .spinner svg { + * width: 28px; + * height: 28px; + * stroke: #444; + * fill: #444; + * } + * ``` + * +*/ +IonicModule +.directive('ionSpinner', function() { + return { + restrict: 'E', + controller: '$ionicSpinner', + link: function($scope, $element, $attrs, ctrl) { + var spinnerName = ctrl.init(); + $element.addClass('spinner spinner-' + spinnerName); + } + }; +}); + /** * @ngdoc directive * @name ionTab @@ -10924,6 +12395,8 @@ function($timeout, $compile, $ionicSlideBoxDelegate, $ionicHistory) { * @param {expression=} on-select Called when this tab is selected. * @param {expression=} on-deselect Called when this tab is deselected. * @param {expression=} ng-click By default, the tab will be selected on click. If ngClick is set, it will not. You can explicitly switch tabs using {@link ionic.service:$ionicTabsDelegate#select $ionicTabsDelegate.select()}. + * @param {expression=} hidden Whether the tab is to be hidden or not. + * @param {expression=} disabled Whether the tab is to be disabled or not. */ IonicModule .directive('ionTab', [ @@ -10935,7 +12408,7 @@ function($compile, $ionicConfig, $ionicBind, $ionicViewSwitcher) { //Returns ' key="value"' if value exists function attrStr(k, v) { - return angular.isDefined(v) ? ' ' + k + '="' + v + '"' : ''; + return isDefined(v) ? ' ' + k + '="' + v + '"' : ''; } return { restrict: 'E', @@ -10956,6 +12429,7 @@ function($compile, $ionicConfig, $ionicBind, $ionicViewSwitcher) { attrStr('badge', attr.badge) + attrStr('badge-style', attr.badgeStyle) + attrStr('hidden', attr.hidden) + + attrStr('disabled', attr.disabled) + attrStr('class', attr['class']) + '>'; @@ -11070,6 +12544,7 @@ function($compile, $ionicConfig, $ionicBind, $ionicViewSwitcher) { function destroyTab() { childScope && childScope.$destroy(); isTabContentAttached && childElement && childElement.remove(); + tabContentEle.innerHTML = ''; isTabContentAttached = childScope = childElement = null; } @@ -11098,7 +12573,7 @@ IonicModule require: ['^ionTabs', '^ionTab'], template: '' + + ' ng-disabled="disabled()" class="tab-item">' + '{{badge}}' + '' + '' + @@ -11111,6 +12586,7 @@ IonicModule iconOff: '@', badge: '=', hidden: '@', + disabled: '&', badgeStyle: '@', 'class': '@' }, @@ -11160,16 +12636,19 @@ IonicModule * @module ionic * @delegate ionic.service:$ionicTabsDelegate * @restrict E - * @codepen KbrzJ + * @codepen odqCz * * @description * Powers a multi-tabbed interface with a Tab Bar and a set of "pages" that can be tabbed * through. * - * Assign any [tabs class](/docs/components#tabs) or - * [animation class](/docs/components#animation) to the element to define + * Assign any [tabs class](/docs/components#tabs) to the element to define * its look and feel. * + * For iOS, tabs will appear at the bottom of the screen. For Android, tabs will be at the top + * of the screen, below the nav-bar. This follows each OS's design specification, but can be + * configured with the [$ionicConfigProvider](docs/api/provider/$ionicConfigProvider/). + * * See the {@link ionic.directive:ionTab} directive's documentation for more details on * individual tabs. * @@ -11180,15 +12659,15 @@ IonicModule * ```html * * - * + * * * * - * + * * * * - * + * * * * @@ -11235,6 +12714,18 @@ function($ionicTabsDelegate, $ionicConfig, $ionicHistory) { $scope.$hasTabsTop = isTabsTop && !isHidden; }); + function emitLifecycleEvent(ev, data) { + ev.stopPropagation(); + var selectedTab = tabsCtrl.selectedTab(); + if (selectedTab) { + selectedTab.$emit(ev.name.replace('NavView', 'View'), data); + } + } + + $scope.$on('$ionicNavView.beforeLeave', emitLifecycleEvent); + $scope.$on('$ionicNavView.afterLeave', emitLifecycleEvent); + $scope.$on('$ionicNavView.leave', emitLifecycleEvent); + $scope.$on('$destroy', function() { // variable to inform child tabs that they're all being blown away // used so that while destorying an individual tab, each one @@ -11285,9 +12776,9 @@ function($ionicTabsDelegate, $ionicConfig, $ionicHistory) { */ IonicModule .directive('ionToggle', [ - '$ionicGesture', '$timeout', -function($ionicGesture, $timeout) { + '$ionicConfig', +function($timeout, $ionicConfig) { return { restrict: 'E', @@ -11322,38 +12813,36 @@ function($ionicGesture, $timeout) { } }); - if(attr.toggleClass) { + if (attr.toggleClass) { element[0].getElementsByTagName('label')[0].classList.add(attr.toggleClass); } - return function($scope, $element, $attr) { - var el, checkbox, track, handle; - - el = $element[0].getElementsByTagName('label')[0]; - checkbox = el.children[0]; - track = el.children[1]; - handle = track.children[0]; - - var ngModelController = jqLite(checkbox).controller('ngModel'); - - $scope.toggle = new ionic.views.Toggle({ - el: el, - track: track, - checkbox: checkbox, - handle: handle, - onChange: function() { - if(checkbox.checked) { - ngModelController.$setViewValue(true); - } else { - ngModelController.$setViewValue(false); - } - $scope.$apply(); - } - }); - - $scope.$on('$destroy', function() { - $scope.toggle.destroy(); - }); + element.addClass('toggle-' + $ionicConfig.form.toggle()); + + return function($scope, $element) { + var el = $element[0].getElementsByTagName('label')[0]; + var checkbox = el.children[0]; + var track = el.children[1]; + var handle = track.children[0]; + + var ngModelController = jqLite(checkbox).controller('ngModel'); + + $scope.toggle = new ionic.views.Toggle({ + el: el, + track: track, + checkbox: checkbox, + handle: handle, + onChange: function() { + if (ngModelController) { + ngModelController.$setViewValue(checkbox.checked); + $scope.$apply(); + } + } + }); + + $scope.$on('$destroy', function() { + $scope.toggle.destroy(); + }); }; } @@ -11378,7 +12867,7 @@ function($ionicGesture, $timeout) { * left in the DOM, and its scope is disconnected from the `$watch` cycle. When navigating to a * view that is already cached, its scope is reconnected, and the existing element, which was * left in the DOM, becomes active again. This can be disabled, or the maximum number of cached - * views changed in {@link ionic.directive:ionicConfig}, in the view's `$state` configuration, or + * views changed in {@link ionic.provider:$ionicConfigProvider}, in the view's `$state` configuration, or * as an attribute on the view itself (see below). * * @usage @@ -11398,7 +12887,7 @@ function($ionicGesture, $timeout) { * * ## View LifeCycle and Events * - * Views can be cached, which means *controllers normally only load once*, which may + * Views can be cached, which means ***controllers normally only load once***, which may * affect your controller logic. To know when a view has entered or left, events * have been added that are emitted from the view's scope. These events also * contain data about the view, such as the title and whether the back button should diff --git a/www/lib/ionic/js/ionic-angular.min.js b/www/lib/ionic/js/ionic-angular.min.js index d12e856..9030fd8 100644 --- a/www/lib/ionic/js/ionic-angular.min.js +++ b/www/lib/ionic/js/ionic-angular.min.js @@ -2,7 +2,7 @@ * Copyright 2014 Drifty Co. * http://drifty.com/ * - * Ionic, v1.0.0-beta.14 + * Ionic, v1.0.0-beta.14-nightly-1102 * A powerful HTML5 mobile app framework. * http://ionicframework.com/ * @@ -12,7 +12,7 @@ * */ -!function(){function e(e,t){return[function(){return{priority:"99",link:function(n,i,o){o.$observe(e,function(e){e||i[0].removeAttribute(t)})}}}]}function t(e){return["$ionicGesture","$parse",function(t,n){var i=e.substr(2).toLowerCase();return function(o,r,a){var s=n(a[e]),c=function(e){o.$apply(function(){s(o,{$event:e})})},l=t.on(i,c,r);o.$on("$destroy",function(){t.off(l,i,c)})}}]}function n(){return["$ionicScrollDelegate",function(e){return{restrict:"E",link:function(t,n,i){function o(t){for(var i=3,o=t.target;i--&&o;){if(o.classList.contains("button")||o.tagName.match(/input|textarea|select/i)||o.isContentEditable)return;o=o.parentNode}var r=t.gesture&&t.gesture.touches[0]||t.detail.touches[0],a=n[0].getBoundingClientRect();ionic.DomUtil.rectContains(r.pageX,r.pageY,a.left,a.top-20,a.left+a.width,a.top+a.height)&&e.scrollTop(!0)}"true"!=i.noTapScroll&&(ionic.on("tap",o,n[0]),t.$on("$destroy",function(){ionic.off("tap",o,n[0])}))}}}]}function i(e){return["$document","$timeout",function(t,n){return{restrict:"E",controller:"$ionicHeaderBar",compile:function(i){function o(t,n,i,o){e?(t.$watch(function(){return n[0].className},function(e){var n=-1===e.indexOf("ng-hide"),i=-1!==e.indexOf("bar-subheader");t.$hasHeader=n&&!i,t.$hasSubheader=n&&i}),t.$on("$destroy",function(){delete t.$hasHeader,delete t.$hasSubheader}),o.align(),t.$on("$ionicHeader.align",function(){ionic.requestAnimationFrame(o.align)})):(t.$watch(function(){return n[0].className},function(e){var n=-1===e.indexOf("ng-hide"),i=-1!==e.indexOf("bar-subfooter");t.$hasFooter=n&&!i,t.$hasSubfooter=n&&i}),t.$on("$destroy",function(){delete t.$hasFooter,delete t.$hasSubfooter}),t.$watch("$hasTabs",function(e){n.toggleClass("has-tabs",!!e)}))}return i.addClass(e?"bar bar-header":"bar bar-footer"),n(function(){e&&t[0].getElementsByClassName("tabs-top").length&&i.addClass("has-tabs-top")}),{pre:o}}}}]}function o(e){return e.clientHeight}function r(e){e.stopPropagation()}var a={method:function(e,t,n){var i=!1;return function(){return i||(i=!0,t(e)),n.apply(this,arguments)}},field:function(e,t,n,i,o){var r=!1,a=function(){return r||(r=!0,t(e)),o},s=function(n){return r||(r=!0,t(e)),o=n,n};Object.defineProperty(n,i,{get:a,set:s,enumerable:!0})}},s=angular.module("ionic",["ngAnimate","ngSanitize","ui.router"]),c=angular.extend,l=angular.forEach,u=angular.isDefined,d=(angular.isNumber,angular.isString),f=angular.element;s.factory("$ionicActionSheet",["$rootScope","$compile","$animate","$timeout","$ionicTemplateLoader","$ionicPlatform","$ionicBody",function(e,t,n,i,o,r,a){function s(o){var s=e.$new(!0);angular.extend(s,{cancel:angular.noop,destructiveButtonClicked:angular.noop,buttonClicked:angular.noop,$deregisterBackButton:angular.noop,buttons:[],cancelOnStateChange:!0},o||{});var c=s.element=t('')(s),l=f(c[0].querySelector(".action-sheet-wrapper")),u=s.cancelOnStateChange?e.$on("$stateChangeSuccess",function(){s.cancel()}):angular.noop;return s.removeSheet=function(e){s.removed||(s.removed=!0,l.removeClass("action-sheet-up"),i(function(){a.removeClass("action-sheet-open")},400),s.$deregisterBackButton(),u(),n.removeClass(c,"active").then(function(){s.$destroy(),c.remove(),s.cancel.$scope=l=null,(e||angular.noop)()}))},s.showSheet=function(e){s.removed||(a.append(c).addClass("action-sheet-open"),n.addClass(c,"active").then(function(){s.removed||(e||angular.noop)()}),i(function(){s.removed||l.addClass("action-sheet-up")},20,!1))},s.$deregisterBackButton=r.registerBackButtonAction(function(){i(s.cancel)},b),s.cancel=function(){s.removeSheet(o.cancel)},s.buttonClicked=function(e){o.buttonClicked(e,o.buttons[e])===!0&&s.removeSheet()},s.destructiveButtonClicked=function(){o.destructiveButtonClicked()===!0&&s.removeSheet()},s.showSheet(),s.cancel.$scope=s,s.cancel}return{show:s}}]),f.prototype.addClass=function(e){var t,n,i,o,r,a;if(e&&"ng-scope"!=e&&"ng-isolate-scope"!=e)for(t=0;t2*Math.abs(t))return void r(e);Math.abs(t)>2*Math.abs(n)&&(f=!0);var o=a(e.gesture.center.pageX);s.onDrag(o)}}function r(e){if(h){var t=a(e.gesture.center.pageX);n.onDragEnd(t,e.gesture.velocityX),h=null}}function a(e){var t=h.startX-e,n=t/h.distance;return n}var s=c({},{getDistance:function(){return s.element.prop("offsetWidth")},onDragStart:angular.noop,onDrag:angular.noop,onDragEnd:angular.noop},n),l=ionic.onGesture("dragstart",i,t[0]),u=ionic.onGesture("drag",o,t[0]),d=ionic.onGesture("dragend",r,t[0]);e.$on("$destroy",function(){ionic.offGesture(l,"dragstart",i),ionic.offGesture(u,"drag",o),ionic.offGesture(d,"dragend",r)});var f=!1;t.on("touchmove pointermove mousemove",function(e){f&&e.preventDefault()}),t.on("touchend mouseup mouseleave",function(){f=!1});var h}return e}]),s.factory("$ionicBackdrop",["$document","$timeout",function(e,t){function n(){1===++a&&(r.addClass("visible"),ionic.requestAnimationFrame(function(){a&&r.addClass("active")}))}function i(){0===--a&&(r.removeClass("active"),t(function(){!a&&r.removeClass("visible")},400,!1))}function o(){return r}var r=f('
    '),a=0;return e[0].body.appendChild(r[0]),{retain:n,release:i,getElement:o,_element:r}}]),s.factory("$ionicBind",["$parse","$interpolate",function(e,t){var n=/^\s*([@=&])(\??)\s*(\w*)\s*$/;return function(i,o,r){l(r||{},function(r,a){var s,c,l=r.match(n)||[],u=l[3]||a,d=l[1];switch(d){case"@":if(!o[u])return;o.$observe(u,function(e){i[a]=e}),o[u]&&(i[a]=t(o[u])(i));break;case"=":if(!o[u])return;c=i.$watch(o[u],function(e){i[a]=e}),i.$on("$destroy",c);break;case"&":if(o[u]&&o[u].match(RegExp(a+"(.*?)")))throw new Error('& expression binding "'+a+'" looks like it will recursively call "'+o[u]+'" and cause a stack overflow! Please choose a different scopeName.');s=e(o[u]),i[a]=function(e){return s(i,e)}}})}}]),s.factory("$ionicBody",["$document",function(e){return{addClass:function(){for(var t=0;tthis.data.length-1)return this.afterSiblings[e-this.dataStartIndex];var t=this.getItem(e),i=this.data[e];return(t.index!==e||t.scope[this.keyExpr]!==i)&&(t.index=t.scope.$index=e,t.scope[this.keyExpr]=i,t.scope.$first=0===e,t.scope.$last=e===this.getLength()-1,t.scope.$middle=!(t.scope.$first||t.scope.$last),t.scope.$odd=!(t.scope.$even=0===(1&e)),n.$$phase||t.scope.$digest()),this.attachedItems[e]=t,t},destroyItem:function(e){e.element.remove(),e.scope.$destroy(),e.scope=null,e.element=null},detachItem:function(e){delete this.attachedItems[e.index],e.isOutside?i(e.element):this.backupItemsArray.length>=this.BACKUP_ITEMS_LENGTH?this.destroyItem(e):(this.backupItemsArray.push(e),i(e.element),ionic.Utils.disconnectScope(e.scope))},getLength:function(){return this.dimensions&&this.dimensions.length||0},setData:function(e,t,n){this.data=e||[],this.beforeSiblings=t||[],this.afterSiblings=n||[],this.calculateDataDimensions(),this.afterSiblings.forEach(function(e){e.element.css({position:"absolute",top:"0",left:"0"}),i(e.element)})}},o}]),s.factory("$collectionRepeatManager",["$rootScope","$timeout",function(){function e(e){function t(){return n.viewportSize}var n=this;this.dataSource=e.dataSource,this.element=e.element,this.scrollView=e.scrollView,this.isVertical=!!this.scrollView.options.scrollingY,this.renderedItems={},this.dimensions=[],this.setCurrentIndex(0),this.scrollView.__$callback=this.scrollView.__callback,this.scrollView.__callback=angular.bind(this,this.renderScroll),this.isVertical?(this.scrollView.options.getContentHeight=t,this.scrollValue=function(){return this.scrollView.__scrollTop},this.scrollMaxValue=function(){return this.scrollView.__maxScrollTop},this.scrollSize=function(){return this.scrollView.__clientHeight},this.secondaryScrollSize=function(){return this.scrollView.__clientWidth},this.transformString=function(e,t){return"translate3d("+t+"px,"+e+"px,0)"},this.primaryDimension=function(e){return e.height},this.secondaryDimension=function(e){return e.width}):(this.scrollView.options.getContentWidth=t,this.scrollValue=function(){return this.scrollView.__scrollLeft},this.scrollMaxValue=function(){return this.scrollView.__maxScrollLeft},this.scrollSize=function(){return this.scrollView.__clientWidth},this.secondaryScrollSize=function(){return this.scrollView.__clientHeight},this.transformString=function(e,t){return"translate3d("+e+"px,"+t+"px,0)"},this.primaryDimension=function(e){return e.width},this.secondaryDimension=function(e){return e.height})}return e.prototype={destroy:function(){this.renderedItems={},this.render=angular.noop,this.calculateDimensions=angular.noop,this.dimensions=[]},calculateDimensions:function(){function e(e){var r={primarySize:this.primaryDimension(e),secondarySize:Math.min(this.secondaryDimension(e),o)};return t&&(i+=t.secondarySize,t.primaryPos===n&&i+r.secondarySize>o&&(i=0,n+=t.primarySize)),r.primaryPos=n,r.secondaryPos=i,t=r,r}var t,n=0,i=0,o=this.secondaryScrollSize();this.dataSource.beforeSiblings&&this.dataSource.beforeSiblings.forEach(e,this);var r=n+(t?t.primarySize:0);n=i=0,t=null;var a=this.dataSource.dimensions.map(e,this),s=n+(t?t.primarySize:0);return{beforeSize:r,totalSize:s,dimensions:a}},resize:function(){var e=this.calculateDimensions();this.dimensions=e.dimensions,this.viewportSize=e.totalSize,this.beforeSize=e.beforeSize,this.setCurrentIndex(0),this.render(!0),this.dataSource.setup()},setCurrentIndex:function(e){var t=(this.dimensions[e]||{}).primaryPos||0;this.currentIndex=e,this.hasPrevIndex=e>0,this.hasPrevIndex&&(this.previousPos=Math.max(t-this.dimensions[e-1].primarySize,this.dimensions[e-1].primaryPos)),this.hasNextIndex=e+1=this.nextPos||this.hasPrevIndex&&et;)e--;else for(;(n=this.dimensions[e+1])&&n.primaryPos=this.dataSource.getLength();if(o||e){for(n in this.renderedItems)this.removeItem(n);if(o)return}for(var r,a=this.scrollValue(),s=this.scrollSize(),c=s+a,l=this.getIndexForScrollValue(this.currentIndex,a),u=Math.max(l-1,0);u>0&&(r=this.dimensions[u])&&r.primaryPos===this.dimensions[l-1].primaryPos;)u--;for(n=u;(r=this.dimensions[n])&&r.primaryPos-r.primarySizef||f>d)&&this.removeItem(f);this.setCurrentIndex(l)},renderItem:function(e,t,n){var i=this.dataSource.attachItemAtIndex(e);i&&i.element?((i.primaryPos!==t||i.secondaryPos!==n)&&(i.element.css(ionic.CSS.TRANSFORM,this.transformString(t,n)),i.primaryPos=t,i.secondaryPos=n),this.renderedItems[e]=i):delete this.renderedItems[e]},removeItem:function(e){var t=this.renderedItems[e];t&&(t.primaryPos=t.secondaryPos=null,this.dataSource.detachItem(t),delete this.renderedItems[e])}},e}]),s.factory("$ionicGesture",[function(){return{on:function(e,t,n,i){return window.ionic.onGesture(e,t,n[0],i)},off:function(e,t,n){return window.ionic.offGesture(e,t,n)}}}]),s.factory("$ionicHistory",["$rootScope","$state","$location","$window","$timeout","$ionicViewSwitcher","$ionicNavViewDelegate",function(e,t,n,i,o,r,a){function s(e){return e?L.views[e]:null}function l(e){return e?s(e.backViewId):null}function u(e){return e?s(e.forwardViewId):null}function d(e){return e?L.histories[e]:null}function f(e){var t=h(e);return L.histories[t.historyId]||(L.histories[t.historyId]={historyId:t.historyId,parentHistoryId:h(t.scope.$parent).historyId,stack:[],cursor:-1}),d(t.historyId)}function h(t){for(var n=t;n;){if(n.hasOwnProperty("$historyId"))return{historyId:n.$historyId,scope:n};n=n.$parent}return{historyId:"root",scope:e}}function p(e){L.currentView=s(e),L.backView=l(L.currentView),L.forwardView=u(L.currentView)}function v(){var e;if(t&&t.current&&t.current.name){if(e=t.current.name,t.params)for(var n in t.params)t.params.hasOwnProperty(n)&&t.params[n]&&(e+="_"+n+"="+t.params[n]);return e}return ionic.Utils.nextUid()}function g(){var e;if(t&&t.params)for(var n in t.params)t.params.hasOwnProperty(n)&&(e=e||{},e[n]=t.params[n]);return e}function m(e){return e&&e.length&&/ion-side-menus|ion-tabs/i.test(e[0].tagName)}var $,w,b,y,S="initialView",k="newView",T="moveBack",C="moveForward",I="back",B="forward",x="enter",V="exit",E="swap",A="none",D=0,L={histories:{root:{historyId:"root",parentHistoryId:null,stack:[],cursor:-1}},views:{},backView:null,forwardView:null,currentView:null},P=function(){};return P.prototype.initialize=function(e){if(e){for(var t in e)this[t]=e[t];return this}return null},P.prototype.go=function(){return this.stateName?t.go(this.stateName,this.stateParams):this.url&&this.url!==n.url()?L.backView===this?i.history.go(-1):L.forwardView===this?i.history.go(1):void n.url(this.url):null},P.prototype.destroy=function(){this.scope&&(this.scope.$destroy&&this.scope.$destroy(),this.scope=null)},{register:function(e,t){var i,a,c,u=v(),m=f(e),P=L.currentView,H=L.backView,N=L.forwardView,_=null,O=null,M=A,R=m.historyId,U=n.url();if($!==u&&($=u,D++),y)_=y.viewId,O=y.action,M=y.direction,y=null;else if(H&&H.stateId===u)_=H.viewId,R=H.historyId,O=T,H.historyId===P.historyId?M=I:P&&(M=V,i=d(H.historyId),i&&i.parentHistoryId===P.historyId?M=x:(i=d(P.historyId),i&&i.parentHistoryId===m.parentHistoryId&&(M=E)));else if(N&&N.stateId===u)_=N.viewId,R=N.historyId,O=C,N.historyId===P.historyId?M=B:P&&(M=V,P.historyId===m.parentHistoryId?M=x:(i=d(P.historyId),i&&i.parentHistoryId===m.parentHistoryId&&(M=E))),i=h(e),N.historyId&&i.scope&&(i.scope.$historyId=N.historyId,R=N.historyId);else if(P&&P.historyId!==R&&m.cursor>-1&&m.stack.length>0&&m.cursor=N.index;a--)i.stack[a].destroy(),i.stack.splice(a);R=N.historyId}m.historyId===P.historyId?M=B:P.historyId!==m.historyId&&(M=x,i=d(P.historyId),i&&i.parentHistoryId===m.parentHistoryId?M=E:(i=d(i.parentHistoryId),i&&i.historyId===m.historyId&&(M=V)))}else O=S;2>D&&(M=A),L.views[_]=this.createView({viewId:_,index:m.stack.length,historyId:m.historyId,backViewId:P&&P.viewId?P.viewId:null,forwardViewId:null,stateId:u,stateName:this.currentStateName(),stateParams:g(),url:U}),m.stack.push(L.views[_])}if(o.cancel(b),w){if(w.disableAnimate&&(M=A),w.disableBack&&(L.views[_].backViewId=null),w.historyRoot){for(a=0;a-1&&a.cursor'}).factory("$ionicLoading",["$ionicLoadingConfig","$ionicBody","$ionicTemplateLoader","$ionicBackdrop","$timeout","$q","$log","$compile","$ionicPlatform","$rootScope",function(e,t,n,i,o,r,s,l,u,d){function f(){return w||(w=n.compile({template:h,appendTo:t.get()}).then(function(e){var a=e;return e.show=function(e){var s=e.templateUrl?n.load(e.templateUrl):r.when(e.template||e.content||"");a.scope=e.scope||a.scope,this.isShown||(this.hasBackdrop=!e.noBackdrop&&e.showBackdrop!==!1,this.hasBackdrop&&(i.retain(),i.getElement().addClass("backdrop-loading"))),e.duration&&(o.cancel(this.durationTimeout),this.durationTimeout=o(angular.bind(this,this.hide),+e.duration)),b(),b=u.registerBackButtonAction(angular.noop,S),s.then(function(e){if(e){var n=a.element.children();n.html(e),l(n.contents())(a.scope)}a.isShown&&(a.element.addClass("visible"),ionic.requestAnimationFrame(function(){a.isShown&&(a.element.addClass("active"),t.addClass("loading-active"))}))}),this.isShown=!0},e.hide=function(){b(),this.isShown&&(this.hasBackdrop&&(i.release(),i.getElement().removeClass("backdrop-loading")),a.element.removeClass("active"),t.removeClass("loading-active"),setTimeout(function(){!a.isShown&&a.element.removeClass("visible")},200)),o.cancel(this.durationTimeout),this.isShown=!1},e})),w}function m(t){t=c({},e||{},t||{});var n=t.delay||t.showDelay||0;return k&&o.cancel(k),k=o(angular.noop,n),k.then(f).then(function(e){return t.hideOnStateChange&&(y=d.$on("$stateChangeSuccess",$)),e.show(t)}),{hide:a.method(p,s.error,$),show:a.method(v,s.error,function(){m(t)}),setContent:a.method(g,s.error,function(e){f().then(function(t){t.show({template:e})})})}}function $(){y(),o.cancel(k),f().then(function(e){e.hide()})}var w,b=angular.noop,y=angular.noop,k=r.when();return{show:m,hide:$,_getLoader:f}}]),s.factory("$ionicModal",["$rootScope","$ionicBody","$compile","$timeout","$ionicPlatform","$ionicTemplateLoader","$q","$log",function(e,t,n,i,o,r,a,s){var l=ionic.views.Modal.inherit({initialize:function(e){ionic.views.Modal.prototype.initialize.call(this,e),this.animation=e.animation||"slide-in-up"},show:function(e){var n=this;if(n.scope.$$destroyed)return void s.error("Cannot call "+n.viewType+".show() after remove(). Please create a new "+n.viewType+" instance.");var r=f(n.modalEl);return n.el.classList.remove("hide"),i(function(){t.addClass(n.viewType+"-open")},400),n.el.parentElement||(r.addClass(n.animation),t.append(n.el)),e&&n.positionView&&(n.positionView(e,r),ionic.on("resize",function(){ionic.off("resize",null,window),n.positionView(e,r)},window)),r.addClass("ng-enter active").removeClass("ng-leave ng-leave-active"),n._isShown=!0,n._deregisterBackButton=o.registerBackButtonAction(n.hardwareBackButtonClose?angular.bind(n,n.hide):angular.noop,w),n._isOpenPromise=a.defer(),ionic.views.Modal.prototype.show.call(n),i(function(){r.addClass("ng-enter-active"),ionic.trigger("resize"),n.scope.$parent&&n.scope.$parent.$broadcast(n.viewType+".shown",n),n.el.classList.add("active"),n.scope.$broadcast("$ionicHeader.align")},20),i(function(){n.$el.on("click",function(e){n.backdropClickToClose&&e.target===n.el&&n.hide()})},400)},hide:function(){var e=this,n=f(e.modalEl);return e.el.classList.remove("active"),n.addClass("ng-leave"),i(function(){n.addClass("ng-leave-active").removeClass("ng-enter ng-enter-active active")},20),e.$el.off("click"),e._isShown=!1,e.scope.$parent&&e.scope.$parent.$broadcast(e.viewType+".hidden",e),e._deregisterBackButton&&e._deregisterBackButton(),ionic.views.Modal.prototype.hide.call(e),e.positionView&&ionic.off("resize",null,window),i(function(){t.removeClass(e.viewType+"-open"),e.el.classList.add("hide")},e.hideDelay||320)},remove:function(){var e=this;return e.scope.$parent&&e.scope.$parent.$broadcast(e.viewType+".removed",e),e.hide().then(function(){e.scope.$destroy(),e.$el.remove()})},isShown:function(){return!!this._isShown}}),u=function(t,i){var o=i.scope&&i.scope.$new()||e.$new(!0);i.viewType=i.viewType||"modal",c(o,{$hasHeader:!1,$hasSubheader:!1,$hasFooter:!1,$hasSubfooter:!1,$hasTabs:!1,$hasTabsTop:!1});var r=n(""+t+"")(o);i.$el=r,i.el=r[0],i.modalEl=i.el.querySelector("."+i.viewType);var a=new l(i);return a.scope=o,i.scope||(o[i.viewType]=a),a};return{fromTemplate:function(e,t){var n=u(e,t||{});return n},fromTemplateUrl:function(e,t,n){var i;return angular.isFunction(t)&&(i=t,t=n),r.load(e).then(function(e){var n=u(e,t||{});return i&&i(n),n})}}}]),s.service("$ionicNavBarDelegate",ionic.DelegateService(["align","showBackButton","showBar","title","changeTitle","setTitle","getTitle","back","getPreviousTitle"])),s.service("$ionicNavViewDelegate",ionic.DelegateService(["clearCache"]));var m=100,$=150,w=200,b=300,y=400,S=500;s.provider("$ionicPlatform",function(){return{$get:["$q","$rootScope",function(e){var t={onHardwareBackButton:function(e){ionic.Platform.ready(function(){document.addEventListener("backbutton",e,!1)})},offHardwareBackButton:function(e){ionic.Platform.ready(function(){document.removeEventListener("backbutton",e)})},$backButtonActions:{},registerBackButtonAction:function(e,n,i){t._hasBackButtonHandler||(t.$backButtonActions={},t.onHardwareBackButton(t.hardwareBackButtonClick),t._hasBackButtonHandler=!0);var o={id:i?i:ionic.Utils.nextUid(),priority:n?n:0,fn:e};return t.$backButtonActions[o.id]=o,function(){delete t.$backButtonActions[o.id] -}},hardwareBackButtonClick:function(e){var n,i;for(i in t.$backButtonActions)(!n||t.$backButtonActions[i].priority>=n.priority)&&(n=t.$backButtonActions[i]);return n?(n.fn(e),n):void 0},is:function(e){return ionic.Platform.is(e)},on:function(e,t){return ionic.Platform.ready(function(){document.addEventListener(e,t,!1)}),function(){ionic.Platform.ready(function(){document.removeEventListener(e,t)})}},ready:function(t){var n=e.defer();return ionic.Platform.ready(function(){n.resolve(),t&&t()}),n.promise}};return t}]}}),s.factory("$ionicPopover",["$ionicModal","$ionicPosition","$document","$window",function(e,t,n,i){function o(e,o){var a=angular.element(e.target||e),s=t.offset(a),c=o.prop("offsetWidth"),l=o.prop("offsetHeight"),u=n[0].body.clientWidth,d=i.innerHeight,h={left:s.left+s.width/2-c/2},p=f(o[0].querySelector(".popover-arrow"));h.leftu&&(h.left=u-c-r),s.top+s.height+l>d?(h.top=s.top-l,o.addClass("popover-bottom")):(h.top=s.top+s.height,o.removeClass("popover-bottom")),p.css({left:s.left+s.width/2-p.prop("offsetWidth")/2-h.left+"px"}),o.css({top:h.top+"px",left:h.left+"px",marginLeft:"0",opacity:"1"})}var r=6,a={viewType:"popover",hideDelay:1,animation:"none",positionView:o};return{fromTemplate:function(t,n){return e.fromTemplate(t,ionic.Utils.extend(a,n||{}))},fromTemplateUrl:function(t,n){return e.fromTemplateUrl(t,ionic.Utils.extend(a,n||{}))}}}]);var k='';s.factory("$ionicPopup",["$ionicTemplateLoader","$ionicBackdrop","$q","$timeout","$rootScope","$ionicBody","$compile","$ionicPlatform",function(e,t,n,i,o,r,a,s){function l(t){t=c({scope:null,title:"",buttons:[]},t||{});var o=e.compile({template:k,scope:t.scope&&t.scope.$new(),appendTo:r.get()}),s=t.templateUrl?e.load(t.templateUrl):n.when(t.template||t.content||"");return n.all([o,s]).then(function(e){var o=e[0],r=e[1],s=n.defer();o.responseDeferred=s;var l=f(o.element[0].querySelector(".popup-body"));return r?(l.html(r),a(l.contents())(o.scope)):l.remove(),c(o.scope,{title:t.title,buttons:t.buttons,subTitle:t.subTitle,cssClass:t.cssClass,$buttonTapped:function(e,t){var n=(e.onTap||angular.noop)(t);t=t.originalEvent||t,t.defaultPrevented||s.resolve(n)}}),o.show=function(){o.isShown||(o.isShown=!0,ionic.requestAnimationFrame(function(){o.isShown&&(o.element.removeClass("popup-hidden"),o.element.addClass("popup-showing active"),h(o.element))}))},o.hide=function(e){return e=e||angular.noop,o.isShown?(o.isShown=!1,o.element.removeClass("active"),o.element.addClass("popup-hidden"),void i(e,250)):e()},o.remove=function(){o.removed||(o.hide(function(){o.element.remove(),o.scope.$destroy()}),o.removed=!0)},o})}function u(){$[0]&&$[0].responseDeferred.resolve()}function d(e){function n(e){o.then(function(t){t.removed||t.responseDeferred.resolve(e)})}var o=w._createPopup(e),a=$[0];a&&a.hide();var c=i(angular.noop,a?m.stackPushDelay:0).then(function(){return o}).then(function(e){return a||(r.addClass("popup-open"),t.retain(),w._backButtonActionDone=s.registerBackButtonAction(u,y)),$.unshift(e),e.show(),e.responseDeferred.notify({close:c.close}),e.responseDeferred.promise.then(function(n){var o=$.indexOf(e);-1!==o&&$.splice(o,1),e.remove();var a=$[0];return a?a.show():(i(function(){r.removeClass("popup-open")},400),i(function(){t.release()},m.stackPushDelay||0),(w._backButtonActionDone||angular.noop)()),n})});return c.close=n,c}function h(e){var t=e[0].querySelector("[autofocus]");t&&t.focus()}function p(e){return d(c({buttons:[{text:e.okText||"OK",type:e.okType||"button-positive",onTap:function(){return!0}}]},e||{}))}function v(e){return d(c({buttons:[{text:e.cancelText||"Cancel",type:e.cancelType||"button-default",onTap:function(){return!1}},{text:e.okText||"OK",type:e.okType||"button-positive",onTap:function(){return!0}}]},e||{}))}function g(e){var t=o.$new(!0);t.data={};var n="";return e.template&&/<[a-z][\s\S]*>/i.test(e.template)===!1&&(n=""+e.template+"",delete e.template),d(c({template:n+'',scope:t,buttons:[{text:e.cancelText||"Cancel",type:e.cancelType||"button-default",onTap:function(){}},{text:e.okText||"OK",type:e.okType||"button-positive",onTap:function(){return t.data.response||""}}]},e||{}))}var m={stackPushDelay:75},$=[],w={show:d,alert:p,confirm:v,prompt:g,_createPopup:l,_popupStack:$};return w}]),s.factory("$ionicPosition",["$document","$window",function(e,t){function n(e,n){return e.currentStyle?e.currentStyle[n]:t.getComputedStyle?t.getComputedStyle(e)[n]:e.style[n]}function i(e){return"static"===(n(e,"position")||"static")}var o=function(t){for(var n=e[0],o=t.offsetParent||n;o&&o!==n&&i(o);)o=o.offsetParent;return o||n};return{position:function(t){var n=this.offset(t),i={top:0,left:0},r=o(t[0]);r!=e[0]&&(i=this.offset(angular.element(r)),i.top+=r.clientTop-r.scrollTop,i.left+=r.clientLeft-r.scrollLeft);var a=t[0].getBoundingClientRect();return{width:a.width||t.prop("offsetWidth"),height:a.height||t.prop("offsetHeight"),top:n.top-i.top,left:n.left-i.left}},offset:function(n){var i=n[0].getBoundingClientRect();return{width:i.width||n.prop("offsetWidth"),height:i.height||n.prop("offsetHeight"),top:i.top+(t.pageYOffset||e[0].documentElement.scrollTop),left:i.left+(t.pageXOffset||e[0].documentElement.scrollLeft)}}}}]),s.service("$ionicScrollDelegate",ionic.DelegateService(["resize","scrollTop","scrollBottom","scrollTo","scrollBy","zoomTo","zoomBy","getScrollPosition","anchorScroll","getScrollView"])),s.service("$ionicSideMenuDelegate",ionic.DelegateService(["toggleLeft","toggleRight","getOpenRatio","isOpen","isOpenLeft","isOpenRight","canDragContent","edgeDragThreshold"])),s.service("$ionicSlideBoxDelegate",ionic.DelegateService(["update","slide","select","enableSlide","previous","next","stop","autoPlay","start","currentIndex","selected","slidesCount","count","loop"])),s.service("$ionicTabsDelegate",ionic.DelegateService(["select","selectedIndex"])),function(){var e=[];s.factory("$ionicTemplateCache",["$http","$templateCache","$timeout",function(t,n,i){function o(e){return"undefined"==typeof e?r():(d(e)&&(e=[e]),l(e,function(e){s.push(e)}),void(a&&r()))}function r(){if(o._runCount++,a=!0,0!==s.length){for(var e=0;4>e&&(template=s.pop());)d(template)&&t.get(template,{cache:n}),e++;s.length&&i(r,1e3)}}var a,s=e;return o._runCount=0,o}]).config(["$stateProvider","$ionicConfigProvider",function(t,n){var i=t.state;t.state=function(o,r){if("object"==typeof r){var a=r.prefetchTemplate!==!1&&e.length").html(i).contents();return n.controller&&(r=t(n.controller,c(n.locals,{$scope:a})),s.children().data("$ngControllerController",r)),n.appendTo&&f(n.appendTo).append(s),e(s)(a),{element:s,scope:a}})}return{load:a,compile:s}}]),s.factory("$ionicViewService",["$ionicHistory","$log",function(e,t){function n(e,n){t.warn("$ionicViewService"+e+" is deprecated, please use $ionicHistory"+n+" instead: http://ionicframework.com/docs/nightly/api/service/$ionicHistory/")}n("","");var i={getCurrentView:"currentView",getBackView:"backView",getForwardView:"forwardView",getCurrentStateName:"currentStateName",nextViewOptions:"nextViewOptions",clearHistory:"clearHistory"};return l(i,function(t,o){i[o]=function(){return n("."+o,"."+t),e[t].apply(this,arguments)}}),i}]),s.factory("$ionicViewSwitcher",["$timeout","$document","$q","$ionicClickBlock","$ionicConfig","$ionicNavBarDelegate",function(e,t,n,i,o,r){function a(e,t){return s(e).abstract?s(e).name:t?t.stateId||t.viewId:ionic.Utils.nextUid()}function s(e){return e&&e.$$state&&e.$$state.self||{}}function u(e,t,n,i){var r=s(e),a=v||E(t,"view-transition")||r.viewTransition||o.views.transition()||"ios",l=o.navBar.transition();return n=g||E(t,"view-direction")||r.viewDirection||n||"none",c(d(i),{transition:a,navBarTransition:"view"===l?a:l,direction:n,shouldAnimate:"none"!==a&&"none"!==n})}function d(e){return e=e||{},{viewId:e.viewId,historyId:e.historyId,stateId:e.stateId,stateName:e.stateName,stateParams:e.stateParams}}function h(e,t){return arguments.length>1?void E(e,T,t):E(e,T)}function p(e){if(e&&e.length){var t=e.scope();t&&(t.$emit("$ionicView.unloaded",e.data(k)),t.$destroy()),e.remove()}}var v,g,m="webkitTransitionEnd transitionend",$="$noCache",w="$destroyEle",b="$eleId",y="$accessed",S="$fallbackTimer",k="$viewData",T="nav-view",C="active",I="cached",B="stage",x=0;ionic.transition=ionic.transition||{},ionic.transition.isActive=!1;var V,E=ionic.DomUtil.cachedAttr,A=[],D={create:function(t,l,f,T){var V,L,P,H=++x,N={init:function(e,t){D.isTransitioning(!0),N.loadViewElements(e),N.render(e,function(){t&&t()})},loadViewElements:function(e){for(var n,i=t.getViewElements(),o=a(l,f),r=t.activeEleId(),s=0,c=i.length;c>s&&(n=i.eq(s),n.data(b)===o?n.data($)?(n.data(b,o+ionic.Utils.nextUid()),n.data(w,!0)):V=n:n.data(b)===r&&(L=n),!V||!L);s++);P=!!V,P||(V=e.ele||D.createViewEle(l),V.data(b,o)),t.activeEleId(o),e.ele=null},render:function(e,n){if(L&&ionic.Utils.disconnectScope(L.scope()),P)ionic.Utils.reconnectScope(V.scope());else{h(V,B);var i=u(l,V,e.direction,f),r=o.transitions.views[i.transition]||o.transitions.views.none;r(V,null,i.direction,!0).run(0),V.data(k,{viewId:i.viewId,historyId:i.historyId,stateName:i.stateName,stateParams:i.stateParams}),(s(l).cache===!1||"false"===s(l).cache||"false"==V.attr("cache-view")||0===o.views.maxCache())&&V.data($,!0);var a=t.appendViewElement(V,l);delete i.direction,delete i.transition,a.$emit("$ionicView.loaded",i)}V.data(y,Date.now()),n&&n()},transition:function(a,s){function p(){h(V,_.shouldAnimate?"entering":C),h(L,_.shouldAnimate?"leaving":I),_.run(1),r._instances.forEach(function(e){e.triggerTransitionStart(H)}),_.shouldAnimate||$()}function $(){$.x||($.x=!0,V.off(m,$),e.cancel(V.data(S)),L&&e.cancel(L.data(S)),N.emit("after",b,y),w.resolve(t),H===x&&(n.all(A).then(D.transitionEnd),N.cleanup(b)),r._instances.forEach(function(e){e.triggerTransitionEnd()}),v=g=f=T=V=L=null)}var w=n.defer();A.push(w.promise);var b=u(l,V,a,f),y=c(c({},b),d(T));b.transitionId=y.transitionId=H,b.fromCache=!!P,b.enableBack=!!s,E(V.parent(),"nav-view-transition",b.transition),E(V.parent(),"nav-view-direction",b.direction),e.cancel(V.data(S)),N.emit("before",b,y);var k=o.transitions.views[b.transition]||o.transitions.views.none,_=k(V,L,b.direction,b.shouldAnimate);_.shouldAnimate&&(V.on(m,$),V.data(S,e($,1e3)),i.show()),h(V,B),_.run(0),e(p,16)},emit:function(e,t,n){var i=V.scope();i&&(i.$emit("$ionicView."+e+"Enter",t),"after"==e&&i.$emit("$ionicView.enter",t)),L&&(i=L.scope(),i&&(i.$emit("$ionicView."+e+"Leave",n),"after"==e&&i.$emit("$ionicView.leave",n)))},cleanup:function(e){L&&"back"==e.direction&&!o.views.forwardCache()&&p(L);var n,i,r,a=t.getViewElements(),s=a.length,c=s-1>o.views.maxCache(),l=Date.now();for(n=0;s>n;n++)i=a.eq(n),c&&i.data(y)t&&(e=t+(g-m-5)),e},h.titleTextX=function(){return t[0].offsetWidth/2-h.titleWidth()/2},h.titleLeftRight=function(){return g-m},h.backButtonTextLeft=function(){for(var e=0,t=a(c);t;)e+=t.offsetLeft,t=t.parentElement;return e},h.resetBackButton=function(){if(o.backButton.previousTitleText()){var e=a(d);if(e){e.classList.remove(f);var t=r.backTitle();t!==v&&(v=e.innerHTML=t)}var n=a(u);n&&n.classList.remove(f)}},h.align=function(e){var i=a(s);e=e||n.alignTitle||o.navBar.alignTitle();var r=h.calcWidths(e,!1);if(b&&v&&o.backButton.previousTitleText()){var c=h.calcWidths(e,!0),l=t[0].offsetWidth-c.titleLeft-c.titleRight;h.titleTextWidth()<=l&&(r=c)}return h.updatePositions(i,r.titleLeft,r.titleRight,r.buttonsLeft,r.buttonsRight,r.css,r.showPrevTitle)},h.calcWidths=function(e,n){var i,o,r,h,p,v,g,m,$,w=a(s),y=a(l),S=t[0].childNodes,k=0,T=0,C=0,I=0,B="",x=0;for(i=0;i10&&(C=I=V)}return{backButtonWidth:x,buttonsLeft:k,buttonsRight:T,titleLeft:C,titleRight:I,showPrevTitle:n,css:B}},h.updatePositions=function(e,n,r,s,c,l,p){var v=i.defer();if(e&&(n!==g&&(e.style.left=n?n+"px":"",g=n),r!==m&&(e.style.right=r?r+"px":"",m=r),l!==$&&(l&&e.classList.add(l),$&&e.classList.remove($),$=l)),o.backButton.previousTitleText()){var w=a(d),b=a(u);w&&w.classList[p?"remove":"add"](f),b&&b.classList[p?"add":"remove"](f)}return ionic.requestAnimationFrame(function(){if(e&&e.offsetWidth+10i?n:i,r!==m&&(e.style.right=r+"px",m=r)}v.resolve()}),v.promise},h.setCss=function(e,t){ionic.DomUtil.cachedStyles(a(e),t)};var T={};e.$on("$destroy",function(){for(var e in T)T[e]=null})}]),s.service("$ionicListDelegate",ionic.DelegateService(["showReorder","showDelete","canSwipeItems","closeOptionButtons"])).controller("$ionicList",["$scope","$attrs","$ionicListDelegate","$ionicHistory",function(e,t,n,i){var o=this,r=!0,a=!1,s=!1,c=n._registerInstance(o,t.delegateHandle,function(){return i.isActiveScope(e)});e.$on("$destroy",c),o.showReorder=function(e){return arguments.length&&(a=!!e),a},o.showDelete=function(e){return arguments.length&&(s=!!e),s},o.canSwipeItems=function(e){return arguments.length&&(r=!!e),r},o.closeOptionButtons=function(){o.listView&&o.listView.clearDragEffects()}}]),s.controller("$ionicNavBar",["$scope","$element","$attrs","$compile","$timeout","$ionicNavBarDelegate","$ionicConfig","$ionicHistory",function(e,t,n,i,o,r,a,s){function c(e,t){var n=console.warn||console.log;n&&n("navBarController."+e+" is deprecated, please use "+t+" instead")}function d(e){return B[e]?f(B[e]):void 0}function h(){for(var e=0;e'),h.append(v)),t==S?v.append(e):v.prepend(e)):(p||(p=f('
    '),m[k]?m[k].after(p):h.prepend(p)),t==S?p.append(e):p.prepend(e)))}var s=f('