diff --git a/dev/index.html b/dev/index.html
index c47ac2d..8c910ad 100644
--- a/dev/index.html
+++ b/dev/index.html
@@ -1,3 +1,21 @@
+
+<!--
+Copyright 2017-present Open Networking Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+
 <!DOCTYPE html>
 <html lang="en">
 <head>
diff --git a/dev/js/alert.dev.js b/dev/js/alert.dev.js
index 6d5cefc..05a6614 100644
--- a/dev/js/alert.dev.js
+++ b/dev/js/alert.dev.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 'use strict';
 
 angular.module('ngXosLib')
diff --git a/dev/js/field.dev.js b/dev/js/field.dev.js
index 1f59629..badb886 100644
--- a/dev/js/field.dev.js
+++ b/dev/js/field.dev.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 'use strict';
 
 angular.module('ngXosLib')
diff --git a/dev/js/form.dev.js b/dev/js/form.dev.js
index b955253..96fbb92 100644
--- a/dev/js/form.dev.js
+++ b/dev/js/form.dev.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 'use strict';
 
 angular.module('ngXosLib')
diff --git a/dev/js/main.js b/dev/js/main.js
index 445374d..3c30d62 100644
--- a/dev/js/main.js
+++ b/dev/js/main.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /* eslint-disable angular/ng_module_name */
 (function(){
   'use strict';
diff --git a/dev/js/smart-table.dev.js b/dev/js/smart-table.dev.js
index 0388e19..9b22d1e 100644
--- a/dev/js/smart-table.dev.js
+++ b/dev/js/smart-table.dev.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function () {
   'use strict';
 
diff --git a/dev/js/table.dev.js b/dev/js/table.dev.js
index 4ac974d..32424a5 100644
--- a/dev/js/table.dev.js
+++ b/dev/js/table.dev.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 'use strict';
 
 angular.module('ngXosLib')
diff --git a/dev/templates/alert.dev.html b/dev/templates/alert.dev.html
index a528e7e..81c6e7f 100644
--- a/dev/templates/alert.dev.html
+++ b/dev/templates/alert.dev.html
@@ -1,3 +1,21 @@
+
+<!--
+Copyright 2017-present Open Networking Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+
 
 <xos-alert config="vm.config1">
   A sample alert message
diff --git a/dev/templates/field.dev.html b/dev/templates/field.dev.html
index 7e50a5e..1b93889 100644
--- a/dev/templates/field.dev.html
+++ b/dev/templates/field.dev.html
@@ -1,3 +1,21 @@
+
+<!--
+Copyright 2017-present Open Networking Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+
 <xos-field ng-model="vm.field1.model" name="vm.field1.name" field="vm.field1.field"></xos-field>
 <xos-field ng-model="vm.field2.model" name="vm.field2.name" field="vm.field2.field"></xos-field>
 <xos-field ng-model="vm.field3.model" name="vm.field3.name" field="vm.field3.field"></xos-field>
diff --git a/dev/templates/form.dev.html b/dev/templates/form.dev.html
index d2f12ff..4cabf4b 100644
--- a/dev/templates/form.dev.html
+++ b/dev/templates/form.dev.html
@@ -1 +1,19 @@
+
+<!--
+Copyright 2017-present Open Networking Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+
 <xos-form ng-model="vm.model" config="vm.config"></xos-form>
diff --git a/dev/templates/nav.dev.html b/dev/templates/nav.dev.html
index 6dfbcae..6b7ba3e 100644
--- a/dev/templates/nav.dev.html
+++ b/dev/templates/nav.dev.html
@@ -1,3 +1,21 @@
+
+<!--
+Copyright 2017-present Open Networking Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+
 <nav class="navbar navbar-default">
   <div class="">
     <ul class="nav navbar-nav">
diff --git a/dev/templates/smart-table.dev.html b/dev/templates/smart-table.dev.html
index 2c74e70..24c45c4 100644
--- a/dev/templates/smart-table.dev.html
+++ b/dev/templates/smart-table.dev.html
@@ -1 +1,19 @@
+
+<!--
+Copyright 2017-present Open Networking Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+
 <xos-smart-table config="vm.config"></xos-smart-table>
\ No newline at end of file
diff --git a/dev/templates/table.dev.html b/dev/templates/table.dev.html
index 41c10bf..ba67351 100644
--- a/dev/templates/table.dev.html
+++ b/dev/templates/table.dev.html
@@ -1 +1,19 @@
+
+<!--
+Copyright 2017-present Open Networking Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+
 <xos-table config="vm.config" data="vm.data"></xos-table>
\ No newline at end of file
diff --git a/dist/ngXosHelpers.min.js b/dist/ngXosHelpers.min.js
index 271d3a8..38cbd2a 100644
--- a/dist/ngXosHelpers.min.js
+++ b/dist/ngXosHelpers.min.js
@@ -1,2 +1,20 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 "use strict";function _toConsumableArray(e){if(Array.isArray(e)){for(var n=0,i=Array(e.length);n<e.length;n++)i[n]=e[n];return i}return Array.from(e)}!function(){angular.module("xos.uiComponents",["chart.js","RecursionHelper","dndLists"])}(),function(){angular.module("xos.uiComponents").component("xosSmartTable",{restrict:"E",bindings:{config:"="},template:'\n        <div class="row" ng-show="vm.data.length > 0">\n          <div class="col-xs-12 text-right">\n            <a href="" class="btn btn-success" ng-click="vm.createItem()">\n              Add\n            </a>\n          </div>\n        </div>\n        <div class="row">\n          <div class="col-xs-12 table-responsive">\n            <xos-table config="vm.tableConfig" data="vm.data"></xos-table>\n          </div>\n        </div>\n        <div class="panel panel-default" ng-show="vm.detailedItem">\n          <div class="panel-heading">\n            <div class="row">\n              <div class="col-xs-11">\n                <h3 class="panel-title" ng-show="vm.detailedItem.id">Update {{vm.config.resource}} {{vm.detailedItem.id}}</h3>\n                <h3 class="panel-title" ng-show="!vm.detailedItem.id">Create {{vm.config.resource}} item</h3>\n              </div>\n              <div class="col-xs-1">\n                <a href="" ng-click="vm.cleanForm()">\n                  <i class="glyphicon glyphicon-remove pull-right"></i>\n                </a>\n              </div>\n            </div>\n          </div>\n          <div class="panel-body">\n            <xos-form config="vm.formConfig" ng-model="vm.detailedItem"></xos-form>\n          </div>\n        </div>\n        <xos-alert config="{type: \'success\', closeBtn: true}" show="vm.responseMsg">{{vm.responseMsg}}</xos-alert>\n        <xos-alert config="{type: \'danger\', closeBtn: true}" show="vm.responseErr">{{vm.responseErr}}</xos-alert>\n      ',bindToController:!0,controllerAs:"vm",controller:["$injector","LabelFormatter","_","XosFormHelpers",function(e,n,i,o){var t=this;this.responseMsg=!1,this.responseErr=!1,this.tableConfig={columns:[],actions:[{label:"delete",icon:"remove",cb:function(e){t.Resource["delete"]({id:e.id}).$promise.then(function(){i.remove(t.data,function(n){return n.id===e.id}),t.responseMsg=t.config.resource+" with id "+e.id+" successfully deleted"})["catch"](function(n){t.responseErr=n.data.detail||"Error while deleting "+t.config.resource+" with id "+e.id})},color:"red"},{label:"details",icon:"search",cb:function(e){t.detailedItem=e}}],classes:"table table-striped table-bordered table-responsive",filter:"field",order:!0,pagination:{pageSize:10}},this.formConfig={exclude:this.config.hiddenFields,fields:{},formName:this.config.resource+"Form",actions:[{label:"Save",icon:"ok",cb:function(e){var n=void 0,i=!0;e.id?(n=e.$update(),i=!1):n=e.$save(),n.then(function(n){i&&t.data.push(angular.copy(n)),delete t.detailedItem,t.responseMsg=t.config.resource+" with id "+e.id+" successfully saved"})["catch"](function(n){t.responseErr=n.data.detail||"Error while saving "+t.config.resource+" with id "+e.id})},"class":"success"}]},this.cleanForm=function(){delete t.detailedItem},this.createItem=function(){t.detailedItem=new t.Resource},this.Resource=e.get(this.config.resource);var r=function(){t.Resource.query().$promise.then(function(e){if(!e[0])return void(t.data=e);var r=e[0],a=Object.keys(r);i.remove(a,function(e){return"id"===e||"validators"===e}),angular.isArray(t.config.hiddenFields)&&(a=i.difference(a,t.config.hiddenFields)),a.forEach(function(e){var i={label:n.format(e),prop:e};i.type=o._getFieldFormat(r[e]),t.tableConfig.columns.push(i)}),a.forEach(function(e){t.formConfig.fields[e]={label:n.format(e).replace(":",""),type:o._getFieldFormat(r[e])}}),t.data=e})};r()}]})}(),function(){angular.module("xos.uiComponents").component("xosSmartPie",{restrict:"E",bindings:{config:"="},template:'\n      <canvas\n        class="chart chart-pie {{vm.config.classes}}"\n        chart-data="vm.data" chart-labels="vm.labels"\n        chart-legend="{{vm.config.legend}}">\n      </canvas>\n    ',bindToController:!0,controllerAs:"vm",controller:["$injector","$interval","$scope","$timeout","_",function(e,n,i,o,t){var r=this;if(!this.config.resource&&!this.config.data)throw new Error("[xosSmartPie] Please provide a resource or an array of data in the configuration");var a=function(e){return t.groupBy(e,r.config.groupBy)},s=function(e){return t.reduce(Object.keys(e),function(n,i){return n.concat(e[i].length)},[])},l=function(e){return angular.isFunction(r.config.labelFormatter)?r.config.labelFormatter(Object.keys(e)):Object.keys(e)},c=function(e){var n=a(e);r.data=s(n),r.labels=l(n)};this.config.resource?!function(){r.Resource=e.get(r.config.resource);var i=function(){r.Resource.query().$promise.then(function(e){e[0]&&c(e)})};i(),r.config.poll&&n(function(){i()},1e3*r.config.poll)}():i.$watch(function(){return r.config.data},function(e){e&&c(r.config.data)},!0),i.$on("create",function(e,n){console.log("create: "+n.id)}),i.$on("destroy",function(e,n){console.log("destroy: "+n.id)})}]})}(),function(){angular.module("xos.uiComponents").component("xosValidation",{restrict:"E",bindings:{field:"=",form:"="},template:'\n      <div ng-cloak>\n        <xos-alert config="vm.config" show="vm.field.$error.required !== undefined && vm.field.$error.required !== false  && (vm.field.$touched || vm.form.$submitted)">\n          Field required\n        </xos-alert>\n        <xos-alert config="vm.config" show="vm.field.$error.email !== undefined && vm.field.$error.email !== false && (vm.field.$touched || vm.form.$submitted)">\n          This is not a valid email\n        </xos-alert>\n        <xos-alert config="vm.config" show="vm.field.$error.minlength !== undefined && vm.field.$error.minlength !== false && (vm.field.$touched || vm.form.$submitted)">\n          Too short\n        </xos-alert>\n        <xos-alert config="vm.config" show="vm.field.$error.maxlength !== undefined && vm.field.$error.maxlength !== false && (vm.field.$touched || vm.form.$submitted)">\n          Too long\n        </xos-alert>\n        <xos-alert config="vm.config" show="vm.field.$error.custom !== undefined && vm.field.$error.custom !== false && (vm.field.$touched || vm.form.$submitted)">\n          Field invalid\n        </xos-alert>\n      </div>\n    ',transclude:!0,bindToController:!0,controllerAs:"vm",controller:function(){this.config={type:"danger"}}})}(),function(){angular.module("xos.uiComponents").component("xosTable",{restrict:"E",bindings:{data:"=",config:"="},template:'\n        <div ng-show="vm.data.length > 0 && vm.loader == false">\n          <div class="row" ng-if="vm.config.filter == \'fulltext\'">\n            <div class="col-xs-12">\n              <input\n                class="form-control"\n                placeholder="Type to search.."\n                type="text"\n                ng-model="vm.query"/>\n            </div>\n          </div>\n          <table ng-class="vm.classes" ng-hide="vm.data.length == 0">\n            <thead>\n              <tr>\n                <th ng-repeat="col in vm.columns">\n                  {{col.label}}\n                  <span ng-if="vm.config.order">\n                    <a href="" ng-click="vm.orderBy = col.prop; vm.reverse = false">\n                      <i class="glyphicon glyphicon-chevron-up"></i>\n                    </a>\n                    <a href="" ng-click="vm.orderBy = col.prop; vm.reverse = true">\n                      <i class="glyphicon glyphicon-chevron-down"></i>\n                    </a>\n                  </span>\n                </th>\n                <th ng-if="vm.config.actions">Actions:</th>\n              </tr>\n            </thead>\n            <tbody ng-if="vm.config.filter == \'field\'">\n              <tr>\n                <td ng-repeat="col in vm.columns">\n                  <input\n                    ng-if="col.type !== \'boolean\' && col.type !== \'array\' && col.type !== \'object\' && col.type !== \'custom\'"\n                    class="form-control"\n                    placeholder="Type to search by {{col.label}}"\n                    type="text"\n                    ng-model="vm.query[col.prop]"/>\n                  <select\n                    ng-if="col.type === \'boolean\'"\n                    class="form-control"\n                    ng-model="vm.query[col.prop]">\n                    <option value="">-</option>\n                    <option value="true">True</option>\n                    <option value="false">False</option>\n                  </select>\n                </td>\n                <td ng-if="vm.config.actions"></td>\n              </tr>\n            </tbody>\n            <tbody>\n              <tr ng-repeat="item in vm.data | filter:vm.query:vm.comparator | orderBy:vm.orderBy:vm.reverse | pagination:vm.currentPage * vm.config.pagination.pageSize | limitTo: (vm.config.pagination.pageSize || vm.data.length) track by $index">\n                <td ng-repeat="col in vm.columns" xos-link-wrapper>\n                  <span ng-if="!col.type || col.type === \'text\'">{{item[col.prop]}}</span>\n                  <span ng-if="col.type === \'boolean\'">\n                    <i class="glyphicon"\n                      ng-class="{\'glyphicon-ok\': item[col.prop], \'glyphicon-remove\': !item[col.prop]}">\n                    </i>\n                  </span>\n                  <span ng-if="col.type === \'date\'">\n                    {{item[col.prop] | date:\'H:mm MMM d, yyyy\'}}\n                  </span>\n                  <span ng-if="col.type === \'array\'">\n                    {{item[col.prop] | arrayToList}}\n                  </span>\n                  <span ng-if="col.type === \'object\'">\n                    <dl class="dl-horizontal">\n                      <span ng-repeat="(k,v) in item[col.prop]">\n                        <dt>{{k}}</dt>\n                        <dd>{{v}}</dd>\n                      </span>\n                    </dl>\n                  </span>\n                  <span ng-if="col.type === \'custom\'">\n                    {{col.formatter(item)}}\n                  </span>\n                  <span ng-if="col.type === \'icon\'">\n                    <i class="glyphicon glyphicon-{{col.formatter(item)}}">\n                    </i>\n                  </span>\n                </td>\n                <td ng-if="vm.config.actions">\n                  <a href=""\n                    ng-repeat="action in vm.config.actions"\n                    ng-click="action.cb(item)"\n                    title="{{action.label}}">\n                    <i\n                      class="glyphicon glyphicon-{{action.icon}}"\n                      style="color: {{action.color}};"></i>\n                  </a>\n                </td>\n              </tr>\n            </tbody>\n          </table>\n          <xos-pagination\n            ng-if="vm.config.pagination"\n            page-size="vm.config.pagination.pageSize"\n            total-elements="vm.data.length"\n            change="vm.goToPage">\n            </xos-pagination>\n        </div>\n        <div ng-show="(vm.data.length == 0 || !vm.data) && vm.loader == false">\n           <xos-alert config="{type: \'info\'}">\n            No data to show.\n          </xos-alert>\n        </div>\n        <div ng-show="vm.loader == true">\n          <div class="loader"></div>\n        </div>\n      ',bindToController:!0,controllerAs:"vm",controller:["_","$scope","Comparator",function(e,n,i){var o=this;if(this.comparator=i,this.loader=!0,n.$watch(function(){return o.data},function(e){angular.isDefined(e)&&(o.loader=!1)}),!this.config)throw new Error('[xosTable] Please provide a configuration via the "config" attribute');if(!this.config.columns)throw new Error("[xosTable] Please provide a columns list in the configuration");this.config.order&&angular.isObject(this.config.order)&&(this.reverse=this.config.order.reverse||!1,this.orderBy=this.config.order.field||"id");var t=e.filter(this.config.columns,{type:"custom"});angular.isArray(t)&&t.length>0&&e.forEach(t,function(e){if(!e.formatter||!angular.isFunction(e.formatter))throw new Error("[xosTable] You have provided a custom field type, a formatter function should provided too.")});var r=e.filter(this.config.columns,{type:"icon"});angular.isArray(r)&&r.length>0&&e.forEach(r,function(e){if(!e.formatter||!angular.isFunction(e.formatter))throw new Error("[xosTable] You have provided an icon field type, a formatter function should provided too.")});var a=e.filter(this.config.columns,function(e){return angular.isDefined(e.link)});angular.isArray(a)&&a.length>0&&e.forEach(a,function(e){if(!angular.isFunction(e.link))throw new Error("[xosTable] The link property should be a function.")}),this.columns=this.config.columns,this.classes=this.config.classes||"table table-striped table-bordered",this.config.actions,this.config.pagination&&(this.currentPage=0,this.goToPage=function(e){o.currentPage=e})}]}).filter("arrayToList",function(){return function(e){return angular.isArray(e)?e.join(", "):e}}).directive("xosLinkWrapper",function(){return{restrict:"A",transclude:!0,template:'\n          <a ng-if="col.link" href="{{col.link(item)}}">\n            <div ng-transclude></div>\n          </a>\n          <div ng-transclude ng-if="!col.link"></div>\n        '}})}(),function(){angular.module("xos.uiComponents").component("xosPagination",{restrict:"E",bindings:{pageSize:"=",totalElements:"=",change:"="},template:'\n      <div class="row" ng-if="vm.pageList.length > 1">\n        <div class="col-xs-12 text-center">\n          <ul class="pagination">\n            <li\n              ng-click="vm.goToPage(vm.currentPage - 1)"\n              ng-class="{disabled: vm.currentPage == 0}">\n              <a href="" aria-label="Previous">\n                  <span aria-hidden="true">&laquo;</span>\n              </a>\n            </li>\n            <li ng-repeat="i in vm.pageList" ng-class="{active: i === vm.currentPage}">\n              <a href="" ng-click="vm.goToPage(i)">{{i + 1}}</a>\n            </li>\n            <li\n              ng-click="vm.goToPage(vm.currentPage + 1)"\n              ng-class="{disabled: vm.currentPage == vm.pages - 1}">\n              <a href="" aria-label="Next">\n                  <span aria-hidden="true">&raquo;</span>\n              </a>\n            </li>\n          </ul>\n        </div>\n      </div>\n    ',bindToController:!0,controllerAs:"vm",controller:["$scope",function(e){var n=this;this.currentPage=0,this.goToPage=function(e){e<0||e===n.pages||(n.currentPage=e,n.change(e))},this.createPages=function(e){for(var n=[],i=0;i<e;i++)n.push(i);return n},e.$watch(function(){return n.totalElements},function(){n.totalElements&&(n.pages=Math.ceil(n.totalElements/n.pageSize),n.pageList=n.createPages(n.pages))})}]}).filter("pagination",function(){return function(e,n){return e&&angular.isArray(e)?(n=parseInt(n,10),e.slice(n)):e}})}(),function(){angular.module("xos.uiComponents").component("xosField",{restrict:"E",bindings:{name:"=",field:"=",ngModel:"="},template:'\n      <label ng-if="vm.field.type !== \'object\' && vm.field.type !== \'array\'">{{vm.field.label}}</label>\n      <input\n        xos-custom-validator custom-validator="vm.field.validators.custom || null"\n        ng-if="vm.field.type !== \'boolean\' && vm.field.type !== \'object\' && vm.field.type !== \'select\' && vm.field.type !== \'array\'"\n        type="{{vm.field.type}}"\n        name="{{vm.name}}"\n        class="form-control"\n        ng-model="vm.ngModel"\n        ng-minlength="vm.field.validators.minlength || 0"\n        ng-maxlength="vm.field.validators.maxlength || 2000"\n        ng-required="vm.field.validators.required || false" />\n        <select class="form-control" ng-if ="vm.field.type === \'select\'"\n          name = "{{vm.name}}"\n          ng-options="item.id as item.label for item in vm.field.options"\n          ng-model="vm.ngModel"\n          ng-required="vm.field.validators.required || false">\n          </select>\n      <span class="boolean-field" ng-if="vm.field.type === \'boolean\'">\n        <a href="#"\n          class="btn btn-success"\n          ng-show="vm.ngModel"\n          ng-click="vm.ngModel = false">\n          <i class="glyphicon glyphicon-ok"></i>\n        </a>\n        <a href="#"\n          class="btn btn-danger"\n          ng-show="!vm.ngModel"\n          ng-click="vm.ngModel = true">\n          <i class="glyphicon glyphicon-remove"></i>\n        </a>\n      </span>\n      <div\n        class="panel panel-default object-field"\n        ng-if="vm.field.type == \'object\' && (!vm.isEmptyObject(vm.ngModel) || !vm.isEmptyObject(vm.field.properties))"\n        >\n        <div class="panel-heading">{{vm.field.label}}</div>\n        <div class="panel-body">\n          <div ng-if="!vm.field.properties" ng-repeat="(k, v) in vm.ngModel">\n            <xos-field\n              name="k"\n              field="{label: vm.formatLabel(k), type: vm.getType(v)}"\n              ng-model="v">\n            </xos-field>\n          </div>\n          <div ng-if="vm.field.properties" ng-repeat="(k, v) in vm.field.properties">\n            <xos-field\n              name="k"\n              field="{\n                label: v.label || vm.formatLabel(k),\n                type: v.type,\n                validators: v.validators\n              }"\n              ng-model="vm.ngModel[k]">\n            </xos-field>\n          </div>\n        </div>\n      </div>\n      <div\n        class="panel panel-default array-field"\n        ng-if="vm.field.type == \'array\'">\n        <div class="panel-heading">{{vm.field.label}}</div>\n        <div class="panel-body selected">\n          <ul class="draggable" dnd-list="vm.ngModel">\n            <li\n              class="array-element"\n              ng-repeat="item in vm.ngModel"\n              dnd-draggable="item"\n              dnd-moved="vm.ngModel.splice($index, 1)"\n              dnd-effect-allowed="move"\n              dnd-selected="models.selected = item"\n              >\n              <div class="well well-sm text-center">\n                {{item}}\n              </div>\n            </li>\n            <div class="clearfix"></div>\n          </ul>\n        </div>\n        <div class="panel-body unselected">\n          <ul class="draggable" dnd-list="vm.field.availableOptions">\n            <li\n              class="array-element"\n              ng-repeat="item in vm.field.availableOptions"\n              dnd-draggable="item"\n              dnd-moved="vm.field.availableOptions.splice($index, 1)"\n              dnd-effect-allowed="move"\n              dnd-selected="models.selected = item"\n              >\n              <div class="well well-sm text-center">\n                {{item}}\n              </div>\n            </li>\n            <div class="clearfix"></div>\n          </ul>\n        </div>\n      </div>\n    ',bindToController:!0,controllerAs:"vm",controller:["$attrs","$scope","XosFormHelpers","LabelFormatter","_",function(e,n,i,o,t){var r=this;if(!this.name)throw new Error("[xosField] Please provide a field name");if(!this.field)throw new Error("[xosField] Please provide a field definition");if(!this.field.type)throw new Error("[xosField] Please provide a type in the field definition");if(!e.ngModel)throw new Error("[xosField] Please provide an ng-model");this.getType=i._getFieldFormat,this.formatLabel=o.format,this.isEmptyObject=function(e){return!e||0===Object.keys(e).length},"array"===this.field.type&&n.$watch(function(){return r.ngModel.length},function(){r.field.availableOptions=t.difference(r.field.options,r.ngModel)})}]}).directive("xosCustomValidator",function(){return{restrict:"A",scope:{fn:"=customValidator"},require:"ngModel",link:function(e,n,i,o){function t(n){var i=e.fn(n);return angular.isArray(i)?o.$setValidity.apply(o,_toConsumableArray(i)):o.$setValidity("custom",i),n}angular.isFunction(e.fn)&&o.$parsers.push(t)}}})}(),function(){angular.module("xos.uiComponents").component("xosForm",{restrict:"E",bindings:{config:"=",ngModel:"="},template:'\n      <form name="vm.{{vm.config.formName || \'form\'}}" novalidate>\n        <div class="form-group" ng-repeat="(name, field) in vm.formField">\n          <xos-field name="name" field="field" ng-model="vm.ngModel[name]"></xos-field>\n          <xos-validation field="vm[vm.config.formName || \'form\'][name]" form = "vm[vm.config.formName || \'form\']"></xos-validation>\n          <div class="alert alert-info" ng-show="(field.hint).length >0" role="alert">{{field.hint}}</div>\n        </div>\n        <div class="form-group" ng-if="vm.config.actions">\n        <xos-alert config="vm.config.feedback" show="vm.config.feedback.show">{{vm.config.feedback.message}}</xos-alert>\n\n          <button role="button" href=""\n            ng-repeat="action in vm.config.actions"\n            ng-click="action.cb(vm.ngModel, vm[vm.config.formName || \'form\'])"\n            class="btn btn-{{action.class}}"\n            title="{{action.label}}">\n            <i class="glyphicon glyphicon-{{action.icon}}"></i>\n            {{action.label}}\n          </button>\n        </div>\n      </form>\n    ',bindToController:!0,controllerAs:"vm",controller:["$scope","$log","_","XosFormHelpers",function(e,n,i,o){var t=this;if(!this.config)throw new Error('[xosForm] Please provide a configuration via the "config" attribute');if(!this.config.actions)throw new Error("[xosForm] Please provide an action list in the configuration");this.config.feedback||(this.config.feedback={show:!1,message:"Form submitted successfully !!!",type:"success"}),this.excludedField=["id","validators","created","updated","deleted","backend_status"],this.config&&this.config.exclude&&(this.excludedField=this.excludedField.concat(this.config.exclude)),this.formField=[],e.$watch(function(){return t.config},function(){if(t.ngModel){var e=i.difference(Object.keys(t.ngModel),t.excludedField),n=o.parseModelField(e);t.formField=o.buildFormStructure(n,t.config.fields,t.ngModel,t.config.order)}},!0),e.$watch(function(){return t.ngModel},function(e){if(t.formField={},e){var n=i.difference(Object.keys(e),t.excludedField),r=o.parseModelField(n);t.formField=o.buildFormStructure(r,t.config.fields,e,t.config.order)}})}]})}(),function(){angular.module("xos.uiComponents").component("xosAlert",{restrict:"E",bindings:{config:"=",show:"=?"},template:'\n      <div ng-cloak class="alert alert-{{vm.config.type}}" ng-hide="!vm.show">\n        <button type="button" class="close" ng-if="vm.config.closeBtn" ng-click="vm.dismiss()">\n          <span aria-hidden="true">&times;</span>\n        </button>\n        <p ng-transclude></p>\n      </div>\n    ',transclude:!0,bindToController:!0,controllerAs:"vm",controller:["$timeout",function(e){var n=this;if(!this.config)throw new Error('[xosAlert] Please provide a configuration via the "config" attribute');this.show=this.show!==!1,this.dismiss=function(){n.show=!1},this.config.autoHide&&!function(){var i=e(function(){n.dismiss(),e.cancel(i)},n.config.autoHide)}()}]})}(),function(){function e(){var e=function(e){return e.split("_").join(" ").trim()},n=function(e){return e.split(/(?=[A-Z])/).map(function(e){return e.toLowerCase()}).join(" ")},i=function(e){return e.slice(0,1).toUpperCase()+e.slice(1)},o=function(o){return o=e(o),o=n(o),o=i(o).replace(/\s\s+/g," ")+":",o.replace("::",":")};return{_formatByUnderscore:e,_formatByUppercase:n,_capitalize:i,format:o}}angular.module("xos.uiComponents").factory("LabelFormatter",e)}();var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e};!function(){angular.module("xos.uiComponents").service("XosFormHelpers",["_","LabelFormatter",function(e,n){var i=this;this._isEmail=function(e){var n=/(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/;return n.test(e)},this._getFieldFormat=function(e){return angular.isArray(e)?"array":angular.isDate(e)||!Number.isNaN(Date.parse(e))&&/^\d+-\d+-\d+\D\d+:\d+:\d+\.\d+\D/.test(e)?"date":"boolean"==typeof e?"boolean":i._isEmail(e)?"email":angular.isString(e)||null===e?"text":"undefined"==typeof e?"undefined":_typeof(e)},this.buildFormStructure=function(o,t,r,a){var s={};return o=angular.extend(o,t),t=t||{},a&&e.each(a,function(e){s[e]={}}),e.each(Object.keys(o),function(e){s[e]={label:t[e]&&t[e].label?t[e].label+":":n.format(e),type:t[e]&&t[e].type?t[e].type:i._getFieldFormat(r[e]),validators:t[e]&&t[e].validators?t[e].validators:{},hint:t[e]&&t[e].hint?t[e].hint:""},t[e]&&t[e].options&&(s[e].options=t[e].options),t[e]&&t[e].properties&&(s[e].properties=t[e].properties),"date"===s[e].type&&(r[e]=new Date(r[e])),"number"===s[e].type&&(r[e]=parseInt(r[e],10))}),s},this.parseModelField=function(n){return e.reduce(n,function(e,n){return e[n]={},e},{})}}])}(),function(){function e(e){return function(n,i){if(angular.isUndefined(n))return!1;if(null===n||null===i)return n===i;if(angular.isObject(i)||angular.isObject(n))return angular.equals(i,n);if(e.isBoolean(n)||e.isBoolean(i))return 0!==n&&1!==n||(n=!!n),angular.equals(i,n);if(!angular.isString(n)||!angular.isString(i)){if(!angular.isDefined(n.toString)||!angular.isDefined(i.toString))return n===i;n=n.toString(),i=i.toString()}return n=n.toLowerCase()+"",i=i.toLowerCase()+"",n.indexOf(i)!==-1}}e.$inject=["_"],angular.module("xos.uiComponents").factory("Comparator",e)}(),function(){function e(e,n,i){e.interceptors.push("SetCSRFToken"),i.defaults.stripTrailingSlashes=!1}e.$inject=["$httpProvider","$interpolateProvider","$resourceProvider"],angular.module("xos.helpers",["ngCookies","ngResource","ngAnimate","xos.uiComponents"]).config(e).factory("_",["$window",function(e){return e._}])}(),function(){angular.module("xos.helpers").service("vSG-Collection",["$resource",function(e){return e("/api/service/vsg/")}])}(),function(){angular.module("xos.helpers").service("vOLT-Collection",["$resource",function(e){return e("/api/tenant/cord/volt/:volt_id/",{volt_id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Login",["$resource",function(e){return e("/api/utility/login/")}]).service("Logout",["$resource",function(e){return e("/api/utility/logout/")}])}(),function(){angular.module("xos.helpers").service("Users",["$resource",function(e){return e("/api/core/users/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Truckroll",["$resource",function(e){return e("/api/tenant/truckroll/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Tenants",["$resource",function(e){return e("/api/core/tenants/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Subscribers",["$resource",function(e){return e("/api/tenant/cord/subscriber/:id/",{id:"@id"},{update:{method:"PUT"},"View-a-Subscriber-Features-Detail":{method:"GET",isArray:!1,url:"/api/tenant/cord/subscriber/:id/features/"},"Read-Subscriber-uplink_speed":{method:"GET",isArray:!1,url:"/api/tenant/cord/subscriber/:id/features/uplink_speed/"},"Update-Subscriber-uplink_speed":{method:"PUT",isArray:!1,url:"/api/tenant/cord/subscriber/:id/features/uplink_speed/"},"Read-Subscriber-downlink_speed":{method:"GET",isArray:!1,url:"/api/tenant/cord/subscriber/:id/features/downlink_speed/"},"Update-Subscriber-downlink_speed":{method:"PUT",isArray:!1,url:"/api/tenant/cord/subscriber/:id/features/downlink_speed/"},"Read-Subscriber-cdn":{method:"GET",isArray:!1,url:"/api/tenant/cord/subscriber/:id/features/cdn/"},"Update-Subscriber-cdn":{method:"PUT",isArray:!1,url:"/api/tenant/cord/subscriber/:id/features/cdn/"},"Read-Subscriber-uverse":{method:"GET",isArray:!1,url:"/api/tenant/cord/subscriber/:id/features/uverse/"},"Update-Subscriber-uverse":{method:"PUT",isArray:!1,url:"/api/tenant/cord/subscriber/:id/features/uverse/"},"Read-Subscriber-status":{method:"GET",isArray:!1,url:"/api/tenant/cord/subscriber/:id/features/status/"},"Update-Subscriber-status":{method:"PUT",isArray:!1,url:"/api/tenant/cord/subscriber/:id/features/status/"}})}])}(),function(){angular.module("xos.helpers").service("SlicesPlus",["$http","$q",function(e,n){this.query=function(i){var o=n.defer();return e.get("/api/utility/slicesplus/",{params:i}).then(function(e){o.resolve(e.data)})["catch"](function(e){o.reject(e.data)}),{$promise:o.promise}},this.get=function(i,o){var t=n.defer();return e.get("/api/utility/slicesplus/"+i,{params:o}).then(function(e){t.resolve(e.data)})["catch"](function(e){t.reject(e.data)}),{$promise:t.promise}}}])}(),function(){angular.module("xos.helpers").service("Slices",["$resource",function(e){return e("/api/core/slices/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Sites",["$resource",function(e){return e("/api/core/sites/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Services",["$resource",function(e){return e("/api/core/services/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("ONOS-Services-Collection",["$resource",function(e){return e("/api/service/onos/")}])}(),function(){angular.module("xos.helpers").service("ONOS-App-Collection",["$resource",function(e){return e("/api/tenant/onos/app/")}])}(),function(){angular.module("xos.helpers").service("Nodes",["$resource",function(e){return e("/api/core/nodes/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Networkstemplates",["$resource",function(e){return e("/api/core/networktemplates/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Networks",["$resource",function(e){return e("/api/core/networks/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Me",["$q","$http",function(e,n){this.get=function(){var i=e.defer();return n.get("/api/utility/me/").then(function(e){i.resolve(e.data)})["catch"](function(e){i.reject(e)}),i.promise}}])}(),function(){angular.module("xos.helpers").service("Instances",["$resource",function(e){return e("/api/core/instances/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Images",["$resource",function(e){return e("/api/core/images/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Flavors",["$resource",function(e){return e("/api/core/flavors/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Example-Services-Collection",["$resource",function(e){return e("/api/service/exampleservice/")}])}(),function(){angular.module("xos.helpers").service("Deployments",["$resource",function(e){return e("/api/core/deployments/:id/",{id:"@id"},{update:{method:"PUT"}})}])}(),function(){angular.module("xos.helpers").service("Dashboards",["$resource","$q","$http",function(e,n,i){var o=e("/api/core/dashboardviews/:id/",{id:"@id"},{update:{method:"PUT"}});return o.prototype.$save=function(){var e=n.defer();return i.put("/api/core/dashboardviews/"+this.id+"/",this).then(function(n){e.resolve(n.data)})["catch"](function(n){e.reject(n.data)}),e.promise},o}])}(),function(){angular.module("xos.helpers").service("XosUserPrefs",["$cookies","Me","$q",function(e,n,i){var o=this,t=e.get("xosUserPrefs")?angular.fromJson(e.get("xosUserPrefs")):{};this.getAll=function(){return t=e.get("xosUserPrefs")?angular.fromJson(e.get("xosUserPrefs")):{}},this.setAll=function(n){e.put("xosUserPrefs",angular.toJson(n))},this.getSynchronizerNotificationStatus=function(){var e=!(arguments.length<=0||void 0===arguments[0])&&arguments[0];return e?o.getAll().synchronizers.notification[e]:o.getAll().synchronizers.notification},this.getUserDetailsCookie=function(){
 var e=i.defer(),n=o.getAll();return n.userData?e.resolve(n.userData):o.setUserDetailsCookie().$promise.then(function(n){e.resolve(n)}),{$promise:e.promise}},this.setUserDetailsCookie=function(){var e=arguments.length<=0||void 0===arguments[0]?null:arguments[0],t=i.defer(),r=o.getAll();return e?(r.userData=e,o.setAll(r),t.resolve(e)):n.get().then(function(e){r.userData=e,o.setAll(r),t.resolve(e)})["catch"](function(e){t.reject(e)}),{$promise:t.promise}},this.setSynchronizerNotificationStatus=function(){var e=!(arguments.length<=0||void 0===arguments[0])&&arguments[0],n=arguments[1];if(!e)throw new Error("[XosUserPrefs] When updating a synchronizer is mandatory to provide a name.");var i=o.getAll();i.synchronizers||(i.synchronizers={notification:{}}),i.synchronizers.notification[e]=n,o.setAll(i)}}])}(),function(){angular.module("xos.helpers").service("GraphService",["$q","Tenants","Services",function(e,n,i){var o=this;this.loadCoarseData=function(){var o=void 0,t=e.defer();return i.query().$promise.then(function(e){return o=e,n.query({kind:"coarse"}).$promise}).then(function(e){t.resolve({tenants:e,services:o})}),t.promise},this.getCoarseGraph=function(){return o.loadCoarseData().then(function(e){console.log(e)}),"ciao"}}])}(),function(){angular.module("xos.helpers").factory("Notification",function(){return window.Notification}).service("xosNotification",["$q","$log","Notification",function(e,n,i){var o=this;this.checkPermission=function(){var n=e.defer();return i.requestPermission().then(function(e){"granted"===e?n.resolve(e):n.reject(e)}),n.promise},this.sendNotification=function(e,o){var t=new i(e,o);t.onerror=function(e){n.error(e)}},this.notify=function(e,t){"Notification"in window?"granted"!==i.permission?o.checkPermission().then(function(){return o.sendNotification(e,t)}):"granted"===i.permission&&o.sendNotification(e,t):n.info("This browser does not support desktop notification")}}])}(),function(){function e(){return{request:function(e){return e.url.indexOf(".html")===-1&&(e.url+="?no_hyperlinks=1"),e}}}angular.module("xos.helpers").factory("NoHyperlinks",e)}(),angular.module("xos.helpers").config(["$provide",function(e){e.decorator("$log",["$delegate",function(e){var n=function(){return window.location.href.indexOf("debug=true")>=0},i=e.log,o=e.info,t=e.warn,r=e.debug,a=function(i){return function(){if(n()){var o=[].slice.call(arguments),t=new Date;return o[0]="["+t.getHours()+":"+t.getMinutes()+":"+t.getSeconds()+"] "+o[0],!angular.isFunction(e.reset)||e.debug.logs instanceof Array||e.reset(),i.apply(null,o)}}};return e.info=a(o),e.log=a(i),e.warn=a(t),e.debug=a(r),e}])}]),function(){function e(e){return{request:function(n){return"GET"!==n.method&&(n.headers["X-CSRFToken"]=e.get("xoscsrftoken")),n}}}e.$inject=["$cookies"],angular.module("xos.helpers").factory("SetCSRFToken",e)}();
\ No newline at end of file
diff --git a/dist/ngXosVendor.min.js b/dist/ngXosVendor.min.js
index c79b894..8d5b7bd 100644
--- a/dist/ngXosVendor.min.js
+++ b/dist/ngXosVendor.min.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 !function(t){"use strict";function n(t,n){return n=n||Error,function(){var e,r,i=2,o=arguments,a=o[0],u="["+(t?t+":":"")+a+"] ",s=o[1];for(u+=s.replace(/\{\d+\}/g,function(t){var n=+t.slice(1,-1),e=n+i;return e<o.length?yt(o[e]):t}),u+="\nhttp://errors.angularjs.org/1.5.8/"+(t?t+"/":"")+a,r=i,e="?";r<o.length;r++,e="&")u+=e+"p"+(r-i)+"="+encodeURIComponent(yt(o[r]));return new n(u)}}function e(t){if(null==t||M(t))return!1;if(Zr(t)||x(t)||Fr&&t instanceof Fr)return!0;var n="length"in Object(t)&&t.length;return w(n)&&(n>=0&&(n-1 in t||t instanceof Array)||"function"==typeof t.item)}function r(t,n,i){var o,a;if(t)if(S(t))for(o in t)"prototype"==o||"length"==o||"name"==o||t.hasOwnProperty&&!t.hasOwnProperty(o)||n.call(i,t[o],o,t);else if(Zr(t)||e(t)){var u="object"!=typeof t;for(o=0,a=t.length;o<a;o++)(u||o in t)&&n.call(i,t[o],o,t)}else if(t.forEach&&t.forEach!==r)t.forEach(n,i,t);else if(b(t))for(o in t)n.call(i,t[o],o,t);else if("function"==typeof t.hasOwnProperty)for(o in t)t.hasOwnProperty(o)&&n.call(i,t[o],o,t);else for(o in t)Or.call(t,o)&&n.call(i,t[o],o,t);return t}function i(t,n,e){for(var r=Object.keys(t).sort(),i=0;i<r.length;i++)n.call(e,t[r[i]],r[i]);return r}function o(t){return function(n,e){t(e,n)}}function a(){return++Gr}function u(t,n){n?t.$$hashKey=n:delete t.$$hashKey}function s(t,n,e){for(var r=t.$$hashKey,i=0,o=n.length;i<o;++i){var a=n[i];if($(a)||S(a))for(var l=Object.keys(a),c=0,f=l.length;c<f;c++){var h=l[c],p=a[h];e&&$(p)?C(p)?t[h]=new Date(p.valueOf()):_(p)?t[h]=new RegExp(p):p.nodeName?t[h]=p.cloneNode(!0):N(p)?t[h]=p.clone():($(t[h])||(t[h]=Zr(p)?[]:{}),s(t[h],[p],!0)):t[h]=p}}return u(t,r),t}function l(t){return s(t,zr.call(arguments,1),!1)}function c(t){return s(t,zr.call(arguments,1),!0)}function f(t){return parseInt(t,10)}function h(t,n){return l(Object.create(t),n)}function p(){}function d(t){return t}function v(t){return function(){return t}}function g(t){return S(t.toString)&&t.toString!==Wr}function m(t){return"undefined"==typeof t}function y(t){return"undefined"!=typeof t}function $(t){return null!==t&&"object"==typeof t}function b(t){return null!==t&&"object"==typeof t&&!Ur(t)}function x(t){return"string"==typeof t}function w(t){return"number"==typeof t}function C(t){return"[object Date]"===Wr.call(t)}function S(t){return"function"==typeof t}function _(t){return"[object RegExp]"===Wr.call(t)}function M(t){return t&&t.window===t}function k(t){return t&&t.$evalAsync&&t.$watch}function A(t){return"[object File]"===Wr.call(t)}function E(t){return"[object FormData]"===Wr.call(t)}function P(t){return"[object Blob]"===Wr.call(t)}function T(t){return"boolean"==typeof t}function O(t){return t&&S(t.then)}function L(t){return t&&w(t.length)&&Xr.test(Wr.call(t))}function D(t){return"[object ArrayBuffer]"===Wr.call(t)}function N(t){return!(!t||!(t.nodeName||t.prop&&t.attr&&t.find))}function j(t){var n,e={},r=t.split(",");for(n=0;n<r.length;n++)e[r[n]]=!0;return e}function R(t){return Lr(t.nodeName||t[0]&&t[0].nodeName)}function F(t,n){var e=t.indexOf(n);return e>=0&&t.splice(e,1),e}function I(t,n){function e(t,n){var e,r=n.$$hashKey;if(Zr(t))for(var o=0,a=t.length;o<a;o++)n.push(i(t[o]));else if(b(t))for(e in t)n[e]=i(t[e]);else if(t&&"function"==typeof t.hasOwnProperty)for(e in t)t.hasOwnProperty(e)&&(n[e]=i(t[e]));else for(e in t)Or.call(t,e)&&(n[e]=i(t[e]));return u(n,r),n}function i(t){if(!$(t))return t;var n=a.indexOf(t);if(n!==-1)return s[n];if(M(t)||k(t))throw Hr("cpws","Can't copy! Making copies of Window or Scope instances is not supported.");var r=!1,i=o(t);return void 0===i&&(i=Zr(t)?[]:Object.create(Ur(t)),r=!0),a.push(t),s.push(i),r?e(t,i):i}function o(t){switch(Wr.call(t)){case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Float32Array]":case"[object Float64Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return new t.constructor(i(t.buffer),t.byteOffset,t.length);case"[object ArrayBuffer]":if(!t.slice){var n=new ArrayBuffer(t.byteLength);return new Uint8Array(n).set(new Uint8Array(t)),n}return t.slice(0);case"[object Boolean]":case"[object Number]":case"[object String]":case"[object Date]":return new t.constructor(t.valueOf());case"[object RegExp]":var e=new RegExp(t.source,t.toString().match(/[^\/]*$/)[0]);return e.lastIndex=t.lastIndex,e;case"[object Blob]":return new t.constructor([t],{type:t.type})}if(S(t.cloneNode))return t.cloneNode(!0)}var a=[],s=[];if(n){if(L(n)||D(n))throw Hr("cpta","Can't copy! TypedArray destination cannot be mutated.");if(t===n)throw Hr("cpi","Can't copy! Source and destination are identical.");return Zr(n)?n.length=0:r(n,function(t,e){"$$hashKey"!==e&&delete n[e]}),a.push(t),s.push(n),e(t,n)}return i(t)}function q(t,n){if(t===n)return!0;if(null===t||null===n)return!1;if(t!==t&&n!==n)return!0;var e,r,i,o=typeof t,a=typeof n;if(o==a&&"object"==o){if(!Zr(t)){if(C(t))return!!C(n)&&q(t.getTime(),n.getTime());if(_(t))return!!_(n)&&t.toString()==n.toString();if(k(t)||k(n)||M(t)||M(n)||Zr(n)||C(n)||_(n))return!1;i=dt();for(r in t)if("$"!==r.charAt(0)&&!S(t[r])){if(!q(t[r],n[r]))return!1;i[r]=!0}for(r in n)if(!(r in i)&&"$"!==r.charAt(0)&&y(n[r])&&!S(n[r]))return!1;return!0}if(!Zr(n))return!1;if((e=t.length)==n.length){for(r=0;r<e;r++)if(!q(t[r],n[r]))return!1;return!0}}return!1}function z(t,n,e){return t.concat(zr.call(n,e))}function V(t,n){return zr.call(t,n||0)}function B(t,n){var e=arguments.length>2?V(arguments,2):[];return!S(n)||n instanceof RegExp?n:e.length?function(){return arguments.length?n.apply(t,z(e,arguments,0)):n.apply(t,e)}:function(){return arguments.length?n.apply(t,arguments):n.call(t)}}function W(n,e){var r=e;return"string"==typeof n&&"$"===n.charAt(0)&&"$"===n.charAt(1)?r=void 0:M(e)?r="$WINDOW":e&&t.document===e?r="$DOCUMENT":k(e)&&(r="$SCOPE"),r}function U(t,n){if(!m(t))return w(n)||(n=n?2:null),JSON.stringify(t,W,n)}function H(t){return x(t)?JSON.parse(t):t}function Y(t,n){t=t.replace(ni,"");var e=Date.parse("Jan 01, 1970 00:00:00 "+t)/6e4;return isNaN(e)?n:e}function G(t,n){return t=new Date(t.getTime()),t.setMinutes(t.getMinutes()+n),t}function Z(t,n,e){e=e?-1:1;var r=t.getTimezoneOffset(),i=Y(n,r);return G(t,e*(i-r))}function X(t){t=Fr(t).clone();try{t.empty()}catch(n){}var e=Fr("<div>").append(t).html();try{return t[0].nodeType===ui?Lr(e):e.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(t,n){return"<"+Lr(n)})}catch(n){return Lr(e)}}function J(t){try{return decodeURIComponent(t)}catch(n){}}function K(t){var n={};return r((t||"").split("&"),function(t){var e,r,i;t&&(r=t=t.replace(/\+/g,"%20"),e=t.indexOf("="),e!==-1&&(r=t.substring(0,e),i=t.substring(e+1)),r=J(r),y(r)&&(i=!y(i)||J(i),Or.call(n,r)?Zr(n[r])?n[r].push(i):n[r]=[n[r],i]:n[r]=i))}),n}function Q(t){var n=[];return r(t,function(t,e){Zr(t)?r(t,function(t){n.push(nt(e,!0)+(t===!0?"":"="+nt(t,!0)))}):n.push(nt(e,!0)+(t===!0?"":"="+nt(t,!0)))}),n.length?n.join("&"):""}function tt(t){return nt(t,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function nt(t,n){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,n?"%20":"+")}function et(t,n){var e,r,i=ei.length;for(r=0;r<i;++r)if(e=ei[r]+n,x(e=t.getAttribute(e)))return e;return null}function rt(t,n){var e,i,o={};r(ei,function(n){var r=n+"app";!e&&t.hasAttribute&&t.hasAttribute(r)&&(e=t,i=t.getAttribute(r))}),r(ei,function(n){var r,o=n+"app";!e&&(r=t.querySelector("["+o.replace(":","\\:")+"]"))&&(e=r,i=r.getAttribute(o))}),e&&(o.strictDi=null!==et(e,"strict-di"),n(e,i?[i]:[],o))}function it(n,e,i){$(i)||(i={});var o={strictDi:!1};i=l(o,i);var a=function(){if(n=Fr(n),n.injector()){var r=n[0]===t.document?"document":X(n);throw Hr("btstrpd","App already bootstrapped with this element '{0}'",r.replace(/</,"&lt;").replace(/>/,"&gt;"))}e=e||[],e.unshift(["$provide",function(t){t.value("$rootElement",n)}]),i.debugInfoEnabled&&e.push(["$compileProvider",function(t){t.debugInfoEnabled(!0)}]),e.unshift("ng");var o=rn(e,i.strictDi);return o.invoke(["$rootScope","$rootElement","$compile","$injector",function(t,n,e,r){t.$apply(function(){n.data("$injector",r),e(n)(t)})}]),o},u=/^NG_ENABLE_DEBUG_INFO!/,s=/^NG_DEFER_BOOTSTRAP!/;return t&&u.test(t.name)&&(i.debugInfoEnabled=!0,t.name=t.name.replace(u,"")),t&&!s.test(t.name)?a():(t.name=t.name.replace(s,""),Yr.resumeBootstrap=function(t){return r(t,function(t){e.push(t)}),a()},void(S(Yr.resumeDeferredBootstrap)&&Yr.resumeDeferredBootstrap()))}function ot(){t.name="NG_ENABLE_DEBUG_INFO!"+t.name,t.location.reload()}function at(t){var n=Yr.element(t).injector();if(!n)throw Hr("test","no injector found for element argument to getTestability");return n.get("$$testability")}function ut(t,n){return n=n||"_",t.replace(ri,function(t,e){return(e?n:"")+t.toLowerCase()})}function st(){var n;if(!ii){var e=ti();Ir=m(e)?t.jQuery:e?t[e]:void 0,Ir&&Ir.fn.on?(Fr=Ir,l(Ir.fn,{scope:Mi.scope,isolateScope:Mi.isolateScope,controller:Mi.controller,injector:Mi.injector,inheritedData:Mi.inheritedData}),n=Ir.cleanData,Ir.cleanData=function(t){for(var e,r,i=0;null!=(r=t[i]);i++)e=Ir._data(r,"events"),e&&e.$destroy&&Ir(r).triggerHandler("$destroy");n(t)}):Fr=Et,Yr.element=Fr,ii=!0}}function lt(t,n,e){if(!t)throw Hr("areq","Argument '{0}' is {1}",n||"?",e||"required");return t}function ct(t,n,e){return e&&Zr(t)&&(t=t[t.length-1]),lt(S(t),n,"not a function, got "+(t&&"object"==typeof t?t.constructor.name||"Object":typeof t)),t}function ft(t,n){if("hasOwnProperty"===t)throw Hr("badname","hasOwnProperty is not a valid {0} name",n)}function ht(t,n,e){if(!n)return t;for(var r,i=n.split("."),o=t,a=i.length,u=0;u<a;u++)r=i[u],t&&(t=(o=t)[r]);return!e&&S(t)?B(o,t):t}function pt(t){for(var n,e=t[0],r=t[t.length-1],i=1;e!==r&&(e=e.nextSibling);i++)(n||t[i]!==e)&&(n||(n=Fr(zr.call(t,0,i))),n.push(e));return n||t}function dt(){return Object.create(null)}function vt(t){function e(t,n,e){return t[n]||(t[n]=e())}var r=n("$injector"),i=n("ng"),o=e(t,"angular",Object);return o.$$minErr=o.$$minErr||n,e(o,"module",function(){var t={};return function(n,o,a){var u=function(t,n){if("hasOwnProperty"===t)throw i("badname","hasOwnProperty is not a valid {0} name",n)};return u(n,"module"),o&&t.hasOwnProperty(n)&&(t[n]=null),e(t,n,function(){function t(t,n,e,r){return r||(r=i),function(){return r[e||"push"]([t,n,arguments]),c}}function e(t,e){return function(r,o){return o&&S(o)&&(o.$$moduleName=n),i.push([t,e,arguments]),c}}if(!o)throw r("nomod","Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.",n);var i=[],u=[],s=[],l=t("$injector","invoke","push",u),c={_invokeQueue:i,_configBlocks:u,_runBlocks:s,requires:o,name:n,provider:e("$provide","provider"),factory:e("$provide","factory"),service:e("$provide","service"),value:t("$provide","value"),constant:t("$provide","constant","unshift"),decorator:e("$provide","decorator"),animation:e("$animateProvider","register"),filter:e("$filterProvider","register"),controller:e("$controllerProvider","register"),directive:e("$compileProvider","directive"),component:e("$compileProvider","component"),config:l,run:function(t){return s.push(t),this}};return a&&l(a),c})}})}function gt(t,n){if(Zr(t)){n=n||[];for(var e=0,r=t.length;e<r;e++)n[e]=t[e]}else if($(t)){n=n||{};for(var i in t)"$"===i.charAt(0)&&"$"===i.charAt(1)||(n[i]=t[i])}return n||t}function mt(t){var n=[];return JSON.stringify(t,function(t,e){if(e=W(t,e),$(e)){if(n.indexOf(e)>=0)return"...";n.push(e)}return e})}function yt(t){return"function"==typeof t?t.toString().replace(/ \{[\s\S]*$/,""):m(t)?"undefined":"string"!=typeof t?mt(t):t}function $t(e){l(e,{bootstrap:it,copy:I,extend:l,merge:c,equals:q,element:Fr,forEach:r,injector:rn,noop:p,bind:B,toJson:U,fromJson:H,identity:d,isUndefined:m,isDefined:y,isString:x,isFunction:S,isObject:$,isNumber:w,isElement:N,isArray:Zr,version:fi,isDate:C,lowercase:Lr,uppercase:Dr,callbacks:{$$counter:0},getTestability:at,$$minErr:n,$$csp:Qr,reloadWithDebugInfo:ot}),(qr=vt(t))("ng",["ngLocale"],["$provide",function(t){t.provider({$$sanitizeUri:_e}),t.provider("$compile",vn).directive({a:No,input:ta,textarea:ta,form:qo,script:Za,select:Ka,style:tu,option:Qa,ngBind:ra,ngBindHtml:oa,ngBindTemplate:ia,ngClass:ua,ngClassEven:la,ngClassOdd:sa,ngCloak:ca,ngController:fa,ngForm:zo,ngHide:Va,ngIf:da,ngInclude:va,ngInit:ma,ngNonBindable:La,ngPluralize:Ra,ngRepeat:Fa,ngShow:za,ngStyle:Ba,ngSwitch:Wa,ngSwitchWhen:Ua,ngSwitchDefault:Ha,ngOptions:ja,ngTransclude:Ga,ngModel:Pa,ngList:ya,ngChange:aa,pattern:eu,ngPattern:eu,required:nu,ngRequired:nu,minlength:iu,ngMinlength:iu,maxlength:ru,ngMaxlength:ru,ngValue:ea,ngModelOptions:Oa}).directive({ngInclude:ga}).directive(jo).directive(ha),t.provider({$anchorScroll:on,$animate:Vi,$animateCss:Ui,$$animateJs:qi,$$animateQueue:zi,$$AnimateRunner:Wi,$$animateAsyncRun:Bi,$browser:fn,$cacheFactory:hn,$controller:xn,$document:wn,$exceptionHandler:Cn,$filter:Ie,$$forceReflow:Ji,$interpolate:Rn,$interval:Fn,$http:Ln,$httpParamSerializer:_n,$httpParamSerializerJQLike:Mn,$httpBackend:Nn,$xhrFactory:Dn,$jsonpCallbacks:ao,$location:Qn,$log:te,$parse:$e,$rootScope:Se,$q:be,$$q:xe,$sce:Ee,$sceDelegate:Ae,$sniffer:Pe,$templateCache:pn,$templateRequest:Te,$$testability:Oe,$timeout:Le,$window:je,$$rAF:Ce,$$jqLite:Xt,$$HashMap:Pi,$$cookieReader:Fe})}])}function bt(){return++pi}function xt(t){return t.replace(gi,function(t,n,e,r){return r?e.toUpperCase():e}).replace(mi,"Moz$1")}function wt(t){return!xi.test(t)}function Ct(t){var n=t.nodeType;return n===oi||!n||n===li}function St(t){for(var n in hi[t.ng339])return!0;return!1}function _t(t){for(var n=0,e=t.length;n<e;n++)Lt(t[n])}function Mt(t,n){var e,i,o,a,u=n.createDocumentFragment(),s=[];if(wt(t))s.push(n.createTextNode(t));else{for(e=u.appendChild(n.createElement("div")),i=(wi.exec(t)||["",""])[1].toLowerCase(),o=Si[i]||Si._default,e.innerHTML=o[1]+t.replace(Ci,"<$1></$2>")+o[2],a=o[0];a--;)e=e.lastChild;s=z(s,e.childNodes),e=u.firstChild,e.textContent=""}return u.textContent="",u.innerHTML="",r(s,function(t){u.appendChild(t)}),u}function kt(n,e){e=e||t.document;var r;return(r=bi.exec(n))?[e.createElement(r[1])]:(r=Mt(n,e))?r.childNodes:[]}function At(t,n){var e=t.parentNode;e&&e.replaceChild(n,t),n.appendChild(t)}function Et(t){if(t instanceof Et)return t;var n;if(x(t)&&(t=Jr(t),n=!0),!(this instanceof Et)){if(n&&"<"!=t.charAt(0))throw $i("nosel","Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element");return new Et(t)}n?It(this,kt(t)):It(this,t)}function Pt(t){return t.cloneNode(!0)}function Tt(t,n){if(n||Lt(t),t.querySelectorAll)for(var e=t.querySelectorAll("*"),r=0,i=e.length;r<i;r++)Lt(e[r])}function Ot(t,n,e,i){if(y(i))throw $i("offargs","jqLite#off() does not support the `selector` argument");var o=Dt(t),a=o&&o.events,u=o&&o.handle;if(u)if(n){var s=function(n){var r=a[n];y(e)&&F(r||[],e),y(e)&&r&&r.length>0||(vi(t,n,u),delete a[n])};r(n.split(" "),function(t){s(t),yi[t]&&s(yi[t])})}else for(n in a)"$destroy"!==n&&vi(t,n,u),delete a[n]}function Lt(t,n){var e=t.ng339,r=e&&hi[e];if(r){if(n)return void delete r.data[n];r.handle&&(r.events.$destroy&&r.handle({},"$destroy"),Ot(t)),delete hi[e],t.ng339=void 0}}function Dt(t,n){var e=t.ng339,r=e&&hi[e];return n&&!r&&(t.ng339=e=bt(),r=hi[e]={events:{},data:{},handle:void 0}),r}function Nt(t,n,e){if(Ct(t)){var r=y(e),i=!r&&n&&!$(n),o=!n,a=Dt(t,!i),u=a&&a.data;if(r)u[n]=e;else{if(o)return u;if(i)return u&&u[n];l(u,n)}}}function jt(t,n){return!!t.getAttribute&&(" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+n+" ")>-1}function Rt(t,n){n&&t.setAttribute&&r(n.split(" "),function(n){t.setAttribute("class",Jr((" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+Jr(n)+" "," ")))})}function Ft(t,n){if(n&&t.setAttribute){var e=(" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");r(n.split(" "),function(t){t=Jr(t),e.indexOf(" "+t+" ")===-1&&(e+=t+" ")}),t.setAttribute("class",Jr(e))}}function It(t,n){if(n)if(n.nodeType)t[t.length++]=n;else{var e=n.length;if("number"==typeof e&&n.window!==n){if(e)for(var r=0;r<e;r++)t[t.length++]=n[r]}else t[t.length++]=n}}function qt(t,n){return zt(t,"$"+(n||"ngController")+"Controller")}function zt(t,n,e){t.nodeType==li&&(t=t.documentElement);for(var r=Zr(n)?n:[n];t;){for(var i=0,o=r.length;i<o;i++)if(y(e=Fr.data(t,r[i])))return e;t=t.parentNode||t.nodeType===ci&&t.host}}function Vt(t){for(Tt(t,!0);t.firstChild;)t.removeChild(t.firstChild)}function Bt(t,n){n||Tt(t);var e=t.parentNode;e&&e.removeChild(t)}function Wt(n,e){e=e||t,"complete"===e.document.readyState?e.setTimeout(n):Fr(e).on("load",n)}function Ut(t,n){var e=ki[n.toLowerCase()];return e&&Ai[R(t)]&&e}function Ht(t){return Ei[t]}function Yt(t,n){var e=function(e,r){e.isDefaultPrevented=function(){return e.defaultPrevented};var i=n[r||e.type],o=i?i.length:0;if(o){if(m(e.immediatePropagationStopped)){var a=e.stopImmediatePropagation;e.stopImmediatePropagation=function(){e.immediatePropagationStopped=!0,e.stopPropagation&&e.stopPropagation(),a&&a.call(e)}}e.isImmediatePropagationStopped=function(){return e.immediatePropagationStopped===!0};var u=i.specialHandlerWrapper||Gt;o>1&&(i=gt(i));for(var s=0;s<o;s++)e.isImmediatePropagationStopped()||u(t,e,i[s])}};return e.elem=t,e}function Gt(t,n,e){e.call(t,n)}function Zt(t,n,e){var r=n.relatedTarget;r&&(r===t||_i.call(t,r))||e.call(t,n)}function Xt(){this.$get=function(){return l(Et,{hasClass:function(t,n){return t.attr&&(t=t[0]),jt(t,n)},addClass:function(t,n){return t.attr&&(t=t[0]),Ft(t,n)},removeClass:function(t,n){return t.attr&&(t=t[0]),Rt(t,n)}})}}function Jt(t,n){var e=t&&t.$$hashKey;if(e)return"function"==typeof e&&(e=t.$$hashKey()),e;var r=typeof t;return e="function"==r||"object"==r&&null!==t?t.$$hashKey=r+":"+(n||a)():r+":"+t}function Kt(t,n){if(n){var e=0;this.nextUid=function(){return++e}}r(t,this.put,this)}function Qt(t){return Function.prototype.toString.call(t)+" "}function tn(t){var n=Qt(t).replace(Ni,""),e=n.match(Ti)||n.match(Oi);return e}function nn(t){var n=tn(t);return n?"function("+(n[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function en(t,n,e){var i,o,a;if("function"==typeof t){if(!(i=t.$inject)){if(i=[],t.length){if(n)throw x(e)&&e||(e=t.name||nn(t)),ji("strictdi","{0} is not using explicit annotation and cannot be invoked in strict mode",e);o=tn(t),r(o[1].split(Li),function(t){t.replace(Di,function(t,n,e){i.push(e)})})}t.$inject=i}}else Zr(t)?(a=t.length-1,ct(t[a],"fn"),i=t.slice(0,a)):ct(t,"fn",!0);return i}function rn(t,n){function e(t){return function(n,e){return $(n)?void r(n,o(t)):t(n,e)}}function i(t,n){if(ft(t,"service"),(S(n)||Zr(n))&&(n=C.instantiate(n)),!n.$get)throw ji("pget","Provider '{0}' must define $get factory method.",t);return w[t+g]=n}function a(t,n){return function(){var e=k.invoke(n,this);if(m(e))throw ji("undef","Provider '{0}' must return a value from $get factory method.",t);return e}}function u(t,n,e){return i(t,{$get:e!==!1?a(t,n):n})}function s(t,n){return u(t,["$injector",function(t){return t.instantiate(n)}])}function l(t,n){return u(t,v(n),!1)}function c(t,n){ft(t,"constant"),w[t]=n,_[t]=n}function f(t,n){var e=C.get(t+g),r=e.$get;e.$get=function(){var t=k.invoke(r,e);return k.invoke(n,null,{$delegate:t})}}function h(t){lt(m(t)||Zr(t),"modulesToLoad","not an array");var n,e=[];return r(t,function(t){function r(t){var n,e;for(n=0,e=t.length;n<e;n++){var r=t[n],i=C.get(r[0]);i[r[1]].apply(i,r[2])}}if(!b.get(t)){b.put(t,!0);try{x(t)?(n=qr(t),e=e.concat(h(n.requires)).concat(n._runBlocks),r(n._invokeQueue),r(n._configBlocks)):S(t)?e.push(C.invoke(t)):Zr(t)?e.push(C.invoke(t)):ct(t,"module")}catch(i){throw Zr(t)&&(t=t[t.length-1]),i.message&&i.stack&&i.stack.indexOf(i.message)==-1&&(i=i.message+"\n"+i.stack),ji("modulerr","Failed to instantiate module {0} due to:\n{1}",t,i.stack||i.message||i)}}}),e}function p(t,e){function r(n,r){if(t.hasOwnProperty(n)){if(t[n]===d)throw ji("cdep","Circular dependency found: {0}",n+" <- "+y.join(" <- "));return t[n]}try{return y.unshift(n),t[n]=d,t[n]=e(n,r)}catch(i){throw t[n]===d&&delete t[n],i}finally{y.shift()}}function i(t,e,i){for(var o=[],a=rn.$$annotate(t,n,i),u=0,s=a.length;u<s;u++){var l=a[u];if("string"!=typeof l)throw ji("itkn","Incorrect injection token! Expected service name as string, got {0}",l);o.push(e&&e.hasOwnProperty(l)?e[l]:r(l,i))}return o}function o(t){return!(Rr<=11)&&("function"==typeof t&&/^(?:class\b|constructor\()/.test(Qt(t)))}function a(t,n,e,r){"string"==typeof e&&(r=e,e=null);var a=i(t,e,r);return Zr(t)&&(t=t[t.length-1]),o(t)?(a.unshift(null),new(Function.prototype.bind.apply(t,a))):t.apply(n,a)}function u(t,n,e){var r=Zr(t)?t[t.length-1]:t,o=i(t,n,e);return o.unshift(null),new(Function.prototype.bind.apply(r,o))}return{invoke:a,instantiate:u,get:r,annotate:rn.$$annotate,has:function(n){return w.hasOwnProperty(n+g)||t.hasOwnProperty(n)}}}n=n===!0;var d={},g="Provider",y=[],b=new Kt([],(!0)),w={$provide:{provider:e(i),factory:e(u),service:e(s),value:e(l),constant:e(c),decorator:f}},C=w.$injector=p(w,function(t,n){throw Yr.isString(n)&&y.push(n),ji("unpr","Unknown provider: {0}",y.join(" <- "))}),_={},M=p(_,function(t,n){var e=C.get(t+g,n);return k.invoke(e.$get,e,void 0,t)}),k=M;w["$injector"+g]={$get:v(M)};var A=h(t);return k=M.get("$injector"),k.strictDi=n,r(A,function(t){t&&k.invoke(t)}),k}function on(){var t=!0;this.disableAutoScrolling=function(){t=!1},this.$get=["$window","$location","$rootScope",function(n,e,r){function i(t){var n=null;return Array.prototype.some.call(t,function(t){if("a"===R(t))return n=t,!0}),n}function o(){var t=u.yOffset;if(S(t))t=t();else if(N(t)){var e=t[0],r=n.getComputedStyle(e);t="fixed"!==r.position?0:e.getBoundingClientRect().bottom}else w(t)||(t=0);return t}function a(t){if(t){t.scrollIntoView();var e=o();if(e){var r=t.getBoundingClientRect().top;n.scrollBy(0,r-e)}}else n.scrollTo(0,0)}function u(t){t=x(t)?t:e.hash();var n;t?(n=s.getElementById(t))?a(n):(n=i(s.getElementsByName(t)))?a(n):"top"===t&&a(null):a(null)}var s=n.document;return t&&r.$watch(function(){return e.hash()},function(t,n){t===n&&""===t||Wt(function(){r.$evalAsync(u)})}),u}]}function an(t,n){return t||n?t?n?(Zr(t)&&(t=t.join(" ")),Zr(n)&&(n=n.join(" ")),t+" "+n):t:n:""}function un(t){for(var n=0;n<t.length;n++){var e=t[n];if(e.nodeType===Fi)return e}}function sn(t){x(t)&&(t=t.split(" "));var n=dt();return r(t,function(t){t.length&&(n[t]=!0)}),n}function ln(t){return $(t)?t:{}}function cn(t,n,e,i){function o(t){try{t.apply(null,V(arguments,1))}finally{if(y--,0===y)for(;$.length;)try{$.pop()()}catch(n){e.error(n)}}}function a(t){var n=t.indexOf("#");return n===-1?"":t.substr(n)}function u(){S=null,s(),l()}function s(){b=_(),b=m(b)?null:b,q(b,A)&&(b=A),A=b}function l(){w===c.url()&&x===b||(w=c.url(),x=b,r(M,function(t){t(c.url(),b)}))}var c=this,f=t.location,h=t.history,d=t.setTimeout,v=t.clearTimeout,g={};c.isMock=!1;var y=0,$=[];c.$$completeOutstandingRequest=o,c.$$incOutstandingRequestCount=function(){y++},c.notifyWhenNoOutstandingRequests=function(t){0===y?t():$.push(t)};var b,x,w=f.href,C=n.find("base"),S=null,_=i.history?function(){try{return h.state}catch(t){}}:p;s(),x=b,c.url=function(n,e,r){if(m(r)&&(r=null),f!==t.location&&(f=t.location),h!==t.history&&(h=t.history),n){var o=x===r;if(w===n&&(!i.history||o))return c;var u=w&&Wn(w)===Wn(n);return w=n,x=r,!i.history||u&&o?(u||(S=n),e?f.replace(n):u?f.hash=a(n):f.href=n,f.href!==n&&(S=n)):(h[e?"replaceState":"pushState"](r,"",n),s(),x=b),S&&(S=n),c}return S||f.href.replace(/%27/g,"'")},c.state=function(){return b};var M=[],k=!1,A=null;c.onUrlChange=function(n){return k||(i.history&&Fr(t).on("popstate",u),Fr(t).on("hashchange",u),k=!0),M.push(n),n},c.$$applicationDestroyed=function(){Fr(t).off("hashchange popstate",u)},c.$$checkUrlChange=l,c.baseHref=function(){var t=C.attr("href");return t?t.replace(/^(https?\:)?\/\/[^\/]*/,""):""},c.defer=function(t,n){var e;return y++,e=d(function(){delete g[e],o(t)},n||0),g[e]=!0,e},c.defer.cancel=function(t){return!!g[t]&&(delete g[t],v(t),o(p),!0)}}function fn(){this.$get=["$window","$log","$sniffer","$document",function(t,n,e,r){return new cn(t,r,n,e)}]}function hn(){this.$get=function(){function t(t,r){function i(t){t!=h&&(p?p==t&&(p=t.n):p=t,o(t.n,t.p),o(t,h),h=t,h.n=null)}function o(t,n){t!=n&&(t&&(t.p=n),n&&(n.n=t))}if(t in e)throw n("$cacheFactory")("iid","CacheId '{0}' is already taken!",t);var a=0,u=l({},r,{id:t}),s=dt(),c=r&&r.capacity||Number.MAX_VALUE,f=dt(),h=null,p=null;return e[t]={put:function(t,n){if(!m(n)){if(c<Number.MAX_VALUE){var e=f[t]||(f[t]={key:t});i(e)}return t in s||a++,s[t]=n,a>c&&this.remove(p.key),n}},get:function(t){if(c<Number.MAX_VALUE){var n=f[t];if(!n)return;i(n)}return s[t]},remove:function(t){if(c<Number.MAX_VALUE){var n=f[t];if(!n)return;n==h&&(h=n.p),n==p&&(p=n.n),o(n.n,n.p),delete f[t]}t in s&&(delete s[t],a--)},removeAll:function(){s=dt(),a=0,f=dt(),h=p=null},destroy:function(){s=null,u=null,f=null,delete e[t]},info:function(){return l({},u,{size:a})}}}var e={};return t.info=function(){var t={};return r(e,function(n,e){t[e]=n.info()}),t},t.get=function(t){return e[t]},t}}function pn(){this.$get=["$cacheFactory",function(t){return t("templates")}]}function dn(){}function vn(n,e){function i(t,n,e){var i=/^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/,o=dt();return r(t,function(t,r){if(t in M)return void(o[r]=M[t]);var a=t.match(i);if(!a)throw Hi("iscp","Invalid {3} for directive '{0}'. Definition: {... {1}: '{2}' ...}",n,r,t,e?"controller bindings definition":"isolate scope definition");o[r]={mode:a[1][0],collection:"*"===a[2],optional:"?"===a[3],attrName:a[4]||r},a[4]&&(M[t]=o[r])}),o}function a(t,n){var e={isolateScope:null,bindToController:null};if($(t.scope)&&(t.bindToController===!0?(e.bindToController=i(t.scope,n,!0),e.isolateScope={}):e.isolateScope=i(t.scope,n,!1)),$(t.bindToController)&&(e.bindToController=i(t.bindToController,n,!0)),$(e.bindToController)){var r=t.controller,o=t.controllerAs;if(!r)throw Hi("noctrl","Cannot bind to controller without directive '{0}'s controller.",n);if(!bn(r,o))throw Hi("noident","Cannot bind to controller without identifier for directive '{0}'.",n)}return e}function u(t){var n=t.charAt(0);if(!n||n!==Lr(n))throw Hi("baddir","Directive/Component name '{0}' is invalid. The first character must be a lowercase letter",t);if(t!==t.trim())throw Hi("baddir","Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces",t)}function s(t){var n=t.require||t.controller&&t.name;return!Zr(n)&&$(n)&&r(n,function(t,e){var r=t.match(C),i=t.substring(r[0].length);i||(n[e]=r[0]+e)}),n}var c={},f="Directive",g=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,b=/(([\w\-]+)(?:\:([^;]+))?;?)/,w=j("ngSrc,ngSrcset,src,srcset"),C=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,_=/^(on[a-z]+|formaction)$/,M=dt();this.directive=function P(t,e){return ft(t,"directive"),x(t)?(u(t),lt(e,"directiveFactory"),c.hasOwnProperty(t)||(c[t]=[],n.factory(t+f,["$injector","$exceptionHandler",function(n,e){var i=[];return r(c[t],function(r,o){try{var a=n.invoke(r);S(a)?a={compile:v(a)}:!a.compile&&a.link&&(a.compile=v(a.link)),a.priority=a.priority||0,a.index=o,a.name=a.name||t,a.require=s(a),a.restrict=a.restrict||"EA",a.$$moduleName=r.$$moduleName,i.push(a)}catch(u){e(u)}}),i}])),c[t].push(e)):r(t,o(P)),this},this.component=function(t,n){function e(t){function e(n){return S(n)||Zr(n)?function(e,r){return t.invoke(n,this,{$element:e,$attrs:r})}:n}var o=n.template||n.templateUrl?n.template:"",a={controller:i,controllerAs:bn(n.controller)||n.controllerAs||"$ctrl",template:e(o),templateUrl:e(n.templateUrl),transclude:n.transclude,scope:{},bindToController:n.bindings||{},restrict:"E",require:n.require};return r(n,function(t,n){"$"===n.charAt(0)&&(a[n]=t)}),a}var i=n.controller||function(){};return r(n,function(t,n){"$"===n.charAt(0)&&(e[n]=t,S(i)&&(i[n]=t))}),e.$inject=["$injector"],this.directive(t,e)},this.aHrefSanitizationWhitelist=function(t){return y(t)?(e.aHrefSanitizationWhitelist(t),this):e.aHrefSanitizationWhitelist()},this.imgSrcSanitizationWhitelist=function(t){return y(t)?(e.imgSrcSanitizationWhitelist(t),this):e.imgSrcSanitizationWhitelist()};var A=!0;this.debugInfoEnabled=function(t){return y(t)?(A=t,this):A};var E=10;this.onChangesTtl=function(t){return arguments.length?(E=t,this):E},this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(n,e,i,o,u,s,v,M,P,O){function L(){try{if(!--Ct)throw $t=void 0,Hi("infchng","{0} $onChanges() iterations reached. Aborting!\n",E);v.$apply(function(){for(var t=[],n=0,e=$t.length;n<e;++n)try{$t[n]()}catch(r){t.push(r)}if($t=void 0,t.length)throw t})}finally{Ct++}}function D(t,n){if(n){var e,r,i,o=Object.keys(n);for(e=0,r=o.length;e<r;e++)i=o[e],this[i]=n[i]}else this.$attr={};this.$$element=t}function N(t,n,e){xt.innerHTML="<span "+n+">";var r=xt.firstChild.attributes,i=r[0];r.removeNamedItem(i.name),i.value=e,t.attributes.setNamedItem(i)}function j(t,n){try{t.addClass(n)}catch(e){}}function I(n,e,r,i,o){n instanceof Fr||(n=Fr(n));for(var a=/\S+/,u=0,s=n.length;u<s;u++){var l=n[u];l.nodeType===ui&&l.nodeValue.match(a)&&At(l,n[u]=t.document.createElement("span"))}var c=W(n,e,n,r,i,o);I.$$addScopeClass(n);var f=null;return function(t,e,r){lt(t,"scope"),o&&o.needsNewScope&&(t=t.$parent.$new()),r=r||{};var i=r.parentBoundTranscludeFn,a=r.transcludeControllers,u=r.futureParentElement;i&&i.$$boundTransclude&&(i=i.$$boundTransclude),f||(f=z(u));var s;if(s="html"!==f?Fr(ft(f,Fr("<div>").append(n).html())):e?Mi.clone.call(n):n,a)for(var l in a)s.data("$"+l+"Controller",a[l].instance);return I.$$addScopeInfo(s,t),e&&e(s,t),c&&c(t,s,s,i),s}}function z(t){var n=t&&t[0];return n&&"foreignobject"!==R(n)&&Wr.call(n).match(/SVG/)?"svg":"html"}function W(t,n,e,r,i,o){function a(t,e,r,i){var o,a,u,s,l,c,f,h,v;if(p){var g=e.length;for(v=new Array(g),l=0;l<d.length;l+=3)f=d[l],v[f]=e[f]}else v=e;for(l=0,c=d.length;l<c;)u=v[d[l++]],o=d[l++],a=d[l++],o?(o.scope?(s=t.$new(),I.$$addScopeInfo(Fr(u),s)):s=t,h=o.transcludeOnThisElement?U(t,o.transclude,i):!o.templateOnThisElement&&i?i:!i&&n?U(t,n):null,o(a,s,u,r,h)):a&&a(t,u.childNodes,void 0,i)}for(var u,s,l,c,f,h,p,d=[],v=0;v<t.length;v++)u=new D,s=H(t[v],[],u,0===v?r:void 0,i),l=s.length?K(s,t[v],u,n,e,null,[],[],o):null,l&&l.scope&&I.$$addScopeClass(u.$$element),f=l&&l.terminal||!(c=t[v].childNodes)||!c.length?null:W(c,l?(l.transcludeOnThisElement||!l.templateOnThisElement)&&l.transclude:n),(l||f)&&(d.push(v,l,f),h=!0,p=p||l),o=null;return h?a:null}function U(t,n,e){function r(r,i,o,a,u){return r||(r=t.$new(!1,u),r.$$transcluded=!0),n(r,i,{parentBoundTranscludeFn:e,transcludeControllers:o,futureParentElement:a})}var i=r.$$slots=dt();for(var o in n.$$slots)n.$$slots[o]?i[o]=U(t,n.$$slots[o],e):i[o]=null;return r}function H(t,n,e,r,i){var o,a,u=t.nodeType,s=e.$attr;switch(u){case oi:et(n,mn(R(t)),"E",r,i);for(var l,c,f,h,p,d,v=t.attributes,g=0,m=v&&v.length;g<m;g++){var y=!1,w=!1;l=v[g],c=l.name,p=Jr(l.value),h=mn(c),(d=kt.test(h))&&(c=c.replace(Gi,"").substr(8).replace(/_(.)/g,function(t,n){return n.toUpperCase()}));var C=h.match(Et);C&&rt(C[1])&&(y=c,w=c.substr(0,c.length-5)+"end",c=c.substr(0,c.length-6)),f=mn(c.toLowerCase()),s[f]=c,!d&&e.hasOwnProperty(f)||(e[f]=p,Ut(t,f)&&(e[f]=!0)),pt(t,n,p,f,d),et(n,f,"A",r,i,y,w)}if(a=t.className,$(a)&&(a=a.animVal),x(a)&&""!==a)for(;o=b.exec(a);)f=mn(o[2]),et(n,f,"C",r,i)&&(e[f]=Jr(o[3])),a=a.substr(o.index+o[0].length);break;case ui:if(11===Rr)for(;t.parentNode&&t.nextSibling&&t.nextSibling.nodeType===ui;)t.nodeValue=t.nodeValue+t.nextSibling.nodeValue,t.parentNode.removeChild(t.nextSibling);ct(n,t.nodeValue);break;case si:Y(t,n,e,r,i)}return n.sort(at),n}function Y(t,n,e,r,i){try{var o=g.exec(t.nodeValue);if(o){var a=mn(o[1]);
 et(n,a,"M",r,i)&&(e[a]=Jr(o[2]))}}catch(u){}}function G(t,n,e){var r=[],i=0;if(n&&t.hasAttribute&&t.hasAttribute(n)){do{if(!t)throw Hi("uterdir","Unterminated attribute, found '{0}' but no matching '{1}' found.",n,e);t.nodeType==oi&&(t.hasAttribute(n)&&i++,t.hasAttribute(e)&&i--),r.push(t),t=t.nextSibling}while(i>0)}else r.push(t);return Fr(r)}function Z(t,n,e){return function(r,i,o,a,u){return i=G(i[0],n,e),t(r,i,o,a,u)}}function J(t,n,e,r,i,o){var a;return t?I(n,e,r,i,o):function(){return a||(a=I(n,e,r,i,o),n=e=o=null),a.apply(this,arguments)}}function K(t,n,e,o,a,u,s,c,f){function h(t,n,e,r){t&&(e&&(t=Z(t,e,r)),t.require=d.require,t.directiveName=v,(_===d||d.$$isolateScope)&&(t=gt(t,{isolateScope:!0})),s.push(t)),n&&(e&&(n=Z(n,e,r)),n.require=d.require,n.directiveName=v,(_===d||d.$$isolateScope)&&(n=gt(n,{isolateScope:!0})),c.push(n))}function p(t,o,a,u,f){function h(t,n,e,r){var i;if(k(t)||(r=e,e=n,n=t,t=void 0),T&&(i=b),e||(e=T?A.parent():A),!r)return f(t,n,i,e,F);var o=f.$$slots[r];if(o)return o(t,n,i,e,F);if(m(o))throw Hi("noslot",'No parent directive that requires a transclusion with slot name "{0}". Element: {1}',r,X(A))}var p,d,v,g,y,b,x,A,E,P;n===a?(E=e,A=e.$$element):(A=Fr(a),E=new D(A,e)),y=o,_?g=o.$new(!0):w&&(y=o.$parent),f&&(x=h,x.$$boundTransclude=f,x.isSlotFilled=function(t){return!!f.$$slots[t]}),C&&(b=tt(A,E,x,C,g,o,_)),_&&(I.$$addScopeInfo(A,g,!0,!(M&&(M===_||M===_.$$originalDirective))),I.$$addScopeClass(A,!0),g.$$isolateBindings=_.$$isolateBindings,P=yt(o,E,g,g.$$isolateBindings,_),P.removeWatches&&g.$on("$destroy",P.removeWatches));for(var O in b){var L=C[O],N=b[O],j=L.$$bindings.bindToController;N.identifier&&j?N.bindingInfo=yt(y,E,N.instance,j,L):N.bindingInfo={};var R=N();R!==N.instance&&(N.instance=R,A.data("$"+L.name+"Controller",R),N.bindingInfo.removeWatches&&N.bindingInfo.removeWatches(),N.bindingInfo=yt(y,E,N.instance,j,L))}for(r(C,function(t,n){var e=t.require;t.bindToController&&!Zr(e)&&$(e)&&l(b[n].instance,Q(n,e,A,b))}),r(b,function(t){var n=t.instance;if(S(n.$onChanges))try{n.$onChanges(t.bindingInfo.initialChanges)}catch(e){i(e)}if(S(n.$onInit))try{n.$onInit()}catch(e){i(e)}S(n.$doCheck)&&(y.$watch(function(){n.$doCheck()}),n.$doCheck()),S(n.$onDestroy)&&y.$on("$destroy",function(){n.$onDestroy()})}),p=0,d=s.length;p<d;p++)v=s[p],mt(v,v.isolateScope?g:o,A,E,v.require&&Q(v.directiveName,v.require,A,b),x);var F=o;for(_&&(_.template||null===_.templateUrl)&&(F=g),t&&t(F,a.childNodes,void 0,f),p=c.length-1;p>=0;p--)v=c[p],mt(v,v.isolateScope?g:o,A,E,v.require&&Q(v.directiveName,v.require,A,b),x);r(b,function(t){var n=t.instance;S(n.$postLink)&&n.$postLink()})}f=f||{};for(var d,v,g,y,b,x=-Number.MAX_VALUE,w=f.newScopeDirective,C=f.controllerDirectives,_=f.newIsolateScopeDirective,M=f.templateDirective,A=f.nonTlbTranscludeDirective,E=!1,P=!1,T=f.hasElementTranscludeDirective,O=e.$$element=Fr(n),L=u,N=o,j=!1,F=!1,q=0,z=t.length;q<z;q++){d=t[q];var W=d.$$start,U=d.$$end;if(W&&(O=G(n,W,U)),g=void 0,x>d.priority)break;if((b=d.scope)&&(d.templateUrl||($(b)?(st("new/isolated scope",_||w,d,O),_=d):st("new/isolated scope",_,d,O)),w=w||d),v=d.name,!j&&(d.replace&&(d.templateUrl||d.template)||d.transclude&&!d.$$tlb)){for(var Y,K=q+1;Y=t[K++];)if(Y.transclude&&!Y.$$tlb||Y.replace&&(Y.templateUrl||Y.template)){F=!0;break}j=!0}if(!d.templateUrl&&d.controller&&(b=d.controller,C=C||dt(),st("'"+v+"' controller",C[v],d,O),C[v]=d),b=d.transclude)if(E=!0,d.$$tlb||(st("transclusion",A,d,O),A=d),"element"==b)T=!0,x=d.priority,g=O,O=e.$$element=Fr(I.$$createComment(v,e[v])),n=O[0],vt(a,V(g),n),g[0].$$parentNode=g[0].parentNode,N=J(F,g,o,x,L&&L.name,{nonTlbTranscludeDirective:A});else{var et=dt();if(g=Fr(Pt(n)).contents(),$(b)){g=[];var rt=dt(),at=dt();r(b,function(t,n){var e="?"===t.charAt(0);t=e?t.substring(1):t,rt[t]=n,et[n]=null,at[n]=e}),r(O.contents(),function(t){var n=rt[mn(R(t))];n?(at[n]=!0,et[n]=et[n]||[],et[n].push(t)):g.push(t)}),r(at,function(t,n){if(!t)throw Hi("reqslot","Required transclusion slot `{0}` was not filled.",n)});for(var ut in et)et[ut]&&(et[ut]=J(F,et[ut],o))}O.empty(),N=J(F,g,o,void 0,void 0,{needsNewScope:d.$$isolateScope||d.$$newScope}),N.$$slots=et}if(d.template)if(P=!0,st("template",M,d,O),M=d,b=S(d.template)?d.template(O,e):d.template,b=Mt(b),d.replace){if(L=d,g=wt(b)?[]:$n(ft(d.templateNamespace,Jr(b))),n=g[0],1!=g.length||n.nodeType!==oi)throw Hi("tplrt","Template for directive '{0}' must have exactly one root element. {1}",v,"");vt(a,O,n);var lt={$attr:{}},ct=H(n,[],lt),ht=t.splice(q+1,t.length-(q+1));(_||w)&&nt(ct,_,w),t=t.concat(ct).concat(ht),it(e,lt),z=t.length}else O.html(b);if(d.templateUrl)P=!0,st("template",M,d,O),M=d,d.replace&&(L=d),p=ot(t.splice(q,t.length-q),O,e,a,E&&N,s,c,{controllerDirectives:C,newScopeDirective:w!==d&&w,newIsolateScopeDirective:_,templateDirective:M,nonTlbTranscludeDirective:A}),z=t.length;else if(d.compile)try{y=d.compile(O,e,N);var pt=d.$$originalDirective||d;S(y)?h(null,B(pt,y),W,U):y&&h(B(pt,y.pre),B(pt,y.post),W,U)}catch($t){i($t,X(O))}d.terminal&&(p.terminal=!0,x=Math.max(x,d.priority))}return p.scope=w&&w.scope===!0,p.transcludeOnThisElement=E,p.templateOnThisElement=P,p.transclude=N,f.hasElementTranscludeDirective=T,p}function Q(t,n,e,i){var o;if(x(n)){var a=n.match(C),u=n.substring(a[0].length),s=a[1]||a[3],l="?"===a[2];if("^^"===s?e=e.parent():(o=i&&i[u],o=o&&o.instance),!o){var c="$"+u+"Controller";o=s?e.inheritedData(c):e.data(c)}if(!o&&!l)throw Hi("ctreq","Controller '{0}', required by directive '{1}', can't be found!",u,t)}else if(Zr(n)){o=[];for(var f=0,h=n.length;f<h;f++)o[f]=Q(t,n[f],e,i)}else $(n)&&(o={},r(n,function(n,r){o[r]=Q(t,n,e,i)}));return o||null}function tt(t,n,e,r,i,o,a){var u=dt();for(var l in r){var c=r[l],f={$scope:c===a||c.$$isolateScope?i:o,$element:t,$attrs:n,$transclude:e},h=c.controller;"@"==h&&(h=n[c.name]);var p=s(h,f,!0,c.controllerAs);u[c.name]=p,t.data("$"+c.name+"Controller",p.instance)}return u}function nt(t,n,e){for(var r=0,i=t.length;r<i;r++)t[r]=h(t[r],{$$isolateScope:n,$$newScope:e})}function et(t,e,r,o,u,s,l){if(e===u)return null;var p=null;if(c.hasOwnProperty(e))for(var d,v=n.get(e+f),g=0,y=v.length;g<y;g++)try{if(d=v[g],(m(o)||o>d.priority)&&d.restrict.indexOf(r)!=-1){if(s&&(d=h(d,{$$start:s,$$end:l})),!d.$$bindings){var b=d.$$bindings=a(d,d.name);$(b.isolateScope)&&(d.$$isolateBindings=b.isolateScope)}t.push(d),p=d}}catch(x){i(x)}return p}function rt(t){if(c.hasOwnProperty(t))for(var e,r=n.get(t+f),i=0,o=r.length;i<o;i++)if(e=r[i],e.multiElement)return!0;return!1}function it(t,n){var e=n.$attr,i=t.$attr;t.$$element;r(t,function(r,i){"$"!=i.charAt(0)&&(n[i]&&n[i]!==r&&(r+=("style"===i?";":" ")+n[i]),t.$set(i,r,!0,e[i]))}),r(n,function(n,r){t.hasOwnProperty(r)||"$"===r.charAt(0)||(t[r]=n,"class"!==r&&"style"!==r&&(i[r]=e[r]))})}function ot(t,n,e,i,a,u,s,l){var c,f,p=[],d=n[0],v=t.shift(),g=h(v,{templateUrl:null,transclude:null,replace:null,$$originalDirective:v}),m=S(v.templateUrl)?v.templateUrl(n,e):v.templateUrl,y=v.templateNamespace;return n.empty(),o(m).then(function(o){var h,b,x,w;if(o=Mt(o),v.replace){if(x=wt(o)?[]:$n(ft(y,Jr(o))),h=x[0],1!=x.length||h.nodeType!==oi)throw Hi("tplrt","Template for directive '{0}' must have exactly one root element. {1}",v.name,m);b={$attr:{}},vt(i,n,h);var C=H(h,[],b);$(v.scope)&&nt(C,!0),t=C.concat(t),it(e,b)}else h=d,n.html(o);for(t.unshift(g),c=K(t,h,e,a,n,v,u,s,l),r(i,function(t,e){t==h&&(i[e]=n[0])}),f=W(n[0].childNodes,a);p.length;){var S=p.shift(),_=p.shift(),M=p.shift(),k=p.shift(),A=n[0];if(!S.$$destroyed){if(_!==d){var E=_.className;l.hasElementTranscludeDirective&&v.replace||(A=Pt(h)),vt(M,Fr(_),A),j(Fr(A),E)}w=c.transcludeOnThisElement?U(S,c.transclude,k):k,c(f,S,A,i,w)}}p=null}),function(t,n,e,r,i){var o=i;n.$$destroyed||(p?p.push(n,e,r,o):(c.transcludeOnThisElement&&(o=U(n,c.transclude,i)),c(f,n,e,r,o)))}}function at(t,n){var e=n.priority-t.priority;return 0!==e?e:t.name!==n.name?t.name<n.name?-1:1:t.index-n.index}function st(t,n,e,r){function i(t){return t?" (module: "+t+")":""}if(n)throw Hi("multidir","Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}",n.name,i(n.$$moduleName),e.name,i(e.$$moduleName),t,X(r))}function ct(t,n){var r=e(n,!0);r&&t.push({priority:0,compile:function(t){var n=t.parent(),e=!!n.length;return e&&I.$$addBindingClass(n),function(t,n){var i=n.parent();e||I.$$addBindingClass(i),I.$$addBindingInfo(i,r.expressions),t.$watch(r,function(t){n[0].nodeValue=t})}}})}function ft(n,e){switch(n=Lr(n||"html")){case"svg":case"math":var r=t.document.createElement("div");return r.innerHTML="<"+n+">"+e+"</"+n+">",r.childNodes[0].childNodes;default:return e}}function ht(t,n){if("srcdoc"==n)return M.HTML;var e=R(t);return"xlinkHref"==n||"form"==e&&"action"==n||"img"!=e&&("src"==n||"ngSrc"==n)?M.RESOURCE_URL:void 0}function pt(t,n,r,i,o){var a=ht(t,i);o=w[i]||o;var u=e(r,!0,a,o);if(u){if("multiple"===i&&"select"===R(t))throw Hi("selmulti","Binding to the 'multiple' attribute is not supported. Element: {0}",X(t));n.push({priority:100,compile:function(){return{pre:function(t,n,s){var l=s.$$observers||(s.$$observers=dt());if(_.test(i))throw Hi("nodomevents","Interpolations for HTML DOM event attributes are disallowed.  Please use the ng- versions (such as ng-click instead of onclick) instead.");var c=s[i];c!==r&&(u=c&&e(c,!0,a,o),r=c),u&&(s[i]=u(t),(l[i]||(l[i]=[])).$$inter=!0,(s.$$observers&&s.$$observers[i].$$scope||t).$watch(u,function(t,n){"class"===i&&t!=n?s.$updateClass(t,n):s.$set(i,t)}))}}}})}}function vt(n,e,r){var i,o,a=e[0],u=e.length,s=a.parentNode;if(n)for(i=0,o=n.length;i<o;i++)if(n[i]==a){n[i++]=r;for(var l=i,c=l+u-1,f=n.length;l<f;l++,c++)c<f?n[l]=n[c]:delete n[l];n.length-=u-1,n.context===a&&(n.context=r);break}s&&s.replaceChild(r,a);var h=t.document.createDocumentFragment();for(i=0;i<u;i++)h.appendChild(e[i]);for(Fr.hasData(a)&&(Fr.data(r,Fr.data(a)),Fr(a).off("$destroy")),Fr.cleanData(h.querySelectorAll("*")),i=1;i<u;i++)delete e[i];e[0]=r,e.length=1}function gt(t,n){return l(function(){return t.apply(null,arguments)},t,n)}function mt(t,n,e,r,o,a){try{t(n,e,r,o,a)}catch(u){i(u,X(e))}}function yt(t,n,i,o,a){function s(n,e,r){S(i.$onChanges)&&e!==r&&($t||(t.$$postDigest(L),$t=[]),c||(c={},$t.push(l)),c[n]&&(r=c[n].previousValue),c[n]=new gn(r,e))}function l(){i.$onChanges(c),c=void 0}var c,f=[],h={};return r(o,function(r,o){var l,c,d,v,g,m=r.attrName,y=r.optional,$=r.mode;switch($){case"@":y||Or.call(n,m)||(i[o]=n[m]=void 0),n.$observe(m,function(t){if(x(t)||T(t)){var n=i[o];s(o,t,n),i[o]=t}}),n.$$observers[m].$$scope=t,l=n[m],x(l)?i[o]=e(l)(t):T(l)&&(i[o]=l),h[o]=new gn(Yi,i[o]);break;case"=":if(!Or.call(n,m)){if(y)break;n[m]=void 0}if(y&&!n[m])break;c=u(n[m]),v=c.literal?q:function(t,n){return t===n||t!==t&&n!==n},d=c.assign||function(){throw l=i[o]=c(t),Hi("nonassign","Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!",n[m],m,a.name)},l=i[o]=c(t);var b=function(n){return v(n,i[o])||(v(n,l)?d(t,n=i[o]):i[o]=n),l=n};b.$stateful=!0,g=r.collection?t.$watchCollection(n[m],b):t.$watch(u(n[m],b),null,c.literal),f.push(g);break;case"<":if(!Or.call(n,m)){if(y)break;n[m]=void 0}if(y&&!n[m])break;c=u(n[m]);var w=i[o]=c(t);h[o]=new gn(Yi,i[o]),g=t.$watch(c,function(t,n){if(n===t){if(n===w)return;n=w}s(o,t,n),i[o]=t},c.literal),f.push(g);break;case"&":if(c=n.hasOwnProperty(m)?u(n[m]):p,c===p&&y)break;i[o]=function(n){return c(t,n)}}}),{initialChanges:h,removeWatches:f.length&&function(){for(var t=0,n=f.length;t<n;++t)f[t]()}}}var $t,bt=/^\w/,xt=t.document.createElement("div"),Ct=E;D.prototype={$normalize:mn,$addClass:function(t){t&&t.length>0&&P.addClass(this.$$element,t)},$removeClass:function(t){t&&t.length>0&&P.removeClass(this.$$element,t)},$updateClass:function(t,n){var e=yn(t,n);e&&e.length&&P.addClass(this.$$element,e);var r=yn(n,t);r&&r.length&&P.removeClass(this.$$element,r)},$set:function(t,n,e,o){var a,u=this.$$element[0],s=Ut(u,t),l=Ht(t),c=t;if(s?(this.$$element.prop(t,n),o=s):l&&(this[l]=n,c=l),this[t]=n,o?this.$attr[t]=o:(o=this.$attr[t],o||(this.$attr[t]=o=ut(t,"-"))),a=R(this.$$element),"a"===a&&("href"===t||"xlinkHref"===t)||"img"===a&&"src"===t)this[t]=n=O(n,"src"===t);else if("img"===a&&"srcset"===t&&y(n)){for(var f="",h=Jr(n),p=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,d=/\s/.test(h)?p:/(,)/,v=h.split(d),g=Math.floor(v.length/2),$=0;$<g;$++){var b=2*$;f+=O(Jr(v[b]),!0),f+=" "+Jr(v[b+1])}var x=Jr(v[2*$]).split(/\s/);f+=O(Jr(x[0]),!0),2===x.length&&(f+=" "+Jr(x[1])),this[t]=n=f}e!==!1&&(null===n||m(n)?this.$$element.removeAttr(o):bt.test(o)?this.$$element.attr(o,n):N(this.$$element[0],o,n));var w=this.$$observers;w&&r(w[c],function(t){try{t(n)}catch(e){i(e)}})},$observe:function(t,n){var e=this,r=e.$$observers||(e.$$observers=dt()),i=r[t]||(r[t]=[]);return i.push(n),v.$evalAsync(function(){i.$$inter||!e.hasOwnProperty(t)||m(e[t])||n(e[t])}),function(){F(i,n)}}};var St=e.startSymbol(),_t=e.endSymbol(),Mt="{{"==St&&"}}"==_t?d:function(t){return t.replace(/\{\{/g,St).replace(/}}/g,_t)},kt=/^ngAttr[A-Z]/,Et=/^(.+)Start$/;return I.$$addBindingInfo=A?function(t,n){var e=t.data("$binding")||[];Zr(n)?e=e.concat(n):e.push(n),t.data("$binding",e)}:p,I.$$addBindingClass=A?function(t){j(t,"ng-binding")}:p,I.$$addScopeInfo=A?function(t,n,e,r){var i=e?r?"$isolateScopeNoTemplate":"$isolateScope":"$scope";t.data(i,n)}:p,I.$$addScopeClass=A?function(t,n){j(t,n?"ng-isolate-scope":"ng-scope")}:p,I.$$createComment=function(n,e){var r="";return A&&(r=" "+(n||"")+": ",e&&(r+=e+" ")),t.document.createComment(r)},I}]}function gn(t,n){this.previousValue=t,this.currentValue=n}function mn(t){return xt(t.replace(Gi,""))}function yn(t,n){var e="",r=t.split(/\s+/),i=n.split(/\s+/);t:for(var o=0;o<r.length;o++){for(var a=r[o],u=0;u<i.length;u++)if(a==i[u])continue t;e+=(e.length>0?" ":"")+a}return e}function $n(t){t=Fr(t);var n=t.length;if(n<=1)return t;for(;n--;){var e=t[n];e.nodeType===si&&Vr.call(t,n,1)}return t}function bn(t,n){if(n&&x(n))return n;if(x(t)){var e=Xi.exec(t);if(e)return e[3]}}function xn(){var t={},e=!1;this.has=function(n){return t.hasOwnProperty(n)},this.register=function(n,e){ft(n,"controller"),$(n)?l(t,n):t[n]=e},this.allowGlobals=function(){e=!0},this.$get=["$injector","$window",function(r,i){function o(t,e,r,i){if(!t||!$(t.$scope))throw n("$controller")("noscp","Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",i,e);t.$scope[e]=r}return function(n,a,u,s){var c,f,h,p;if(u=u===!0,s&&x(s)&&(p=s),x(n)){if(f=n.match(Xi),!f)throw Zi("ctrlfmt","Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.",n);h=f[1],p=p||f[3],n=t.hasOwnProperty(h)?t[h]:ht(a.$scope,h,!0)||(e?ht(i,h,!0):void 0),ct(n,h,!0)}if(u){var d=(Zr(n)?n[n.length-1]:n).prototype;c=Object.create(d||null),p&&o(a,p,c,h||n.name);var v;return v=l(function(){var t=r.invoke(n,c,a,h);return t!==c&&($(t)||S(t))&&(c=t,p&&o(a,p,c,h||n.name)),c},{instance:c,identifier:p})}return c=r.instantiate(n,a,h),p&&o(a,p,c,h||n.name),c}}]}function wn(){this.$get=["$window",function(t){return Fr(t.document)}]}function Cn(){this.$get=["$log",function(t){return function(n,e){t.error.apply(t,arguments)}}]}function Sn(t){return $(t)?C(t)?t.toISOString():U(t):t}function _n(){this.$get=function(){return function(t){if(!t)return"";var n=[];return i(t,function(t,e){null===t||m(t)||(Zr(t)?r(t,function(t){n.push(nt(e)+"="+nt(Sn(t)))}):n.push(nt(e)+"="+nt(Sn(t))))}),n.join("&")}}}function Mn(){this.$get=function(){return function(t){function n(t,o,a){null===t||m(t)||(Zr(t)?r(t,function(t,e){n(t,o+"["+($(t)?e:"")+"]")}):$(t)&&!C(t)?i(t,function(t,e){n(t,o+(a?"":"[")+e+(a?"":"]"))}):e.push(nt(o)+"="+nt(Sn(t))))}if(!t)return"";var e=[];return n(t,"",!0),e.join("&")}}}function kn(t,n){if(x(t)){var e=t.replace(eo,"").trim();if(e){var r=n("Content-Type");(r&&0===r.indexOf(Ki)||An(e))&&(t=H(e))}}return t}function An(t){var n=t.match(to);return n&&no[n[0]].test(t)}function En(t){function n(t,n){t&&(i[t]=i[t]?i[t]+", "+n:n)}var e,i=dt();return x(t)?r(t.split("\n"),function(t){e=t.indexOf(":"),n(Lr(Jr(t.substr(0,e))),Jr(t.substr(e+1)))}):$(t)&&r(t,function(t,e){n(Lr(e),Jr(t))}),i}function Pn(t){var n;return function(e){if(n||(n=En(t)),e){var r=n[Lr(e)];return void 0===r&&(r=null),r}return n}}function Tn(t,n,e,i){return S(i)?i(t,n,e):(r(i,function(r){t=r(t,n,e)}),t)}function On(t){return 200<=t&&t<300}function Ln(){var t=this.defaults={transformResponse:[kn],transformRequest:[function(t){return!$(t)||A(t)||P(t)||E(t)?t:U(t)}],headers:{common:{Accept:"application/json, text/plain, */*"},post:gt(Qi),put:gt(Qi),patch:gt(Qi)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},e=!1;this.useApplyAsync=function(t){return y(t)?(e=!!t,this):e};var i=!0;this.useLegacyPromiseExtensions=function(t){return y(t)?(i=!!t,this):i};var o=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(a,u,s,c,f,h){function p(e){function o(t,n){for(var e=0,r=n.length;e<r;){var i=n[e++],o=n[e++];t=t.then(i,o)}return n.length=0,t}function a(t,n){var e,i={};return r(t,function(t,r){S(t)?(e=t(n),null!=e&&(i[r]=e)):i[r]=t}),i}function u(n){var e,r,i,o=t.headers,u=l({},n.headers);o=l({},o.common,o[Lr(n.method)]);t:for(e in o){r=Lr(e);for(i in u)if(Lr(i)===r)continue t;u[e]=o[e]}return a(u,gt(n))}function s(n){var e=n.headers,i=Tn(n.data,Pn(e),void 0,n.transformRequest);return m(i)&&r(e,function(t,n){"content-type"===Lr(n)&&delete e[n]}),m(n.withCredentials)&&!m(t.withCredentials)&&(n.withCredentials=t.withCredentials),g(n,i).then(c,c)}function c(t){var n=l({},t);return n.data=Tn(t.data,t.headers,t.status,p.transformResponse),On(t.status)?n:f.reject(n)}if(!$(e))throw n("$http")("badreq","Http request configuration must be an object.  Received: {0}",e);if(!x(e.url))throw n("$http")("badreq","Http request configuration url must be a string.  Received: {0}",e.url);var p=l({method:"get",transformRequest:t.transformRequest,transformResponse:t.transformResponse,paramSerializer:t.paramSerializer},e);p.headers=u(e),p.method=Dr(p.method),p.paramSerializer=x(p.paramSerializer)?h.get(p.paramSerializer):p.paramSerializer;var d=[],v=[],y=f.when(p);return r(C,function(t){(t.request||t.requestError)&&d.unshift(t.request,t.requestError),(t.response||t.responseError)&&v.push(t.response,t.responseError)}),y=o(y,d),y=y.then(s),y=o(y,v),i?(y.success=function(t){return ct(t,"fn"),y.then(function(n){t(n.data,n.status,n.headers,p)}),y},y.error=function(t){return ct(t,"fn"),y.then(null,function(n){t(n.data,n.status,n.headers,p)}),y}):(y.success=io("success"),y.error=io("error")),y}function d(t){r(arguments,function(t){p[t]=function(n,e){return p(l({},e||{},{method:t,url:n}))}})}function v(t){r(arguments,function(t){p[t]=function(n,e,r){return p(l({},r||{},{method:t,url:n,data:e}))}})}function g(n,i){function o(t){if(t){var n={};return r(t,function(t,r){n[r]=function(n){function r(){t(n)}e?c.$applyAsync(r):c.$$phase?r():c.$apply(r)}}),n}}function s(t,n,r,i){function o(){l(n,t,r,i)}v&&(On(t)?v.put(_,[t,n,En(r),i]):v.remove(_)),e?c.$applyAsync(o):(o(),c.$$phase||c.$apply())}function l(t,e,r,i){e=e>=-1?e:0,(On(e)?x.resolve:x.reject)({data:t,status:e,headers:Pn(r),config:n,statusText:i})}function h(t){l(t.data,t.status,gt(t.headers()),t.statusText)}function d(){var t=p.pendingRequests.indexOf(n);t!==-1&&p.pendingRequests.splice(t,1)}var v,g,x=f.defer(),C=x.promise,S=n.headers,_=b(n.url,n.paramSerializer(n.params));if(p.pendingRequests.push(n),C.then(d,d),!n.cache&&!t.cache||n.cache===!1||"GET"!==n.method&&"JSONP"!==n.method||(v=$(n.cache)?n.cache:$(t.cache)?t.cache:w),v&&(g=v.get(_),y(g)?O(g)?g.then(h,h):Zr(g)?l(g[1],g[0],gt(g[2]),g[3]):l(g,200,{},"OK"):v.put(_,C)),m(g)){var M=Ne(n.url)?u()[n.xsrfCookieName||t.xsrfCookieName]:void 0;M&&(S[n.xsrfHeaderName||t.xsrfHeaderName]=M),a(n.method,_,i,s,S,n.timeout,n.withCredentials,n.responseType,o(n.eventHandlers),o(n.uploadEventHandlers))}return C}function b(t,n){return n.length>0&&(t+=(t.indexOf("?")==-1?"?":"&")+n),t}var w=s("$http");t.paramSerializer=x(t.paramSerializer)?h.get(t.paramSerializer):t.paramSerializer;var C=[];return r(o,function(t){C.unshift(x(t)?h.get(t):h.invoke(t))}),p.pendingRequests=[],d("get","delete","head","jsonp"),v("post","put","patch"),p.defaults=t,p}]}function Dn(){this.$get=function(){return function(){return new t.XMLHttpRequest}}}function Nn(){this.$get=["$browser","$jsonpCallbacks","$document","$xhrFactory",function(t,n,e,r){return jn(t,r,t.defer,n,e[0])}]}function jn(t,n,e,i,o){function a(t,n,e){t=t.replace("JSON_CALLBACK",n);var r=o.createElement("script"),a=null;return r.type="text/javascript",r.src=t,r.async=!0,a=function(t){vi(r,"load",a),vi(r,"error",a),o.body.removeChild(r),r=null;var u=-1,s="unknown";t&&("load"!==t.type||i.wasCalled(n)||(t={type:"error"}),s=t.type,u="error"===t.type?404:200),e&&e(u,s)},di(r,"load",a),di(r,"error",a),o.body.appendChild(r),a}return function(o,u,s,l,c,f,h,d,v,g){function $(){w&&w(),C&&C.abort()}function b(n,r,i,o,a){y(M)&&e.cancel(M),w=C=null,n(r,i,o,a),t.$$completeOutstandingRequest(p)}if(t.$$incOutstandingRequestCount(),u=u||t.url(),"jsonp"===Lr(o))var x=i.createCallback(u),w=a(u,x,function(t,n){var e=200===t&&i.getResponse(x);b(l,t,e,"",n),i.removeCallback(x)});else{var C=n(o,u);C.open(o,u,!0),r(c,function(t,n){y(t)&&C.setRequestHeader(n,t)}),C.onload=function(){var t=C.statusText||"",n="response"in C?C.response:C.responseText,e=1223===C.status?204:C.status;0===e&&(e=n?200:"file"==De(u).protocol?404:0),b(l,e,n,C.getAllResponseHeaders(),t)};var S=function(){b(l,-1,null,null,"")};if(C.onerror=S,C.onabort=S,r(v,function(t,n){C.addEventListener(n,t)}),r(g,function(t,n){C.upload.addEventListener(n,t)}),h&&(C.withCredentials=!0),d)try{C.responseType=d}catch(_){if("json"!==d)throw _}C.send(m(s)?null:s)}if(f>0)var M=e($,f);else O(f)&&f.then($)}}function Rn(){var t="{{",n="}}";this.startSymbol=function(n){return n?(t=n,this):t},this.endSymbol=function(t){return t?(n=t,this):n},this.$get=["$parse","$exceptionHandler","$sce",function(e,r,i){function o(t){return"\\\\\\"+t}function a(e){return e.replace(p,t).replace(d,n)}function u(t){if(null==t)return"";switch(typeof t){case"string":break;case"number":t=""+t;break;default:t=U(t)}return t}function s(t,n,e,r){var i;return i=t.$watch(function(t){return i(),r(t)},n,e)}function c(o,c,p,d){function g(t){try{return t=O(t),d&&!y(t)?t:u(t)}catch(n){r(oo.interr(o,n))}}if(!o.length||o.indexOf(t)===-1){var $;if(!c){var b=a(o);$=v(b),$.exp=o,$.expressions=[],$.$$watchDelegate=s}return $}d=!!d;for(var x,w,C,_=0,M=[],k=[],A=o.length,E=[],P=[];_<A;){if((x=o.indexOf(t,_))==-1||(w=o.indexOf(n,x+f))==-1){_!==A&&E.push(a(o.substring(_)));break}_!==x&&E.push(a(o.substring(_,x))),C=o.substring(x+f,w),M.push(C),k.push(e(C,g)),_=w+h,P.push(E.length),E.push("")}if(p&&E.length>1&&oo.throwNoconcat(o),!c||M.length){var T=function(t){for(var n=0,e=M.length;n<e;n++){if(d&&m(t[n]))return;E[P[n]]=t[n]}return E.join("")},O=function(t){return p?i.getTrusted(p,t):i.valueOf(t)};return l(function(t){var n=0,e=M.length,i=new Array(e);try{for(;n<e;n++)i[n]=k[n](t);return T(i)}catch(a){r(oo.interr(o,a))}},{exp:o,expressions:M,$$watchDelegate:function(t,n){var e;return t.$watchGroup(k,function(r,i){var o=T(r);S(n)&&n.call(this,o,r!==i?e:o,t),e=o})}})}}var f=t.length,h=n.length,p=new RegExp(t.replace(/./g,o),"g"),d=new RegExp(n.replace(/./g,o),"g");return c.startSymbol=function(){return t},c.endSymbol=function(){return n},c}]}function Fn(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(t,n,e,r,i){function o(o,u,s,l){function c(){f?o.apply(null,h):o(v)}var f=arguments.length>4,h=f?V(arguments,4):[],p=n.setInterval,d=n.clearInterval,v=0,g=y(l)&&!l,m=(g?r:e).defer(),$=m.promise;return s=y(s)?s:0,$.$$intervalId=p(function(){g?i.defer(c):t.$evalAsync(c),m.notify(v++),s>0&&v>=s&&(m.resolve(v),d($.$$intervalId),delete a[$.$$intervalId]),g||t.$apply()},u),a[$.$$intervalId]=m,$}var a={};return o.cancel=function(t){return!!(t&&t.$$intervalId in a)&&(a[t.$$intervalId].reject("canceled"),n.clearInterval(t.$$intervalId),delete a[t.$$intervalId],!0)},o}]}function In(t){for(var n=t.split("/"),e=n.length;e--;)n[e]=tt(n[e]);return n.join("/")}function qn(t,n){var e=De(t);n.$$protocol=e.protocol,n.$$host=e.hostname,n.$$port=f(e.port)||so[e.protocol]||null}function zn(t,n){var e="/"!==t.charAt(0);e&&(t="/"+t);var r=De(t);n.$$path=decodeURIComponent(e&&"/"===r.pathname.charAt(0)?r.pathname.substring(1):r.pathname),n.$$search=K(r.search),n.$$hash=decodeURIComponent(r.hash),n.$$path&&"/"!=n.$$path.charAt(0)&&(n.$$path="/"+n.$$path)}function Vn(t,n){return 0===t.lastIndexOf(n,0)}function Bn(t,n){if(Vn(n,t))return n.substr(t.length)}function Wn(t){var n=t.indexOf("#");return n==-1?t:t.substr(0,n)}function Un(t){return t.replace(/(#.+)|#$/,"$1")}function Hn(t){return t.substr(0,Wn(t).lastIndexOf("/")+1)}function Yn(t){return t.substring(0,t.indexOf("/",t.indexOf("//")+2))}function Gn(t,n,e){this.$$html5=!0,e=e||"",qn(t,this),this.$$parse=function(t){var e=Bn(n,t);if(!x(e))throw lo("ipthprfx",'Invalid url "{0}", missing path prefix "{1}".',t,n);zn(e,this),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var t=Q(this.$$search),e=this.$$hash?"#"+tt(this.$$hash):"";this.$$url=In(this.$$path)+(t?"?"+t:"")+e,this.$$absUrl=n+this.$$url.substr(1)},this.$$parseLinkUrl=function(r,i){if(i&&"#"===i[0])return this.hash(i.slice(1)),!0;var o,a,u;return y(o=Bn(t,r))?(a=o,u=y(o=Bn(e,o))?n+(Bn("/",o)||o):t+a):y(o=Bn(n,r))?u=n+o:n==r+"/"&&(u=n),u&&this.$$parse(u),!!u}}function Zn(t,n,e){qn(t,this),this.$$parse=function(r){function i(t,n,e){var r,i=/^\/[A-Z]:(\/.*)/;return Vn(n,e)&&(n=n.replace(e,"")),i.exec(n)?t:(r=i.exec(t),r?r[1]:t)}var o,a=Bn(t,r)||Bn(n,r);m(a)||"#"!==a.charAt(0)?this.$$html5?o=a:(o="",m(a)&&(t=r,this.replace())):(o=Bn(e,a),m(o)&&(o=a)),zn(o,this),this.$$path=i(this.$$path,o,t),this.$$compose()},this.$$compose=function(){var n=Q(this.$$search),r=this.$$hash?"#"+tt(this.$$hash):"";this.$$url=In(this.$$path)+(n?"?"+n:"")+r,this.$$absUrl=t+(this.$$url?e+this.$$url:"")},this.$$parseLinkUrl=function(n,e){return Wn(t)==Wn(n)&&(this.$$parse(n),!0)}}function Xn(t,n,e){this.$$html5=!0,Zn.apply(this,arguments),this.$$parseLinkUrl=function(r,i){if(i&&"#"===i[0])return this.hash(i.slice(1)),!0;var o,a;return t==Wn(r)?o=r:(a=Bn(n,r))?o=t+e+a:n===r+"/"&&(o=n),o&&this.$$parse(o),!!o},this.$$compose=function(){var n=Q(this.$$search),r=this.$$hash?"#"+tt(this.$$hash):"";this.$$url=In(this.$$path)+(n?"?"+n:"")+r,this.$$absUrl=t+e+this.$$url}}function Jn(t){return function(){return this[t]}}function Kn(t,n){return function(e){return m(e)?this[t]:(this[t]=n(e),this.$$compose(),this)}}function Qn(){var t="",n={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(n){return y(n)?(t=n,this):t},this.html5Mode=function(t){return T(t)?(n.enabled=t,this):$(t)?(T(t.enabled)&&(n.enabled=t.enabled),T(t.requireBase)&&(n.requireBase=t.requireBase),T(t.rewriteLinks)&&(n.rewriteLinks=t.rewriteLinks),this):n},this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(e,r,i,o,a){function u(t,n,e){var i=l.url(),o=l.$$state;try{r.url(t,n,e),l.$$state=r.state()}catch(a){throw l.url(i),l.$$state=o,a}}function s(t,n){e.$broadcast("$locationChangeSuccess",l.absUrl(),t,l.$$state,n)}var l,c,f,h=r.baseHref(),p=r.url();if(n.enabled){if(!h&&n.requireBase)throw lo("nobase","$location in HTML5 mode requires a <base> tag to be present!");f=Yn(p)+(h||"/"),c=i.history?Gn:Xn}else f=Wn(p),c=Zn;var d=Hn(f);l=new c(f,d,"#"+t),l.$$parseLinkUrl(p,p),l.$$state=r.state();var v=/^\s*(javascript|mailto):/i;o.on("click",function(t){if(n.rewriteLinks&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey&&2!=t.which&&2!=t.button){for(var i=Fr(t.target);"a"!==R(i[0]);)if(i[0]===o[0]||!(i=i.parent())[0])return;var u=i.prop("href"),s=i.attr("href")||i.attr("xlink:href");$(u)&&"[object SVGAnimatedString]"===u.toString()&&(u=De(u.animVal).href),v.test(u)||!u||i.attr("target")||t.isDefaultPrevented()||l.$$parseLinkUrl(u,s)&&(t.preventDefault(),l.absUrl()!=r.url()&&(e.$apply(),a.angular["ff-684208-preventDefault"]=!0))}}),Un(l.absUrl())!=Un(p)&&r.url(l.absUrl(),!0);var g=!0;return r.onUrlChange(function(t,n){return m(Bn(d,t))?void(a.location.href=t):(e.$evalAsync(function(){var r,i=l.absUrl(),o=l.$$state;t=Un(t),l.$$parse(t),l.$$state=n,r=e.$broadcast("$locationChangeStart",t,i,n,o).defaultPrevented,l.absUrl()===t&&(r?(l.$$parse(i),l.$$state=o,u(i,!1,o)):(g=!1,s(i,o)))}),void(e.$$phase||e.$digest()))}),e.$watch(function(){var t=Un(r.url()),n=Un(l.absUrl()),o=r.state(),a=l.$$replace,c=t!==n||l.$$html5&&i.history&&o!==l.$$state;(g||c)&&(g=!1,e.$evalAsync(function(){var n=l.absUrl(),r=e.$broadcast("$locationChangeStart",n,t,l.$$state,o).defaultPrevented;l.absUrl()===n&&(r?(l.$$parse(t),l.$$state=o):(c&&u(n,a,o===l.$$state?null:l.$$state),s(t,o)))})),l.$$replace=!1}),l}]}function te(){var t=!0,n=this;this.debugEnabled=function(n){return y(n)?(t=n,this):t},this.$get=["$window",function(e){function i(t){return t instanceof Error&&(t.stack?t=t.message&&t.stack.indexOf(t.message)===-1?"Error: "+t.message+"\n"+t.stack:t.stack:t.sourceURL&&(t=t.message+"\n"+t.sourceURL+":"+t.line)),t}function o(t){var n=e.console||{},o=n[t]||n.log||p,a=!1;try{a=!!o.apply}catch(u){}return a?function(){var t=[];return r(arguments,function(n){t.push(i(n))}),o.apply(n,t)}:function(t,n){o(t,null==n?"":n)}}return{log:o("log"),info:o("info"),warn:o("warn"),error:o("error"),debug:function(){var e=o("debug");return function(){t&&e.apply(n,arguments)}}()}}]}function ne(t,n){if("__defineGetter__"===t||"__defineSetter__"===t||"__lookupGetter__"===t||"__lookupSetter__"===t||"__proto__"===t)throw fo("isecfld","Attempting to access a disallowed field in Angular expressions! Expression: {0}",n);return t}function ee(t){return t+""}function re(t,n){if(t){if(t.constructor===t)throw fo("isecfn","Referencing Function in Angular expressions is disallowed! Expression: {0}",n);if(t.window===t)throw fo("isecwindow","Referencing the Window in Angular expressions is disallowed! Expression: {0}",n);if(t.children&&(t.nodeName||t.prop&&t.attr&&t.find))throw fo("isecdom","Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}",n);if(t===Object)throw fo("isecobj","Referencing Object in Angular expressions is disallowed! Expression: {0}",n)}return t}function ie(t,n){if(t){if(t.constructor===t)throw fo("isecfn","Referencing Function in Angular expressions is disallowed! Expression: {0}",n);if(t===ho||t===po||t===vo)throw fo("isecff","Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}",n)}}function oe(t,n){if(t&&(t===(0).constructor||t===(!1).constructor||t==="".constructor||t==={}.constructor||t===[].constructor||t===Function.constructor))throw fo("isecaf","Assigning to a constructor is disallowed! Expression: {0}",n)}function ae(t,n){return"undefined"!=typeof t?t:n}function ue(t,n){return"undefined"==typeof t?n:"undefined"==typeof n?t:t+n}function se(t,n){var e=t(n);return!e.$stateful}function le(t,n){var e,i;switch(t.type){case $o.Program:e=!0,r(t.body,function(t){le(t.expression,n),e=e&&t.expression.constant}),t.constant=e;break;case $o.Literal:t.constant=!0,t.toWatch=[];break;case $o.UnaryExpression:le(t.argument,n),t.constant=t.argument.constant,t.toWatch=t.argument.toWatch;break;case $o.BinaryExpression:le(t.left,n),le(t.right,n),t.constant=t.left.constant&&t.right.constant,t.toWatch=t.left.toWatch.concat(t.right.toWatch);break;case $o.LogicalExpression:le(t.left,n),le(t.right,n),t.constant=t.left.constant&&t.right.constant,t.toWatch=t.constant?[]:[t];break;case $o.ConditionalExpression:le(t.test,n),le(t.alternate,n),le(t.consequent,n),t.constant=t.test.constant&&t.alternate.constant&&t.consequent.constant,t.toWatch=t.constant?[]:[t];break;case $o.Identifier:t.constant=!1,t.toWatch=[t];break;case $o.MemberExpression:le(t.object,n),t.computed&&le(t.property,n),t.constant=t.object.constant&&(!t.computed||t.property.constant),t.toWatch=[t];break;case $o.CallExpression:
 e=!!t.filter&&se(n,t.callee.name),i=[],r(t.arguments,function(t){le(t,n),e=e&&t.constant,t.constant||i.push.apply(i,t.toWatch)}),t.constant=e,t.toWatch=t.filter&&se(n,t.callee.name)?i:[t];break;case $o.AssignmentExpression:le(t.left,n),le(t.right,n),t.constant=t.left.constant&&t.right.constant,t.toWatch=[t];break;case $o.ArrayExpression:e=!0,i=[],r(t.elements,function(t){le(t,n),e=e&&t.constant,t.constant||i.push.apply(i,t.toWatch)}),t.constant=e,t.toWatch=i;break;case $o.ObjectExpression:e=!0,i=[],r(t.properties,function(t){le(t.value,n),e=e&&t.value.constant&&!t.computed,t.value.constant||i.push.apply(i,t.value.toWatch)}),t.constant=e,t.toWatch=i;break;case $o.ThisExpression:t.constant=!1,t.toWatch=[];break;case $o.LocalsExpression:t.constant=!1,t.toWatch=[]}}function ce(t){if(1==t.length){var n=t[0].expression,e=n.toWatch;return 1!==e.length?e:e[0]!==n?e:void 0}}function fe(t){return t.type===$o.Identifier||t.type===$o.MemberExpression}function he(t){if(1===t.body.length&&fe(t.body[0].expression))return{type:$o.AssignmentExpression,left:t.body[0].expression,right:{type:$o.NGValueParameter},operator:"="}}function pe(t){return 0===t.body.length||1===t.body.length&&(t.body[0].expression.type===$o.Literal||t.body[0].expression.type===$o.ArrayExpression||t.body[0].expression.type===$o.ObjectExpression)}function de(t){return t.constant}function ve(t,n){this.astBuilder=t,this.$filter=n}function ge(t,n){this.astBuilder=t,this.$filter=n}function me(t){return"constructor"==t}function ye(t){return S(t.valueOf)?t.valueOf():xo.call(t)}function $e(){var t,n,e=dt(),i=dt(),o={"true":!0,"false":!1,"null":null,undefined:void 0};this.addLiteral=function(t,n){o[t]=n},this.setIdentifierFns=function(e,r){return t=e,n=r,this},this.$get=["$filter",function(a){function u(t,n,r){var o,u,l;switch(r=r||b,typeof t){case"string":t=t.trim(),l=t;var g=r?i:e;if(o=g[l],!o){":"===t.charAt(0)&&":"===t.charAt(1)&&(u=!0,t=t.substring(2));var y=r?$:m,x=new yo(y),w=new bo(x,a,y);o=w.parse(t),o.constant?o.$$watchDelegate=d:u?o.$$watchDelegate=o.literal?h:f:o.inputs&&(o.$$watchDelegate=c),r&&(o=s(o)),g[l]=o}return v(o,n);case"function":return v(t,n);default:return v(p,n)}}function s(t){function n(n,e,r,i){var o=b;b=!0;try{return t(n,e,r,i)}finally{b=o}}if(!t)return t;n.$$watchDelegate=t.$$watchDelegate,n.assign=s(t.assign),n.constant=t.constant,n.literal=t.literal;for(var e=0;t.inputs&&e<t.inputs.length;++e)t.inputs[e]=s(t.inputs[e]);return n.inputs=t.inputs,n}function l(t,n){return null==t||null==n?t===n:("object"!=typeof t||(t=ye(t),"object"!=typeof t))&&(t===n||t!==t&&n!==n)}function c(t,n,e,r,i){var o,a=r.inputs;if(1===a.length){var u=l;return a=a[0],t.$watch(function(t){var n=a(t);return l(n,u)||(o=r(t,void 0,void 0,[n]),u=n&&ye(n)),o},n,e,i)}for(var s=[],c=[],f=0,h=a.length;f<h;f++)s[f]=l,c[f]=null;return t.$watch(function(t){for(var n=!1,e=0,i=a.length;e<i;e++){var u=a[e](t);(n||(n=!l(u,s[e])))&&(c[e]=u,s[e]=u&&ye(u))}return n&&(o=r(t,void 0,void 0,c)),o},n,e,i)}function f(t,n,e,r){var i,o;return i=t.$watch(function(t){return r(t)},function(t,e,r){o=t,S(n)&&n.apply(this,arguments),y(t)&&r.$$postDigest(function(){y(o)&&i()})},e)}function h(t,n,e,i){function o(t){var n=!0;return r(t,function(t){y(t)||(n=!1)}),n}var a,u;return a=t.$watch(function(t){return i(t)},function(t,e,r){u=t,S(n)&&n.call(this,t,e,r),o(t)&&r.$$postDigest(function(){o(u)&&a()})},e)}function d(t,n,e,r){var i;return i=t.$watch(function(t){return i(),r(t)},n,e)}function v(t,n){if(!n)return t;var e=t.$$watchDelegate,r=!1,i=e!==h&&e!==f,o=i?function(e,i,o,a){var u=r&&a?a[0]:t(e,i,o,a);return n(u,e,i)}:function(e,r,i,o){var a=t(e,r,i,o),u=n(a,e,r);return y(a)?u:a};return t.$$watchDelegate&&t.$$watchDelegate!==c?o.$$watchDelegate=t.$$watchDelegate:n.$stateful||(o.$$watchDelegate=c,r=!t.inputs,o.inputs=t.inputs?t.inputs:[t]),o}var g=Qr().noUnsafeEval,m={csp:g,expensiveChecks:!1,literals:I(o),isIdentifierStart:S(t)&&t,isIdentifierContinue:S(n)&&n},$={csp:g,expensiveChecks:!0,literals:I(o),isIdentifierStart:S(t)&&t,isIdentifierContinue:S(n)&&n},b=!1;return u.$$runningExpensiveChecks=function(){return b},u}]}function be(){this.$get=["$rootScope","$exceptionHandler",function(t,n){return we(function(n){t.$evalAsync(n)},n)}]}function xe(){this.$get=["$browser","$exceptionHandler",function(t,n){return we(function(n){t.defer(n)},n)}]}function we(t,e){function i(){this.$$state={status:0}}function o(t,n){return function(e){n.call(t,e)}}function a(t){var n,r,i;i=t.pending,t.processScheduled=!1,t.pending=void 0;for(var o=0,a=i.length;o<a;++o){r=i[o][0],n=i[o][t.status];try{S(n)?r.resolve(n(t.value)):1===t.status?r.resolve(t.value):r.reject(t.value)}catch(u){r.reject(u),e(u)}}}function u(n){!n.processScheduled&&n.pending&&(n.processScheduled=!0,t(function(){a(n)}))}function s(){this.promise=new i}function c(t){var n=new s,e=0,i=Zr(t)?[]:{};return r(t,function(t,r){e++,y(t).then(function(t){i.hasOwnProperty(r)||(i[r]=t,--e||n.resolve(i))},function(t){i.hasOwnProperty(r)||n.reject(t)})}),0===e&&n.resolve(i),n.promise}function f(t){var n=p();return r(t,function(t){y(t).then(n.resolve,n.reject)}),n.promise}var h=n("$q",TypeError),p=function(){var t=new s;return t.resolve=o(t,t.resolve),t.reject=o(t,t.reject),t.notify=o(t,t.notify),t};l(i.prototype,{then:function(t,n,e){if(m(t)&&m(n)&&m(e))return this;var r=new s;return this.$$state.pending=this.$$state.pending||[],this.$$state.pending.push([r,t,n,e]),this.$$state.status>0&&u(this.$$state),r.promise},"catch":function(t){return this.then(null,t)},"finally":function(t,n){return this.then(function(n){return g(n,!0,t)},function(n){return g(n,!1,t)},n)}}),l(s.prototype,{resolve:function(t){this.promise.$$state.status||(t===this.promise?this.$$reject(h("qcycle","Expected promise to be resolved with value other than itself '{0}'",t)):this.$$resolve(t))},$$resolve:function(t){function n(t){s||(s=!0,a.$$resolve(t))}function r(t){s||(s=!0,a.$$reject(t))}var i,a=this,s=!1;try{($(t)||S(t))&&(i=t&&t.then),S(i)?(this.promise.$$state.status=-1,i.call(t,n,r,o(this,this.notify))):(this.promise.$$state.value=t,this.promise.$$state.status=1,u(this.promise.$$state))}catch(l){r(l),e(l)}},reject:function(t){this.promise.$$state.status||this.$$reject(t)},$$reject:function(t){this.promise.$$state.value=t,this.promise.$$state.status=2,u(this.promise.$$state)},notify:function(n){var r=this.promise.$$state.pending;this.promise.$$state.status<=0&&r&&r.length&&t(function(){for(var t,i,o=0,a=r.length;o<a;o++){i=r[o][0],t=r[o][3];try{i.notify(S(t)?t(n):n)}catch(u){e(u)}}})}});var d=function(t){var n=new s;return n.reject(t),n.promise},v=function(t,n){var e=new s;return n?e.resolve(t):e.reject(t),e.promise},g=function(t,n,e){var r=null;try{S(e)&&(r=e())}catch(i){return v(i,!1)}return O(r)?r.then(function(){return v(t,n)},function(t){return v(t,!1)}):v(t,n)},y=function(t,n,e,r){var i=new s;return i.resolve(t),i.promise.then(n,e,r)},b=y,x=function(t){function n(t){r.resolve(t)}function e(t){r.reject(t)}if(!S(t))throw h("norslvr","Expected resolverFn, got '{0}'",t);var r=new s;return t(n,e),r.promise};return x.prototype=i.prototype,x.defer=p,x.reject=d,x.when=y,x.resolve=b,x.all=c,x.race=f,x}function Ce(){this.$get=["$window","$timeout",function(t,n){var e=t.requestAnimationFrame||t.webkitRequestAnimationFrame,r=t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.webkitCancelRequestAnimationFrame,i=!!e,o=i?function(t){var n=e(t);return function(){r(n)}}:function(t){var e=n(t,16.66,!1);return function(){n.cancel(e)}};return o.supported=i,o}]}function Se(){function t(t){function n(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$id=a(),this.$$ChildScope=null}return n.prototype=t,n}var i=10,o=n("$rootScope"),u=null,s=null;this.digestTtl=function(t){return arguments.length&&(i=t),i},this.$get=["$exceptionHandler","$parse","$browser",function(n,l,c){function f(t){t.currentScope.$$destroyed=!0}function h(t){9===Rr&&(t.$$childHead&&h(t.$$childHead),t.$$nextSibling&&h(t.$$nextSibling)),t.$parent=t.$$nextSibling=t.$$prevSibling=t.$$childHead=t.$$childTail=t.$root=t.$$watchers=null}function d(){this.$id=a(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this.$root=this,this.$$destroyed=!1,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$$isolateBindings=null}function v(t){if(_.$$phase)throw o("inprog","{0} already in progress",_.$$phase);_.$$phase=t}function g(){_.$$phase=null}function y(t,n){do t.$$watchersCount+=n;while(t=t.$parent)}function b(t,n,e){do t.$$listenerCount[e]-=n,0===t.$$listenerCount[e]&&delete t.$$listenerCount[e];while(t=t.$parent)}function x(){}function w(){for(;A.length;)try{A.shift()()}catch(t){n(t)}s=null}function C(){null===s&&(s=c.defer(function(){_.$apply(w)}))}d.prototype={constructor:d,$new:function(n,e){var r;return e=e||this,n?(r=new d,r.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=t(this)),r=new this.$$ChildScope),r.$parent=e,r.$$prevSibling=e.$$childTail,e.$$childHead?(e.$$childTail.$$nextSibling=r,e.$$childTail=r):e.$$childHead=e.$$childTail=r,(n||e!=this)&&r.$on("$destroy",f),r},$watch:function(t,n,e,r){var i=l(t);if(i.$$watchDelegate)return i.$$watchDelegate(this,n,e,i,t);var o=this,a=o.$$watchers,s={fn:n,last:x,get:i,exp:r||t,eq:!!e};return u=null,S(n)||(s.fn=p),a||(a=o.$$watchers=[]),a.unshift(s),y(this,1),function(){F(a,s)>=0&&y(o,-1),u=null}},$watchGroup:function(t,n){function e(){s=!1,l?(l=!1,n(o,o,u)):n(o,i,u)}var i=new Array(t.length),o=new Array(t.length),a=[],u=this,s=!1,l=!0;if(!t.length){var c=!0;return u.$evalAsync(function(){c&&n(o,o,u)}),function(){c=!1}}return 1===t.length?this.$watch(t[0],function(t,e,r){o[0]=t,i[0]=e,n(o,t===e?o:i,r)}):(r(t,function(t,n){var r=u.$watch(t,function(t,r){o[n]=t,i[n]=r,s||(s=!0,u.$evalAsync(e))});a.push(r)}),function(){for(;a.length;)a.shift()()})},$watchCollection:function(t,n){function r(t){o=t;var n,r,i,u,s;if(!m(o)){if($(o))if(e(o)){a!==p&&(a=p,g=a.length=0,f++),n=o.length,g!==n&&(f++,a.length=g=n);for(var l=0;l<n;l++)s=a[l],u=o[l],i=s!==s&&u!==u,i||s===u||(f++,a[l]=u)}else{a!==d&&(a=d={},g=0,f++),n=0;for(r in o)Or.call(o,r)&&(n++,u=o[r],s=a[r],r in a?(i=s!==s&&u!==u,i||s===u||(f++,a[r]=u)):(g++,a[r]=u,f++));if(g>n){f++;for(r in a)Or.call(o,r)||(g--,delete a[r])}}else a!==o&&(a=o,f++);return f}}function i(){if(v?(v=!1,n(o,o,s)):n(o,u,s),c)if($(o))if(e(o)){u=new Array(o.length);for(var t=0;t<o.length;t++)u[t]=o[t]}else{u={};for(var r in o)Or.call(o,r)&&(u[r]=o[r])}else u=o}r.$stateful=!0;var o,a,u,s=this,c=n.length>1,f=0,h=l(t,r),p=[],d={},v=!0,g=0;return this.$watch(h,i)},$digest:function(){var t,e,r,a,l,f,h,p,d,m,y,$,b=i,C=this,A=[];v("$digest"),c.$$checkUrlChange(),this===_&&null!==s&&(c.defer.cancel(s),w()),u=null;do{p=!1,m=C;for(var P=0;P<M.length;P++){try{$=M[P],$.scope.$eval($.expression,$.locals)}catch(T){n(T)}u=null}M.length=0;t:do{if(f=m.$$watchers)for(h=f.length;h--;)try{if(t=f[h])if(l=t.get,(e=l(m))===(r=t.last)||(t.eq?q(e,r):"number"==typeof e&&"number"==typeof r&&isNaN(e)&&isNaN(r))){if(t===u){p=!1;break t}}else p=!0,u=t,t.last=t.eq?I(e,null):e,a=t.fn,a(e,r===x?e:r,m),b<5&&(y=4-b,A[y]||(A[y]=[]),A[y].push({msg:S(t.exp)?"fn: "+(t.exp.name||t.exp.toString()):t.exp,newVal:e,oldVal:r}))}catch(T){n(T)}if(!(d=m.$$watchersCount&&m.$$childHead||m!==C&&m.$$nextSibling))for(;m!==C&&!(d=m.$$nextSibling);)m=m.$parent}while(m=d);if((p||M.length)&&!b--)throw g(),o("infdig","{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}",i,A)}while(p||M.length);for(g();E<k.length;)try{k[E++]()}catch(T){n(T)}k.length=E=0},$destroy:function(){if(!this.$$destroyed){var t=this.$parent;this.$broadcast("$destroy"),this.$$destroyed=!0,this===_&&c.$$applicationDestroyed(),y(this,-this.$$watchersCount);for(var n in this.$$listenerCount)b(this,this.$$listenerCount[n],n);t&&t.$$childHead==this&&(t.$$childHead=this.$$nextSibling),t&&t.$$childTail==this&&(t.$$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=p,this.$on=this.$watch=this.$watchGroup=function(){return p},this.$$listeners={},this.$$nextSibling=null,h(this)}},$eval:function(t,n){return l(t)(this,n)},$evalAsync:function(t,n){_.$$phase||M.length||c.defer(function(){M.length&&_.$digest()}),M.push({scope:this,expression:l(t),locals:n})},$$postDigest:function(t){k.push(t)},$apply:function(t){try{v("$apply");try{return this.$eval(t)}finally{g()}}catch(e){n(e)}finally{try{_.$digest()}catch(e){throw n(e),e}}},$applyAsync:function(t){function n(){e.$eval(t)}var e=this;t&&A.push(n),t=l(t),C()},$on:function(t,n){var e=this.$$listeners[t];e||(this.$$listeners[t]=e=[]),e.push(n);var r=this;do r.$$listenerCount[t]||(r.$$listenerCount[t]=0),r.$$listenerCount[t]++;while(r=r.$parent);var i=this;return function(){var r=e.indexOf(n);r!==-1&&(e[r]=null,b(i,1,t))}},$emit:function(t,e){var r,i,o,a=[],u=this,s=!1,l={name:t,targetScope:u,stopPropagation:function(){s=!0},preventDefault:function(){l.defaultPrevented=!0},defaultPrevented:!1},c=z([l],arguments,1);do{for(r=u.$$listeners[t]||a,l.currentScope=u,i=0,o=r.length;i<o;i++)if(r[i])try{r[i].apply(null,c)}catch(f){n(f)}else r.splice(i,1),i--,o--;if(s)return l.currentScope=null,l;u=u.$parent}while(u);return l.currentScope=null,l},$broadcast:function(t,e){var r=this,i=r,o=r,a={name:t,targetScope:r,preventDefault:function(){a.defaultPrevented=!0},defaultPrevented:!1};if(!r.$$listenerCount[t])return a;for(var u,s,l,c=z([a],arguments,1);i=o;){for(a.currentScope=i,u=i.$$listeners[t]||[],s=0,l=u.length;s<l;s++)if(u[s])try{u[s].apply(null,c)}catch(f){n(f)}else u.splice(s,1),s--,l--;if(!(o=i.$$listenerCount[t]&&i.$$childHead||i!==r&&i.$$nextSibling))for(;i!==r&&!(o=i.$$nextSibling);)i=i.$parent}return a.currentScope=null,a}};var _=new d,M=_.$$asyncQueue=[],k=_.$$postDigestQueue=[],A=_.$$applyAsyncQueue=[],E=0;return _}]}function _e(){var t=/^\s*(https?|ftp|mailto|tel|file):/,n=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(n){return y(n)?(t=n,this):t},this.imgSrcSanitizationWhitelist=function(t){return y(t)?(n=t,this):n},this.$get=function(){return function(e,r){var i,o=r?n:t;return i=De(e).href,""===i||i.match(o)?e:"unsafe:"+i}}}function Me(t){if("self"===t)return t;if(x(t)){if(t.indexOf("***")>-1)throw wo("iwcard","Illegal sequence *** in string matcher.  String: {0}",t);return t=Kr(t).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*"),new RegExp("^"+t+"$")}if(_(t))return new RegExp("^"+t.source+"$");throw wo("imatcher",'Matchers may only be "self", string patterns or RegExp objects')}function ke(t){var n=[];return y(t)&&r(t,function(t){n.push(Me(t))}),n}function Ae(){this.SCE_CONTEXTS=Co;var t=["self"],n=[];this.resourceUrlWhitelist=function(n){return arguments.length&&(t=ke(n)),t},this.resourceUrlBlacklist=function(t){return arguments.length&&(n=ke(t)),n},this.$get=["$injector",function(e){function r(t,n){return"self"===t?Ne(n):!!t.exec(n.href)}function i(e){var i,o,a=De(e.toString()),u=!1;for(i=0,o=t.length;i<o;i++)if(r(t[i],a)){u=!0;break}if(u)for(i=0,o=n.length;i<o;i++)if(r(n[i],a)){u=!1;break}return u}function o(t){var n=function(t){this.$$unwrapTrustedValue=function(){return t}};return t&&(n.prototype=new t),n.prototype.valueOf=function(){return this.$$unwrapTrustedValue()},n.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()},n}function a(t,n){var e=f.hasOwnProperty(t)?f[t]:null;if(!e)throw wo("icontext","Attempted to trust a value in invalid context. Context: {0}; Value: {1}",t,n);if(null===n||m(n)||""===n)return n;if("string"!=typeof n)throw wo("itype","Attempted to trust a non-string value in a content requiring a string: Context: {0}",t);return new e(n)}function u(t){return t instanceof c?t.$$unwrapTrustedValue():t}function s(t,n){if(null===n||m(n)||""===n)return n;var e=f.hasOwnProperty(t)?f[t]:null;if(e&&n instanceof e)return n.$$unwrapTrustedValue();if(t===Co.RESOURCE_URL){if(i(n))return n;throw wo("insecurl","Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}",n.toString())}if(t===Co.HTML)return l(n);throw wo("unsafe","Attempting to use an unsafe value in a safe context.")}var l=function(t){throw wo("unsafe","Attempting to use an unsafe value in a safe context.")};e.has("$sanitize")&&(l=e.get("$sanitize"));var c=o(),f={};return f[Co.HTML]=o(c),f[Co.CSS]=o(c),f[Co.URL]=o(c),f[Co.JS]=o(c),f[Co.RESOURCE_URL]=o(f[Co.URL]),{trustAs:a,getTrusted:s,valueOf:u}}]}function Ee(){var t=!0;this.enabled=function(n){return arguments.length&&(t=!!n),t},this.$get=["$parse","$sceDelegate",function(n,e){if(t&&Rr<8)throw wo("iequirks","Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.");var i=gt(Co);i.isEnabled=function(){return t},i.trustAs=e.trustAs,i.getTrusted=e.getTrusted,i.valueOf=e.valueOf,t||(i.trustAs=i.getTrusted=function(t,n){return n},i.valueOf=d),i.parseAs=function(t,e){var r=n(e);return r.literal&&r.constant?r:n(e,function(n){return i.getTrusted(t,n)})};var o=i.parseAs,a=i.getTrusted,u=i.trustAs;return r(Co,function(t,n){var e=Lr(n);i[xt("parse_as_"+e)]=function(n){return o(t,n)},i[xt("get_trusted_"+e)]=function(n){return a(t,n)},i[xt("trust_as_"+e)]=function(n){return u(t,n)}}),i}]}function Pe(){this.$get=["$window","$document",function(t,n){var e,r,i={},o=t.chrome&&t.chrome.app&&t.chrome.app.runtime,a=!o&&t.history&&t.history.pushState,u=f((/android (\d+)/.exec(Lr((t.navigator||{}).userAgent))||[])[1]),s=/Boxee/i.test((t.navigator||{}).userAgent),l=n[0]||{},c=/^(Moz|webkit|ms)(?=[A-Z])/,h=l.body&&l.body.style,p=!1,d=!1;if(h){for(var v in h)if(r=c.exec(v)){e=r[0],e=e[0].toUpperCase()+e.substr(1);break}e||(e="WebkitOpacity"in h&&"webkit"),p=!!("transition"in h||e+"Transition"in h),d=!!("animation"in h||e+"Animation"in h),!u||p&&d||(p=x(h.webkitTransition),d=x(h.webkitAnimation))}return{history:!(!a||u<4||s),hasEvent:function(t){if("input"===t&&Rr<=11)return!1;if(m(i[t])){var n=l.createElement("div");i[t]="on"+t in n}return i[t]},csp:Qr(),vendorPrefix:e,transitions:p,animations:d,android:u}}]}function Te(){var t;this.httpOptions=function(n){return n?(t=n,this):t},this.$get=["$templateCache","$http","$q","$sce",function(n,e,r,i){function o(a,u){function s(t){if(!u)throw So("tpload","Failed to load template: {0} (HTTP status: {1} {2})",a,t.status,t.statusText);return r.reject(t)}o.totalPendingRequests++,x(a)&&!m(n.get(a))||(a=i.getTrustedResourceUrl(a));var c=e.defaults&&e.defaults.transformResponse;return Zr(c)?c=c.filter(function(t){return t!==kn}):c===kn&&(c=null),e.get(a,l({cache:n,transformResponse:c},t))["finally"](function(){o.totalPendingRequests--}).then(function(t){return n.put(a,t.data),t.data},s)}return o.totalPendingRequests=0,o}]}function Oe(){this.$get=["$rootScope","$browser","$location",function(t,n,e){var i={};return i.findBindings=function(t,n,e){var i=t.getElementsByClassName("ng-binding"),o=[];return r(i,function(t){var i=Yr.element(t).data("$binding");i&&r(i,function(r){if(e){var i=new RegExp("(^|\\s)"+Kr(n)+"(\\s|\\||$)");i.test(r)&&o.push(t)}else r.indexOf(n)!=-1&&o.push(t)})}),o},i.findModels=function(t,n,e){for(var r=["ng-","data-ng-","ng\\:"],i=0;i<r.length;++i){var o=e?"=":"*=",a="["+r[i]+"model"+o+'"'+n+'"]',u=t.querySelectorAll(a);if(u.length)return u}},i.getLocation=function(){return e.url()},i.setLocation=function(n){n!==e.url()&&(e.url(n),t.$digest())},i.whenStable=function(t){n.notifyWhenNoOutstandingRequests(t)},i}]}function Le(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(t,n,e,r,i){function o(o,u,s){S(o)||(s=u,u=o,o=p);var l,c=V(arguments,3),f=y(s)&&!s,h=(f?r:e).defer(),d=h.promise;return l=n.defer(function(){try{h.resolve(o.apply(null,c))}catch(n){h.reject(n),i(n)}finally{delete a[d.$$timeoutId]}f||t.$apply()},u),d.$$timeoutId=l,a[l]=h,d}var a={};return o.cancel=function(t){return!!(t&&t.$$timeoutId in a)&&(a[t.$$timeoutId].reject("canceled"),delete a[t.$$timeoutId],n.defer.cancel(t.$$timeoutId))},o}]}function De(t){var n=t;return Rr&&(_o.setAttribute("href",n),n=_o.href),_o.setAttribute("href",n),{href:_o.href,protocol:_o.protocol?_o.protocol.replace(/:$/,""):"",host:_o.host,search:_o.search?_o.search.replace(/^\?/,""):"",hash:_o.hash?_o.hash.replace(/^#/,""):"",hostname:_o.hostname,port:_o.port,pathname:"/"===_o.pathname.charAt(0)?_o.pathname:"/"+_o.pathname}}function Ne(t){var n=x(t)?De(t):t;return n.protocol===Mo.protocol&&n.host===Mo.host}function je(){this.$get=v(t)}function Re(t){function n(t){try{return decodeURIComponent(t)}catch(n){return t}}var e=t[0]||{},r={},i="";return function(){var t,o,a,u,s,l=e.cookie||"";if(l!==i)for(i=l,t=i.split("; "),r={},a=0;a<t.length;a++)o=t[a],u=o.indexOf("="),u>0&&(s=n(o.substring(0,u)),m(r[s])&&(r[s]=n(o.substring(u+1))));return r}}function Fe(){this.$get=Re}function Ie(t){function n(i,o){if($(i)){var a={};return r(i,function(t,e){a[e]=n(e,t)}),a}return t.factory(i+e,o)}var e="Filter";this.register=n,this.$get=["$injector",function(t){return function(n){return t.get(n+e)}}],n("currency",We),n("date",or),n("filter",qe),n("json",ar),n("limitTo",ur),n("lowercase",Lo),n("number",Ue),n("orderBy",lr),n("uppercase",Do)}function qe(){return function(t,r,i,o){if(!e(t)){if(null==t)return t;throw n("filter")("notarray","Expected array but received: {0}",t)}o=o||"$";var a,u,s=Be(r);switch(s){case"function":a=r;break;case"boolean":case"null":case"number":case"string":u=!0;case"object":a=ze(r,i,o,u);break;default:return t}return Array.prototype.filter.call(t,a)}}function ze(t,n,e,r){var i,o=$(t)&&e in t;return n===!0?n=q:S(n)||(n=function(t,n){return!m(t)&&(null===t||null===n?t===n:!($(n)||$(t)&&!g(t))&&(t=Lr(""+t),n=Lr(""+n),t.indexOf(n)!==-1))}),i=function(i){return o&&!$(i)?Ve(i,t[e],n,e,!1):Ve(i,t,n,e,r)}}function Ve(t,n,e,r,i,o){var a=Be(t),u=Be(n);if("string"===u&&"!"===n.charAt(0))return!Ve(t,n.substring(1),e,r,i);if(Zr(t))return t.some(function(t){return Ve(t,n,e,r,i)});switch(a){case"object":var s;if(i){for(s in t)if("$"!==s.charAt(0)&&Ve(t[s],n,e,r,!0))return!0;return!o&&Ve(t,n,e,r,!1)}if("object"===u){for(s in n){var l=n[s];if(!S(l)&&!m(l)){var c=s===r,f=c?t:t[s];if(!Ve(f,l,e,r,c,c))return!1}}return!0}return e(t,n);case"function":return!1;default:return e(t,n)}}function Be(t){return null===t?"null":typeof t}function We(t){var n=t.NUMBER_FORMATS;return function(t,e,r){return m(e)&&(e=n.CURRENCY_SYM),m(r)&&(r=n.PATTERNS[1].maxFrac),null==t?t:Ge(t,n.PATTERNS[1],n.GROUP_SEP,n.DECIMAL_SEP,r).replace(/\u00A4/g,e)}}function Ue(t){var n=t.NUMBER_FORMATS;return function(t,e){return null==t?t:Ge(t,n.PATTERNS[0],n.GROUP_SEP,n.DECIMAL_SEP,e)}}function He(t){var n,e,r,i,o,a=0;for((e=t.indexOf(Ao))>-1&&(t=t.replace(Ao,"")),(r=t.search(/e/i))>0?(e<0&&(e=r),e+=+t.slice(r+1),t=t.substring(0,r)):e<0&&(e=t.length),r=0;t.charAt(r)==Eo;r++);if(r==(o=t.length))n=[0],e=1;else{for(o--;t.charAt(o)==Eo;)o--;for(e-=r,n=[],i=0;r<=o;r++,i++)n[i]=+t.charAt(r)}return e>ko&&(n=n.splice(0,ko-1),a=e-1,e=1),{d:n,e:a,i:e}}function Ye(t,n,e,r){var i=t.d,o=i.length-t.i;n=m(n)?Math.min(Math.max(e,o),r):+n;var a=n+t.i,u=i[a];if(a>0){i.splice(Math.max(t.i,a));for(var s=a;s<i.length;s++)i[s]=0}else{o=Math.max(0,o),t.i=1,i.length=Math.max(1,a=n+1),i[0]=0;for(var l=1;l<a;l++)i[l]=0}if(u>=5)if(a-1<0){for(var c=0;c>a;c--)i.unshift(0),t.i++;i.unshift(1),t.i++}else i[a-1]++;for(;o<Math.max(0,n);o++)i.push(0);var f=i.reduceRight(function(t,n,e,r){return n+=t,r[e]=n%10,Math.floor(n/10)},0);f&&(i.unshift(f),t.i++)}function Ge(t,n,e,r,i){if(!x(t)&&!w(t)||isNaN(t))return"";var o,a=!isFinite(t),u=!1,s=Math.abs(t)+"",l="";if(a)l="∞";else{o=He(s),Ye(o,i,n.minFrac,n.maxFrac);var c=o.d,f=o.i,h=o.e,p=[];for(u=c.reduce(function(t,n){return t&&!n},!0);f<0;)c.unshift(0),f++;f>0?p=c.splice(f,c.length):(p=c,c=[0]);var d=[];for(c.length>=n.lgSize&&d.unshift(c.splice(-n.lgSize,c.length).join(""));c.length>n.gSize;)d.unshift(c.splice(-n.gSize,c.length).join(""));c.length&&d.unshift(c.join("")),l=d.join(e),p.length&&(l+=r+p.join("")),h&&(l+="e+"+h)}return t<0&&!u?n.negPre+l+n.negSuf:n.posPre+l+n.posSuf}function Ze(t,n,e,r){var i="";for((t<0||r&&t<=0)&&(r?t=-t+1:(t=-t,i="-")),t=""+t;t.length<n;)t=Eo+t;return e&&(t=t.substr(t.length-n)),i+t}function Xe(t,n,e,r,i){return e=e||0,function(o){var a=o["get"+t]();return(e>0||a>-e)&&(a+=e),0===a&&e==-12&&(a=12),Ze(a,n,r,i)}}function Je(t,n,e){return function(r,i){var o=r["get"+t](),a=(e?"STANDALONE":"")+(n?"SHORT":""),u=Dr(a+t);return i[u][o]}}function Ke(t,n,e){var r=-1*e,i=r>=0?"+":"";return i+=Ze(Math[r>0?"floor":"ceil"](r/60),2)+Ze(Math.abs(r%60),2)}function Qe(t){var n=new Date(t,0,1).getDay();return new Date(t,0,(n<=4?5:12)-n)}function tr(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate()+(4-t.getDay()))}function nr(t){return function(n){var e=Qe(n.getFullYear()),r=tr(n),i=+r-+e,o=1+Math.round(i/6048e5);return Ze(o,t)}}function er(t,n){return t.getHours()<12?n.AMPMS[0]:n.AMPMS[1]}function rr(t,n){return t.getFullYear()<=0?n.ERAS[0]:n.ERAS[1]}function ir(t,n){return t.getFullYear()<=0?n.ERANAMES[0]:n.ERANAMES[1]}function or(t){function n(t){var n;if(n=t.match(e)){var r=new Date(0),i=0,o=0,a=n[8]?r.setUTCFullYear:r.setFullYear,u=n[8]?r.setUTCHours:r.setHours;n[9]&&(i=f(n[9]+n[10]),o=f(n[9]+n[11])),a.call(r,f(n[1]),f(n[2])-1,f(n[3]));var s=f(n[4]||0)-i,l=f(n[5]||0)-o,c=f(n[6]||0),h=Math.round(1e3*parseFloat("0."+(n[7]||0)));return u.call(r,s,l,c,h),r}return t}var e=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(e,i,o){var a,u,s="",l=[];if(i=i||"mediumDate",i=t.DATETIME_FORMATS[i]||i,x(e)&&(e=Oo.test(e)?f(e):n(e)),w(e)&&(e=new Date(e)),!C(e)||!isFinite(e.getTime()))return e;for(;i;)u=To.exec(i),u?(l=z(l,u,1),i=l.pop()):(l.push(i),i=null);var c=e.getTimezoneOffset();return o&&(c=Y(o,c),e=Z(e,o,!0)),r(l,function(n){a=Po[n],s+=a?a(e,t.DATETIME_FORMATS,c):"''"===n?"'":n.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),s}}function ar(){return function(t,n){return m(n)&&(n=2),U(t,n)}}function ur(){return function(t,n,r){return n=Math.abs(Number(n))===1/0?Number(n):f(n),isNaN(n)?t:(w(t)&&(t=t.toString()),e(t)?(r=!r||isNaN(r)?0:f(r),r=r<0?Math.max(0,t.length+r):r,n>=0?sr(t,r,r+n):0===r?sr(t,n,t.length):sr(t,Math.max(0,r+n),r)):t)}}function sr(t,n,e){return x(t)?t.slice(n,e):zr.call(t,n,e)}function lr(t){function r(n){return n.map(function(n){var e=1,r=d;if(S(n))r=n;else if(x(n)&&("+"!=n.charAt(0)&&"-"!=n.charAt(0)||(e="-"==n.charAt(0)?-1:1,n=n.substring(1)),""!==n&&(r=t(n),r.constant))){var i=r();r=function(t){return t[i]}}return{get:r,descending:e}})}function i(t){switch(typeof t){case"number":case"boolean":case"string":return!0;default:return!1}}function o(t){return S(t.valueOf)&&(t=t.valueOf(),i(t))?t:g(t)&&(t=t.toString(),i(t))?t:t}function a(t,n){var e=typeof t;return null===t?(e="string",t="null"):"object"===e&&(t=o(t)),{value:t,type:e,index:n}}function u(t,n){var e=0,r=t.type,i=n.type;if(r===i){var o=t.value,a=n.value;"string"===r?(o=o.toLowerCase(),a=a.toLowerCase()):"object"===r&&($(o)&&(o=t.index),$(a)&&(a=n.index)),o!==a&&(e=o<a?-1:1)}else e=r<i?-1:1;return e}return function(t,i,o,s){function l(t,n){return{value:t,tieBreaker:{value:n,type:"number",index:n},predicateValues:f.map(function(e){return a(e.get(t),n)})}}function c(t,n){for(var e=0,r=f.length;e<r;e++){var i=p(t.predicateValues[e],n.predicateValues[e]);if(i)return i*f[e].descending*h}return p(t.tieBreaker,n.tieBreaker)*h}if(null==t)return t;if(!e(t))throw n("orderBy")("notarray","Expected array but received: {0}",t);Zr(i)||(i=[i]),0===i.length&&(i=["+"]);var f=r(i),h=o?-1:1,p=S(s)?s:u,d=Array.prototype.map.call(t,l);return d.sort(c),t=d.map(function(t){return t.value})}}function cr(t){return S(t)&&(t={link:t}),t.restrict=t.restrict||"AC",v(t)}function fr(t,n){t.$name=n}function hr(t,n,e,i,o){var a=this,u=[];a.$error={},a.$$success={},a.$pending=void 0,a.$name=o(n.name||n.ngForm||"")(e),a.$dirty=!1,a.$pristine=!0,a.$valid=!0,a.$invalid=!1,a.$submitted=!1,a.$$parentForm=Ro,a.$rollbackViewValue=function(){r(u,function(t){t.$rollbackViewValue()})},a.$commitViewValue=function(){r(u,function(t){t.$commitViewValue()})},a.$addControl=function(t){ft(t.$name,"input"),u.push(t),t.$name&&(a[t.$name]=t),t.$$parentForm=a},a.$$renameControl=function(t,n){var e=t.$name;a[e]===t&&delete a[e],a[n]=t,t.$name=n},a.$removeControl=function(t){t.$name&&a[t.$name]===t&&delete a[t.$name],r(a.$pending,function(n,e){a.$setValidity(e,null,t)}),r(a.$error,function(n,e){a.$setValidity(e,null,t)}),r(a.$$success,function(n,e){a.$setValidity(e,null,t)}),F(u,t),t.$$parentForm=Ro},kr({ctrl:this,$element:t,set:function(t,n,e){var r=t[n];if(r){var i=r.indexOf(e);i===-1&&r.push(e)}else t[n]=[e]},unset:function(t,n,e){var r=t[n];r&&(F(r,e),0===r.length&&delete t[n])},$animate:i}),a.$setDirty=function(){i.removeClass(t,xa),i.addClass(t,wa),a.$dirty=!0,a.$pristine=!1,a.$$parentForm.$setDirty()},a.$setPristine=function(){i.setClass(t,xa,wa+" "+Fo),a.$dirty=!1,a.$pristine=!0,a.$submitted=!1,r(u,function(t){t.$setPristine()})},a.$setUntouched=function(){r(u,function(t){t.$setUntouched()})},a.$setSubmitted=function(){i.addClass(t,Fo),a.$submitted=!0,a.$$parentForm.$setSubmitted()}}function pr(t){t.$formatters.push(function(n){return t.$isEmpty(n)?n:n.toString()})}function dr(t,n,e,r,i,o){vr(t,n,e,r,i,o),pr(r)}function vr(t,n,e,r,i,o){var a=Lr(n[0].type);if(!i.android){var u=!1;n.on("compositionstart",function(){u=!0}),n.on("compositionend",function(){u=!1,l()})}var s,l=function(t){if(s&&(o.defer.cancel(s),s=null),!u){var i=n.val(),l=t&&t.type;"password"===a||e.ngTrim&&"false"===e.ngTrim||(i=Jr(i)),(r.$viewValue!==i||""===i&&r.$$hasNativeValidators)&&r.$setViewValue(i,l)}};if(i.hasEvent("input"))n.on("input",l);else{var c=function(t,n,e){s||(s=o.defer(function(){s=null,n&&n.value===e||l(t)}))};n.on("keydown",function(t){var n=t.keyCode;91===n||15<n&&n<19||37<=n&&n<=40||c(t,this,this.value)}),i.hasEvent("paste")&&n.on("paste cut",c)}n.on("change",l),Ko[a]&&r.$$hasNativeValidators&&a===e.type&&n.on(Jo,function(t){if(!s){var n=this[Tr],e=n.badInput,r=n.typeMismatch;s=o.defer(function(){s=null,n.badInput===e&&n.typeMismatch===r||l(t)})}}),r.$render=function(){var t=r.$isEmpty(r.$viewValue)?"":r.$viewValue;n.val()!==t&&n.val(t)}}function gr(t,n){if(C(t))return t;if(x(t)){Go.lastIndex=0;var e=Go.exec(t);if(e){var r=+e[1],i=+e[2],o=0,a=0,u=0,s=0,l=Qe(r),c=7*(i-1);return n&&(o=n.getHours(),a=n.getMinutes(),u=n.getSeconds(),s=n.getMilliseconds()),new Date(r,0,l.getDate()+c,o,a,u,s)}}return NaN}function mr(t,n){return function(e,i){var o,a;if(C(e))return e;if(x(e)){if('"'==e.charAt(0)&&'"'==e.charAt(e.length-1)&&(e=e.substring(1,e.length-1)),Vo.test(e))return new Date(e);if(t.lastIndex=0,o=t.exec(e))return o.shift(),a=i?{yyyy:i.getFullYear(),MM:i.getMonth()+1,dd:i.getDate(),HH:i.getHours(),mm:i.getMinutes(),ss:i.getSeconds(),sss:i.getMilliseconds()/1e3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(o,function(t,e){e<n.length&&(a[n[e]]=+t)}),new Date(a.yyyy,a.MM-1,a.dd,a.HH,a.mm,a.ss||0,1e3*a.sss||0)}return NaN}}function yr(t,n,e,r){return function(i,o,a,u,s,l,c){function f(t){return t&&!(t.getTime&&t.getTime()!==t.getTime())}function h(t){return y(t)&&!C(t)?e(t)||void 0:t}$r(i,o,a,u),vr(i,o,a,u,s,l);var p,d=u&&u.$options&&u.$options.timezone;if(u.$$parserName=t,u.$parsers.push(function(t){if(u.$isEmpty(t))return null;if(n.test(t)){var r=e(t,p);return d&&(r=Z(r,d)),r}}),u.$formatters.push(function(t){if(t&&!C(t))throw Aa("datefmt","Expected `{0}` to be a date",t);return f(t)?(p=t,p&&d&&(p=Z(p,d,!0)),c("date")(t,r,d)):(p=null,"")}),y(a.min)||a.ngMin){var v;u.$validators.min=function(t){return!f(t)||m(v)||e(t)>=v},a.$observe("min",function(t){
diff --git a/dist/xosNgLib.css b/dist/xosNgLib.css
index dec2ce3..b4ae64b 100644
--- a/dist/xosNgLib.css
+++ b/dist/xosNgLib.css
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 @keyframes slideInRight {
   from {
     transform: translate3d(100%, 0, 0);
diff --git a/dist/xosUiComponents.js b/dist/xosUiComponents.js
index 2392930..cc08dbe 100644
--- a/dist/xosUiComponents.js
+++ b/dist/xosUiComponents.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 'use strict';
 
 /**
diff --git a/gulp/dev.js b/gulp/dev.js
index ee51e3f..8dc7573 100644
--- a/gulp/dev.js
+++ b/gulp/dev.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /*eslint-env node */
 (function () {
   'use strict';
diff --git a/gulp/docs.js b/gulp/docs.js
index 11494e6..e5e7bf7 100644
--- a/gulp/docs.js
+++ b/gulp/docs.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /*eslint-env node */
 
 const gulp = require('gulp');
diff --git a/gulp/ngXosHelpers.js b/gulp/ngXosHelpers.js
index 4888bdf..f297c35 100644
--- a/gulp/ngXosHelpers.js
+++ b/gulp/ngXosHelpers.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /*eslint-env node */
 
 (function () {
diff --git a/gulp/ngXosVendor.js b/gulp/ngXosVendor.js
index 9e82c23..6205137 100644
--- a/gulp/ngXosVendor.js
+++ b/gulp/ngXosVendor.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /*eslint-env node */
 (function () {
   
diff --git a/gulpfile.js b/gulpfile.js
index e25e936..57037b9 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /*eslint-env node */
 (function () {
   'use strict';
diff --git a/karma.conf.ci.js b/karma.conf.ci.js
index 399cdfd..834214f 100644
--- a/karma.conf.ci.js
+++ b/karma.conf.ci.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /*eslint-env node */
 (function () {
   
diff --git a/karma.conf.js b/karma.conf.js
index 16ca1a6..e62295b 100644
--- a/karma.conf.js
+++ b/karma.conf.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /*eslint-env node */
 (function () {
   'use strict';
diff --git a/karma.conf.ui.js b/karma.conf.ui.js
index fe5aadf..72132d9 100644
--- a/karma.conf.ui.js
+++ b/karma.conf.ui.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /*eslint-env node */
 (function () {
   
diff --git a/ng-xos-lib-onboard.yaml b/ng-xos-lib-onboard.yaml
index 381e63a..ce84c8c 100644
--- a/ng-xos-lib-onboard.yaml
+++ b/ng-xos-lib-onboard.yaml
@@ -1,3 +1,19 @@
+
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
 tosca_definitions_version: tosca_simple_yaml_1_0
 
 description: Onboard ng-xos-lib
diff --git a/spec/csrftoken.test.js b/spec/csrftoken.test.js
index fd00181..3a5d035 100644
--- a/spec/csrftoken.test.js
+++ b/spec/csrftoken.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function () {
   'use strict';
   describe('The xos.helper module', function(){
diff --git a/spec/label_formatter.test.js b/spec/label_formatter.test.js
index 119f4ce..e2b2a9d 100644
--- a/spec/label_formatter.test.js
+++ b/spec/label_formatter.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function () {
   'use strict';
 
diff --git a/spec/log.test.js b/spec/log.test.js
index 21085c6..88bcab1 100644
--- a/spec/log.test.js
+++ b/spec/log.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/noHyperlinks.test.js b/spec/noHyperlinks.test.js
index 7b6e9d0..0db18a0 100644
--- a/spec/noHyperlinks.test.js
+++ b/spec/noHyperlinks.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/notification.test.js b/spec/notification.test.js
index cbc1e56..4ed7304 100644
--- a/spec/notification.test.js
+++ b/spec/notification.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function () {
   'use strict';
 
diff --git a/spec/services/helpers/comparator.test.js b/spec/services/helpers/comparator.test.js
index 66e26d3..4262411 100644
--- a/spec/services/helpers/comparator.test.js
+++ b/spec/services/helpers/comparator.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function () {
   'use strict';
 
diff --git a/spec/services/helpers/form.helpers.test.js b/spec/services/helpers/form.helpers.test.js
index 308d503..aa37c25 100644
--- a/spec/services/helpers/form.helpers.test.js
+++ b/spec/services/helpers/form.helpers.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/services/helpers/user-prefs.test.js b/spec/services/helpers/user-prefs.test.js
index 63b55c9..f8582aa 100644
--- a/spec/services/helpers/user-prefs.test.js
+++ b/spec/services/helpers/user-prefs.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/test_helpers.js b/spec/test_helpers.js
index c373c5e..625124e 100644
--- a/spec/test_helpers.js
+++ b/spec/test_helpers.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * Collection of helpers for xos tests
  */
diff --git a/spec/ui/alert.test.js b/spec/ui/alert.test.js
index c67d03a..d5151f6 100644
--- a/spec/ui/alert.test.js
+++ b/spec/ui/alert.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/ui/custom-validator.test.js b/spec/ui/custom-validator.test.js
index c85c934..55a1afc 100644
--- a/spec/ui/custom-validator.test.js
+++ b/spec/ui/custom-validator.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/ui/field.test.js b/spec/ui/field.test.js
index 6260ac8..9d8e90d 100644
--- a/spec/ui/field.test.js
+++ b/spec/ui/field.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/ui/form.test.js b/spec/ui/form.test.js
index deb7e60..a24dd31 100644
--- a/spec/ui/form.test.js
+++ b/spec/ui/form.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/ui/pagination.test.js b/spec/ui/pagination.test.js
index 03f1045..4cfec15 100644
--- a/spec/ui/pagination.test.js
+++ b/spec/ui/pagination.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function () {
   'use strict';
 
diff --git a/spec/ui/smart-pie.test.js b/spec/ui/smart-pie.test.js
index d5a9cfe..d5a09c4 100644
--- a/spec/ui/smart-pie.test.js
+++ b/spec/ui/smart-pie.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/ui/smart-table.test.js b/spec/ui/smart-table.test.js
index e87e807..941cebc 100644
--- a/spec/ui/smart-table.test.js
+++ b/spec/ui/smart-table.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/ui/table.test.js b/spec/ui/table.test.js
index 0b6ea87..fc56429 100644
--- a/spec/ui/table.test.js
+++ b/spec/ui/table.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/ui/validation.test.js b/spec/ui/validation.test.js
index 44d9f96..a572316 100644
--- a/spec/ui/validation.test.js
+++ b/spec/ui/validation.test.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/spec/ui/xos.helpers.mock.js b/spec/ui/xos.helpers.mock.js
index bf0f0f5..55b374d 100644
--- a/spec/ui/xos.helpers.mock.js
+++ b/spec/ui/xos.helpers.mock.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function () {
   'use strict';
   angular.module('xos.helpers', ['xos.uiComponents'])
diff --git a/src/index.ngdoc.js b/src/index.ngdoc.js
index 6f6a77c..3ab7574 100644
--- a/src/index.ngdoc.js
+++ b/src/index.ngdoc.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
 * @ngdoc overview
 * @name ngXosLib
diff --git a/src/services/csrfToken.interceptor.js b/src/services/csrfToken.interceptor.js
index 5f87de5..393d8ea 100644
--- a/src/services/csrfToken.interceptor.js
+++ b/src/services/csrfToken.interceptor.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/helpers/ui/comparator.service.js b/src/services/helpers/ui/comparator.service.js
index 24bf9f9..824f464 100644
--- a/src/services/helpers/ui/comparator.service.js
+++ b/src/services/helpers/ui/comparator.service.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/helpers/ui/form.helpers.js b/src/services/helpers/ui/form.helpers.js
index 5dbecd7..92f49ca 100644
--- a/src/services/helpers/ui/form.helpers.js
+++ b/src/services/helpers/ui/form.helpers.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function () {
 
   angular.module('xos.uiComponents')
diff --git a/src/services/helpers/ui/label_formatter.service.js b/src/services/helpers/ui/label_formatter.service.js
index e01e772..150e3e3 100644
--- a/src/services/helpers/ui/label_formatter.service.js
+++ b/src/services/helpers/ui/label_formatter.service.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/helpers/user-prefs.service.js b/src/services/helpers/user-prefs.service.js
index f3f1f19..0a430ae 100644
--- a/src/services/helpers/user-prefs.service.js
+++ b/src/services/helpers/user-prefs.service.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function () {
   
   angular.module('xos.helpers')
diff --git a/src/services/log.decorator.js b/src/services/log.decorator.js
index 37d36f9..54b9e94 100644
--- a/src/services/log.decorator.js
+++ b/src/services/log.decorator.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 // TODO write tests for log
 
 /* eslint-disable  angular/ng_window_service*/
diff --git a/src/services/noHyperlinks.interceptor.js b/src/services/noHyperlinks.interceptor.js
index af3dd63..6927b57 100644
--- a/src/services/noHyperlinks.interceptor.js
+++ b/src/services/noHyperlinks.interceptor.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/notification.service.js b/src/services/notification.service.js
index 9a1598e..00e0453 100644
--- a/src/services/notification.service.js
+++ b/src/services/notification.service.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /* eslint-disable  angular/ng_window_service*/
 (function() {
   'use strict';
diff --git a/src/services/rest/Dashboards.js b/src/services/rest/Dashboards.js
index 42af90b..45df6c7 100644
--- a/src/services/rest/Dashboards.js
+++ b/src/services/rest/Dashboards.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Deployments.js b/src/services/rest/Deployments.js
index 4fecbc2..c37fdd6 100644
--- a/src/services/rest/Deployments.js
+++ b/src/services/rest/Deployments.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Example.js b/src/services/rest/Example.js
index b13ccda..d4b9b7e 100644
--- a/src/services/rest/Example.js
+++ b/src/services/rest/Example.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Flavors.js b/src/services/rest/Flavors.js
index 348b770..840578a 100644
--- a/src/services/rest/Flavors.js
+++ b/src/services/rest/Flavors.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Images.js b/src/services/rest/Images.js
index 4fe9cb3..19eb685 100644
--- a/src/services/rest/Images.js
+++ b/src/services/rest/Images.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Instances.js b/src/services/rest/Instances.js
index f1e8521..03ffee9 100644
--- a/src/services/rest/Instances.js
+++ b/src/services/rest/Instances.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Me.js b/src/services/rest/Me.js
index fe3dfb1..ac4c9ef 100644
--- a/src/services/rest/Me.js
+++ b/src/services/rest/Me.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Networks.js b/src/services/rest/Networks.js
index 74b73b6..3f0ca5b 100644
--- a/src/services/rest/Networks.js
+++ b/src/services/rest/Networks.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Networkstemplates.js b/src/services/rest/Networkstemplates.js
index 961d5d8..7899842 100644
--- a/src/services/rest/Networkstemplates.js
+++ b/src/services/rest/Networkstemplates.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Nodes.js b/src/services/rest/Nodes.js
index bf2e387..4b3abad 100644
--- a/src/services/rest/Nodes.js
+++ b/src/services/rest/Nodes.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/ONOS-Apps.js b/src/services/rest/ONOS-Apps.js
index 8d4c104..e29c32d 100644
--- a/src/services/rest/ONOS-Apps.js
+++ b/src/services/rest/ONOS-Apps.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/ONOS-Services.js b/src/services/rest/ONOS-Services.js
index 19270e1..e14af8d 100644
--- a/src/services/rest/ONOS-Services.js
+++ b/src/services/rest/ONOS-Services.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Services.js b/src/services/rest/Services.js
index eda57e4..6419749 100644
--- a/src/services/rest/Services.js
+++ b/src/services/rest/Services.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Sites.js b/src/services/rest/Sites.js
index 818d741..d1a7ad4 100644
--- a/src/services/rest/Sites.js
+++ b/src/services/rest/Sites.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Slices.js b/src/services/rest/Slices.js
index 5a0da11..0b41ae3 100644
--- a/src/services/rest/Slices.js
+++ b/src/services/rest/Slices.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Slices_plus.js b/src/services/rest/Slices_plus.js
index 8213b11..5930531 100644
--- a/src/services/rest/Slices_plus.js
+++ b/src/services/rest/Slices_plus.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Subscribers.js b/src/services/rest/Subscribers.js
index 945e1e8..1f70ed1 100644
--- a/src/services/rest/Subscribers.js
+++ b/src/services/rest/Subscribers.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Tenant.js b/src/services/rest/Tenant.js
index 8feb102..9516de8 100644
--- a/src/services/rest/Tenant.js
+++ b/src/services/rest/Tenant.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Truckroll.js b/src/services/rest/Truckroll.js
index 7af9016..833d947 100644
--- a/src/services/rest/Truckroll.js
+++ b/src/services/rest/Truckroll.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Users.js b/src/services/rest/Users.js
index 8be0fdd..d6fb235 100644
--- a/src/services/rest/Users.js
+++ b/src/services/rest/Users.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/Utility.js b/src/services/rest/Utility.js
index a735c46..e06caa6 100644
--- a/src/services/rest/Utility.js
+++ b/src/services/rest/Utility.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/vOLT.js b/src/services/rest/vOLT.js
index 424c48d..9da07d0 100644
--- a/src/services/rest/vOLT.js
+++ b/src/services/rest/vOLT.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/rest/vSG.js b/src/services/rest/vSG.js
index 121b5a3..61cfdbd 100644
--- a/src/services/rest/vSG.js
+++ b/src/services/rest/vSG.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/services/service_graph.service.js b/src/services/service_graph.service.js
index 8a732a2..0456a08 100644
--- a/src/services/service_graph.service.js
+++ b/src/services/service_graph.service.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
diff --git a/src/styles/animations.scss b/src/styles/animations.scss
index f565ff7..57c0ce6 100644
--- a/src/styles/animations.scss
+++ b/src/styles/animations.scss
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 @keyframes slideInRight {
   from {
     transform: translate3d(100%, 0, 0);
diff --git a/src/styles/loader.scss b/src/styles/loader.scss
index 66297df..ee867b2 100644
--- a/src/styles/loader.scss
+++ b/src/styles/loader.scss
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 .loader {
   font-size: 10px;
   margin: 0 auto;
diff --git a/src/styles/main.scss b/src/styles/main.scss
index 3dbdc24..1c3d24d 100644
--- a/src/styles/main.scss
+++ b/src/styles/main.scss
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 @import './animations.scss';
 @import '../../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_variables.scss';
 @import './loader.scss';
diff --git a/src/ui_components/dumbComponents/alert/alert.component.js b/src/ui_components/dumbComponents/alert/alert.component.js
index 948c851..23097d2 100644
--- a/src/ui_components/dumbComponents/alert/alert.component.js
+++ b/src/ui_components/dumbComponents/alert/alert.component.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/src/ui_components/dumbComponents/alert/alert.scss b/src/ui_components/dumbComponents/alert/alert.scss
index f031ba6..b3d409e 100644
--- a/src/ui_components/dumbComponents/alert/alert.scss
+++ b/src/ui_components/dumbComponents/alert/alert.scss
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 @import '../../../styles/animations.scss';
 
 xos-alert {
diff --git a/src/ui_components/dumbComponents/field/field.component.js b/src/ui_components/dumbComponents/field/field.component.js
index 6b413bb..a204222 100644
--- a/src/ui_components/dumbComponents/field/field.component.js
+++ b/src/ui_components/dumbComponents/field/field.component.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/src/ui_components/dumbComponents/field/field.scss b/src/ui_components/dumbComponents/field/field.scss
index 1810ea0..183b668 100644
--- a/src/ui_components/dumbComponents/field/field.scss
+++ b/src/ui_components/dumbComponents/field/field.scss
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 xos-field {
   display: block;
 
diff --git a/src/ui_components/dumbComponents/form/form.component.js b/src/ui_components/dumbComponents/form/form.component.js
index 185abc3..c417433 100644
--- a/src/ui_components/dumbComponents/form/form.component.js
+++ b/src/ui_components/dumbComponents/form/form.component.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/src/ui_components/dumbComponents/form/form.scss b/src/ui_components/dumbComponents/form/form.scss
index cf977af..9f8465a 100644
--- a/src/ui_components/dumbComponents/form/form.scss
+++ b/src/ui_components/dumbComponents/form/form.scss
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 @import '../../../styles/animations.scss';
 @import '../../../../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_variables.scss';
 
diff --git a/src/ui_components/dumbComponents/pagination/pagination.component.js b/src/ui_components/dumbComponents/pagination/pagination.component.js
index 0324751..15c5ab3 100644
--- a/src/ui_components/dumbComponents/pagination/pagination.component.js
+++ b/src/ui_components/dumbComponents/pagination/pagination.component.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/src/ui_components/dumbComponents/table/table.component.js b/src/ui_components/dumbComponents/table/table.component.js
index ed038fd..f677e2a 100644
--- a/src/ui_components/dumbComponents/table/table.component.js
+++ b/src/ui_components/dumbComponents/table/table.component.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/src/ui_components/dumbComponents/table/table.scss b/src/ui_components/dumbComponents/table/table.scss
index d9830d8..d19a74d 100644
--- a/src/ui_components/dumbComponents/table/table.scss
+++ b/src/ui_components/dumbComponents/table/table.scss
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 @import '../../../styles/animations.scss';
 
 xos-table {
diff --git a/src/ui_components/dumbComponents/validation/validation.component.js b/src/ui_components/dumbComponents/validation/validation.component.js
index 42deb4e..9a8dd7b 100644
--- a/src/ui_components/dumbComponents/validation/validation.component.js
+++ b/src/ui_components/dumbComponents/validation/validation.component.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/src/ui_components/dumbComponents/validation/validation.scss b/src/ui_components/dumbComponents/validation/validation.scss
index 588853f..63c7393 100644
--- a/src/ui_components/dumbComponents/validation/validation.scss
+++ b/src/ui_components/dumbComponents/validation/validation.scss
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 @import '../../../styles/animations.scss';
 @import '../../../../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_variables.scss';
 
diff --git a/src/ui_components/smartComponents/smartPie/smartPie.component.js b/src/ui_components/smartComponents/smartPie/smartPie.component.js
index 2276b5d..73aba05 100644
--- a/src/ui_components/smartComponents/smartPie/smartPie.component.js
+++ b/src/ui_components/smartComponents/smartPie/smartPie.component.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/src/ui_components/smartComponents/smartTable/smartTable.component.js b/src/ui_components/smartComponents/smartTable/smartTable.component.js
index d65884a..3c9bf7e 100644
--- a/src/ui_components/smartComponents/smartTable/smartTable.component.js
+++ b/src/ui_components/smartComponents/smartTable/smartTable.component.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/src/ui_components/smartComponents/smartTable/smartTable.scss b/src/ui_components/smartComponents/smartTable/smartTable.scss
index fc63fdf..f96c2e7 100644
--- a/src/ui_components/smartComponents/smartTable/smartTable.scss
+++ b/src/ui_components/smartComponents/smartTable/smartTable.scss
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 xos-smart-table{
   
 }
\ No newline at end of file
diff --git a/src/ui_components/ui-components.module.js b/src/ui_components/ui-components.module.js
index 1b02ab3..1a1bb7c 100644
--- a/src/ui_components/ui-components.module.js
+++ b/src/ui_components/ui-components.module.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 /**
  * © OpenCORD
  *
diff --git a/src/xosHelpers.module.js b/src/xosHelpers.module.js
index 25c8354..7b5f9df 100644
--- a/src/xosHelpers.module.js
+++ b/src/xosHelpers.module.js
@@ -1,3 +1,21 @@
+
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
 (function() {
   'use strict';
 
