From 56799eaefe3dc98fd58665ddcbf3bb5bc3dedc4c Mon Sep 17 00:00:00 2001 From: tliero Date: Mon, 7 Mar 2016 17:06:19 +0100 Subject: [PATCH] showing transactions, next step: CRUD --- .../de/tilman/transactions/Application.java | 44 + .../transactions/SecurityConfiguration.java | 9 +- .../tilman/transactions/domain/Category.java | 3 +- .../repository/CategoryRepository.java | 4 +- .../repository/TransactionRepository.java | 19 +- .../repository/UserRepository.java | 4 + src/main/resources/static/css/app.css | 31 + src/main/resources/static/favicon.ico | Bin 0 -> 32988 bytes src/main/resources/static/icon-grey.png | Bin 0 -> 4686 bytes src/main/resources/static/icon.png | Bin 0 -> 5601 bytes src/main/resources/static/icon.svg | 2560 +++++++++++++++++ src/main/resources/static/index.html | 24 + .../static/js/angular-resource.min.js | 13 + .../resources/static/js/angular-route.min.js | 15 + src/main/resources/static/js/angular.min.js | 293 ++ src/main/resources/static/js/app.js | 13 + src/main/resources/static/js/controllers.js | 81 + .../static/partials/transaction-details.html | 20 + .../static/partials/transaction-list.html | 40 + 19 files changed, 3158 insertions(+), 15 deletions(-) create mode 100644 src/main/resources/static/css/app.css create mode 100644 src/main/resources/static/favicon.ico create mode 100644 src/main/resources/static/icon-grey.png create mode 100644 src/main/resources/static/icon.png create mode 100644 src/main/resources/static/icon.svg create mode 100644 src/main/resources/static/index.html create mode 100644 src/main/resources/static/js/angular-resource.min.js create mode 100644 src/main/resources/static/js/angular-route.min.js create mode 100644 src/main/resources/static/js/angular.min.js create mode 100644 src/main/resources/static/js/app.js create mode 100644 src/main/resources/static/js/controllers.js create mode 100644 src/main/resources/static/partials/transaction-details.html create mode 100644 src/main/resources/static/partials/transaction-list.html diff --git a/src/main/java/de/tilman/transactions/Application.java b/src/main/java/de/tilman/transactions/Application.java index 0517cd4..afe69eb 100644 --- a/src/main/java/de/tilman/transactions/Application.java +++ b/src/main/java/de/tilman/transactions/Application.java @@ -1,7 +1,20 @@ package de.tilman.transactions; +import javax.annotation.PostConstruct; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.context.SecurityContextHolder; + +import de.tilman.transactions.domain.Account; +import de.tilman.transactions.domain.User; +import de.tilman.transactions.repository.AccountRepository; +import de.tilman.transactions.repository.UserRepository; @SpringBootApplication public class Application { @@ -9,5 +22,36 @@ public class Application { public static void main(String[] args) { SpringApplication.run(Application.class); } + + private static final Logger log = LoggerFactory.getLogger(Application.class); + + @Autowired UserRepository userRepository; + @Autowired AccountRepository accountRepository; + + + // XXX for dev + @PostConstruct + public void init() { + + /** + * Due to method-level protections the security context must be loaded + * with an authentication token containing the necessary privileges. + */ + SecurityContextHolder.getContext().setAuthentication( + new UsernamePasswordAuthenticationToken("system", "system", AuthorityUtils.createAuthorityList("ROLE_ADMIN", "ROLE_USER"))); + + log.info("Users:"); + for (User user : userRepository.findAll()) { + log.info(user.getId() + ", " + user.getName()); + } + + log.info("Accounts:"); + for (Account account : accountRepository.findAll()) { + log.info(account.getId() + ", " + account.getName() /* + ", " + account.getOwner().getName() */); + } + + SecurityContextHolder.clearContext(); + } + } diff --git a/src/main/java/de/tilman/transactions/SecurityConfiguration.java b/src/main/java/de/tilman/transactions/SecurityConfiguration.java index 5d8bcde..8989491 100644 --- a/src/main/java/de/tilman/transactions/SecurityConfiguration.java +++ b/src/main/java/de/tilman/transactions/SecurityConfiguration.java @@ -1,6 +1,7 @@ package de.tilman.transactions; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @@ -23,12 +24,12 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { // Basis-Schutz: Nur autorisierte Zugriffe (feingranulare Steuerung über Assertions) http.authorizeRequests() - //.antMatchers(HttpMethod.GET, "/public/**").permitAll() + .antMatchers(HttpMethod.GET, "/public/**").permitAll() .anyRequest().authenticated(); - http.httpBasic(); - //http.formLogin(); +// http.httpBasic(); // XXX mit HTTP Basic Auth funktioniert der Logout nicht richtig + http.formLogin(); - http.csrf().disable(); + http.csrf().disable(); // XXX später wieder aktivieren } } diff --git a/src/main/java/de/tilman/transactions/domain/Category.java b/src/main/java/de/tilman/transactions/domain/Category.java index 190775a..84320d2 100644 --- a/src/main/java/de/tilman/transactions/domain/Category.java +++ b/src/main/java/de/tilman/transactions/domain/Category.java @@ -1,5 +1,6 @@ package de.tilman.transactions.domain; +import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @@ -12,7 +13,7 @@ public class Category { @GeneratedValue private Long id; - @ManyToOne + @ManyToOne(optional = false, cascade = CascadeType.ALL) private Account account; private String name; diff --git a/src/main/java/de/tilman/transactions/repository/CategoryRepository.java b/src/main/java/de/tilman/transactions/repository/CategoryRepository.java index d8f6885..5702c3c 100644 --- a/src/main/java/de/tilman/transactions/repository/CategoryRepository.java +++ b/src/main/java/de/tilman/transactions/repository/CategoryRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.query.Param; +import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.security.access.prepost.PreAuthorize; import de.tilman.transactions.domain.Category; @@ -13,7 +14,8 @@ import de.tilman.transactions.domain.Category; public interface CategoryRepository extends PagingAndSortingRepository { // TODO How to prevent users from retrieving/changing categories of other user's accounts? - // http://localhost:8080/categories/search/findByAccountIdOrderByPositionAsc?accountId=1 + // http://localhost:8080/categories/search/listForAccount?accountId=1 + @RestResource(path = "listForAccount") List findByAccountIdOrderByPositionAsc(@Param("accountId") Long accountId); @PreAuthorize("hasRole('ROLE_ADMIN')") diff --git a/src/main/java/de/tilman/transactions/repository/TransactionRepository.java b/src/main/java/de/tilman/transactions/repository/TransactionRepository.java index e04d289..fa2805d 100644 --- a/src/main/java/de/tilman/transactions/repository/TransactionRepository.java +++ b/src/main/java/de/tilman/transactions/repository/TransactionRepository.java @@ -8,21 +8,22 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.query.Param; import org.springframework.data.rest.core.annotation.RestResource; -import org.springframework.security.access.prepost.PreAuthorize; import de.tilman.transactions.domain.Transaction; public interface TransactionRepository extends PagingAndSortingRepository { - // TODO How to prevent loading transactions from other user's accounts? - // --> Solution? http://stackoverflow.com/a/21577081/3761783 - @PreAuthorize("isFullyAuthenticated() && (#username == principal.username)") - @Query("SELECT t FROM Transaction t INNER JOIN t.account a WHERE a.id = :accountId AND t.description like :prefix%") - List getDescriptions(@Param("accountId") Long accountId, @Param("prefix") String prefix); - - List findFirst10ByAccountIdOrderByDateDesc(@Param("accountId") Long accountId); - @RestResource(exported = false) Page findAll(Pageable pageable); + + @RestResource(path = "last10") + List findFirst10ByAccountIdOrderByDateDesc(@Param("accountId") Long accountId); + + // TODO How to prevent loading transactions from other user's accounts? --> Solution? http://stackoverflow.com/a/21577081/3761783 + // http://localhost:8080/transactions/search/descriptions?accountId=1&prefix=Kan + // http://localhost:8080/transactions/search/descriptions?accountId=1&prefix=C&size=2 + @RestResource(path = "descriptions") + @Query("SELECT t FROM Transaction t INNER JOIN t.account a WHERE a.id = :accountId AND t.description LIKE :prefix% ORDER BY t.date DESC") + Page getDescriptionsByAccount(@Param("accountId") Long accountId, @Param("prefix") String prefix, Pageable pageable); } diff --git a/src/main/java/de/tilman/transactions/repository/UserRepository.java b/src/main/java/de/tilman/transactions/repository/UserRepository.java index 17997fc..b2658cb 100644 --- a/src/main/java/de/tilman/transactions/repository/UserRepository.java +++ b/src/main/java/de/tilman/transactions/repository/UserRepository.java @@ -5,6 +5,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.query.Param; +import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.security.access.prepost.PreAuthorize; import de.tilman.transactions.domain.User; @@ -27,4 +28,7 @@ public interface UserRepository extends PagingAndSortingRepository { @PreAuthorize("hasRole('ROLE_ADMIN')") public Page findAll(Pageable pageable); + @RestResource(exported = false) + User findByName(String name); + } \ No newline at end of file diff --git a/src/main/resources/static/css/app.css b/src/main/resources/static/css/app.css new file mode 100644 index 0000000..4074932 --- /dev/null +++ b/src/main/resources/static/css/app.css @@ -0,0 +1,31 @@ +body { + padding-top: 20px; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; +} + +.inputTable { + margin: auto; + margin-top: 2em; + border: none; +} + +.listing { + margin: auto; + margin-top: 2em; + font-size: 80%; + border: none; + border-collapse: collapse; +} + +.listing td, th { + border: 1px solid black; + padding: 3px; +} + +.credit { + background-color: #ccddff; +} + +.clickable { + cursor: pointer; +} \ No newline at end of file diff --git a/src/main/resources/static/favicon.ico b/src/main/resources/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..99810a02bd6cc6503b8c974262ff15a05d62a517 GIT binary patch literal 32988 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/static/icon-grey.png b/src/main/resources/static/icon-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7dfa1b3a1c44b6a8fb92be03a56b530c1cc4c2 GIT binary patch literal 4686 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 Q*Z=?k07*qoM6N<$f{!TwCIA2c literal 0 HcmV?d00001 diff --git a/src/main/resources/static/icon.png b/src/main/resources/static/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e403ac6d17eb30fe19efd81da83a0845df4f7848 GIT binary patch literal 5601 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/static/icon.svg b/src/main/resources/static/icon.svg new file mode 100644 index 0000000..74f9ae1 --- /dev/null +++ b/src/main/resources/static/icon.svg @@ -0,0 +1,2560 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + 10 + 10 + + 10 + + + + + + + 10 + 10 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + 10 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + 10 + + 10 + + + + + + + 10 + 10 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html new file mode 100644 index 0000000..688661e --- /dev/null +++ b/src/main/resources/static/index.html @@ -0,0 +1,24 @@ + + + + + + +Transactions + + + + + + + + + + + + + +
+ + + \ No newline at end of file diff --git a/src/main/resources/static/js/angular-resource.min.js b/src/main/resources/static/js/angular-resource.min.js new file mode 100644 index 0000000..8a4729d --- /dev/null +++ b/src/main/resources/static/js/angular-resource.min.js @@ -0,0 +1,13 @@ +/* + AngularJS v1.4.6 + (c) 2010-2015 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(I,f,C){'use strict';function D(t,e){e=e||{};f.forEach(e,function(f,k){delete e[k]});for(var k in t)!t.hasOwnProperty(k)||"$"===k.charAt(0)&&"$"===k.charAt(1)||(e[k]=t[k]);return e}var y=f.$$minErr("$resource"),B=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;f.module("ngResource",["ng"]).provider("$resource",function(){var t=/^https?:\/\/[^\/]*/,e=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(k,F){function w(f,g){this.template=f;this.defaults=r({},e.defaults,g);this.urlParams={}}function z(l,g,s,h){function c(b,q){var c={};q=r({},g,q);u(q,function(a,q){x(a)&&(a=a());var m;if(a&&a.charAt&&"@"==a.charAt(0)){m=b;var d=a.substr(1);if(null==d||""===d||"hasOwnProperty"===d||!B.test("."+d))throw y("badmember",d);for(var d=d.split("."),n=0,g=d.length;n").append(b).html();try{return b[0].nodeType===Pa?I(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+I(b)})}catch(d){return I(c)}}function wc(b){try{return decodeURIComponent(b)}catch(a){}}function xc(b){var a={};n((b||"").split("&"),function(b){var d,e,f;b&&(e= +b=b.replace(/\+/g,"%20"),d=b.indexOf("="),-1!==d&&(e=b.substring(0,d),f=b.substring(d+1)),e=wc(e),x(e)&&(f=x(f)?wc(f):!0,Na.call(a,e)?K(a[e])?a[e].push(f):a[e]=[a[e],f]:a[e]=f))});return a}function Pb(b){var a=[];n(b,function(b,d){K(b)?n(b,function(b){a.push(ma(d,!0)+(!0===b?"":"="+ma(b,!0)))}):a.push(ma(d,!0)+(!0===b?"":"="+ma(b,!0)))});return a.length?a.join("&"):""}function nb(b){return ma(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ma(b,a){return encodeURIComponent(b).replace(/%40/gi, +"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,a?"%20":"+")}function Yd(b,a){var c,d,e=Qa.length;for(d=0;d/,">"));}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);c.debugInfoEnabled&&a.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);a.unshift("ng");d=eb(a,c.strictDi);d.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector", +d);c(b)(a)})}]);return d},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;N&&e.test(N.name)&&(c.debugInfoEnabled=!0,N.name=N.name.replace(e,""));if(N&&!f.test(N.name))return d();N.name=N.name.replace(f,"");aa.resumeBootstrap=function(b){n(b,function(b){a.push(b)});return d()};B(aa.resumeDeferredBootstrap)&&aa.resumeDeferredBootstrap()}function $d(){N.name="NG_ENABLE_DEBUG_INFO!"+N.name;N.location.reload()}function ae(b){b=aa.element(b).injector();if(!b)throw Ea("test");return b.get("$$testability")} +function zc(b,a){a=a||"_";return b.replace(be,function(b,d){return(d?a:"")+b.toLowerCase()})}function ce(){var b;if(!Ac){var a=ob();la=N.jQuery;x(a)&&(la=null===a?u:N[a]);la&&la.fn.on?(z=la,Q(la.fn,{scope:Ra.scope,isolateScope:Ra.isolateScope,controller:Ra.controller,injector:Ra.injector,inheritedData:Ra.inheritedData}),b=la.cleanData,la.cleanData=function(a){var d;if(Qb)Qb=!1;else for(var e=0,f;null!=(f=a[e]);e++)(d=la._data(f,"events"))&&d.$destroy&&la(f).triggerHandler("$destroy");b(a)}):z=R;aa.element= +z;Ac=!0}}function pb(b,a,c){if(!b)throw Ea("areq",a||"?",c||"required");return b}function Sa(b,a,c){c&&K(b)&&(b=b[b.length-1]);pb(B(b),a,"not a function, got "+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function Ta(b,a){if("hasOwnProperty"===b)throw Ea("badname",a);}function Bc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g")+d[2];for(d=d[0];d--;)c=c.lastChild;f=cb(f,c.childNodes);c=e.firstChild;c.textContent=""}else f.push(a.createTextNode(b));e.textContent="";e.innerHTML="";n(f,function(a){e.appendChild(a)});return e}function R(b){if(b instanceof R)return b;var a;H(b)&&(b=T(b),a=!0);if(!(this instanceof R)){if(a&&"<"!=b.charAt(0))throw Tb("nosel");return new R(b)}if(a){a=W;var c;b=(c=Df.exec(b))?[a.createElement(c[1])]: +(c=Lc(b,a))?c.childNodes:[]}Mc(this,b)}function Ub(b){return b.cloneNode(!0)}function tb(b,a){a||ub(b);if(b.querySelectorAll)for(var c=b.querySelectorAll("*"),d=0,e=c.length;dk&&this.remove(s.key); +return b}},get:function(a){if(k").parent()[0])});var f=S(a,b,a,c,d,e);V.$$addScopeClass(a);var g=null;return function(b,c,d){pb(b,"scope");d=d||{}; +var e=d.parentBoundTranscludeFn,h=d.transcludeControllers;d=d.futureParentElement;e&&e.$$boundTransclude&&(e=e.$$boundTransclude);g||(g=(d=d&&d[0])?"foreignobject"!==ta(d)&&d.toString().match(/SVG/)?"svg":"html":"html");d="html"!==g?z(Xb(g,z("
").append(a).html())):c?Ra.clone.call(a):a;if(h)for(var k in h)d.data("$"+k+"Controller",h[k].instance);V.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,e);return d}}function S(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,s,t,O;if(p)for(O=Array(c.length),m=0;m< +h.length;m+=3)f=h[m],O[f]=c[f];else O=c;m=0;for(s=h.length;mC.priority)break;if(v=C.scope)C.templateUrl||(D(v)?(N("new/isolated scope",P||S,C,ba),P=C):N("new/isolated scope", +P,C,ba)),S=S||C;x=C.name;!C.templateUrl&&C.controller&&(v=C.controller,w=w||ga(),N("'"+x+"' controller",w[x],C,ba),w[x]=C);if(v=C.transclude)n=!0,C.$$tlb||(N("transclusion",A,C,ba),A=C),"element"==v?(r=!0,J=C.priority,v=ba,ba=d.$$element=z(W.createComment(" "+x+": "+d[x]+" ")),b=ba[0],U(f,xa.call(v,0),b),y=V(v,e,J,g&&g.name,{nonTlbTranscludeDirective:A})):(v=z(Ub(b)).contents(),ba.empty(),y=V(v,e));if(C.template)if(M=!0,N("template",F,C,ba),F=C,v=B(C.template)?C.template(ba,d):C.template,v=fa(v), +C.replace){g=C;v=Sb.test(v)?Yc(Xb(C.templateNamespace,T(v))):[];b=v[0];if(1!=v.length||b.nodeType!==pa)throw ea("tplrt",x,"");U(f,ba,b);G={$attr:{}};v=ha(b,[],G);var Q=a.splice(wa+1,a.length-(wa+1));P&&Zc(v);a=a.concat(v).concat(Q);$c(d,G);G=a.length}else ba.html(v);if(C.templateUrl)M=!0,N("template",F,C,ba),F=C,C.replace&&(g=C),L=Lf(a.splice(wa,a.length-wa),ba,d,f,n&&y,h,k,{controllerDirectives:w,newScopeDirective:S!==C&&S,newIsolateScopeDirective:P,templateDirective:F,nonTlbTranscludeDirective:A}), +G=a.length;else if(C.compile)try{za=C.compile(ba,d,y),B(za)?s(null,za,Bb,I):za&&s(za.pre,za.post,Bb,I)}catch(R){c(R,ua(ba))}C.terminal&&(L.terminal=!0,J=Math.max(J,C.priority))}L.scope=S&&!0===S.scope;L.transcludeOnThisElement=n;L.templateOnThisElement=M;L.transclude=y;m.hasElementTranscludeDirective=r;return L}function Zc(a){for(var b=0,c=a.length;bm.priority)&&-1!=m.restrict.indexOf(f)&&(k&&(m=Nb(m,{$$start:k,$$end:l})),b.push(m),h=m)}catch(J){c(J)}}return h}function G(b){if(e.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,f=c.length;d"+b+"";return c.childNodes[0].childNodes;default:return b}}function R(a,b){if("srcdoc"==b)return M.HTML;var c=ta(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return M.RESOURCE_URL}function X(a,c,d,e, +f){var g=R(a,e);f=h[e]||f;var l=b(d,!0,g,f);if(l){if("multiple"===e&&"select"===ta(a))throw ea("selmulti",ua(a));c.push({priority:100,compile:function(){return{pre:function(a,c,h){c=h.$$observers||(h.$$observers={});if(k.test(e))throw ea("nodomevents");var m=h[e];m!==d&&(l=m&&b(m,!0,g,f),d=m);l&&(h[e]=l(a),(c[e]||(c[e]=[])).$$inter=!0,(h.$$observers&&h.$$observers[e].$$scope||a).$watch(l,function(a,b){"class"===e&&a!=b?h.$updateClass(a,b):h.$set(e,a)}))}}}})}}function U(a,b,c){var d=b[0],e=b.length, +f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=a)return b;for(;a--;)8===b[a].nodeType&&Mf.call(b,a,1);return b}function Xe(){var b={},a=!1;this.register=function(a,d){Ta(a,"controller");D(a)?Q(b,a):b[a]=d};this.allowGlobals=function(){a=!0};this.$get=["$injector","$window",function(c,d){function e(a,b,c,d){if(!a||!D(a.$scope))throw G("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,h,l){var k,m,q;h=!0===h;l&&H(l)&&(q=l);if(H(f)){l=f.match(Vc);if(!l)throw Nf("ctrlfmt",f);m=l[1];q=q||l[3];f=b.hasOwnProperty(m)?b[m]:Bc(g.$scope, +m,!0)||(a?Bc(d,m,!0):u);Sa(f,m,!0)}if(h)return h=(K(f)?f[f.length-1]:f).prototype,k=Object.create(h||null),q&&e(g,q,k,m||f.name),Q(function(){var a=c.invoke(f,k,g,m);a!==k&&(D(a)||B(a))&&(k=a,q&&e(g,q,k,m||f.name));return k},{instance:k,identifier:q});k=c.instantiate(f,g,m);q&&e(g,q,k,m||f.name);return k}}]}function Ye(){this.$get=["$window",function(b){return z(b.document)}]}function Ze(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function Yb(b){return D(b)? +ca(b)?b.toISOString():db(b):b}function df(){this.$get=function(){return function(b){if(!b)return"";var a=[];mc(b,function(b,d){null===b||y(b)||(K(b)?n(b,function(b,c){a.push(ma(d)+"="+ma(Yb(b)))}):a.push(ma(d)+"="+ma(Yb(b))))});return a.join("&")}}}function ef(){this.$get=function(){return function(b){function a(b,e,f){null===b||y(b)||(K(b)?n(b,function(b,c){a(b,e+"["+(D(b)?c:"")+"]")}):D(b)&&!ca(b)?mc(b,function(b,c){a(b,e+(f?"":"[")+c+(f?"":"]"))}):c.push(ma(e)+"="+ma(Yb(b))))}if(!b)return"";var c= +[];a(b,"",!0);return c.join("&")}}}function Zb(b,a){if(H(b)){var c=b.replace(Of,"").trim();if(c){var d=a("Content-Type");(d=d&&0===d.indexOf(bd))||(d=(d=c.match(Pf))&&Qf[d[0]].test(c));d&&(b=uc(c))}}return b}function cd(b){var a=ga(),c;H(b)?n(b.split("\n"),function(b){c=b.indexOf(":");var e=I(T(b.substr(0,c)));b=T(b.substr(c+1));e&&(a[e]=a[e]?a[e]+", "+b:b)}):D(b)&&n(b,function(b,c){var f=I(c),g=T(b);f&&(a[f]=a[f]?a[f]+", "+g:g)});return a}function dd(b){var a;return function(c){a||(a=cd(b));return c? +(c=a[I(c)],void 0===c&&(c=null),c):a}}function ed(b,a,c,d){if(B(d))return d(b,a,c);n(d,function(d){b=d(b,a,c)});return b}function cf(){var b=this.defaults={transformResponse:[Zb],transformRequest:[function(a){return D(a)&&"[object File]"!==sa.call(a)&&"[object Blob]"!==sa.call(a)&&"[object FormData]"!==sa.call(a)?db(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ia($b),put:ia($b),patch:ia($b)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"}, +a=!1;this.useApplyAsync=function(b){return x(b)?(a=!!b,this):a};var c=!0;this.useLegacyPromiseExtensions=function(a){return x(a)?(c=!!a,this):c};var d=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(e,f,g,h,l,k){function m(a){function d(a){var b=Q({},a);b.data=a.data?ed(a.data,a.headers,a.status,f.transformResponse):a.data;a=a.status;return 200<=a&&300>a?b:l.reject(b)}function e(a,b){var c,d={};n(a,function(a,e){B(a)?(c=a(b),null!= +c&&(d[e]=c)):d[e]=a});return d}if(!aa.isObject(a))throw G("$http")("badreq",a);var f=Q({method:"get",transformRequest:b.transformRequest,transformResponse:b.transformResponse,paramSerializer:b.paramSerializer},a);f.headers=function(a){var c=b.headers,d=Q({},a.headers),f,g,h,c=Q({},c.common,c[I(a.method)]);a:for(f in c){g=I(f);for(h in d)if(I(h)===g)continue a;d[f]=c[f]}return e(d,ia(a))}(a);f.method=rb(f.method);f.paramSerializer=H(f.paramSerializer)?k.get(f.paramSerializer):f.paramSerializer;var g= +[function(a){var c=a.headers,e=ed(a.data,dd(c),u,a.transformRequest);y(e)&&n(c,function(a,b){"content-type"===I(b)&&delete c[b]});y(a.withCredentials)&&!y(b.withCredentials)&&(a.withCredentials=b.withCredentials);return q(a,e).then(d,d)},u],h=l.when(f);for(n(E,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){a=g.shift();var m=g.shift(),h=h.then(a,m)}c?(h.success=function(a){Sa(a,"fn");h.then(function(b){a(b.data, +b.status,b.headers,f)});return h},h.error=function(a){Sa(a,"fn");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=fd("success"),h.error=fd("error"));return h}function q(c,d){function g(b,c,d,e){function f(){k(c,b,d,e)}F&&(200<=b&&300>b?F.put(P,[b,c,cd(d),e]):F.remove(P));a?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function k(a,b,d,e){b=Math.max(b,0);(200<=b&&300>b?O.resolve:O.reject)({data:a,status:b,headers:dd(d),config:c,statusText:e})}function q(a){k(a.data,a.status, +ia(a.headers()),a.statusText)}function E(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a,1)}var O=l.defer(),J=O.promise,F,n,S=c.headers,P=s(c.url,c.paramSerializer(c.params));m.pendingRequests.push(c);J.then(E,E);!c.cache&&!b.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(F=D(c.cache)?c.cache:D(b.cache)?b.cache:t);F&&(n=F.get(P),x(n)?n&&B(n.then)?n.then(q,q):K(n)?k(n[1],n[0],ia(n[2]),n[3]):k(n,200,{},"OK"):F.put(P,J));y(n)&&((n=gd(c.url)?f()[c.xsrfCookieName|| +b.xsrfCookieName]:u)&&(S[c.xsrfHeaderName||b.xsrfHeaderName]=n),e(c.method,P,d,g,S,c.timeout,c.withCredentials,c.responseType));return J}function s(a,b){0=l&&(w.resolve(E),t(p.$$intervalId),delete f[p.$$intervalId]);L||b.$apply()},h);f[p.$$intervalId]=w;return p}var f={};e.cancel=function(b){return b&& +b.$$intervalId in f?(f[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete f[b.$$intervalId],!0):!1};return e}]}function ac(b){b=b.split("/");for(var a=b.length;a--;)b[a]=nb(b[a]);return b.join("/")}function hd(b,a){var c=Aa(b);a.$$protocol=c.protocol;a.$$host=c.hostname;a.$$port=Y(c.port)||Tf[c.protocol]||null}function id(b,a){var c="/"!==b.charAt(0);c&&(b="/"+b);var d=Aa(b);a.$$path=decodeURIComponent(c&&"/"===d.pathname.charAt(0)?d.pathname.substring(1):d.pathname);a.$$search= +xc(d.search);a.$$hash=decodeURIComponent(d.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function ra(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Ja(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Cb(b){return b.replace(/(#.+)|#$/,"$1")}function bc(b,a,c){this.$$html5=!0;c=c||"";hd(b,this);this.$$parse=function(b){var c=ra(a,b);if(!H(c))throw Db("ipthprfx",b,a);id(c,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var b= +Pb(this.$$search),c=this.$$hash?"#"+nb(this.$$hash):"";this.$$url=ac(this.$$path)+(b?"?"+b:"")+c;this.$$absUrl=a+this.$$url.substr(1)};this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;(f=ra(b,d))!==u?(g=f,g=(f=ra(c,f))!==u?a+(ra("/",f)||f):b+g):(f=ra(a,d))!==u?g=a+f:a==d+"/"&&(g=a);g&&this.$$parse(g);return!!g}}function cc(b,a,c){hd(b,this);this.$$parse=function(d){var e=ra(b,d)||ra(a,d),f;y(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",y(e)&&(b=d,this.replace())): +(f=ra(c,e),y(f)&&(f=e));id(f,this);d=this.$$path;var e=b,g=/^\/[A-Z]:(\/.*)/;0===f.indexOf(e)&&(f=f.replace(e,""));g.exec(f)||(d=(f=g.exec(d))?f[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var a=Pb(this.$$search),e=this.$$hash?"#"+nb(this.$$hash):"";this.$$url=ac(this.$$path)+(a?"?"+a:"")+e;this.$$absUrl=b+(this.$$url?c+this.$$url:"")};this.$$parseLinkUrl=function(a,c){return Ja(b)==Ja(a)?(this.$$parse(a),!0):!1}}function jd(b,a,c){this.$$html5=!0;cc.apply(this,arguments);this.$$parseLinkUrl= +function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;b==Ja(d)?f=d:(g=ra(a,d))?f=b+c+g:a===d+"/"&&(f=a);f&&this.$$parse(f);return!!f};this.$$compose=function(){var a=Pb(this.$$search),e=this.$$hash?"#"+nb(this.$$hash):"";this.$$url=ac(this.$$path)+(a?"?"+a:"")+e;this.$$absUrl=b+c+this.$$url}}function Eb(b){return function(){return this[b]}}function kd(b,a){return function(c){if(y(c))return this[b];this[b]=a(c);this.$$compose();return this}}function gf(){var b="",a={enabled:!1,requireBase:!0, +rewriteLinks:!0};this.hashPrefix=function(a){return x(a)?(b=a,this):b};this.html5Mode=function(b){return ab(b)?(a.enabled=b,this):D(b)?(ab(b.enabled)&&(a.enabled=b.enabled),ab(b.requireBase)&&(a.requireBase=b.requireBase),ab(b.rewriteLinks)&&(a.rewriteLinks=b.rewriteLinks),this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(c,d,e,f,g){function h(a,b,c){var e=k.url(),f=k.$$state;try{d.url(a,b,c),k.$$state=d.state()}catch(g){throw k.url(e),k.$$state=f,g;}}function l(a, +b){c.$broadcast("$locationChangeSuccess",k.absUrl(),a,k.$$state,b)}var k,m;m=d.baseHref();var q=d.url(),s;if(a.enabled){if(!m&&a.requireBase)throw Db("nobase");s=q.substring(0,q.indexOf("/",q.indexOf("//")+2))+(m||"/");m=e.history?bc:jd}else s=Ja(q),m=cc;var t=s.substr(0,Ja(s).lastIndexOf("/")+1);k=new m(s,t,"#"+b);k.$$parseLinkUrl(q,q);k.$$state=d.state();var E=/^\s*(javascript|mailto):/i;f.on("click",function(b){if(a.rewriteLinks&&!b.ctrlKey&&!b.metaKey&&!b.shiftKey&&2!=b.which&&2!=b.button){for(var e= +z(b.target);"a"!==ta(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),l=e.attr("href")||e.attr("xlink:href");D(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=Aa(h.animVal).href);E.test(h)||!h||e.attr("target")||b.isDefaultPrevented()||!k.$$parseLinkUrl(h,l)||(b.preventDefault(),k.absUrl()!=d.url()&&(c.$apply(),g.angular["ff-684208-preventDefault"]=!0))}});Cb(k.absUrl())!=Cb(q)&&d.url(k.absUrl(),!0);var L=!0;d.onUrlChange(function(a,b){y(ra(t,a))?g.location.href=a:(c.$evalAsync(function(){var d= +k.absUrl(),e=k.$$state,f;k.$$parse(a);k.$$state=b;f=c.$broadcast("$locationChangeStart",a,d,b,e).defaultPrevented;k.absUrl()===a&&(f?(k.$$parse(d),k.$$state=e,h(d,!1,e)):(L=!1,l(d,e)))}),c.$$phase||c.$digest())});c.$watch(function(){var a=Cb(d.url()),b=Cb(k.absUrl()),f=d.state(),g=k.$$replace,m=a!==b||k.$$html5&&e.history&&f!==k.$$state;if(L||m)L=!1,c.$evalAsync(function(){var b=k.absUrl(),d=c.$broadcast("$locationChangeStart",b,a,k.$$state,f).defaultPrevented;k.absUrl()===b&&(d?(k.$$parse(a),k.$$state= +f):(m&&h(b,g,f===k.$$state?null:k.$$state),l(a,f)))});k.$$replace=!1});return k}]}function hf(){var b=!0,a=this;this.debugEnabled=function(a){return x(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||v;a=!1;try{a=!!e.apply}catch(l){}return a?function(){var a= +[];n(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function Wa(b,a){if("__defineGetter__"===b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw da("isecfld",a);return b}function Ba(b,a){if(b){if(b.constructor===b)throw da("isecfn",a);if(b.window===b)throw da("isecwindow", +a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw da("isecdom",a);if(b===Object)throw da("isecobj",a);}return b}function ld(b,a){if(b){if(b.constructor===b)throw da("isecfn",a);if(b===Uf||b===Vf||b===Wf)throw da("isecff",a);}}function Xf(b,a){return"undefined"!==typeof b?b:a}function md(b,a){return"undefined"===typeof b?a:"undefined"===typeof a?b:b+a}function U(b,a){var c,d;switch(b.type){case r.Program:c=!0;n(b.body,function(b){U(b.expression,a);c=c&&b.expression.constant});b.constant= +c;break;case r.Literal:b.constant=!0;b.toWatch=[];break;case r.UnaryExpression:U(b.argument,a);b.constant=b.argument.constant;b.toWatch=b.argument.toWatch;break;case r.BinaryExpression:U(b.left,a);U(b.right,a);b.constant=b.left.constant&&b.right.constant;b.toWatch=b.left.toWatch.concat(b.right.toWatch);break;case r.LogicalExpression:U(b.left,a);U(b.right,a);b.constant=b.left.constant&&b.right.constant;b.toWatch=b.constant?[]:[b];break;case r.ConditionalExpression:U(b.test,a);U(b.alternate,a);U(b.consequent, +a);b.constant=b.test.constant&&b.alternate.constant&&b.consequent.constant;b.toWatch=b.constant?[]:[b];break;case r.Identifier:b.constant=!1;b.toWatch=[b];break;case r.MemberExpression:U(b.object,a);b.computed&&U(b.property,a);b.constant=b.object.constant&&(!b.computed||b.property.constant);b.toWatch=[b];break;case r.CallExpression:c=b.filter?!a(b.callee.name).$stateful:!1;d=[];n(b.arguments,function(b){U(b,a);c=c&&b.constant;b.constant||d.push.apply(d,b.toWatch)});b.constant=c;b.toWatch=b.filter&& +!a(b.callee.name).$stateful?d:[b];break;case r.AssignmentExpression:U(b.left,a);U(b.right,a);b.constant=b.left.constant&&b.right.constant;b.toWatch=[b];break;case r.ArrayExpression:c=!0;d=[];n(b.elements,function(b){U(b,a);c=c&&b.constant;b.constant||d.push.apply(d,b.toWatch)});b.constant=c;b.toWatch=d;break;case r.ObjectExpression:c=!0;d=[];n(b.properties,function(b){U(b.value,a);c=c&&b.value.constant;b.value.constant||d.push.apply(d,b.value.toWatch)});b.constant=c;b.toWatch=d;break;case r.ThisExpression:b.constant= +!1,b.toWatch=[]}}function nd(b){if(1==b.length){b=b[0].expression;var a=b.toWatch;return 1!==a.length?a:a[0]!==b?a:u}}function od(b){return b.type===r.Identifier||b.type===r.MemberExpression}function pd(b){if(1===b.body.length&&od(b.body[0].expression))return{type:r.AssignmentExpression,left:b.body[0].expression,right:{type:r.NGValueParameter},operator:"="}}function qd(b){return 0===b.body.length||1===b.body.length&&(b.body[0].expression.type===r.Literal||b.body[0].expression.type===r.ArrayExpression|| +b.body[0].expression.type===r.ObjectExpression)}function rd(b,a){this.astBuilder=b;this.$filter=a}function sd(b,a){this.astBuilder=b;this.$filter=a}function Fb(b){return"constructor"==b}function dc(b){return B(b.valueOf)?b.valueOf():Yf.call(b)}function jf(){var b=ga(),a=ga();this.$get=["$filter",function(c){function d(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=dc(a),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function e(a,b,c,e,f){var g=e.inputs,h;if(1===g.length){var k=d,g=g[0];return a.$watch(function(a){var b= +g(a);d(b,k)||(h=e(a,u,u,[b]),k=b&&dc(b));return h},b,c,f)}for(var l=[],m=[],q=0,n=g.length;q=this.promise.$$state.status&&d&&d.length&&b(function(){for(var b, +e,f=0,g=d.length;fa)for(b in l++,f)e.hasOwnProperty(b)||(t--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,g,k=1t&&(C=4-t,w[C]||(w[C]=[]),w[C].push({msg:B(b.exp)?"fn: "+(b.exp.name||b.exp.toString()):b.exp,newVal:f,oldVal:h}));else if(b===d){s=!1;break a}}catch(y){g(y)}if(!(k=n.$$watchersCount&&n.$$childHead||n!==this&&n.$$nextSibling))for(;n!==this&&!(k=n.$$nextSibling);)n=n.$parent}while(n=k);if((s||u.length)&&!t--)throw p.$$phase=null,c("infdig",a,w);}while(s||u.length);for(p.$$phase= +null;x.length;)try{x.shift()()}catch(z){g(z)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===p&&l.$$applicationDestroyed();s(this,-this.$$watchersCount);for(var b in this.$$listenerCount)t(this,this.$$listenerCount[b],b);a&&a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&& +(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=v;this.$on=this.$watch=this.$watchGroup=function(){return v};this.$$listeners={};this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}},$eval:function(a,b){return h(a)(this,b)},$evalAsync:function(a,b){p.$$phase||u.length||l.defer(function(){u.length&&p.$digest()});u.push({scope:this,expression:a,locals:b})},$$postDigest:function(a){x.push(a)}, +$apply:function(a){try{q("$apply");try{return this.$eval(a)}finally{p.$$phase=null}}catch(b){g(b)}finally{try{p.$digest()}catch(c){throw g(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&M.push(b);w()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,t(e,1,a))}},$emit:function(a, +b){var c=[],d,e=this,f=!1,h={name:a,targetScope:e,stopPropagation:function(){f=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=cb([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(m=d.length;lVa)throw Ca("iequirks");var d=ia(oa);d.isEnabled=function(){return b};d.trustAs=c.trustAs;d.getTrusted=c.getTrusted;d.valueOf=c.valueOf;b||(d.trustAs=d.getTrusted=function(a,b){return b},d.valueOf=Za);d.parseAs=function(b,c){var e=a(c);return e.literal&&e.constant?e:a(c,function(a){return d.getTrusted(b,a)})};var e=d.parseAs, +f=d.getTrusted,g=d.trustAs;n(oa,function(a,b){var c=I(b);d[fb("parse_as_"+c)]=function(b){return e(a,b)};d[fb("get_trusted_"+c)]=function(b){return f(a,b)};d[fb("trust_as_"+c)]=function(b){return g(a,b)}});return d}]}function pf(){this.$get=["$window","$document",function(b,a){var c={},d=Y((/android (\d+)/.exec(I((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g,h=/^(Moz|webkit|ms)(?=[A-Z])/,l=f.body&&f.body.style,k=!1,m=!1;if(l){for(var q in l)if(k= +h.exec(q)){g=k[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in l&&"webkit");k=!!("transition"in l||g+"Transition"in l);m=!!("animation"in l||g+"Animation"in l);!d||k&&m||(k=H(l.webkitTransition),m=H(l.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hasEvent:function(a){if("input"===a&&11>=Va)return!1;if(y(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:Fa(),vendorPrefix:g,transitions:k,animations:m,android:d}}]}function rf(){this.$get= +["$templateCache","$http","$q","$sce",function(b,a,c,d){function e(f,g){e.totalPendingRequests++;H(f)&&b.get(f)||(f=d.getTrustedResourceUrl(f));var h=a.defaults&&a.defaults.transformResponse;K(h)?h=h.filter(function(a){return a!==Zb}):h===Zb&&(h=null);return a.get(f,{cache:b,transformResponse:h})["finally"](function(){e.totalPendingRequests--}).then(function(a){b.put(f,a.data);return a.data},function(a){if(!g)throw ea("tpload",f,a.status,a.statusText);return c.reject(a)})}e.totalPendingRequests=0; +return e}]}function sf(){this.$get=["$rootScope","$browser","$location",function(b,a,c){return{findBindings:function(a,b,c){a=a.getElementsByClassName("ng-binding");var g=[];n(a,function(a){var d=aa.element(a).data("$binding");d&&n(d,function(d){c?(new RegExp("(^|\\s)"+ud(b)+"(\\s|\\||$)")).test(d)&&g.push(a):-1!=d.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,c){for(var g=["ng-","data-ng-","ng\\:"],h=0;hb;b=Math.abs(b);var g=Infinity===b;if(!g&&!isFinite(b))return"";var h=b+"",l="",k=!1,m=[];g&&(l="\u221e");if(!g&&-1!==h.indexOf("e")){var q=h.match(/([\d\.]+)e(-?)(\d+)/);q&&"-"==q[2]&&q[3]>e+1?b=0:(l=h,k=!0)}if(g||k)0b&&(l=b.toFixed(e),b=parseFloat(l));else{g=(h.split(Dd)[1]||"").length; +y(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);var g=(""+b).split(Dd),h=g[0],g=g[1]||"",q=0,s=a.lgSize,t=a.gSize;if(h.length>=s+t)for(q=h.length-s,k=0;kb&&(d="-",b=-b);for(b=""+b;b.length-c)e+=c;0===e&&-12==c&&(e=12);return Gb(e,a,d)}}function Hb(b,a){return function(c,d){var e=c["get"+b](),f=rb(a?"SHORT"+b:b);return d[f][e]}}function Ed(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function Fd(b){return function(a){var c=Ed(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))- ++c;a=1+Math.round(a/6048E5);return Gb(a,b)}}function hc(b,a){return 0>=b.getFullYear()?a.ERAS[0]:a.ERAS[1]}function zd(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,l=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=Y(b[9]+b[10]),g=Y(b[9]+b[11]));h.call(a,Y(b[1]),Y(b[2])-1,Y(b[3]));f=Y(b[4]||0)-f;g=Y(b[5]||0)-g;h=Y(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));l.call(a,f,g,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; +return function(c,e,f){var g="",h=[],l,k;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;H(c)&&(c=fg.test(c)?Y(c):a(c));X(c)&&(c=new Date(c));if(!ca(c)||!isFinite(c.getTime()))return c;for(;e;)(k=gg.exec(e))?(h=cb(h,k,1),e=h.pop()):(h.push(e),e=null);var m=c.getTimezoneOffset();f&&(m=vc(f,c.getTimezoneOffset()),c=Ob(c,f,!0));n(h,function(a){l=hg[a];g+=l?l(c,b.DATETIME_FORMATS,m):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function ag(){return function(b,a){y(a)&&(a=2);return db(b,a)}}function bg(){return function(b, +a,c){a=Infinity===Math.abs(Number(a))?Number(a):Y(a);if(isNaN(a))return b;X(b)&&(b=b.toString());if(!K(b)&&!H(b))return b;c=!c||isNaN(c)?0:Y(c);c=0>c&&c>=-b.length?b.length+c:c;return 0<=a?b.slice(c,c+a):0===c?b.slice(a,b.length):b.slice(Math.max(0,c+a),c)}}function Bd(b){function a(a,c){c=c?-1:1;return a.map(function(a){var d=1,h=Za;if(B(a))h=a;else if(H(a)){if("+"==a.charAt(0)||"-"==a.charAt(0))d="-"==a.charAt(0)?-1:1,a=a.substring(1);if(""!==a&&(h=b(a),h.constant))var l=h(),h=function(a){return a[l]}}return{get:h, +descending:d*c}})}function c(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}return function(b,e,f){if(!Da(b))return b;K(e)||(e=[e]);0===e.length&&(e=["+"]);var g=a(e,f);g.push({get:function(){return{}},descending:f?-1:1});b=Array.prototype.map.call(b,function(a,b){return{value:a,predicateValues:g.map(function(d){var e=d.get(a);d=typeof e;if(null===e)d="string",e="null";else if("string"===d)e=e.toLowerCase();else if("object"===d)a:{if("function"===typeof e.valueOf&& +(e=e.valueOf(),c(e)))break a;if(pc(e)&&(e=e.toString(),c(e)))break a;e=b}return{value:e,type:d}})}});b.sort(function(a,b){for(var c=0,d=0,e=g.length;db||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent("paste"))a.on("paste cut", +m)}a.on("change",l);d.$render=function(){var b=d.$isEmpty(d.$viewValue)?"":d.$viewValue;a.val()!==b&&a.val(b)}}function Kb(b,a){return function(c,d){var e,f;if(ca(c))return c;if(H(c)){'"'==c.charAt(0)&&'"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1));if(ig.test(c))return new Date(c);b.lastIndex=0;if(e=b.exec(c))return e.shift(),f=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0, +mm:0,ss:0,sss:0},n(e,function(b,c){c=r};g.$observe("min",function(a){r=s(a);h.$validate()})}if(x(g.max)||g.ngMax){var w;h.$validators.max=function(a){return!q(a)||y(w)||c(a)<=w};g.$observe("max",function(a){w=s(a);h.$validate()})}}}function Id(b,a,c,d){(d.$$hasNativeValidators=D(a[0].validity))&&d.$parsers.push(function(b){var c=a.prop("validity")||{}; +return c.badInput&&!c.typeMismatch?u:b})}function Jd(b,a,c,d,e){if(x(d)){b=b(d);if(!b.constant)throw kb("constexpr",c,d);return b(a)}return e}function jc(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d(?:<\/\1>|)$/,Sb=/<|&#?\w+;/, +Bf=/<([\w:]+)/,Cf=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,na={option:[1,'"],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};na.optgroup=na.option;na.tbody=na.tfoot=na.colgroup=na.caption=na.thead;na.th=na.td;var Ra=R.prototype={ready:function(b){function a(){c||(c=!0,b())}var c= +!1;"complete"===W.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),R(N).on("load",a))},toString:function(){var b=[];n(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?z(this[b]):z(this[this.length+b])},length:0,push:kg,sort:[].sort,splice:[].splice},Ab={};n("multiple selected checked disabled readOnly required open".split(" "),function(b){Ab[I(b)]=b});var Rc={};n("input select option textarea button form details".split(" "),function(b){Rc[b]=!0});var Sc= +{ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};n({data:Vb,removeData:ub,hasData:function(b){for(var a in gb[b.ng339])return!0;return!1}},function(b,a){R[a]=b});n({data:Vb,inheritedData:zb,scope:function(b){return z.data(b,"$scope")||zb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return z.data(b,"$isolateScope")||z.data(b,"$isolateScopeNoTemplate")},controller:Oc,injector:function(b){return zb(b,"$injector")},removeAttr:function(b, +a){b.removeAttribute(a)},hasClass:wb,css:function(b,a,c){a=fb(a);if(x(c))b.style[a]=c;else return b.style[a]},attr:function(b,a,c){var d=b.nodeType;if(d!==Pa&&2!==d&&8!==d)if(d=I(a),Ab[d])if(x(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||v).specified?d:u;else if(x(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?u:b},prop:function(b,a,c){if(x(c))b[a]=c;else return b[a]},text:function(){function b(a, +b){if(y(b)){var d=a.nodeType;return d===pa||d===Pa?a.textContent:""}a.textContent=b}b.$dv="";return b}(),val:function(b,a){if(y(a)){if(b.multiple&&"select"===ta(b)){var c=[];n(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(y(a))return b.innerHTML;tb(b,!0);b.innerHTML=a},empty:Pc},function(b,a){R.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==Pc&&(2==b.length&&b!==wb&&b!==Oc?a:d)===u){if(D(a)){for(e=0;e< +g;e++)if(b===Vb)b(this[e],a);else for(f in a)b(this[e],f,a[f]);return this}e=b.$dv;g=e===u?Math.min(g,1):g;for(f=0;f <= >= && || ! = |".split(" "),function(a){Lb[a]=!0});var rg={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v", +"'":"'",'"':'"'},ec=function(a){this.options=a};ec.prototype={constructor:ec,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"=== +a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=x(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw da("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index","<=",">=");)a={type:r.BinaryExpression,operator:c.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a={type:r.BinaryExpression,operator:c.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a={type:r.BinaryExpression,operator:c.text, +left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:r.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.constants.hasOwnProperty(this.peek().text)?a=fa(this.constants[this.consume().text]):this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant(): +this.throwError("not a primary expression",this.peek());for(var c;c=this.expect("(","[",".");)"("===c.text?(a={type:r.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===c.text?(a={type:r.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===c.text?a={type:r.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var c={type:r.CallExpression,callee:this.identifier(), +arguments:a,filter:!0};this.expect(":");)a.push(this.expression());return c},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.expression());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:r.Identifier,name:a.text}},constant:function(){return{type:r.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break; +a.push(this.expression())}while(this.expect(","))}this.consume("]");return{type:r.ArrayExpression,elements:a}},object:function(){var a=[],c;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;c={type:r.Property,kind:"init"};this.peek().constant?c.key=this.constant():this.peek().identifier?c.key=this.identifier():this.throwError("invalid key",this.peek());this.consume(":");c.value=this.expression();a.push(c)}while(this.expect(","))}this.consume("}");return{type:r.ObjectExpression,properties:a}}, +throwError:function(a,c){throw da("syntax",c.text,a,c.index+1,this.text,this.text.substring(c.index));},consume:function(a){if(0===this.tokens.length)throw da("ueoe",this.text);var c=this.expect(a);c||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return c},peekToken:function(){if(0===this.tokens.length)throw da("ueoe",this.text);return this.tokens[0]},peek:function(a,c,d,e){return this.peekAhead(0,a,c,d,e)},peekAhead:function(a,c,d,e,f){if(this.tokens.length>a){a=this.tokens[a]; +var g=a.text;if(g===c||g===d||g===e||g===f||!(c||d||e||f))return a}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},constants:{"true":{type:r.Literal,value:!0},"false":{type:r.Literal,value:!1},"null":{type:r.Literal,value:null},undefined:{type:r.Literal,value:u},"this":{type:r.ThisExpression}}};rd.prototype={compile:function(a,c){var d=this,e=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:c,fn:{vars:[],body:[],own:{}},assign:{vars:[], +body:[],own:{}},inputs:[]};U(e,d.$filter);var f="",g;this.stage="assign";if(g=pd(e))this.state.computing="assign",f=this.nextId(),this.recurse(g,f),f="fn.assign="+this.generateFunction("assign","s,v,l");g=nd(e.body);d.stage="inputs";n(g,function(a,c){var e="fn"+c;d.state[e]={vars:[],body:[],own:{}};d.state.computing=e;var f=d.nextId();d.recurse(a,f);d.return_(f);d.state.inputs.push(e);a.watchId=c});this.state.computing="fn";this.stage="main";this.recurse(e);f='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+ +"var fn="+this.generateFunction("fn","s,l,a,i")+f+this.watchFns()+"return fn;";f=(new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","ifDefined","plus","text",f))(this.$filter,Wa,Ba,ld,Xf,md,a);this.state=this.stage=u;f.literal=qd(e);f.constant=e.constant;return f},USE:"use",STRICT:"strict",watchFns:function(){var a=[],c=this.state.inputs,d=this;n(c,function(c){a.push("var "+c+"="+d.generateFunction(c,"s"))});c.length&&a.push("fn.inputs=["+c.join(",")+"];");return a.join("")}, +generateFunction:function(a,c){return"function("+c+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],c=this;n(this.state.filters,function(d,e){a.push(d+"=$filter("+c.escape(e)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,c,d,e,f,g){var h,l,k=this,m,q;e=e||v;if(!g&&x(a.watchId))c=c||this.nextId(),this.if_("i", +this.lazyAssign(c,this.computedMember("i",a.watchId)),this.lazyRecurse(a,c,d,e,f,!0));else switch(a.type){case r.Program:n(a.body,function(c,d){k.recurse(c.expression,u,u,function(a){l=a});d!==a.body.length-1?k.current().body.push(l,";"):k.return_(l)});break;case r.Literal:q=this.escape(a.value);this.assign(c,q);e(q);break;case r.UnaryExpression:this.recurse(a.argument,u,u,function(a){l=a});q=a.operator+"("+this.ifDefined(l,0)+")";this.assign(c,q);e(q);break;case r.BinaryExpression:this.recurse(a.left, +u,u,function(a){h=a});this.recurse(a.right,u,u,function(a){l=a});q="+"===a.operator?this.plus(h,l):"-"===a.operator?this.ifDefined(h,0)+a.operator+this.ifDefined(l,0):"("+h+")"+a.operator+"("+l+")";this.assign(c,q);e(q);break;case r.LogicalExpression:c=c||this.nextId();k.recurse(a.left,c);k.if_("&&"===a.operator?c:k.not(c),k.lazyRecurse(a.right,c));e(c);break;case r.ConditionalExpression:c=c||this.nextId();k.recurse(a.test,c);k.if_(c,k.lazyRecurse(a.alternate,c),k.lazyRecurse(a.consequent,c));e(c); +break;case r.Identifier:c=c||this.nextId();d&&(d.context="inputs"===k.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);Wa(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||"s",function(){f&&1!==f&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(c,k.nonComputedMember("s",a.name))})},c&&k.lazyAssign(c,k.nonComputedMember("l", +a.name)));(k.state.expensiveChecks||Fb(a.name))&&k.addEnsureSafeObject(c);e(c);break;case r.MemberExpression:h=d&&(d.context=this.nextId())||this.nextId();c=c||this.nextId();k.recurse(a.object,h,u,function(){k.if_(k.notNull(h),function(){if(a.computed)l=k.nextId(),k.recurse(a.property,l),k.addEnsureSafeMemberName(l),f&&1!==f&&k.if_(k.not(k.computedMember(h,l)),k.lazyAssign(k.computedMember(h,l),"{}")),q=k.ensureSafeObject(k.computedMember(h,l)),k.assign(c,q),d&&(d.computed=!0,d.name=l);else{Wa(a.property.name); +f&&1!==f&&k.if_(k.not(k.nonComputedMember(h,a.property.name)),k.lazyAssign(k.nonComputedMember(h,a.property.name),"{}"));q=k.nonComputedMember(h,a.property.name);if(k.state.expensiveChecks||Fb(a.property.name))q=k.ensureSafeObject(q);k.assign(c,q);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(c,"undefined")});e(c)},!!f);break;case r.CallExpression:c=c||this.nextId();a.filter?(l=k.filter(a.callee.name),m=[],n(a.arguments,function(a){var c=k.nextId();k.recurse(a,c);m.push(c)}),q=l+ +"("+m.join(",")+")",k.assign(c,q),e(c)):(l=k.nextId(),h={},m=[],k.recurse(a.callee,l,h,function(){k.if_(k.notNull(l),function(){k.addEnsureSafeFunction(l);n(a.arguments,function(a){k.recurse(a,k.nextId(),u,function(a){m.push(k.ensureSafeObject(a))})});h.name?(k.state.expensiveChecks||k.addEnsureSafeObject(h.context),q=k.member(h.context,h.name,h.computed)+"("+m.join(",")+")"):q=l+"("+m.join(",")+")";q=k.ensureSafeObject(q);k.assign(c,q)},function(){k.assign(c,"undefined")});e(c)}));break;case r.AssignmentExpression:l= +this.nextId();h={};if(!od(a.left))throw da("lval");this.recurse(a.left,u,h,function(){k.if_(k.notNull(h.context),function(){k.recurse(a.right,l);k.addEnsureSafeObject(k.member(h.context,h.name,h.computed));q=k.member(h.context,h.name,h.computed)+a.operator+l;k.assign(c,q);e(c||q)})},1);break;case r.ArrayExpression:m=[];n(a.elements,function(a){k.recurse(a,k.nextId(),u,function(a){m.push(a)})});q="["+m.join(",")+"]";this.assign(c,q);e(q);break;case r.ObjectExpression:m=[];n(a.properties,function(a){k.recurse(a.value, +k.nextId(),u,function(c){m.push(k.escape(a.key.type===r.Identifier?a.key.name:""+a.key.value)+":"+c)})});q="{"+m.join(",")+"}";this.assign(c,q);e(q);break;case r.ThisExpression:this.assign(c,"s");e("s");break;case r.NGValueParameter:this.assign(c,"v"),e("v")}},getHasOwnProperty:function(a,c){var d=a+"."+c,e=this.current().own;e.hasOwnProperty(d)||(e[d]=this.nextId(!1,a+"&&("+this.escape(c)+" in "+a+")"));return e[d]},assign:function(a,c){if(a)return this.current().body.push(a,"=",c,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)|| +(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,c){return"ifDefined("+a+","+this.escape(c)+")"},plus:function(a,c){return"plus("+a+","+c+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,c,d){if(!0===a)c();else{var e=this.current().body;e.push("if(",a,"){");c();e.push("}");d&&(e.push("else{"),d(),e.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,c){return a+ +"."+c},computedMember:function(a,c){return a+"["+c+"]"},member:function(a,c,d){return d?this.computedMember(a,c):this.nonComputedMember(a,c)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+ +a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},lazyRecurse:function(a,c,d,e,f,g){var h=this;return function(){h.recurse(a,c,d,e,f,g)}},lazyAssign:function(a,c){var d=this;return function(){d.assign(a,c)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(H(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(X(a))return a.toString();if(!0===a)return"true"; +if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw da("esc");},nextId:function(a,c){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(c?"="+c:""));return d},current:function(){return this.state[this.state.computing]}};sd.prototype={compile:function(a,c){var d=this,e=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=c;U(e,d.$filter);var f,g;if(f=pd(e))g=this.recurse(f);f=nd(e.body);var h;f&&(h=[],n(f,function(a,c){var e=d.recurse(a); +a.input=e;h.push(e);a.watchId=c}));var l=[];n(e.body,function(a){l.push(d.recurse(a.expression))});f=0===e.body.length?function(){}:1===e.body.length?l[0]:function(a,c){var d;n(l,function(e){d=e(a,c)});return d};g&&(f.assign=function(a,c,d){return g(a,d,c)});h&&(f.inputs=h);f.literal=qd(e);f.constant=e.constant;return f},recurse:function(a,c,d){var e,f,g=this,h;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case r.Literal:return this.value(a.value,c);case r.UnaryExpression:return f= +this.recurse(a.argument),this["unary"+a.operator](f,c);case r.BinaryExpression:return e=this.recurse(a.left),f=this.recurse(a.right),this["binary"+a.operator](e,f,c);case r.LogicalExpression:return e=this.recurse(a.left),f=this.recurse(a.right),this["binary"+a.operator](e,f,c);case r.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),c);case r.Identifier:return Wa(a.name,g.expression),g.identifier(a.name,g.expensiveChecks||Fb(a.name), +c,d,g.expression);case r.MemberExpression:return e=this.recurse(a.object,!1,!!d),a.computed||(Wa(a.property.name,g.expression),f=a.property.name),a.computed&&(f=this.recurse(a.property)),a.computed?this.computedMember(e,f,c,d,g.expression):this.nonComputedMember(e,f,g.expensiveChecks,c,d,g.expression);case r.CallExpression:return h=[],n(a.arguments,function(a){h.push(g.recurse(a))}),a.filter&&(f=this.$filter(a.callee.name)),a.filter||(f=this.recurse(a.callee,!0)),a.filter?function(a,d,e,g){for(var n= +[],t=0;t":function(a,c,d){return function(e,f,g,h){e=a(e,f,g,h)>c(e,f,g,h);return d?{value:e}:e}},"binary<=":function(a,c,d){return function(e, +f,g,h){e=a(e,f,g,h)<=c(e,f,g,h);return d?{value:e}:e}},"binary>=":function(a,c,d){return function(e,f,g,h){e=a(e,f,g,h)>=c(e,f,g,h);return d?{value:e}:e}},"binary&&":function(a,c,d){return function(e,f,g,h){e=a(e,f,g,h)&&c(e,f,g,h);return d?{value:e}:e}},"binary||":function(a,c,d){return function(e,f,g,h){e=a(e,f,g,h)||c(e,f,g,h);return d?{value:e}:e}},"ternary?:":function(a,c,d,e){return function(f,g,h,l){f=a(f,g,h,l)?c(f,g,h,l):d(f,g,h,l);return e?{value:f}:f}},value:function(a,c){return function(){return c? +{context:u,name:u,value:a}:a}},identifier:function(a,c,d,e,f){return function(g,h,l,k){g=h&&a in h?h:g;e&&1!==e&&g&&!g[a]&&(g[a]={});h=g?g[a]:u;c&&Ba(h,f);return d?{context:g,name:a,value:h}:h}},computedMember:function(a,c,d,e,f){return function(g,h,l,k){var m=a(g,h,l,k),q,n;null!=m&&(q=c(g,h,l,k),Wa(q,f),e&&1!==e&&m&&!m[q]&&(m[q]={}),n=m[q],Ba(n,f));return d?{context:m,name:q,value:n}:n}},nonComputedMember:function(a,c,d,e,f,g){return function(h,l,k,m){h=a(h,l,k,m);f&&1!==f&&h&&!h[c]&&(h[c]={}); +l=null!=h?h[c]:u;(d||Fb(c))&&Ba(l,g);return e?{context:h,name:c,value:l}:l}},inputs:function(a,c){return function(d,e,f,g){return g?g[c]:a(d,e,f)}}};var fc=function(a,c,d){this.lexer=a;this.$filter=c;this.options=d;this.ast=new r(this.lexer);this.astCompiler=d.csp?new sd(this.ast,c):new rd(this.ast,c)};fc.prototype={constructor:fc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};ga();ga();var Yf=Object.prototype.valueOf,Ca=G("$sce"),oa={HTML:"html",CSS:"css",URL:"url", +RESOURCE_URL:"resourceUrl",JS:"js"},ea=G("$compile"),Z=W.createElement("a"),wd=Aa(N.location.href);xd.$inject=["$document"];Jc.$inject=["$provide"];yd.$inject=["$locale"];Ad.$inject=["$locale"];var Dd=".",hg={yyyy:$("FullYear",4),yy:$("FullYear",2,0,!0),y:$("FullYear",1),MMMM:Hb("Month"),MMM:Hb("Month",!0),MM:$("Month",2,1),M:$("Month",1,1),dd:$("Date",2),d:$("Date",1),HH:$("Hours",2),H:$("Hours",1),hh:$("Hours",2,-12),h:$("Hours",1,-12),mm:$("Minutes",2),m:$("Minutes",1),ss:$("Seconds",2),s:$("Seconds", +1),sss:$("Milliseconds",3),EEEE:Hb("Day"),EEE:Hb("Day",!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a,c,d){a=-1*d;return a=(0<=a?"+":"")+(Gb(Math[0=a.getFullYear()?c.ERANAMES[0]:c.ERANAMES[1]}},gg=/((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,fg=/^\-?\d+$/;zd.$inject=["$locale"];var cg=qa(I),dg=qa(rb);Bd.$inject= +["$parse"];var he=qa({restrict:"E",compile:function(a,c){if(!c.href&&!c.xlinkHref)return function(a,c){if("a"===c[0].nodeName.toLowerCase()){var f="[object SVGAnimatedString]"===sa.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)||a.preventDefault()})}}}}),sb={};n(Ab,function(a,c){function d(a,d,f){a.$watch(f[e],function(a){f.$set(c,!!a)})}if("multiple"!=a){var e=va("ng-"+c),f=d;"checked"===a&&(f=function(a,c,f){f.ngModel!==f[e]&&d(a,c,f)});sb[e]=function(){return{restrict:"A", +priority:100,link:f}}}});n(Sc,function(a,c){sb[c]=function(){return{priority:100,link:function(a,e,f){if("ngPattern"===c&&"/"==f.ngPattern.charAt(0)&&(e=f.ngPattern.match(jg))){f.$set("ngPattern",new RegExp(e[1],e[2]));return}a.$watch(f[c],function(a){f.$set(c,a)})}}}});n(["src","srcset","href"],function(a){var c=va("ng-"+a);sb[c]=function(){return{priority:99,link:function(d,e,f){var g=a,h=a;"href"===a&&"[object SVGAnimatedString]"===sa.call(e.prop("href"))&&(h="xlinkHref",f.$attr[h]="xlink:href", +g=null);f.$observe(c,function(c){c?(f.$set(h,c),Va&&g&&e.prop(g,f[h])):"href"===a&&f.$set(h,null)})}}}});var Ib={$addControl:v,$$renameControl:function(a,c){a.$name=c},$removeControl:v,$setValidity:v,$setDirty:v,$setPristine:v,$setSubmitted:v};Gd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Od=function(a){return["$timeout","$parse",function(c,d){function e(a){return""===a?d('this[""]').assign:d(a).assign||v}return{name:"form",restrict:a?"EAC":"E",controller:Gd,compile:function(d, +g){d.addClass(Xa).addClass(lb);var h=g.name?"name":a&&g.ngForm?"ngForm":!1;return{pre:function(a,d,f,g){if(!("action"in f)){var n=function(c){a.$apply(function(){g.$commitViewValue();g.$setSubmitted()});c.preventDefault()};d[0].addEventListener("submit",n,!1);d.on("$destroy",function(){c(function(){d[0].removeEventListener("submit",n,!1)},0,!1)})}var t=g.$$parentForm,r=h?e(g.$name):v;h&&(r(a,g),f.$observe(h,function(c){g.$name!==c&&(r(a,u),t.$$renameControl(g,c),r=e(g.$name),r(a,g))}));d.on("$destroy", +function(){t.$removeControl(g);r(a,u);Q(g,Ib)})}}}}}]},ie=Od(),ve=Od(!0),ig=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/,sg=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,tg=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,ug=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Pd=/^(\d{4})-(\d{2})-(\d{2})$/,Qd=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,kc=/^(\d{4})-W(\d\d)$/, +Rd=/^(\d{4})-(\d\d)$/,Sd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Td={text:function(a,c,d,e,f,g){ib(a,c,d,e,f,g);ic(e)},date:jb("date",Pd,Kb(Pd,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":jb("datetimelocal",Qd,Kb(Qd,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:jb("time",Sd,Kb(Sd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:jb("week",kc,function(a,c){if(ca(a))return a;if(H(a)){kc.lastIndex=0;var d=kc.exec(a);if(d){var e=+d[1],f=+d[2],g=d=0,h=0,l=0,k=Ed(e),f=7*(f-1); +c&&(d=c.getHours(),g=c.getMinutes(),h=c.getSeconds(),l=c.getMilliseconds());return new Date(e,0,k.getDate()+f,d,g,h,l)}}return NaN},"yyyy-Www"),month:jb("month",Rd,Kb(Rd,["yyyy","MM"]),"yyyy-MM"),number:function(a,c,d,e,f,g){Id(a,c,d,e);ib(a,c,d,e,f,g);e.$$parserName="number";e.$parsers.push(function(a){return e.$isEmpty(a)?null:ug.test(a)?parseFloat(a):u});e.$formatters.push(function(a){if(!e.$isEmpty(a)){if(!X(a))throw kb("numfmt",a);a=a.toString()}return a});if(x(d.min)||d.ngMin){var h;e.$validators.min= +function(a){return e.$isEmpty(a)||y(h)||a>=h};d.$observe("min",function(a){x(a)&&!X(a)&&(a=parseFloat(a,10));h=X(a)&&!isNaN(a)?a:u;e.$validate()})}if(x(d.max)||d.ngMax){var l;e.$validators.max=function(a){return e.$isEmpty(a)||y(l)||a<=l};d.$observe("max",function(a){x(a)&&!X(a)&&(a=parseFloat(a,10));l=X(a)&&!isNaN(a)?a:u;e.$validate()})}},url:function(a,c,d,e,f,g){ib(a,c,d,e,f,g);ic(e);e.$$parserName="url";e.$validators.url=function(a,c){var d=a||c;return e.$isEmpty(d)||sg.test(d)}},email:function(a, +c,d,e,f,g){ib(a,c,d,e,f,g);ic(e);e.$$parserName="email";e.$validators.email=function(a,c){var d=a||c;return e.$isEmpty(d)||tg.test(d)}},radio:function(a,c,d,e){y(d.name)&&c.attr("name",++mb);c.on("click",function(a){c[0].checked&&e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e,f,g,h,l){var k=Jd(l,a,"ngTrueValue",d.ngTrueValue,!0),m=Jd(l,a,"ngFalseValue",d.ngFalseValue,!1);c.on("click",function(a){e.$setViewValue(c[0].checked, +a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return!1===a};e.$formatters.push(function(a){return ka(a,k)});e.$parsers.push(function(a){return a?k:m})},hidden:v,button:v,submit:v,reset:v,file:v},Dc=["$browser","$sniffer","$filter","$parse",function(a,c,d,e){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,g,h,l){l[0]&&(Td[I(h.type)]||Td.text)(f,g,h,l[0],c,a,d,e)}}}}],vg=/^(true|false|\d+)$/,Ne=function(){return{restrict:"A",priority:100,compile:function(a, +c){return vg.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},ne=["$compile",function(a){return{restrict:"AC",compile:function(c){a.$$addBindingClass(c);return function(c,e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=a===u?"":a})}}}}],pe=["$interpolate","$compile",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,g){d=a(f.attr(g.$attr.ngBindTemplate)); +c.$$addBindingInfo(f,d.expressions);f=f[0];g.$observe("ngBindTemplate",function(a){f.textContent=a===u?"":a})}}}}],oe=["$sce","$parse","$compile",function(a,c,d){return{restrict:"A",compile:function(e,f){var g=c(f.ngBindHtml),h=c(f.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(h,function(){e.html(a.getTrustedHtml(g(c))||"")})}}}}],Me=qa({restrict:"A",require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}), +qe=jc("",!0),se=jc("Odd",0),re=jc("Even",1),te=Ma({compile:function(a,c){c.$set("ngCloak",u);a.removeClass("ng-cloak")}}),ue=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Ic={},wg={blur:!0,focus:!0};n("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=va("ng-"+a);Ic[c]=["$parse","$rootScope",function(d,e){return{restrict:"A",compile:function(f,g){var h= +d(g[c],null,!0);return function(c,d){d.on(a,function(d){var f=function(){h(c,{$event:d})};wg[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var xe=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,l,k;c.$watch(e.ngIf,function(c){c?l||g(function(c,f){l=f;c[c.length++]=W.createComment(" end ngIf: "+e.ngIf+" ");h={clone:c};a.enter(c,d.parent(),d)}):(k&&(k.remove(),k=null),l&&(l.$destroy(),l=null),h&&(k= +qb(h.clone),a.leave(k).then(function(){k=null}),h=null))})}}}],ye=["$templateRequest","$anchorScroll","$animate",function(a,c,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:aa.noop,compile:function(e,f){var g=f.ngInclude||f.src,h=f.onload||"",l=f.autoscroll;return function(e,f,n,s,r){var u=0,v,w,p,A=function(){w&&(w.remove(),w=null);v&&(v.$destroy(),v=null);p&&(d.leave(p).then(function(){w=null}),w=p,p=null)};e.$watch(g,function(g){var n=function(){!x(l)||l&&!e.$eval(l)|| +c()},q=++u;g?(a(g,!0).then(function(a){if(q===u){var c=e.$new();s.template=a;a=r(c,function(a){A();d.enter(a,null,f).then(n)});v=c;p=a;v.$emit("$includeContentLoaded",g);e.$eval(h)}},function(){q===u&&(A(),e.$emit("$includeContentError",g))}),e.$emit("$includeContentRequested",g)):(A(),s.template=null)})}}}}],Pe=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Lc(f.template,W).childNodes)(c,function(a){d.append(a)}, +{futureParentElement:d})):(d.html(f.template),a(d.contents())(c))}}}],ze=Ma({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),Le=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||", ",g="false"!==d.ngTrim,h=g?T(f):f;e.$parsers.push(function(a){if(!y(a)){var c=[];a&&n(a.split(h),function(a){a&&c.push(g?T(a):a)});return c}});e.$formatters.push(function(a){return K(a)?a.join(f):u});e.$isEmpty=function(a){return!a|| +!a.length}}}},lb="ng-valid",Kd="ng-invalid",Xa="ng-pristine",Jb="ng-dirty",Md="ng-pending",kb=G("ngModel"),xg=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,c,d,e,f,g,h,l,k,m){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=u;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1; +this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=u;this.$name=m(d.name||"",!1)(a);var q=f(d.ngModel),s=q.assign,r=q,E=s,L=null,w,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var c=f(d.ngModel+"()"),g=f(d.ngModel+"($$$p)");r=function(a){var d=q(a);B(d)&&(d=c(a));return d};E=function(a,c){B(q(a))?g(a,{$$$p:p.$modelValue}):s(a,p.$modelValue)}}else if(!q.assign)throw kb("nonassign",d.ngModel,ua(e));};this.$render=v;this.$isEmpty=function(a){return y(a)|| +""===a||null===a||a!==a};var A=e.inheritedData("$formController")||Ib,z=0;Hd({ctrl:this,$element:e,set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},parentForm:A,$animate:g});this.$setPristine=function(){p.$dirty=!1;p.$pristine=!0;g.removeClass(e,Jb);g.addClass(e,Xa)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;g.removeClass(e,Xa);g.addClass(e,Jb);A.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;g.setClass(e,"ng-untouched","ng-touched")};this.$setTouched= +function(){p.$touched=!0;p.$untouched=!1;g.setClass(e,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){h.cancel(L);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!X(p.$modelValue)||!isNaN(p.$modelValue)){var a=p.$$rawModelValue,c=p.$valid,d=p.$modelValue,e=p.$options&&p.$options.allowInvalid;p.$$runValidators(a,p.$$lastCommittedViewValue,function(f){e||c===f||(p.$modelValue=f?a:u,p.$modelValue!==d&&p.$$writeModelToScope())})}};this.$$runValidators= +function(a,c,d){function e(){var d=!0;n(p.$validators,function(e,f){var h=e(a,c);d=d&&h;g(f,h)});return d?!0:(n(p.$asyncValidators,function(a,c){g(c,null)}),!1)}function f(){var d=[],e=!0;n(p.$asyncValidators,function(f,h){var k=f(a,c);if(!k||!B(k.then))throw kb("$asyncValidators",k);g(h,u);d.push(k.then(function(){g(h,!0)},function(a){e=!1;g(h,!1)}))});d.length?k.all(d).then(function(){h(e)},v):h(!0)}function g(a,c){l===z&&p.$setValidity(a,c)}function h(a){l===z&&d(a)}z++;var l=z;(function(){var a= +p.$$parserName||"parse";if(w===u)g(a,null);else return w||(n(p.$validators,function(a,c){g(c,null)}),n(p.$asyncValidators,function(a,c){g(c,null)})),g(a,w),w;return!0})()?e()?f():h(!1):h(!1)};this.$commitViewValue=function(){var a=p.$viewValue;h.cancel(L);if(p.$$lastCommittedViewValue!==a||""===a&&p.$$hasNativeValidators)p.$$lastCommittedViewValue=a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var c=p.$$lastCommittedViewValue;if(w=y(c)?u:!0)for(var d= +0;df||e.$isEmpty(c)||c.length<=f}}}}},Gc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength",function(a){f=Y(a)||0;e.$validate()});e.$validators.minlength=function(a,c){return e.$isEmpty(c)||c.length>=f}}}}};N.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):(ce(),ee(aa),aa.module("ngLocale",[],["$provide",function(a){function c(a){a+="";var c=a.indexOf(".");return-1== +c?0:a.length-c-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y", +medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",pluralCat:function(a,e){var f=a|0,g=e;u===g&&(g=Math.min(c(a),3));Math.pow(10,g);return 1== +f&&0==g?"one":"other"}})}]),z(W).ready(function(){Zd(W,yc)}))})(window,document);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(''); +//# sourceMappingURL=angular.min.js.map diff --git a/src/main/resources/static/js/app.js b/src/main/resources/static/js/app.js new file mode 100644 index 0000000..5cd2676 --- /dev/null +++ b/src/main/resources/static/js/app.js @@ -0,0 +1,13 @@ +var transactionsApp = angular.module('transactionsApp', ['ngRoute', 'transactionControllers' ]); + +transactionsApp.config([ '$routeProvider', function($routeProvider) { + $routeProvider.when('/list', { + templateUrl : 'partials/transaction-list.html', + controller : 'TransactionListCtrl' + }).when('/transaction/:transactionURI*', { + templateUrl : 'partials/transaction-details.html', + controller : 'TransactionDetailCtrl' + }).otherwise({ + redirectTo : '/list' + }); +} ]); diff --git a/src/main/resources/static/js/controllers.js b/src/main/resources/static/js/controllers.js new file mode 100644 index 0000000..0acf500 --- /dev/null +++ b/src/main/resources/static/js/controllers.js @@ -0,0 +1,81 @@ +var transactionControllers = angular.module('transactionControllers', ['ngResource']); + +transactionControllers.controller('TransactionListCtrl', [ '$scope', '$location', '$resource', function($scope, $location, $resource) { + + // TODO pass accountId + $scope.accountId = 1; + + $scope.initList = function() { + var transactions = $resource('/transactions/search/last10', { accountId: $scope.accountId }).get(); + + transactions.$promise.then(function(data) { + $scope.transactions = transactions._embedded.transactions; + + for (var i = 0; i < $scope.transactions.length; i++) { + $scope.transactions[i].category = $resource($scope.transactions[i]._links.category.href).get(); + $scope.transactions[i].creditor = $resource($scope.transactions[i]._links.creditor.href).get(); + } + + }); + + var categories = $resource('/categories/search/listForAccount', { accountId: $scope.accountId }).get(); + + categories.$promise.then(function(data) { + $scope.categories = categories._embedded.categories; + + // select the first entry as default + $scope.categorySelection = categories._embedded.categories[0]; + }); + + } + + $scope.postTransaction = function() { + +// // simple HTTP POST +// $http.post('/transactions', { "amount" : $scope.amount /* date, */ }).success(function() { +// console.log('REFRESH'); +// $scope.initList(); +// }); + + // via Resource (might be moved into a service) + var Transaction = $resource('/transactions'); + + var newTransaction = new Transaction({ + "account" : $scope.account, + "amount" : $scope.amount, + "date" : $scope.date, + "description" : $scope.description, + "category" : $scope.category, + "creditor" : $scope.creditor + }); + + newTransaction.$save(); + }; + + $scope.showTransaction = function(transaction) { + $location.path('/transaction/' + transaction._links.self.href); + }; + +} ]); + +transactionControllers.controller('TransactionDetailCtrl', [ '$scope', '$routeParams', '$resource', '$location', function($scope, $routeParams, $resource, $location) { + var transaction = $resource($routeParams.transactionURI).get(); + transaction.$promise.then(function(data) { + transaction.category = $resource(transaction._links.category.href).get(); + transaction.creditor = $resource(transaction._links.creditor.href).get(); + transaction.account = $resource(transaction._links.account.href).get(); + }); + + $scope.transaction = transaction; + + $scope.deleteTransaction = function(transaction) { + /*console.log(angular.toJson(transaction, false));*/ + + // TODO auf return code reagieren + $resource(transaction._links.self.href).remove().$promise.then(function() { + $location.path('/'); + }); + } + +} ]); + diff --git a/src/main/resources/static/partials/transaction-details.html b/src/main/resources/static/partials/transaction-details.html new file mode 100644 index 0000000..4d173ac --- /dev/null +++ b/src/main/resources/static/partials/transaction-details.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + + +
DatumKategorieBetragBeschreibung
{{transaction.date | date:'dd.MM.yyyy'}}{{transaction.category.name}}{{transaction.amount | number : 2}} €{{transaction.description}}
+ +
Auslage: {{transaction.creditor.name}}
+ +
+ Delete +
\ No newline at end of file diff --git a/src/main/resources/static/partials/transaction-list.html b/src/main/resources/static/partials/transaction-list.html new file mode 100644 index 0000000..ae2990e --- /dev/null +++ b/src/main/resources/static/partials/transaction-list.html @@ -0,0 +1,40 @@ +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + +
DatumKategorieBetragBeschreibung
{{transaction.date | date:'dd.MM.yyyy'}}{{transaction.category.name}}{{transaction.amount | number : 2}} €{{transaction.description}}
+ +
+
+