 /**
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information 
  regarding copyright ownership.  The ASF licenses this file 
 to you 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.
  */

 /*! usergrid@2.0.9  */
(function(exports, global) {
    global["true"] = exports;
    "use strict";
    var polyfills = function(window, Object) {
        window.requestAnimFrame = function() {
            return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback, element) {
                window.setTimeout(callback, 1e3 / 60);
            };
        }();
        Object.defineProperty(Object.prototype, "clone", {
            enumerable: false,
            writable: true,
            value: function() {
                var i, newObj = this instanceof Array ? [] : {};
                for (i in this) {
                    if (i === "clone") {
                        continue;
                    }
                    if (this[i] && typeof this[i] === "object") {
                        newObj[i] = this[i].clone();
                    } else {
                        newObj[i] = this[i];
                    }
                }
                return newObj;
            }
        });
        Object.defineProperty(Object.prototype, "stringifyJSON", {
            enumerable: false,
            writable: true,
            value: function() {
                return JSON.stringify(this, null, "	");
            }
        });
    };
    polyfills(window, Object);
    var global = global || this;
    var AppServices = AppServices || {};
    global.AppServices = global.AppServices || AppServices;
    AppServices.Constants = angular.module("appservices.constants", []);
    AppServices.Services = angular.module("appservices.services", []);
    AppServices.Controllers = angular.module("appservices.controllers", []);
    AppServices.Filters = angular.module("appservices.filters", []);
    AppServices.Directives = angular.module("appservices.directives", []);
    AppServices.Performance = angular.module("appservices.performance", []);
    AppServices.MAX = angular.module("appservices.max", []);
    angular.module("appservices", [ "ngRoute", "ngResource", "ngSanitize", "ui.bootstrap", "angulartics", "angulartics.google.analytics", "appservices.filters", "appservices.services", "appservices.directives", "appservices.constants", "appservices.controllers", "appservices.max", "angular-intro" ]).config([ "$routeProvider", "$locationProvider", "$sceDelegateProvider", "$analyticsProvider", "$httpProvider", function($routeProvider, $locationProvider, $sceDelegateProvider, $analyticsProvider, $httpProvider) {
        $routeProvider.when("/org-overview", {
            templateUrl: "org-overview/org-overview.html",
            controller: "OrgOverviewCtrl"
        }).when("/login", {
            templateUrl: "login/login.html",
            controller: "LoginCtrl"
        }).when("/login/loading", {
            templateUrl: "login/loading.html",
            controller: "LoginCtrl"
        }).when("/app-overview/summary", {
            templateUrl: "app-overview/app-overview.html",
            controller: "AppOverviewCtrl"
        }).when("/getting-started/setup", {
            templateUrl: "app-overview/getting-started.html",
            controller: "GettingStartedCtrl"
        }).when("/forgot-password", {
            templateUrl: "login/forgot-password.html",
            controller: "ForgotPasswordCtrl"
        }).when("/register", {
            templateUrl: "login/register.html",
            controller: "RegisterCtrl"
        }).when("/users", {
            templateUrl: "users/users.html",
            controller: "UsersCtrl"
        }).when("/users/profile", {
            templateUrl: "users/users-profile.html",
            controller: "UsersProfileCtrl"
        }).when("/users/groups", {
            templateUrl: "users/users-groups.html",
            controller: "UsersGroupsCtrl"
        }).when("/users/activities", {
            templateUrl: "users/users-activities.html",
            controller: "UsersActivitiesCtrl"
        }).when("/users/feed", {
            templateUrl: "users/users-feed.html",
            controller: "UsersFeedCtrl"
        }).when("/users/graph", {
            templateUrl: "users/users-graph.html",
            controller: "UsersGraphCtrl"
        }).when("/users/roles", {
            templateUrl: "users/users-roles.html",
            controller: "UsersRolesCtrl"
        }).when("/groups", {
            templateUrl: "groups/groups.html",
            controller: "GroupsCtrl"
        }).when("/groups/details", {
            templateUrl: "groups/groups-details.html",
            controller: "GroupsDetailsCtrl"
        }).when("/groups/members", {
            templateUrl: "groups/groups-members.html",
            controller: "GroupsMembersCtrl"
        }).when("/groups/activities", {
            templateUrl: "groups/groups-activities.html",
            controller: "GroupsActivitiesCtrl"
        }).when("/groups/roles", {
            templateUrl: "groups/groups-roles.html",
            controller: "GroupsRolesCtrl"
        }).when("/roles", {
            templateUrl: "roles/roles.html",
            controller: "RolesCtrl"
        }).when("/roles/settings", {
            templateUrl: "roles/roles-settings.html",
            controller: "RolesSettingsCtrl"
        }).when("/roles/users", {
            templateUrl: "roles/roles-users.html",
            controller: "RolesUsersCtrl"
        }).when("/roles/groups", {
            templateUrl: "roles/roles-groups.html",
            controller: "RolesGroupsCtrl"
        }).when("/data", {
            templateUrl: "data/data.html",
            controller: "DataCtrl"
        }).when("/data/entity", {
            templateUrl: "data/entity.html",
            controller: "EntityCtrl"
        }).when("/data/shell", {
            templateUrl: "data/shell.html",
            controller: "ShellCtrl"
        }).when("/profile/organizations", {
            templateUrl: "profile/organizations.html",
            controller: "OrgCtrl"
        }).when("/profile/profile", {
            templateUrl: "profile/profile.html",
            controller: "ProfileCtrl"
        }).when("/profile", {
            templateUrl: "profile/account.html",
            controller: "AccountCtrl"
        }).when("/activities", {
            templateUrl: "activities/activities.html",
            controller: "ActivitiesCtrl"
        }).when("/shell", {
            templateUrl: "shell/shell.html",
            controller: "ShellCtrl"
        }).when("/logout", {
            templateUrl: "login/logout.html",
            controller: "LogoutCtrl"
        }).otherwise({
            redirectTo: "/org-overview"
        });
        $locationProvider.html5Mode(false).hashPrefix("!");
        $sceDelegateProvider.resourceUrlWhitelist([ "self", "http://apigee-internal-prod.jupiter.apigee.net/**", "http://apigee-internal-prod.mars.apigee.net/**", "https://appservices.apigee.com/**", "https://api.usergrid.com/**" ]);
        $analyticsProvider.virtualPageviews(false);
        $analyticsProvider.firstPageview(false);
        $httpProvider.defaults.useXDomain = true;
    } ]);
    "use strict";
    AppServices.Controllers.controller("ActivitiesCtrl", [ "ug", "$scope", "$rootScope", "$location", "$route", function(ug, $scope, $rootScope, $location, $route) {
        $scope.$on("app-activities-received", function(evt, data) {
            $scope.activities = data;
            $scope.$apply();
        });
        $scope.$on("app-activities-error", function(evt, data) {
            $rootScope.$broadcast("alert", "error", "Application failed to retreive activities data.");
        });
        ug.getActivities();
    } ]);
    "use strict";
    AppServices.Controllers.controller("AppOverviewCtrl", [ "ug", "charts", "$scope", "$rootScope", "$log", function(ug, charts, $scope, $rootScope, $log) {
        var createGradient = function(color1, color2) {
            var perShapeGradient = {
                x1: 0,
                y1: 0,
                x2: 0,
                y2: 1
            };
            return {
                linearGradient: perShapeGradient,
                stops: [ [ 0, color1 ], [ 1, color2 ] ]
            };
        };
        $scope.appOverview = {};
        $scope.collections = [];
        $scope.graph = "";
        $scope.$on("top-collections-received", function(event, collections) {
            var dataDescription = {
                bar1: {
                    labels: [ "Total" ],
                    dataAttr: [ "title", "count" ],
                    colors: [ createGradient("rgba(36,151,212,0.6)", "rgba(119,198,240,0.6)") ],
                    borderColor: "#1b97d1"
                }
            };
            $scope.collections = collections;
            var arr = [];
            for (var i in collections) {
                if (collections.hasOwnProperty(i)) {
                    arr.push(collections[i]);
                }
            }
            $scope.appOverview = {};
            if (!$rootScope.chartTemplate) {
                ug.httpGet(null, "js/charts/highcharts.json").then(function(success) {
                    $rootScope.chartTemplate = success;
                    $scope.appOverview.chart = angular.copy($rootScope.chartTemplate.pareto);
                    $scope.appOverview.chart = charts.convertParetoChart(arr, $scope.appOverview.chart, dataDescription.bar1, "1h", "NOW");
                    $scope.applyScope();
                }, function(fail) {
                    $log.error("Problem getting chart template", fail);
                });
            } else {
                $scope.appOverview.chart = angular.copy($rootScope.chartTemplate.pareto);
                $scope.appOverview.chart = charts.convertParetoChart(arr, $scope.appOverview.chart, dataDescription.bar1, "1h", "NOW");
                $scope.applyScope();
            }
        });
        $scope.$on("app-initialized", function() {
            ug.getTopCollections();
        });
        if ($rootScope.activeUI) {
            ug.getTopCollections();
        }
    } ]);
    "use strict";
    AppServices.Controllers.controller("GettingStartedCtrl", [ "ug", "$scope", "$rootScope", "$location", "$timeout", "$anchorScroll", function(ug, $scope, $rootScope, $location, $timeout, $anchorScroll) {
        $scope.collections = [];
        $scope.graph = "";
        $scope.clientID = "";
        $scope.clientSecret = "";
        var getKeys = function() {
            return ug.jsonpRaw("credentials", "", {});
        };
        $scope.regenerateCredentialsDialog = function(modalId) {
            $scope.orgAPICredentials = {
                client_id: "regenerating...",
                client_secret: "regenerating..."
            };
            ug.regenerateAppCredentials();
            $scope.hideModal(modalId);
        };
        $scope.$on("app-creds-updated", function(event, credentials) {
            if (credentials) {
                $scope.clientID = credentials.client_id;
                $scope.clientSecret = credentials.client_secret;
                if (!$scope.$$phase) {
                    $scope.$apply();
                }
            } else {
                setTimeout(function() {
                    ug.getAppCredentials();
                }, 5e3);
            }
        });
        ug.getAppCredentials();
        $scope.contentTitle;
        $scope.showSDKDetail = function(name) {
            var introContainer = document.getElementById("intro-container");
            if (name === "nocontent") {
                introContainer.style.height = "0";
                return true;
            }
            introContainer.style.opacity = .1;
            introContainer.style.height = "0";
            var timeout = 0;
            if ($scope.contentTitle) {
                timeout = 500;
            }
            $timeout(function() {
                introContainer.style.height = "1000px";
                introContainer.style.opacity = 1;
            }, timeout);
            $scope.optionName = name;
            $scope.contentTitle = name;
            $scope.sdkLink = "http://apigee.com/docs/content/" + name + "-sdk-redirect";
            $scope.docsLink = "http://apigee.com/docs/app-services/content/installing-apigee-sdk-" + name;
            $scope.getIncludeURL = function() {
                return "app-overview/doc-includes/" + $scope.optionName + ".html";
            };
        };
        $scope.scrollToElement = function(elem) {
            $location.hash(elem);
            $anchorScroll();
            return false;
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("ChartCtrl", [ "$scope", "$location", function($scope, $location) {} ]);
    "use strict";
    AppServices.Directives.directive("chart", function($rootScope) {
        return {
            restrict: "E",
            scope: {
                chartdata: "=chartdata"
            },
            template: "<div></div>",
            replace: true,
            controller: function($scope, $element) {},
            link: function(scope, element, attrs) {
                scope.$watch("chartdata", function(chartdata, oldchartdata) {
                    if (chartdata) {
                        var chartsDefaults = {
                            chart: {
                                renderTo: element[0],
                                type: attrs.type || null,
                                height: attrs.height || null,
                                width: attrs.width || null,
                                reflow: true,
                                animation: false,
                                zoomType: "x"
                            }
                        };
                        if (attrs.type === "pie") {
                            chartsDefaults.chart.margin = [ 0, 0, 0, 0 ];
                            chartsDefaults.chart.spacingLeft = 0;
                            chartsDefaults.chart.spacingRight = 0;
                            chartsDefaults.chart.spacingTop = 0;
                            chartsDefaults.chart.spacingBottom = 0;
                            if (attrs.titleimage) {
                                chartdata.title.text = '<img src="' + attrs.titleimage + '">';
                            }
                            if (attrs.titleicon) {
                                chartdata.title.text = '<i class="pictogram ' + attrs.titleiconclass + '">' + attrs.titleicon + "</i>";
                            }
                            if (attrs.titlecolor) {
                                chartdata.title.style.color = attrs.titlecolor;
                            }
                            if (attrs.titleimagetop) {
                                chartdata.title.style.marginTop = attrs.titleimagetop;
                            }
                            if (attrs.titleimageleft) {
                                chartdata.title.style.marginLeft = attrs.titleimageleft;
                            }
                        }
                        if (attrs.type === "line") {
                            chartsDefaults.chart.marginTop = 30;
                            chartsDefaults.chart.spacingTop = 50;
                        }
                        if (attrs.type === "column") {
                            chartsDefaults.chart.marginBottom = 80;
                        }
                        if (attrs.type === "area") {
                            chartsDefaults.chart.spacingLeft = 0;
                            chartsDefaults.chart.spacingRight = 0;
                            chartsDefaults.chart.marginLeft = 0;
                            chartsDefaults.chart.marginRight = 0;
                        }
                        Highcharts.setOptions({
                            global: {
                                useUTC: false
                            },
                            chart: {
                                style: {
                                    fontFamily: "marquette-light, Helvetica, Arial, sans-serif"
                                }
                            }
                        });
                        if (attrs.type === "line") {
                            var xAxis1 = chartdata.xAxis[0];
                            if (!xAxis1.labels.formatter) {
                                xAxis1.labels.formatter = new Function(attrs.xaxislabel);
                            }
                            if (!xAxis1.labels.step) {
                                xAxis1.labels.step = attrs.xaxisstep;
                            }
                        }
                        if (chartdata.tooltip) {
                            if (typeof chartdata.tooltip.formatter === "string") {
                                chartdata.tooltip.formatter = new Function(chartdata.tooltip.formatter);
                            }
                        }
                        renderChart(chartsDefaults, chartdata);
                    }
                }, true);
            }
        };
    });
    function renderChart(chartsDefaults, chartdata, attrs) {
        var newSettings = {};
        $.extend(true, newSettings, chartsDefaults, chartdata);
        var chart = new Highcharts.Chart(newSettings);
    }
    AppServices.Services.factory("charts", function() {
        var lineChart, areaChart, paretoChart, pieChart, pieCompare, xaxis, seriesIndex;
        return {
            convertLineChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
                lineChart = chartTemplate;
                if (typeof chartData[0] === "undefined") {
                    chartData[0] = {};
                    chartData[0].datapoints = [];
                }
                var dataPoints = chartData[0].datapoints, dPLength = dataPoints.length, label;
                if (currentCompare === "YESTERDAY") {
                    seriesIndex = dataDescription.dataAttr.length;
                    label = "Yesterday ";
                } else if (currentCompare === "LAST_WEEK") {
                    seriesIndex = dataDescription.dataAttr.length;
                    label = "Last Week ";
                } else {
                    lineChart = chartTemplate;
                    seriesIndex = 0;
                    lineChart.series = [];
                    label = "";
                }
                xaxis = lineChart.xAxis[0];
                xaxis.categories = [];
                if (settings.xaxisformat) {
                    xaxis.labels.formatter = new Function(settings.xaxisformat);
                }
                if (settings.step) {
                    xaxis.labels.step = settings.step;
                }
                for (var i = 0; i < dPLength; i++) {
                    var dp = dataPoints[i];
                    xaxis.categories.push(dp.timestamp);
                }
                if (chartData.length > 1) {
                    for (var l = 0; l < chartData.length; l++) {
                        if (chartData[l].chartGroupName) {
                            dataPoints = chartData[l].datapoints;
                            lineChart.series[l] = {};
                            lineChart.series[l].data = [];
                            lineChart.series[l].name = chartData[l].chartGroupName;
                            lineChart.series[l].yAxis = 0;
                            lineChart.series[l].type = "line";
                            lineChart.series[l].color = dataDescription.colors[i];
                            lineChart.series[l].dashStyle = "solid";
                            lineChart.series[l].yAxis.title.text = dataDescription.yAxisLabels;
                            plotData(l, dPLength, dataPoints, dataDescription.detailDataAttr, true);
                        }
                    }
                } else {
                    var steadyCounter = 0;
                    for (var i = seriesIndex; i < dataDescription.dataAttr.length + (seriesIndex > 0 ? seriesIndex : 0); i++) {
                        var yAxisIndex = dataDescription.multiAxis ? steadyCounter : 0;
                        lineChart.series[i] = {};
                        lineChart.series[i].data = [];
                        lineChart.series[i].name = label + dataDescription.labels[steadyCounter];
                        lineChart.series[i].yAxis = yAxisIndex;
                        lineChart.series[i].type = "line";
                        lineChart.series[i].color = dataDescription.colors[i];
                        lineChart.series[i].dashStyle = "solid";
                        lineChart.yAxis[yAxisIndex].title.text = dataDescription.yAxisLabels[dataDescription.yAxisLabels > 1 ? steadyCounter : 0];
                        steadyCounter++;
                    }
                    plotData(seriesIndex, dPLength, dataPoints, dataDescription.dataAttr, false);
                }
                function plotData(counter, dPLength, dataPoints, dataAttrs, detailedView) {
                    for (var i = 0; i < dPLength; i++) {
                        var dp = dataPoints[i];
                        var localCounter = counter;
                        for (var j = 0; j < dataAttrs.length; j++) {
                            if (typeof dp === "undefined") {
                                lineChart.series[localCounter].data.push([ i, 0 ]);
                            } else {
                                lineChart.series[localCounter].data.push([ i, dp[dataAttrs[j]] ]);
                            }
                            if (!detailedView) {
                                localCounter++;
                            }
                        }
                    }
                }
                return lineChart;
            },
            convertAreaChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
                areaChart = angular.copy(areaChart);
                if (typeof chartData[0] === "undefined") {
                    chartData[0] = {};
                    chartData[0].datapoints = [];
                }
                var dataPoints = chartData[0].datapoints, dPLength = dataPoints.length, label;
                if (currentCompare === "YESTERDAY") {
                    seriesIndex = dataDescription.dataAttr.length;
                    label = "Yesterday ";
                } else if (currentCompare === "LAST_WEEK") {
                    seriesIndex = dataDescription.dataAttr.length;
                    label = "Last Week ";
                } else {
                    areaChart = chartTemplate;
                    seriesIndex = 0;
                    areaChart.series = [];
                    label = "";
                }
                xaxis = areaChart.xAxis[0];
                xaxis.categories = [];
                if (settings.xaxisformat) {
                    xaxis.labels.formatter = new Function(settings.xaxisformat);
                }
                if (settings.step) {
                    xaxis.labels.step = settings.step;
                }
                for (var i = 0; i < dPLength; i++) {
                    var dp = dataPoints[i];
                    xaxis.categories.push(dp.timestamp);
                }
                if (chartData.length > 1) {
                    for (var l = 0; l < chartData.length; l++) {
                        if (chartData[l].chartGroupName) {
                            dataPoints = chartData[l].datapoints;
                            areaChart.series[l] = {};
                            areaChart.series[l].data = [];
                            areaChart.series[l].fillColor = dataDescription.areaColors[l];
                            areaChart.series[l].name = chartData[l].chartGroupName;
                            areaChart.series[l].yAxis = 0;
                            areaChart.series[l].type = "area";
                            areaChart.series[l].pointInterval = 1;
                            areaChart.series[l].color = dataDescription.colors[l];
                            areaChart.series[l].dashStyle = "solid";
                            areaChart.series[l].yAxis.title.text = dataDescription.yAxisLabels;
                            plotData(l, dPLength, dataPoints, dataDescription.detailDataAttr, true);
                        }
                    }
                } else {
                    var steadyCounter = 0;
                    for (var i = seriesIndex; i < dataDescription.dataAttr.length + (seriesIndex > 0 ? seriesIndex : 0); i++) {
                        var yAxisIndex = dataDescription.multiAxis ? steadyCounter : 0;
                        areaChart.series[i] = {};
                        areaChart.series[i].data = [];
                        areaChart.series[i].fillColor = dataDescription.areaColors[i];
                        areaChart.series[i].name = label + dataDescription.labels[steadyCounter];
                        areaChart.series[i].yAxis = yAxisIndex;
                        areaChart.series[i].type = "area";
                        areaChart.series[i].pointInterval = 1;
                        areaChart.series[i].color = dataDescription.colors[i];
                        areaChart.series[i].dashStyle = "solid";
                        areaChart.yAxis[yAxisIndex].title.text = dataDescription.yAxisLabels[dataDescription.yAxisLabels > 1 ? steadyCounter : 0];
                        steadyCounter++;
                    }
                    plotData(seriesIndex, dPLength, dataPoints, dataDescription.dataAttr, false);
                }
                function plotData(counter, dPLength, dataPoints, dataAttrs, detailedView) {
                    for (var i = 0; i < dPLength; i++) {
                        var dp = dataPoints[i];
                        var localCounter = counter;
                        for (var j = 0; j < dataAttrs.length; j++) {
                            if (typeof dp === "undefined") {
                                areaChart.series[localCounter].data.push(0);
                            } else {
                                areaChart.series[localCounter].data.push(dp[dataAttrs[j]]);
                            }
                            if (!detailedView) {
                                localCounter++;
                            }
                        }
                    }
                }
                return areaChart;
            },
            convertParetoChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
                paretoChart = chartTemplate;
                if (typeof chartData === "undefined") {
                    chartData = [];
                }
                var label, cdLength = chartData.length, compare = false, allParetoOptions = [], stackedBar = false;
                seriesIndex = 0;
                function getPreviousData() {
                    for (var i = 0; i < chartTemplate.series[0].data.length; i++) {
                        allParetoOptions.push(chartTemplate.xAxis.categories[i]);
                    }
                }
                if (typeof dataDescription.dataAttr[1] === "object") {
                    stackedBar = true;
                }
                if (currentCompare === "YESTERDAY") {
                    label = "Yesterday ";
                    compare = true;
                    if (stackedBar) {
                        seriesIndex = dataDescription.dataAttr[1].length;
                    }
                    getPreviousData();
                } else if (currentCompare === "LAST_WEEK") {
                    label = "Last Week ";
                    compare = true;
                    if (stackedBar) {
                        seriesIndex = dataDescription.dataAttr[1].length;
                    }
                    seriesIndex = getPreviousData();
                } else {
                    compare = false;
                    label = "";
                    paretoChart.xAxis.categories = [];
                    paretoChart.series = [];
                    paretoChart.series[0] = {};
                    paretoChart.series[0].data = [];
                    paretoChart.legend.enabled = false;
                }
                paretoChart.plotOptions.series.borderColor = dataDescription.borderColor;
                if (compare && !stackedBar) {
                    paretoChart.series[1] = {};
                    paretoChart.series[1].data = [];
                    for (var i = 0; i < allParetoOptions.length; i++) {
                        paretoChart.series[1].data.push(0);
                    }
                    paretoChart.legend.enabled = true;
                }
                for (var i = 0; i < cdLength; i++) {
                    var bar = chartData[i];
                    if (!compare) {
                        paretoChart.xAxis.categories.push(bar[dataDescription.dataAttr[0]]);
                        if (typeof dataDescription.dataAttr[1] === "object") {
                            createStackedBar(dataDescription, paretoChart, paretoChart.series.length);
                        } else {
                            paretoChart.series[0].data.push(bar[dataDescription.dataAttr[1]]);
                            paretoChart.series[0].name = dataDescription.labels[0];
                            paretoChart.series[0].color = dataDescription.colors[0];
                        }
                    } else {
                        var newLabel = bar[dataDescription.dataAttr[0]], newValue = bar[dataDescription.dataAttr[1]], previousIndex = allParetoOptions.indexOf(newLabel);
                        if (previousIndex > -1) {
                            if (typeof dataDescription.dataAttr[1] === "object") {
                                createStackedBar(dataDescription, paretoChart, paretoChart.series.length);
                            } else {
                                paretoChart.series[1].data[previousIndex] = newValue;
                                paretoChart.series[1].name = label !== "" ? label + " " + dataDescription.labels[0] : dataDescription.labels[0];
                                paretoChart.series[1].color = dataDescription.colors[1];
                            }
                        } else {}
                    }
                }
                function createStackedBar(dataDescription, paretoChart, startingPoint) {
                    paretoChart.plotOptions = {
                        series: {
                            shadow: false,
                            borderColor: dataDescription.borderColor,
                            borderWidth: 1
                        },
                        column: {
                            stacking: "normal",
                            dataLabels: {
                                enabled: true,
                                color: Highcharts.theme && Highcharts.theme.dataLabelsColor || "white"
                            }
                        }
                    };
                    var start = dataDescription.dataAttr[1].length, steadyCounter = 0, stackName = label;
                    if (compare) {
                        paretoChart.legend.enabled = true;
                    }
                    for (var f = seriesIndex; f < start + seriesIndex; f++) {
                        if (!paretoChart.series[f]) {
                            paretoChart.series[f] = {
                                data: []
                            };
                        }
                        paretoChart.series[f].data.push(bar[dataDescription.dataAttr[1][steadyCounter]]);
                        paretoChart.series[f].name = label !== "" ? label + " " + dataDescription.labels[steadyCounter] : dataDescription.labels[steadyCounter];
                        paretoChart.series[f].color = dataDescription.colors[f];
                        paretoChart.series[f].stack = label;
                        steadyCounter++;
                    }
                }
                return paretoChart;
            },
            convertPieChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
                var label, cdLength = chartData.length, compare = false;
                pieChart = chartTemplate;
                if (currentCompare === "YESTERDAY") {
                    label = "Yesterday ";
                    compare = false;
                } else if (currentCompare === "LAST_WEEK") {
                    label = "Last Week ";
                    compare = false;
                } else {
                    compare = false;
                    pieChart.series[0].data = [];
                    if (pieChart.series[0].dataLabels) {
                        if (typeof pieChart.series[0].dataLabels.formatter === "string") {
                            pieChart.series[0].dataLabels.formatter = new Function(pieChart.series[0].dataLabels.formatter);
                        }
                    }
                }
                pieChart.plotOptions.pie.borderColor = dataDescription.borderColor;
                if (compare) {
                    pieChart.series[1].data = [];
                    if (pieChart.series[1].dataLabels) {
                        if (typeof pieChart.series[1].dataLabels.formatter === "string") {
                            pieChart.series[1].dataLabels.formatter = new Function(pieChart.series[1].dataLabels.formatter);
                        }
                    }
                }
                var tempArray = [];
                for (var i = 0; i < cdLength; i++) {
                    var pie = chartData[i];
                    tempArray.push({
                        name: pie[dataDescription.dataAttr[0]],
                        y: pie[dataDescription.dataAttr[1]],
                        color: ""
                    });
                }
                sortJsonArrayByProperty(tempArray, "name");
                for (var i = 0; i < tempArray.length; i++) {
                    tempArray[i].color = dataDescription.colors[i];
                }
                if (!compare) {
                    pieChart.series[0].data = tempArray;
                } else {
                    pieChart.series[1].data = tempArray;
                }
                return pieChart;
            }
        };
        function sortJsonArrayByProperty(objArray, prop, direction) {
            if (arguments.length < 2) throw new Error("sortJsonArrayByProp requires 2 arguments");
            var direct = arguments.length > 2 ? arguments[2] : 1;
            if (objArray && objArray.constructor === Array) {
                var propPath = prop.constructor === Array ? prop : prop.split(".");
                objArray.sort(function(a, b) {
                    for (var p in propPath) {
                        if (a[propPath[p]] && b[propPath[p]]) {
                            a = a[propPath[p]];
                            b = b[propPath[p]];
                        }
                    }
                    a = a.match(/^\d+$/) ? +a : a;
                    b = b.match(/^\d+$/) ? +b : b;
                    return a < b ? -1 * direct : a > b ? 1 * direct : 0;
                });
            }
        }
    });
    $(".sessions-bar").sparkline([ 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 1 ], {
        type: "bar",
        barColor: "#c5c5c5",
        width: "800px",
        height: 100,
        barWidth: 12,
        barSpacing: "1px"
    });
    "use strict";
    AppServices.Controllers.controller("DataCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        var init = function() {
            $scope.verb = "GET";
            $scope.display = "";
            $scope.queryBodyDetail = {};
            $scope.queryBodyDisplay = "none";
            $scope.queryLimitDisplay = "block";
            $scope.queryStringDisplay = "block";
            $scope.entitySelected = {};
            $scope.newCollection = {};
            $rootScope.queryCollection = {};
            $scope.data = {};
            $scope.data.queryPath = "";
            $scope.data.queryBody = '{ "name":"value" }';
            $scope.data.searchString = "";
            $scope.data.queryLimit = "";
        };
        var runQuery = function(verb) {
            $scope.loading = true;
            var queryPath = $scope.removeFirstSlash($scope.data.queryPath || "");
            var searchString = $scope.data.searchString || "";
            var queryLimit = $scope.data.queryLimit || "";
            var body = JSON.parse($scope.data.queryBody || "{}");
            if (verb == "POST" && $scope.validateJson(true)) {
                ug.runDataPOSTQuery(queryPath, body);
            } else if (verb == "PUT" && $scope.validateJson(true)) {
                ug.runDataPutQuery(queryPath, searchString, queryLimit, body);
            } else if (verb == "DELETE") {
                ug.runDataDeleteQuery(queryPath, searchString, queryLimit);
            } else {
                ug.runDataQuery(queryPath, searchString, queryLimit);
            }
        };
        $scope.$on("top-collections-received", function(event, collectionList) {
            $scope.loading = false;
            var ignoredCollections = [ "events" ];
            ignoredCollections.forEach(function(ignoredCollection) {
                collectionList.hasOwnProperty(ignoredCollection) && delete collectionList[ignoredCollection];
            });
            $scope.collectionList = collectionList;
            $scope.queryBoxesSelected = false;
            if (!$scope.queryPath) {
                $scope.loadCollection("/" + collectionList[Object.keys(collectionList).sort()[0]].name);
            }
            $scope.applyScope();
        });
        $scope.$on("error-running-query", function(event) {
            $scope.loading = false;
            runQuery("GET");
            $scope.applyScope();
        });
        $scope.$on("entity-deleted", function(event) {
            $scope.deleteLoading = false;
            $rootScope.$broadcast("alert", "success", "Entities deleted sucessfully");
            $scope.queryBoxesSelected = false;
            $scope.checkNextPrev();
            $scope.applyScope();
        });
        $scope.$on("entity-deleted-error", function(event) {
            $scope.deleteLoading = false;
            runQuery("GET");
            $scope.applyScope();
        });
        $scope.$on("collection-created", function() {
            $scope.newCollection.name = "";
        });
        $scope.$on("query-received", function(event, collection) {
            $scope.loading = false;
            $rootScope.queryCollection = collection;
            ug.getIndexes($scope.data.queryPath);
            $scope.setDisplayType();
            $scope.checkNextPrev();
            $scope.applyScope();
            $scope.queryBoxesSelected = false;
        });
        $scope.$on("indexes-received", function(event, indexes) {
            var fred = indexes;
        });
        $scope.$on("app-changed", function() {
            init();
        });
        $scope.setDisplayType = function() {
            $scope.display = "generic";
        };
        $scope.deleteEntitiesDialog = function(modalId) {
            $scope.deleteLoading = false;
            $scope.deleteEntities($rootScope.queryCollection, "entity-deleted", "error deleting entity");
            $scope.hideModal(modalId);
        };
        $scope.newCollectionDialog = function(modalId) {
            if ($scope.newCollection.name) {
                ug.createCollection($scope.newCollection.name);
                ug.getTopCollections();
                $rootScope.$broadcast("alert", "success", "Collection created successfully.");
                $scope.hideModal(modalId);
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a collection name.");
            }
        };
        $scope.addToPath = function(uuid) {
            $scope.data.queryPath = "/" + $rootScope.queryCollection._type + "/" + uuid;
        };
        $scope.removeFromPath = function() {
            $scope.data.queryPath = "/" + $rootScope.queryCollection._type;
        };
        $scope.isDeep = function(item) {
            return Object.prototype.toString.call(item) === "[object Object]";
        };
        $scope.loadCollection = function(type) {
            $scope.data.queryPath = "/" + type.substring(1, type.length);
            $scope.data.searchString = "";
            $scope.data.queryLimit = "";
            $scope.data.body = '{ "name":"value" }';
            $scope.selectGET();
            $scope.applyScope();
            $scope.run();
        };
        $scope.selectGET = function() {
            $scope.queryBodyDisplay = "none";
            $scope.queryLimitDisplay = "block";
            $scope.queryStringDisplay = "block";
            $scope.verb = "GET";
        };
        $scope.selectPOST = function() {
            $scope.queryBodyDisplay = "block";
            $scope.queryLimitDisplay = "none";
            $scope.queryStringDisplay = "none";
            $scope.verb = "POST";
        };
        $scope.selectPUT = function() {
            $scope.queryBodyDisplay = "block";
            $scope.queryLimitDisplay = "block";
            $scope.queryStringDisplay = "block";
            $scope.verb = "PUT";
        };
        $scope.selectDELETE = function() {
            $scope.queryBodyDisplay = "none";
            $scope.queryLimitDisplay = "block";
            $scope.queryStringDisplay = "block";
            $scope.verb = "DELETE";
        };
        $scope.validateJson = function(skipMessage) {
            var queryBody = $scope.data.queryBody;
            try {
                queryBody = JSON.parse(queryBody);
            } catch (e) {
                $rootScope.$broadcast("alert", "error", "JSON is not valid");
                return false;
            }
            queryBody = JSON.stringify(queryBody, null, 2);
            !skipMessage && $rootScope.$broadcast("alert", "success", "JSON is valid");
            $scope.data.queryBody = queryBody;
            return true;
        };
        $scope.saveEntity = function(entity) {
            if (!$scope.validateJson()) {
                return false;
            }
            var queryBody = entity._json;
            queryBody = JSON.parse(queryBody);
            $rootScope.selectedEntity.set();
            $rootScope.selectedEntity.set(queryBody);
            $rootScope.selectedEntity.set("type", entity._data.type);
            $rootScope.selectedEntity.set("uuid", entity._data.uuid);
            $rootScope.selectedEntity.save(function(err, data) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
                } else {
                    $rootScope.$broadcast("alert", "success", "entity saved");
                }
            });
        };
        $scope.run = function() {
            $rootScope.queryCollection = "";
            var verb = $scope.verb;
            runQuery(verb);
        };
        $scope.hasProperty = function(prop) {
            var retval = false;
            if (typeof $rootScope.queryCollection._list !== "undefined") {
                angular.forEach($rootScope.queryCollection._list, function(value, key) {
                    if (!retval) {
                        if (value._data[prop]) {
                            retval = true;
                        }
                    }
                });
            }
            return retval;
        };
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($rootScope.queryCollection.hasPreviousPage()) {
                $scope.previous_display = "default";
            }
            if ($rootScope.queryCollection.hasNextPage()) {
                $scope.next_display = "default";
            }
        };
        $scope.selectEntity = function(uuid, addToPath) {
            $rootScope.selectedEntity = $rootScope.queryCollection.getEntityByUUID(uuid);
            if (addToPath) {
                $scope.addToPath(uuid);
            } else {
                $scope.removeFromPath();
            }
        };
        $scope.getJSONView = function(entity) {
            var tempjson = entity.get();
            var queryBody = JSON.stringify(tempjson, null, 2);
            queryBody = JSON.parse(queryBody);
            delete queryBody.metadata;
            delete queryBody.uuid;
            delete queryBody.created;
            delete queryBody.modified;
            delete queryBody.type;
            $scope.queryBody = JSON.stringify(queryBody, null, 2);
        };
        $scope.getPrevious = function() {
            $rootScope.queryCollection.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of data");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $rootScope.queryCollection.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of data");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        init();
        $rootScope.queryCollection = $rootScope.queryCollection || {};
        $rootScope.selectedEntity = {};
        if ($rootScope.queryCollection && $rootScope.queryCollection._type) {
            $scope.loadCollection($rootScope.queryCollection._type);
            $scope.setDisplayType();
        }
        ug.getTopCollections();
        $scope.resetNextPrev();
    } ]);
    "use strict";
    AppServices.Controllers.controller("EntityCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        if (!$rootScope.selectedEntity) {
            $location.path("/data");
            return;
        }
        $scope.entityUUID = $rootScope.selectedEntity.get("uuid");
        $scope.entityType = $rootScope.selectedEntity.get("type");
        var tempjson = $rootScope.selectedEntity.get();
        var queryBody = JSON.stringify(tempjson, null, 2);
        queryBody = JSON.parse(queryBody);
        delete queryBody.metadata;
        delete queryBody.uuid;
        delete queryBody.created;
        delete queryBody.modified;
        delete queryBody.type;
        $scope.queryBody = JSON.stringify(queryBody, null, 2);
        $scope.validateJson = function() {
            var queryBody = $scope.queryBody;
            try {
                queryBody = JSON.parse(queryBody);
            } catch (e) {
                $rootScope.$broadcast("alert", "error", "JSON is not valid");
                return false;
            }
            queryBody = JSON.stringify(queryBody, null, 2);
            $rootScope.$broadcast("alert", "success", "JSON is valid");
            $scope.queryBody = queryBody;
            return true;
        };
        $scope.saveEntity = function() {
            if (!$scope.validateJson()) {
                return false;
            }
            var queryBody = $scope.queryBody;
            queryBody = JSON.parse(queryBody);
            $rootScope.selectedEntity.set();
            $rootScope.selectedEntity.set(queryBody);
            $rootScope.selectedEntity.set("type", $scope.entityType);
            $rootScope.selectedEntity.set("uuid", $scope.entityUUID);
            $rootScope.selectedEntity.save(function(err, data) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
                } else {
                    $rootScope.$broadcast("alert", "success", "entity saved");
                }
            });
        };
    } ]);
    "use strict";
    AppServices.Directives.directive("balloon", [ "$window", "$timeout", function($window, $timeout) {
        return {
            restrict: "ECA",
            scope: "=",
            template: "" + '<div class="baloon {{direction}}" ng-transclude>' + "</div>",
            replace: true,
            transclude: true,
            link: function linkFn(scope, lElement, attrs) {
                scope.direction = attrs.direction;
                var runScroll = true;
                var windowEl = angular.element($window);
                windowEl.on("scroll", function() {
                    if (runScroll) {
                        lElement.addClass("fade-out");
                        $timeout(function() {
                            lElement.addClass("hide");
                        }, 1e3);
                        runScroll = false;
                    }
                });
            }
        };
    } ]);
    "use strict";
    AppServices.Directives.directive("bsmodal", [ "$rootScope", function($rootScope) {
        return {
            restrict: "ECA",
            scope: {
                title: "@title",
                buttonid: "=buttonid",
                footertext: "=footertext",
                closelabel: "=closelabel"
            },
            transclude: true,
            templateUrl: "dialogs/modal.html",
            replace: true,
            link: function linkFn(scope, lElement, attrs, parentCtrl) {
                scope.title = attrs.title;
                scope.footertext = attrs.footertext;
                scope.closelabel = attrs.closelabel;
                scope.close = attrs.close;
                scope.extrabutton = attrs.extrabutton;
                scope.extrabuttonlabel = attrs.extrabuttonlabel;
                scope.buttonId = attrs.buttonid;
                scope.closeDelegate = function(attr) {
                    scope.$parent[attr](attrs.id, scope);
                };
                scope.extraDelegate = function(attr) {
                    if (scope.dialogForm.$valid) {
                        console.log(parentCtrl);
                        scope.$parent[attr](attrs.id);
                    } else {
                        $rootScope.$broadcast("alert", "error", "Please check your form input and resubmit.");
                    }
                };
            }
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("AlertCtrl", [ "$scope", "$rootScope", "$timeout", function($scope, $rootScope, $timeout) {
        $scope.alertDisplay = "none";
        $scope.alerts = [];
        $scope.$on("alert", function(event, type, message, permanent) {
            $scope.addAlert(type, message, permanent);
        });
        $scope.$on("clear-alerts", function(event, message) {
            $scope.alerts = [];
        });
        $scope.addAlert = function(type, message, permanent) {
            $scope.alertDisplay = "block";
            $scope.alerts.push({
                type: type,
                msg: message
            });
            $scope.applyScope();
            if (!permanent) {
                $timeout(function() {
                    $scope.alerts.shift();
                }, 5e3);
            }
        };
        $scope.closeAlert = function(index) {
            $scope.alerts.splice(index, 1);
        };
    } ]);
    "use strict";
    AppServices.Directives.directive("alerti", [ "$rootScope", "$timeout", function($rootScope, $timeout) {
        return {
            restrict: "ECA",
            scope: {
                type: "=type",
                closeable: "@closeable",
                index: "&index"
            },
            template: '<div class="alert" ng-class="type && \'alert-\' + type">' + '    <button ng-show="closeable" type="button" class="close" ng-click="closeAlert(index)">&times;</button>' + '    <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">&#128165;</i>' + '    <i ng-if="type === \'info\'" class="pictogram pull-left">&#8505;</i>' + '    <i ng-if="type === \'error\'" class="pictogram pull-left">&#9889;</i>' + '    <i ng-if="type === \'success\'" class="pictogram pull-left">&#128077;</i>' + "<div ng-transclude></div>" + "</div>",
            replace: true,
            transclude: true,
            link: function linkFn(scope, lElement, attrs) {
                $timeout(function() {
                    lElement.addClass("fade-out");
                }, 4e3);
                lElement.click(function() {
                    if (attrs.index) {
                        scope.$parent.closeAlert(attrs.index);
                    }
                });
                setTimeout(function() {
                    lElement.addClass("alert-animate");
                }, 10);
            }
        };
    } ]);
    "use strict";
    AppServices.Directives.directive("appswitcher", [ "$rootScope", function($rootScope) {
        return {
            restrict: "ECA",
            scope: "=",
            templateUrl: "global/appswitcher-template.html",
            replace: true,
            transclude: true,
            link: function linkFn(scope, lElement, attrs) {
                var classNameOpen = "open";
                $("ul.nav li.dropdownContainingSubmenu").hover(function() {
                    $(this).addClass(classNameOpen);
                }, function() {
                    $(this).removeClass(classNameOpen);
                });
                $("#globalNav > a").mouseover(globalNavDetail);
                $("#globalNavDetail").mouseover(globalNavDetail);
                $("#globalNavSubmenuContainer ul li").mouseover(function() {
                    $("#globalNavDetail > div").removeClass(classNameOpen);
                    $("#" + this.getAttribute("data-globalNavDetail")).addClass(classNameOpen);
                });
                function globalNavDetail() {
                    $("#globalNavDetail > div").removeClass(classNameOpen);
                    $("#globalNavDetailApiPlatform").addClass(classNameOpen);
                }
            }
        };
    } ]);
    "use strict";
    AppServices.Services.factory("help", function($rootScope, $http, $location, $analytics) {
        $rootScope.help = {};
        $rootScope.help.helpButtonStatus = "Enable Help";
        $rootScope.help.helpTooltipsEnabled = false;
        $rootScope.help.clicked = false;
        $rootScope.help.showHelpButtons = false;
        $rootScope.help.introjs_shouldLaunch = false;
        $rootScope.help.showTabsId = "invisible";
        $rootScope.help.showJsonId = "invisible";
        var tooltipStartTime;
        var helpStartTime;
        var introjs_step;
        var getHelpJson = function(path) {
            return $http.get("https://s3.amazonaws.com/sdk.apigee.com/portal_help" + path + "/helpJson.json");
        };
        var getHelpStatus = function(helpType) {
            var status;
            if (helpType == "tour") {
                status = localStorage.getItem("ftu_tour");
                localStorage.setItem("ftu_tour", "false");
            } else if (helpType == "tooltips") {
                status = localStorage.getItem("ftu_tooltips");
                localStorage.setItem("ftu_tooltips", "false");
            }
            return status;
        };
        $rootScope.help.sendTooltipGA = function(tooltipName) {
            $analytics.eventTrack("tooltip - " + $rootScope.currentPath, {
                category: "App Services",
                label: tooltipName
            });
        };
        $rootScope.help.toggleTooltips = function() {
            if ($rootScope.help.helpTooltipsEnabled == false) {
                $rootScope.help.helpButtonStatus = "Disable Help";
                $rootScope.help.helpTooltipsEnabled = true;
                $rootScope.$broadcast("tooltips-enabled");
                showHelpModal("tooltips");
            } else {
                $rootScope.help.helpButtonStatus = "Enable Help";
                $rootScope.help.helpTooltipsEnabled = false;
                $rootScope.$broadcast("tooltips-disabled");
            }
        };
        $rootScope.$on("users-received", function(event, users) {
            if (users._list.length > 0) {
                $rootScope.help.showTabsId = "intro-information-tabs";
                $rootScope.help.showJsonId = "intro-json-object";
            } else {
                $rootScope.help.showTabsId = "invisible";
                $rootScope.help.showJsonId = "invisible";
            }
        });
        $rootScope.$on("groups-received", function(event, groups) {
            if (groups._list.length > 0) {
                $rootScope.help.showTabsId = "intro-information-tabs";
                $rootScope.help.showJsonId = "intro-json-object";
            } else {
                $rootScope.help.showTabsId = "invisible";
                $rootScope.help.showJsonId = "invisible";
            }
        });
        $rootScope.$on("$routeChangeSuccess", function(event, current) {
            var path = current.$$route ? current.$$route.originalPath : null;
            if (path === "/org-overview" || path && path.indexOf("/performance") >= 0 || path === "/users" || path === "/groups" || path === "/roles" || path === "/data") {
                $rootScope.help.showHelpButtons = true;
                getHelpJson(path).success(function(json) {
                    var helpJson = json;
                    setHelpStrings(helpJson);
                    showHelpModal("tour");
                });
            } else {
                $rootScope.help.showHelpButtons = false;
            }
        });
        var showHelpModal = function(helpType) {
            var shouldHelp = location.search.indexOf("noHelp") <= 0;
            if (helpType == "tour" && !getHelpStatus(helpType)) {
                shouldHelp && $rootScope.showModal("introjs");
            } else if (helpType == "tooltips" && !getHelpStatus(helpType)) {
                shouldHelp && $rootScope.showModal("tooltips");
            }
        };
        var setHelpStrings = function(helpJson) {
            $rootScope.help.IntroOptions.steps = helpJson.introjs;
            angular.forEach(helpJson.tooltip, function(value, binding) {
                $rootScope[binding] = value;
            });
            $rootScope.help.tooltip = helpJson.tooltip;
            $rootScope.$broadcast("helpJsonLoaded");
        };
        $rootScope.help.IntroOptions = {
            steps: [],
            showStepNumbers: false,
            exitOnOverlayClick: true,
            exitOnEsc: true,
            nextLabel: "Next",
            prevLabel: "Back",
            skipLabel: "Exit",
            doneLabel: "Done"
        };
        $rootScope.help.introjs_StartEvent = function() {
            helpStartTime = Date.now();
            introjs_step = 1;
        };
        $rootScope.help.introjs_ExitEvent = function() {
            var introjs_time = Math.round((Date.now() - helpStartTime) / 1e3);
            $analytics.eventTrack("introjs timing - " + $rootScope.currentPath, {
                category: "App Services",
                label: introjs_time + "s"
            });
            $analytics.eventTrack("introjs exit - " + $rootScope.currentPath, {
                category: "App Services",
                label: "step" + introjs_step
            });
        };
        $rootScope.help.introjs_CompleteEvent = function() {
            switch ($rootScope.currentPath) {
              case "/performance/app-usage":
                introjs_PageTransitionEvent("/performance/errors-crashes");
                break;

              case "/performance/errors-crashes":
                introjs_PageTransitionEvent("/performance/api-perf");
                break;

              case "/users":
                introjs_PageTransitionEvent("/groups");
                break;

              case "/groups":
                introjs_PageTransitionEvent("/roles");
                break;
            }
        };
        var introjs_PageTransitionEvent = function(url) {
            $location.url(url);
            $rootScope.help.introjs_shouldLaunch = true;
            $rootScope.$apply();
        };
        $rootScope.help.introjs_ChangeEvent = function() {
            introjs_step++;
        };
    });
    "use strict";
    AppServices.Directives.directive("insecureBanner", [ "$rootScope", "ug", function($rootScope, ug) {
        return {
            restrict: "E",
            transclude: true,
            templateUrl: "global/insecure-banner.html",
            link: function linkFn(scope, lElement, attrs) {
                scope.securityWarning = false;
                scope.$on("roles-received", function(evt, roles) {
                    scope.securityWarning = false;
                    if (!roles || !roles._list) return;
                    roles._list.forEach(function(roleHolder) {
                        var role = roleHolder._data;
                        if (role.name.toUpperCase() === "GUEST") {
                            roleHolder.getPermissions(function(err, data) {
                                if (!err) {
                                    if (roleHolder.permissions) {
                                        roleHolder.permissions.forEach(function(permission) {
                                            if (permission.path.indexOf("/**") >= 0) {
                                                scope.securityWarning = true;
                                                scope.applyScope();
                                            }
                                        });
                                    }
                                }
                            });
                        }
                    });
                });
                var initialized = false;
                scope.$on("app-initialized", function() {
                    !initialized && ug.getRoles();
                    initialized = true;
                });
                scope.$on("app-changed", function() {
                    scope.securityWarning = false;
                    ug.getRoles();
                });
            }
        };
    } ]);
    "use strict";
    AppServices.Constants.constant("configuration", {
        ITEMS_URL: "global/temp.json"
    });
    "use strict";
    AppServices.Controllers.controller("PageCtrl", [ "ug", "help", "utility", "$scope", "$rootScope", "$location", "$routeParams", "$q", "$route", "$log", "$analytics", "$sce", function(ug, help, utility, $scope, $rootScope, $location, $routeParams, $q, $route, $log, $analytics, $sce) {
        var initScopeVariables = function() {
            var menuItems = Usergrid.options.menuItems;
            for (var i = 0; i < menuItems.length; i++) {
                menuItems[i].pic = $sce.trustAsHtml(menuItems[i].pic);
                if (menuItems[i].items) {
                    for (var j = 0; j < menuItems[i].items.length; j++) {
                        menuItems[i].items[j].pic = $sce.trustAsHtml(menuItems[i].items[j].pic);
                    }
                }
            }
            $scope.menuItems = Usergrid.options.menuItems;
            $scope.loadingText = "Loading...";
            $scope.use_sso = false;
            $scope.newApp = {
                name: ""
            };
            $scope.getPerm = "";
            $scope.postPerm = "";
            $scope.putPerm = "";
            $scope.deletePerm = "";
            $scope.usersTypeaheadValues = [];
            $scope.groupsTypeaheadValues = [];
            $scope.rolesTypeaheadValues = [];
            $rootScope.sdkActive = false;
            $rootScope.demoData = false;
            $scope.queryStringApplied = false;
            $rootScope.autoUpdateTimer = Usergrid.config ? Usergrid.config.autoUpdateTimer : 61;
            $rootScope.requiresDeveloperKey = Usergrid.config ? Usergrid.config.client.requiresDeveloperKey : false;
            $rootScope.loaded = $rootScope.activeUI = false;
            for (var key in Usergrid.regex) {
                $scope[key] = Usergrid.regex[key];
            }
            $scope.options = Usergrid.options;
            var getQuery = function() {
                var result = {}, queryString = location.search.slice(1), re = /([^&=]+)=([^&]*)/g, m;
                while (m = re.exec(queryString)) {
                    result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
                }
                return result;
            };
            $scope.queryString = getQuery();
        };
        initScopeVariables();
        $rootScope.urls = function() {
            var urls = ug.getUrls($scope.queryString);
            $scope.apiUrl = urls.apiUrl;
            $scope.use_sso = urls.use_sso;
            return urls;
        };
        $rootScope.gotoPage = function(path) {
            $location.path(path);
        };
        var notRegistration = function() {
            return "/forgot-password" !== $location.path() && "/register" !== $location.path();
        };
        var verifyUser = function() {
            if ($location.path().slice(0, "/login".length) !== "/login") {
                $rootScope.currentPath = $location.path();
            }
            if ($routeParams.access_token && $routeParams.admin_email && $routeParams.uuid) {
                ug.set("token", $routeParams.access_token);
                ug.set("email", $routeParams.admin_email);
                ug.set("uuid", $routeParams.uuid);
                $location.search("access_token", null);
                $location.search("admin_email", null);
                $location.search("uuid", null);
            }
            ug.checkAuthentication(true);
        };
        $scope.profile = function() {
            if ($scope.use_sso) {
                window.location = $rootScope.urls().PROFILE_URL + "?callback=" + encodeURIComponent($location.absUrl());
            } else {
                $location.path("/profile");
            }
        };
        $rootScope.showModal = function(id) {
            $("#" + id).modal("show");
        };
        $rootScope.hideModal = function(id) {
            $("#" + id).modal("hide");
        };
        $scope.deleteEntities = function(collection, successBroadcast, errorMessage) {
            collection.resetEntityPointer();
            var entitiesToDelete = [];
            while (collection.hasNextEntity()) {
                var entity = collection.getNextEntity();
                var checked = entity.checked;
                if (checked) {
                    entitiesToDelete.push(entity);
                }
            }
            var count = 0, success = false;
            for (var i = 0; i < entitiesToDelete.length; i++) {
                var entity = entitiesToDelete[i];
                collection.destroyEntity(entity, function(err) {
                    count++;
                    if (err) {
                        $rootScope.$broadcast("alert", "error", errorMessage);
                        $rootScope.$broadcast(successBroadcast + "-error", err);
                    } else {
                        success = true;
                    }
                    if (count === entitiesToDelete.length) {
                        success && $rootScope.$broadcast(successBroadcast);
                        $scope.applyScope();
                    }
                });
            }
        };
        $scope.selectAllEntities = function(list, that, varName, setValue) {
            varName = varName || "master";
            var val = that[varName];
            if (setValue == undefined) {
                setValue = true;
            }
            if (setValue) {
                that[varName] = val = !val;
            }
            list.forEach(function(entitiy) {
                entitiy.checked = val;
            });
        };
        $scope.createPermission = function(type, entity, path, permissions) {
            if (path.charAt(0) != "/") {
                path = "/" + path;
            }
            var ops = "";
            var s = "";
            if (permissions.getPerm) {
                ops = "get";
                s = ",";
            }
            if (permissions.postPerm) {
                ops = ops + s + "post";
                s = ",";
            }
            if (permissions.putPerm) {
                ops = ops + s + "put";
                s = ",";
            }
            if (permissions.deletePerm) {
                ops = ops + s + "delete";
                s = ",";
            }
            var permission = ops + ":" + path;
            return permission;
        };
        $scope.formatDate = function(date) {
            return new Date(date).toUTCString();
        };
        $scope.clearCheckbox = function(id) {
            if ($("#" + id).attr("checked")) {
                $("#" + id).click();
            }
        };
        $scope.removeFirstSlash = function(path) {
            return path.indexOf("/") === 0 ? path.substring(1, path.length) : path;
        };
        $scope.applyScope = function(cb) {
            cb = typeof cb === "function" ? cb : function() {};
            if (!this.$$phase) {
                return this.$apply(cb);
            } else {
                cb();
            }
        };
        $scope.valueSelected = function(list) {
            return list && list.some(function(item) {
                return item.checked;
            });
        };
        $scope.sendHelp = function(modalId) {
            ug.jsonpRaw("apigeeuihelpemail", "", {
                useremail: $rootScope.userEmail
            }).then(function() {
                $rootScope.$broadcast("alert", "success", "Email sent. Our team will be in touch with you shortly.");
            }, function() {
                $rootScope.$broadcast("alert", "error", "Problem Sending Email. Try sending an email to mobile@apigee.com.");
            });
            $scope.hideModal(modalId);
        };
        $scope.$on("users-typeahead-received", function(event, users) {
            $scope.usersTypeaheadValues = users;
            if (!$scope.$$phase) {
                $scope.$apply();
            }
        });
        $scope.$on("groups-typeahead-received", function(event, groups) {
            $scope.groupsTypeaheadValues = groups;
            if (!$scope.$$phase) {
                $scope.$apply();
            }
        });
        $scope.$on("roles-typeahead-received", function(event, roles) {
            $scope.rolesTypeaheadValues = roles;
            if (!$scope.$$phase) {
                $scope.$apply();
            }
        });
        $scope.$on("checkAuthentication-success", function() {
            sessionStorage.setItem("authenticateAttempts", 0);
            $scope.loaded = true;
            $rootScope.activeUI = true;
            $scope.applyScope();
            if (!$scope.queryStringApplied) {
                $scope.queryStringApplied = true;
                setTimeout(function() {
                    if ($scope.queryString.org) {
                        $rootScope.$broadcast("change-org", $scope.queryString.org);
                    }
                }, 1e3);
            }
            $rootScope.$broadcast("app-initialized");
        });
        $scope.$on("checkAuthentication-error", function(args, err, missingData, email) {
            $scope.loaded = true;
            if (err && !$scope.use_sso && notRegistration()) {
                ug.logout();
                $location.path("/login");
                $scope.applyScope();
            } else {
                if (missingData && notRegistration()) {
                    if (!email && $scope.use_sso) {
                        window.location = $rootScope.urls().LOGIN_URL + "?callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
                        return;
                    }
                    ug.reAuthenticate(email);
                }
            }
        });
        $scope.$on("reAuthenticate-success", function(args, err, data, user, organizations, applications) {
            sessionStorage.setItem("authenticateAttempts", 0);
            $rootScope.$broadcast("loginSuccesful", user, organizations, applications);
            $rootScope.$emit("loginSuccesful", user, organizations, applications);
            $rootScope.$broadcast("checkAuthentication-success");
            $scope.applyScope(function() {
                $scope.deferredLogin.resolve();
                $location.path("/org-overview");
            });
        });
        var authenticateAttempts = parseInt(sessionStorage.getItem("authenticateAttempts") || 0);
        $scope.$on("reAuthenticate-error", function() {
            if ($scope.use_sso) {
                if (authenticateAttempts++ > 5) {
                    $rootScope.$broadcast("alert", "error", "There is an issue with authentication. Please contact support.");
                    return;
                }
                console.error("Failed to login via sso " + authenticateAttempts);
                sessionStorage.setItem("authenticateAttempts", authenticateAttempts);
                window.location = $rootScope.urls().LOGIN_URL + "?callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
            } else {
                if (notRegistration()) {
                    ug.logout();
                    $location.path("/login");
                    $scope.applyScope();
                }
            }
        });
        $scope.$on("loginSuccessful", function() {
            $rootScope.activeUI = true;
        });
        $scope.$on("app-changed", function(args, oldVal, newVal, preventReload) {
            if (newVal !== oldVal && !preventReload) {
                $route.reload();
            }
        });
        $scope.$on("org-changed", function(args, oldOrg, newOrg) {
            ug.getApplications();
            $route.reload();
        });
        $scope.$on("app-settings-received", function(evt, data) {});
        $scope.$on("request-times-slow", function(evt, averageRequestTimes) {
            $rootScope.$broadcast("alert", "info", "We are experiencing performance issues on our server.  Please click Get Help for support if this continues.");
        });
        var lastPage = "";
        $scope.$on("$routeChangeSuccess", function() {
            verifyUser();
            $scope.showDemoBar = $location.path().slice(0, "/performance".length) === "/performance";
            if (!$scope.showDemoBar) {
                $rootScope.demoData = false;
            }
            setTimeout(function() {
                lastPage = "";
            }, 50);
            var path = window.location.pathname.replace("index-debug.html", "");
            lastPage === "" && $analytics.pageTrack((path + $location.path()).replace("//", "/"));
            lastPage = $location.path();
        });
        $scope.$on("applications-received", function(event, applications) {
            $scope.applications = applications;
            $scope.hasApplications = Object.keys(applications).length > 0;
        });
        ug.getAppSettings();
        $rootScope.startFirstTimeUser = function() {
            $rootScope.hideModal("introjs");
            $rootScope.help.introjs_StartEvent();
            $scope.startHelp();
        };
        $scope.$on("helpJsonLoaded", function() {
            if ($rootScope.help.introjs_shouldLaunch == true) {
                $rootScope.help.introjs_StartEvent();
                $scope.startHelp();
                $rootScope.help.introjs_shouldLaunch = false;
            }
        });
    } ]);
    "use strict";
    AppServices.Directives.directive("pageTitle", [ "$rootScope", "ug", function($rootScope, ug) {
        return {
            restrict: "E",
            transclude: true,
            templateUrl: "global/page-title.html",
            link: function linkFn(scope, lElement, attrs) {
                scope.title = attrs.title;
                scope.icon = attrs.icon;
                scope.showHelp = function() {
                    $("#need-help").modal("show");
                };
                scope.sendHelp = function() {
                    data.jsonp_raw("apigeeuihelpemail", "", {
                        useremail: $rootScope.userEmail
                    }).then(function() {
                        $rootScope.$broadcast("alert", "success", "Email sent. Our team will be in touch with you shortly.");
                    }, function() {
                        $rootScope.$broadcast("alert", "error", "Problem Sending Email. Try sending an email to mobile@apigee.com.");
                    });
                    $("#need-help").modal("hide");
                };
            }
        };
    } ]);
    "use strict";
    AppServices.Services.factory("ug", function(configuration, $rootScope, utility, $q, $http, $resource, $log, $analytics, $location) {
        var requestTimes = [], running = false, currentRequests = {};
        function reportError(data, config) {
            try {
                $analytics.eventTrack("error", {
                    category: "App Services",
                    label: data + ":" + config.url + ":" + (sessionStorage["apigee_uuid"] || "na")
                });
            } catch (e) {
                console.log(e);
            }
        }
        var getAccessToken = function() {
            return sessionStorage.getItem("accessToken");
        };
        return {
            get: function(prop, isObject) {
                return isObject ? this.client().getObject(prop) : this.client().get(prop);
            },
            set: function(prop, value) {
                this.client().set(prop, value);
            },
            getUrls: function(qs) {
                var host = $location.host();
                var BASE_URL = "";
                var DATA_URL = "";
                var use_sso = false;
                switch (true) {
                  case host === "appservices.apigee.com" && location.pathname.indexOf("/dit") >= 0:
                    BASE_URL = "https://accounts.jupiter.apigee.net";
                    DATA_URL = "https://apigee-internal-prod.jupiter.apigee.net";
                    use_sso = true;
                    break;

                  case host === "appservices.apigee.com" && location.pathname.indexOf("/mars") >= 0:
                    BASE_URL = "https://accounts.mars.apigee.net";
                    DATA_URL = "https://apigee-internal-prod.mars.apigee.net";
                    use_sso = true;
                    break;

                  case host === "appservices.apigee.com":
                    DATA_URL = Usergrid.overrideUrl;
                    break;

                  case host === "apigee.com":
                    BASE_URL = "https://accounts.apigee.com";
                    DATA_URL = "https://api.usergrid.com";
                    use_sso = true;
                    break;

                  case host === "usergrid.dev":
                    DATA_URL = "https://api.usergrid.com";
                    break;

                  default:
                    DATA_URL = Usergrid.overrideUrl;
                    break;
                }
                DATA_URL = qs.api_url || DATA_URL;
                DATA_URL = DATA_URL.lastIndexOf("/") === DATA_URL.length - 1 ? DATA_URL.substring(0, DATA_URL.length - 1) : DATA_URL;
                return {
                    DATA_URL: DATA_URL,
                    LOGIN_URL: BASE_URL + "/accounts/sign_in",
                    PROFILE_URL: BASE_URL + "/accounts/my_account",
                    LOGOUT_URL: BASE_URL + "/accounts/sign_out",
                    apiUrl: DATA_URL,
                    use_sso: use_sso
                };
            },
            orgLogin: function(username, password) {
                var self = this;
                this.client().set("email", username);
                this.client().set("token", null);
                this.client().orgLogin(username, password, function(err, data, user, organizations, applications) {
                    if (err) {
                        $rootScope.$broadcast("loginFailed", err, data);
                    } else {
                        self.initializeCurrentUser(function() {
                            $rootScope.$broadcast("loginSuccesful", user, organizations, applications);
                        });
                    }
                });
            },
            checkAuthentication: function(force) {
                var ug = this;
                var client = ug.client();
                var initialize = function() {
                    ug.initializeCurrentUser(function() {
                        $rootScope.userEmail = client.get("email");
                        $rootScope.organizations = client.getObject("organizations");
                        $rootScope.applications = client.getObject("applications");
                        $rootScope.currentOrg = client.get("orgName");
                        $rootScope.currentApp = client.get("appName");
                        var size = 0, key;
                        for (key in $rootScope.applications) {
                            if ($rootScope.applications.hasOwnProperty(key)) size++;
                        }
                        $rootScope.$broadcast("checkAuthentication-success", client.getObject("organizations"), client.getObject("applications"), client.get("orgName"), client.get("appName"), client.get("email"));
                    });
                }, isAuthenticated = function() {
                    var authenticated = client.get("token") !== null && client.get("organizations") !== null;
                    if (authenticated) {
                        initialize();
                    }
                    return authenticated;
                };
                if (!isAuthenticated() || force) {
                    if (!client.get("token")) {
                        return $rootScope.$broadcast("checkAuthentication-error", "no token", {}, client.get("email"));
                    }
                    this.client().reAuthenticateLite(function(err) {
                        var missingData = err || (!client.get("orgName") || !client.get("appName") || !client.getObject("organizations") || !client.getObject("applications"));
                        var email = client.get("email");
                        if (err || missingData) {
                            $rootScope.$broadcast("checkAuthentication-error", err, missingData, email);
                        } else {
                            initialize();
                        }
                    });
                }
            },
            reAuthenticate: function(email, eventOveride) {
                var ug = this;
                this.client().reAuthenticate(email, function(err, data, user, organizations, applications) {
                    if (!err) {
                        $rootScope.currentUser = user;
                    }
                    if (!err) {
                        $rootScope.userEmail = user.get("email");
                        $rootScope.organizations = organizations;
                        $rootScope.applications = applications;
                        $rootScope.currentOrg = ug.get("orgName");
                        $rootScope.currentApp = ug.get("appName");
                        $rootScope.currentUser = user._data;
                        $rootScope.currentUser.profileImg = utility.get_gravatar($rootScope.currentUser.email);
                    }
                    $rootScope.$broadcast((eventOveride || "reAuthenticate") + "-" + (err ? "error" : "success"), err, data, user, organizations, applications);
                });
            },
            logoutCallback: function() {
                $rootScope.$broadcast("userNotAuthenticated");
            },
            logout: function() {
                $rootScope.activeUI = false;
                $rootScope.userEmail = "user@apigee.com";
                $rootScope.organizations = {
                    noOrg: {
                        name: "No Orgs Found"
                    }
                };
                $rootScope.applications = {
                    noApp: {
                        name: "No Apps Found"
                    }
                };
                $rootScope.currentOrg = "No Org Found";
                $rootScope.currentApp = "No App Found";
                sessionStorage.setItem("accessToken", null);
                sessionStorage.setItem("userUUID", null);
                sessionStorage.setItem("userEmail", null);
                this.client().logout();
                this._client = null;
            },
            client: function() {
                var options = {
                    buildCurl: true,
                    logging: true
                };
                if (Usergrid.options && Usergrid.options.client) {
                    options.keys = Usergrid.options.client;
                }
                this._client = this._client || new Usergrid.Client(options, $rootScope.urls().DATA_URL);
                return this._client;
            },
            setClientProperty: function(key, value) {
                this.client().set(key, value);
            },
            getTopCollections: function() {
                var options = {
                    method: "GET",
                    endpoint: ""
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error getting collections");
                    } else {
                        var collections = data.entities[0].metadata.collections;
                        $rootScope.$broadcast("top-collections-received", collections);
                    }
                });
            },
            createCollection: function(collectionName) {
                var collections = {};
                collections[collectionName] = {};
                var metadata = {
                    metadata: {
                        collections: collections
                    }
                };
                var options = {
                    method: "PUT",
                    body: metadata,
                    endpoint: ""
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error creating collection");
                    } else {
                        $rootScope.$broadcast("collection-created", collections);
                    }
                });
            },
            getApplications: function() {
                this.client().getApplications(function(err, applications) {
                    if (err) {
                        applications && console.error(applications);
                    } else {
                        $rootScope.$broadcast("applications-received", applications);
                    }
                });
            },
            getAdministrators: function() {
                this.client().getAdministrators(function(err, administrators) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error getting administrators");
                    }
                    $rootScope.$broadcast("administrators-received", administrators);
                });
            },
            createApplication: function(appName) {
                this.client().createApplication(appName, function(err, applications) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error creating application");
                    } else {
                        $rootScope.$broadcast("applications-created", applications, appName);
                        $rootScope.$broadcast("applications-received", applications);
                    }
                });
            },
            createAdministrator: function(adminName) {
                this.client().createAdministrator(adminName, function(err, administrators) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error creating administrator");
                    }
                    $rootScope.$broadcast("administrators-received", administrators);
                });
            },
            getFeed: function() {
                var options = {
                    method: "GET",
                    endpoint: "management/organizations/" + this.client().get("orgName") + "/feed",
                    mQuery: true
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error getting feed");
                    } else {
                        var feedData = data.entities;
                        var feed = [];
                        var i = 0;
                        for (i = 0; i < feedData.length; i++) {
                            var date = new Date(feedData[i].created).toUTCString();
                            var title = feedData[i].title;
                            var n = title.indexOf(">");
                            title = title.substring(n + 1, title.length);
                            n = title.indexOf(">");
                            title = title.substring(n + 1, title.length);
                            if (feedData[i].actor) {
                                title = feedData[i].actor.displayName + " " + title;
                            }
                            feed.push({
                                date: date,
                                title: title
                            });
                        }
                        if (i === 0) {
                            feed.push({
                                date: "",
                                title: "No Activities found."
                            });
                        }
                        $rootScope.$broadcast("feed-received", feed);
                    }
                });
            },
            createGroup: function(path, title) {
                var options = {
                    path: path,
                    title: title
                };
                var self = this;
                this.groupsCollection.addEntity(options, function(err) {
                    if (err) {
                        $rootScope.$broadcast("groups-create-error", err);
                    } else {
                        $rootScope.$broadcast("groups-create-success", self.groupsCollection);
                        $rootScope.$broadcast("groups-received", self.groupsCollection);
                    }
                });
            },
            createRole: function(name, title) {
                var options = {
                    name: name,
                    title: title
                }, self = this;
                this.rolesCollection.addEntity(options, function(err) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error creating role");
                    } else {
                        $rootScope.$broadcast("roles-received", self.rolesCollection);
                    }
                });
            },
            createUser: function(username, name, email, password) {
                var options = {
                    username: username,
                    name: name,
                    email: email,
                    password: password
                };
                var self = this;
                this.usersCollection.addEntity(options, function(err, data) {
                    if (err) {
                        if (typeof data === "string") {
                            $rootScope.$broadcast("alert", "error", "error: " + data);
                        } else {
                            $rootScope.$broadcast("alert", "error", "error creating user. the email address might already exist.");
                        }
                    } else {
                        $rootScope.$broadcast("users-create-success", self.usersCollection);
                        $rootScope.$broadcast("users-received", self.usersCollection);
                    }
                });
            },
            getCollection: function(type, path, orderBy, query, limit) {
                var options = {
                    type: path,
                    qs: {}
                };
                if (query) {
                    options.qs["ql"] = query;
                }
                if (options.qs.ql) {
                    options.qs["ql"] = options.qs.ql + " order by " + (orderBy || "created desc");
                } else {
                    options.qs["ql"] = " order by " + (orderBy || "created desc");
                }
                if (limit) {
                    options.qs["limit"] = limit;
                }
                this.client().createCollection(options, function(err, collection, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error getting " + collection._type + ": " + data.error_description);
                    } else {
                        $rootScope.$broadcast(type + "-received", collection);
                    }
                    if (!$rootScope.$$phase) {
                        $rootScope.$apply();
                    }
                });
            },
            runDataQuery: function(queryPath, searchString, queryLimit) {
                this.getCollection("query", queryPath, null, searchString, queryLimit);
            },
            runDataPOSTQuery: function(queryPath, body) {
                var self = this;
                var options = {
                    method: "POST",
                    endpoint: queryPath,
                    body: body
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
                        $rootScope.$broadcast("error-running-query", data);
                    } else {
                        var queryPath = data.path;
                        self.getCollection("query", queryPath, null, "order by modified DESC", null);
                    }
                });
            },
            runDataPutQuery: function(queryPath, searchString, queryLimit, body) {
                var self = this;
                var options = {
                    method: "PUT",
                    endpoint: queryPath,
                    body: body
                };
                if (searchString) {
                    options.qs["ql"] = searchString;
                }
                if (queryLimit) {
                    options.qs["queryLimit"] = queryLimit;
                }
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
                    } else {
                        var queryPath = data.path;
                        self.getCollection("query", queryPath, null, "order by modified DESC", null);
                    }
                });
            },
            runDataDeleteQuery: function(queryPath, searchString, queryLimit) {
                var self = this;
                var options = {
                    method: "DELETE",
                    endpoint: queryPath
                };
                if (searchString) {
                    options.qs["ql"] = searchString;
                }
                if (queryLimit) {
                    options.qs["queryLimit"] = queryLimit;
                }
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
                    } else {
                        var queryPath = data.path;
                        self.getCollection("query", queryPath, null, "order by modified DESC", null);
                    }
                });
            },
            getUsers: function() {
                this.getCollection("users", "users", "username");
                var self = this;
                $rootScope.$on("users-received", function(evt, users) {
                    self.usersCollection = users;
                });
            },
            getGroups: function() {
                this.getCollection("groups", "groups", "title");
                var self = this;
                $rootScope.$on("groups-received", function(event, roles) {
                    self.groupsCollection = roles;
                });
            },
            getRoles: function() {
                this.getCollection("roles", "roles", "name");
                var self = this;
                $rootScope.$on("roles-received", function(event, roles) {
                    self.rolesCollection = roles;
                });
            },
            getNotifiers: function() {
                var query = "", limit = "100", self = this;
                this.getCollection("notifiers", "notifiers", "created", query, limit);
                $rootScope.$on("notifiers-received", function(event, notifiers) {
                    self.notifiersCollection = notifiers;
                });
            },
            getNotificationHistory: function(type) {
                var query = null;
                if (type) {
                    query = "select * where state = '" + type + "'";
                }
                this.getCollection("notifications", "notifications", "created desc", query);
                var self = this;
                $rootScope.$on("notifications-received", function(event, notifications) {
                    self.notificationCollection = notifications;
                });
            },
            getNotificationReceipts: function(uuid) {
                this.getCollection("receipts", "notifications/" + uuid + "/receipts");
                var self = this;
                $rootScope.$on("receipts-received", function(event, receipts) {
                    self.receiptsCollection = receipts;
                });
            },
            getIndexes: function(path) {
                var options = {
                    method: "GET",
                    endpoint: path.split("/").concat("indexes").filter(function(bit) {
                        return bit && bit.length;
                    }).join("/")
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "Problem getting indexes: " + data.error);
                    } else {
                        $rootScope.$broadcast("indexes-received", data.data);
                    }
                });
            },
            sendNotification: function(path, body) {
                var options = {
                    method: "POST",
                    endpoint: path,
                    body: body
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "Problem creating notification: " + data.error);
                    } else {
                        $rootScope.$broadcast("send-notification-complete");
                    }
                });
            },
            getRolesUsers: function(username) {
                var self = this;
                var options = {
                    type: "roles/users/" + username,
                    qs: {
                        ql: "order by username"
                    }
                };
                this.client().createCollection(options, function(err, users) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error getting users");
                    } else {
                        $rootScope.$broadcast("users-received", users);
                    }
                });
            },
            getTypeAheadData: function(type, searchString, searchBy, orderBy) {
                var self = this;
                var search = "";
                var qs = {
                    limit: 100
                };
                if (searchString) {
                    search = "select * where " + searchBy + " = '" + searchString + "'";
                }
                if (orderBy) {
                    search = search + " order by " + orderBy;
                }
                if (search) {
                    qs.ql = search;
                }
                var options = {
                    method: "GET",
                    endpoint: type,
                    qs: qs
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error getting " + type);
                    } else {
                        var entities = data.entities;
                        $rootScope.$broadcast(type + "-typeahead-received", entities);
                    }
                });
            },
            getUsersTypeAhead: function(searchString) {
                this.getTypeAheadData("users", searchString, "username", "username");
            },
            getGroupsTypeAhead: function(searchString) {
                this.getTypeAheadData("groups", searchString, "path", "path");
            },
            getRolesTypeAhead: function(searchString) {
                this.getTypeAheadData("roles", searchString, "name", "name");
            },
            getGroupsForUser: function(user) {
                var self = this;
                var options = {
                    type: "users/" + user + "/groups"
                };
                this.client().createCollection(options, function(err, groups) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error getting groups");
                    } else {
                        $rootScope.$broadcast("user-groups-received", groups);
                    }
                });
            },
            addUserToGroup: function(user, group) {
                var self = this;
                var options = {
                    type: "users/" + user + "/groups/" + group
                };
                this.client().createEntity(options, function(err, entity) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error adding user to group");
                    } else {
                        $rootScope.$broadcast("user-added-to-group-received");
                    }
                });
            },
            addUserToRole: function(user, role) {
                var options = {
                    method: "POST",
                    endpoint: "roles/" + role + "/users/" + user
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error adding user to role");
                    } else {
                        $rootScope.$broadcast("role-update-received");
                    }
                });
            },
            addGroupToRole: function(group, role) {
                var options = {
                    method: "POST",
                    endpoint: "roles/" + role + "/groups/" + group
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error adding group to role");
                    } else {
                        $rootScope.$broadcast("role-update-received");
                    }
                });
            },
            followUser: function(user) {
                var self = this;
                var username = $rootScope.selectedUser.get("uuid");
                var options = {
                    method: "POST",
                    endpoint: "users/" + username + "/following/users/" + user
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error following user");
                    } else {
                        $rootScope.$broadcast("follow-user-received");
                    }
                });
            },
            newPermission: function(permission, type, entity) {
                var options = {
                    method: "POST",
                    endpoint: type + "/" + entity + "/permissions",
                    body: {
                        permission: permission
                    }
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error adding permission");
                    } else {
                        $rootScope.$broadcast("permission-update-received");
                    }
                });
            },
            newUserPermission: function(permission, username) {
                this.newPermission(permission, "users", username);
            },
            newGroupPermission: function(permission, path) {
                this.newPermission(permission, "groups", path);
            },
            newRolePermission: function(permission, name) {
                this.newPermission(permission, "roles", name);
            },
            deletePermission: function(permission, type, entity) {
                var options = {
                    method: "DELETE",
                    endpoint: type + "/" + entity + "/permissions",
                    qs: {
                        permission: permission
                    }
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error deleting permission");
                    } else {
                        $rootScope.$broadcast("permission-update-received");
                    }
                });
            },
            deleteUserPermission: function(permission, user) {
                this.deletePermission(permission, "users", user);
            },
            deleteGroupPermission: function(permission, group) {
                this.deletePermission(permission, "groups", group);
            },
            deleteRolePermission: function(permission, rolename) {
                this.deletePermission(permission, "roles", rolename);
            },
            removeUserFromRole: function(user, role) {
                var options = {
                    method: "DELETE",
                    endpoint: "roles/" + role + "/users/" + user
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error removing user from role");
                    } else {
                        $rootScope.$broadcast("role-update-received");
                    }
                });
            },
            removeUserFromGroup: function(group, role) {
                var options = {
                    method: "DELETE",
                    endpoint: "roles/" + role + "/groups/" + group
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error removing role from the group");
                    } else {
                        $rootScope.$broadcast("role-update-received");
                    }
                });
            },
            createAndroidNotifier: function(name, APIkey) {
                var options = {
                    method: "POST",
                    endpoint: "notifiers",
                    body: {
                        apiKey: APIkey,
                        name: name,
                        provider: "google"
                    }
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        console.error(data);
                        $rootScope.$broadcast("alert", "error", "error creating notifier ");
                    } else {
                        $rootScope.$broadcast("alert", "success", "New notifier created successfully.");
                        $rootScope.$broadcast("notifier-update");
                    }
                });
            },
            createAppleNotifier: function(file, name, environment, certificatePassword) {
                var provider = "apple";
                var formData = new FormData();
                formData.append("p12Certificate", file);
                formData.append("name", name);
                formData.append("provider", provider);
                formData.append("environment", environment);
                formData.append("certificatePassword", certificatePassword || "");
                var options = {
                    method: "POST",
                    endpoint: "notifiers",
                    formData: formData
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        console.error(data);
                        $rootScope.$broadcast("alert", "error", data.error_description || "error creating notifier");
                    } else {
                        $rootScope.$broadcast("alert", "success", "New notifier created successfully.");
                        $rootScope.$broadcast("notifier-update");
                    }
                });
            },
            deleteNotifier: function(name) {
                var options = {
                    method: "DELETE",
                    endpoint: "notifiers/" + name
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error deleting notifier");
                    } else {
                        $rootScope.$broadcast("notifier-update");
                    }
                });
            },
            initializeCurrentUser: function(callback) {
                callback = callback || function() {};
                if ($rootScope.currentUser && !$rootScope.currentUser.reset) {
                    callback($rootScope.currentUser);
                    return $rootScope.$broadcast("current-user-initialized", "");
                }
                var options = {
                    method: "GET",
                    endpoint: "management/users/" + this.client().get("email"),
                    mQuery: true
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "Error getting user info");
                    } else {
                        $rootScope.currentUser = data.data;
                        $rootScope.currentUser.profileImg = utility.get_gravatar($rootScope.currentUser.email);
                        $rootScope.userEmail = $rootScope.currentUser.email;
                        callback($rootScope.currentUser);
                        $rootScope.$broadcast("current-user-initialized", $rootScope.currentUser);
                    }
                });
            },
            updateUser: function(user) {
                var body = $rootScope.currentUser;
                body.username = user.username;
                body.name = user.name;
                body.email = user.email;
                var options = {
                    method: "PUT",
                    endpoint: "management/users/" + user.uuid + "/",
                    mQuery: true,
                    body: body
                };
                var self = this;
                this.client().request(options, function(err, data) {
                    self.client().set("email", user.email);
                    self.client().set("username", user.username);
                    if (err) {
                        return $rootScope.$broadcast("user-update-error", data);
                    }
                    $rootScope.currentUser.reset = true;
                    self.initializeCurrentUser(function() {
                        $rootScope.$broadcast("user-update-success", $rootScope.currentUser);
                    });
                });
            },
            resetUserPassword: function(user) {
                var pwdata = {};
                pwdata.oldpassword = user.oldPassword;
                pwdata.newpassword = user.newPassword;
                pwdata.username = user.username;
                var options = {
                    method: "PUT",
                    endpoint: "users/" + pwdata.uuid + "/",
                    body: pwdata
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        return $rootScope.$broadcast("alert", "error", "Error resetting password");
                    }
                    $rootScope.currentUser.oldPassword = "";
                    $rootScope.currentUser.newPassword = "";
                    $rootScope.$broadcast("user-reset-password-success", $rootScope.currentUser);
                });
            },
            getOrgCredentials: function() {
                var options = {
                    method: "GET",
                    endpoint: "management/organizations/" + this.client().get("orgName") + "/credentials",
                    mQuery: true
                };
                this.client().request(options, function(err, data) {
                    if (err && data.credentials) {
                        $rootScope.$broadcast("alert", "error", "Error getting credentials");
                    } else {
                        $rootScope.$broadcast("org-creds-updated", data.credentials);
                    }
                });
            },
            regenerateOrgCredentials: function() {
                var self = this;
                var options = {
                    method: "POST",
                    endpoint: "management/organizations/" + this.client().get("orgName") + "/credentials",
                    mQuery: true
                };
                this.client().request(options, function(err, data) {
                    if (err && data.credentials) {
                        $rootScope.$broadcast("alert", "error", "Error regenerating credentials");
                    } else {
                        $rootScope.$broadcast("alert", "success", "Regeneration of credentials complete.");
                        $rootScope.$broadcast("org-creds-updated", data.credentials);
                    }
                });
            },
            getAppCredentials: function() {
                var options = {
                    method: "GET",
                    endpoint: "credentials"
                };
                this.client().request(options, function(err, data) {
                    if (err && data.credentials) {
                        $rootScope.$broadcast("alert", "error", "Error getting credentials");
                    } else {
                        $rootScope.$broadcast("app-creds-updated", data.credentials);
                    }
                });
            },
            regenerateAppCredentials: function() {
                var self = this;
                var options = {
                    method: "POST",
                    endpoint: "credentials"
                };
                this.client().request(options, function(err, data) {
                    if (err && data.credentials) {
                        $rootScope.$broadcast("alert", "error", "Error regenerating credentials");
                    } else {
                        $rootScope.$broadcast("alert", "success", "Regeneration of credentials complete.");
                        $rootScope.$broadcast("app-creds-updated", data.credentials);
                    }
                });
            },
            signUpUser: function(orgName, userName, name, email, password) {
                var formData = {
                    organization: orgName,
                    username: userName,
                    name: name,
                    email: email,
                    password: password
                };
                var options = {
                    method: "POST",
                    endpoint: "management/organizations",
                    body: formData,
                    mQuery: true
                };
                var client = this.client();
                client.request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("register-error", data);
                    } else {
                        $rootScope.$broadcast("register-success", data);
                    }
                });
            },
            resendActivationLink: function(id) {
                var options = {
                    method: "GET",
                    endpoint: "management/users/" + id + "/reactivate",
                    mQuery: true
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("resend-activate-error", data);
                    } else {
                        $rootScope.$broadcast("resend-activate-success", data);
                    }
                });
            },
            getAppSettings: function() {
                $rootScope.$broadcast("app-settings-received", {});
            },
            getActivities: function() {
                this.client().request({
                    method: "GET",
                    endpoint: "activities",
                    qs: {
                        limit: 200
                    }
                }, function(err, data) {
                    if (err) return $rootScope.$broadcast("app-activities-error", data);
                    var entities = data.entities;
                    entities.forEach(function(entity) {
                        if (!entity.actor.picture) {
                            entity.actor.picture = window.location.protocol + "//" + window.location.host + window.location.pathname + "img/user_profile.png";
                        } else {
                            entity.actor.picture = entity.actor.picture.replace(/^http:\/\/www.gravatar/i, "https://secure.gravatar");
                            if (~entity.actor.picture.indexOf("http")) {
                                entity.actor.picture = entity.actor.picture;
                            } else {
                                entity.actor.picture = "https://apigee.com/usergrid/img/user_profile.png";
                            }
                        }
                    });
                    $rootScope.$broadcast("app-activities-received", data.entities);
                });
            },
            getEntityActivities: function(entity, isFeed) {
                var route = isFeed ? "feed" : "activities";
                var endpoint = entity.get("type") + "/" + entity.get("uuid") + "/" + route;
                var options = {
                    method: "GET",
                    endpoint: endpoint,
                    qs: {
                        limit: 200
                    }
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast(entity.get("type") + "-" + route + "-error", data);
                    }
                    data.entities.forEach(function(entityInstance) {
                        entityInstance.createdDate = new Date(entityInstance.created).toUTCString();
                    });
                    $rootScope.$broadcast(entity.get("type") + "-" + route + "-received", data.entities);
                });
            },
            addUserActivity: function(user, content) {
                var options = {
                    actor: {
                        displayName: user.get("username"),
                        uuid: user.get("uuid"),
                        username: user.get("username")
                    },
                    verb: "post",
                    content: content
                };
                this.client().createUserActivity(user.get("username"), options, function(err, activity) {
                    if (err) {
                        $rootScope.$broadcast("user-activity-add-error", err);
                    } else {
                        $rootScope.$broadcast("user-activity-add-success", activity);
                    }
                });
            },
            runShellQuery: function(method, path, payload) {
                var path = path.replace(/^\//, "");
                var options = {
                    method: method,
                    endpoint: path
                };
                if (payload) {
                    options["body"] = payload;
                }
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("shell-error", data);
                    } else {
                        $rootScope.$broadcast("shell-success", data);
                    }
                });
            },
            addOrganization: function(user, orgName) {
                var options = {
                    method: "POST",
                    endpoint: "management/users/" + user.uuid + "/organizations",
                    body: {
                        organization: orgName
                    },
                    mQuery: true
                }, client = this.client(), self = this;
                client.request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("user-add-org-error", data);
                    } else {
                        $rootScope.$broadcast("user-add-org-success", $rootScope.organizations);
                    }
                });
            },
            leaveOrganization: function(user, org) {
                var options = {
                    method: "DELETE",
                    endpoint: "management/users/" + user.uuid + "/organizations/" + org.uuid,
                    mQuery: true
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("user-leave-org-error", data);
                    } else {
                        delete $rootScope.organizations[org.name];
                        $rootScope.$broadcast("user-leave-org-success", $rootScope.organizations);
                    }
                });
            },
            httpGet: function(id, url) {
                var items, deferred;
                deferred = $q.defer();
                $http.get(url || configuration.ITEMS_URL).success(function(data, status, headers, config) {
                    var result;
                    if (id) {
                        angular.forEach(data, function(obj, index) {
                            if (obj.id === id) {
                                result = obj;
                            }
                        });
                    } else {
                        result = data;
                    }
                    deferred.resolve(result);
                }).error(function(data, status, headers, config) {
                    $log.error(data, status, headers, config);
                    reportError(data, config);
                    deferred.reject(data);
                });
                return deferred.promise;
            },
            jsonp: function(objectType, criteriaId, params, successCallback) {
                if (!params) {
                    params = {};
                }
                params.demoApp = $rootScope.demoData;
                params.access_token = getAccessToken();
                params.callback = "JSON_CALLBACK";
                var uri = $rootScope.urls().DATA_URL + "/" + $rootScope.currentOrg + "/" + $rootScope.currentApp + "/apm/" + objectType + "/" + criteriaId;
                return this.jsonpRaw(objectType, criteriaId, params, uri, successCallback);
            },
            jsonpSimple: function(objectType, appId, params) {
                var uri = $rootScope.urls().DATA_URL + "/" + $rootScope.currentOrg + "/" + $rootScope.currentApp + "/apm/" + objectType + "/" + appId;
                return this.jsonpRaw(objectType, appId, params, uri);
            },
            calculateAverageRequestTimes: function() {
                if (!running) {
                    var self = this;
                    running = true;
                    setTimeout(function() {
                        running = false;
                        var length = requestTimes.length < 10 ? requestTimes.length : 10;
                        var sum = requestTimes.slice(0, length).reduce(function(a, b) {
                            return a + b;
                        });
                        var avg = sum / length;
                        self.averageRequestTimes = avg / 1e3;
                        if (self.averageRequestTimes > 5) {
                            $rootScope.$broadcast("request-times-slow", self.averageRequestTimes);
                        }
                    }, 3e3);
                }
            },
            jsonpRaw: function(objectType, appId, params, uri, successCallback) {
                if (typeof successCallback !== "function") {
                    successCallback = null;
                }
                uri = uri || $rootScope.urls().DATA_URL + "/" + $rootScope.currentOrg + "/" + $rootScope.currentApp + "/" + objectType;
                if (!params) {
                    params = {};
                }
                var start = new Date().getTime(), self = this;
                params.access_token = getAccessToken();
                params.callback = "JSON_CALLBACK";
                var deferred = $q.defer();
                var diff = function() {
                    currentRequests[uri]--;
                    requestTimes.splice(0, 0, new Date().getTime() - start);
                    self.calculateAverageRequestTimes();
                };
                successCallback && $rootScope.$broadcast("ajax_loading", objectType);
                var reqCount = currentRequests[uri] || 0;
                if (self.averageRequestTimes > 5 && reqCount > 1) {
                    setTimeout(function() {
                        deferred.reject(new Error("query in progress"));
                    }, 50);
                    return deferred;
                }
                currentRequests[uri] = (currentRequests[uri] || 0) + 1;
                $http.jsonp(uri, {
                    params: params
                }).success(function(data, status, headers, config) {
                    diff();
                    if (successCallback) {
                        successCallback(data, status, headers, config);
                        $rootScope.$broadcast("ajax_finished", objectType);
                    }
                    deferred.resolve(data);
                }).error(function(data, status, headers, config) {
                    diff();
                    $log.error("ERROR: Could not get jsonp data. " + uri);
                    reportError(data, config);
                    deferred.reject(data);
                });
                return deferred.promise;
            },
            resource: function(params, isArray) {
                return $resource($rootScope.urls().DATA_URL + "/:orgname/:appname/:username/:endpoint", {}, {
                    get: {
                        method: "JSONP",
                        isArray: isArray,
                        params: params
                    },
                    login: {
                        method: "GET",
                        url: $rootScope.urls().DATA_URL + "/management/token",
                        isArray: false,
                        params: params
                    },
                    save: {
                        url: $rootScope.urls().DATA_URL + "/" + params.orgname + "/" + params.appname,
                        method: "PUT",
                        isArray: false,
                        params: params
                    }
                });
            },
            httpPost: function(url, callback, payload, headers) {
                var accessToken = getAccessToken();
                if (payload) {
                    payload.access_token = accessToken;
                } else {
                    payload = {
                        access_token: accessToken
                    };
                }
                if (!headers) {
                    headers = {
                        Bearer: accessToken
                    };
                }
                $http({
                    method: "POST",
                    url: url,
                    data: payload,
                    headers: headers
                }).success(function(data, status, headers, config) {
                    callback(data);
                }).error(function(data, status, headers, config) {
                    reportError(data, config);
                    callback(data);
                });
            }
        };
    });
    "use strict";
    AppServices.Directives.directive("ngFocus", [ "$parse", function($parse) {
        return function(scope, element, attr) {
            var fn = $parse(attr["ngFocus"]);
            element.bind("focus", function(event) {
                scope.$apply(function() {
                    fn(scope, {
                        $event: event
                    });
                });
            });
        };
    } ]);
    AppServices.Directives.directive("ngBlur", [ "$parse", function($parse) {
        return function(scope, element, attr) {
            var fn = $parse(attr["ngBlur"]);
            element.bind("blur", function(event) {
                scope.$apply(function() {
                    fn(scope, {
                        $event: event
                    });
                });
            });
        };
    } ]);
    "use strict";
    AppServices.Services.factory("utility", function(configuration, $q, $http, $resource) {
        return {
            keys: function(o) {
                var a = [];
                for (var propertyName in o) {
                    a.push(propertyName);
                }
                return a;
            },
            get_gravatar: function(email, size) {
                try {
                    var size = size || 50;
                    if (email.length) {
                        return "https://secure.gravatar.com/avatar/" + MD5(email) + "?s=" + size;
                    } else {
                        return "https://apigee.com/usergrid/img/user_profile.png";
                    }
                } catch (e) {
                    return "https://apigee.com/usergrid/img/user_profile.png";
                }
            },
            get_qs_params: function() {
                var queryParams = {};
                if (window.location.search) {
                    var params = window.location.search.slice(1).split("&");
                    for (var i = 0; i < params.length; i++) {
                        var tmp = params[i].split("=");
                        queryParams[tmp[0]] = unescape(tmp[1]);
                    }
                }
                return queryParams;
            },
            safeApply: function(fn) {
                var phase = this.$root.$$phase;
                if (phase == "$apply" || phase == "$digest") {
                    if (fn && typeof fn === "function") {
                        fn();
                    }
                } else {
                    this.$apply(fn);
                }
            }
        };
    });
    "use strict";
    AppServices.Directives.directive("ugValidate", [ "$rootScope", function($rootScope) {
        return {
            scope: true,
            restrict: "A",
            require: "ng-model",
            replace: true,
            link: function linkFn(scope, element, attrs, ctrl) {
                var validate = function() {
                    var id = element.attr("id");
                    var validator = id + "-validator";
                    var title = element.attr("title");
                    title = title && title.length ? title : "Please enter data";
                    $("#" + validator).remove();
                    if (!ctrl.$valid) {
                        var validatorElem = '<div id="' + validator + '"><span  class="validator-error-message">' + title + "</span></div>";
                        $("#" + id).after(validatorElem);
                        element.addClass("has-error");
                    } else {
                        element.removeClass("has-error");
                        $("#" + validator).remove();
                    }
                };
                var firing = false;
                element.bind("blur", function(evt) {
                    validate(scope, element, attrs, ctrl);
                }).bind("input", function(evt) {
                    if (firing) {
                        return;
                    }
                    firing = true;
                    setTimeout(function() {
                        validate(scope, element, attrs, ctrl);
                        firing = false;
                    }, 500);
                });
            }
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("GroupsActivitiesCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.activitiesSelected = "active";
        if (!$rootScope.selectedGroup) {
            $location.path("/groups");
            return;
        } else {
            $rootScope.selectedGroup.activities = [];
            $rootScope.selectedGroup.getActivities(function(err, data) {
                if (err) {} else {
                    if (!$rootScope.$$phase) {
                        $rootScope.$apply();
                    }
                }
            });
        }
    } ]);
    "use strict";
    AppServices.Controllers.controller("GroupsCtrl", [ "ug", "$scope", "$rootScope", "$location", "$route", function(ug, $scope, $rootScope, $location, $route) {
        $scope.groupsCollection = {};
        $rootScope.selectedGroup = {};
        $scope.previous_display = "none";
        $scope.next_display = "none";
        $scope.hasGroups = false;
        $scope.newGroup = {
            path: "",
            title: ""
        };
        ug.getGroups();
        $scope.currentGroupsPage = {};
        $scope.selectGroupPage = function(route) {
            $scope.currentGroupsPage.template = $route.routes[route].templateUrl;
            $scope.currentGroupsPage.route = route;
        };
        $scope.newGroupDialog = function(modalId, form) {
            if ($scope.newGroup.path && $scope.newGroup.title) {
                ug.createGroup($scope.removeFirstSlash($scope.newGroup.path), $scope.newGroup.title);
                $scope.hideModal(modalId);
                $scope.newGroup = {
                    path: "",
                    title: ""
                };
            } else {
                $rootScope.$broadcast("alert", "error", "Missing required information.");
            }
        };
        $scope.deleteGroupsDialog = function(modalId) {
            $scope.deleteEntities($scope.groupsCollection, "group-deleted", "error deleting group");
            $scope.hideModal(modalId);
            $scope.newGroup = {
                path: "",
                title: ""
            };
        };
        $scope.$on("group-deleted", function() {
            $rootScope.$broadcast("alert", "success", "Group deleted successfully.");
        });
        $scope.$on("group-deleted-error", function() {
            ug.getGroups();
        });
        $scope.$on("groups-create-success", function() {
            $rootScope.$broadcast("alert", "success", "Group created successfully.");
        });
        $scope.$on("groups-create-error", function() {
            $rootScope.$broadcast("alert", "error", "Error creating group. Make sure you don't have spaces in the path.");
        });
        $scope.$on("groups-received", function(event, groups) {
            $scope.groupBoxesSelected = false;
            $scope.groupsCollection = groups;
            $scope.newGroup.path = "";
            $scope.newGroup.title = "";
            if (groups._list.length > 0 && (!$rootScope.selectedGroup._data || !groups._list.some(function(group) {
                return $rootScope.selectedGroup._data.uuid === group._data.uuid;
            }))) {
                $scope.selectGroup(groups._list[0]._data.uuid);
            }
            $scope.hasGroups = groups._list.length > 0;
            $scope.received = true;
            $scope.checkNextPrev();
            $scope.applyScope();
        });
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.groupsCollection.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($scope.groupsCollection.hasNextPage()) {
                $scope.next_display = "block";
            }
        };
        $scope.selectGroup = function(uuid) {
            $rootScope.selectedGroup = $scope.groupsCollection.getEntityByUUID(uuid);
            $scope.currentGroupsPage.template = "groups/groups-details.html";
            $scope.currentGroupsPage.route = "/groups/details";
            $rootScope.$broadcast("group-selection-changed", $rootScope.selectedGroup);
        };
        $scope.getPrevious = function() {
            $scope.groupsCollection.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of groups");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $scope.groupsCollection.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of groups");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.$on("group-deleted", function(event) {
            $route.reload();
            $scope.master = "";
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("GroupsDetailsCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        var selectedGroup = $rootScope.selectedGroup.clone();
        $scope.detailsSelected = "active";
        $scope.json = selectedGroup._json || selectedGroup._data.stringifyJSON();
        $scope.group = selectedGroup._data;
        $scope.group.path = $scope.group.path.indexOf("/") != 0 ? "/" + $scope.group.path : $scope.group.path;
        $scope.group.title = $scope.group.title;
        if (!$rootScope.selectedGroup) {
            $location.path("/groups");
            return;
        }
        $scope.$on("group-selection-changed", function(evt, selectedGroup) {
            $scope.group.path = selectedGroup._data.path.indexOf("/") != 0 ? "/" + selectedGroup._data.path : selectedGroup._data.path;
            $scope.group.title = selectedGroup._data.title;
            $scope.detailsSelected = "active";
            $scope.json = selectedGroup._json || selectedGroup._data.stringifyJSON();
        });
        $rootScope.saveSelectedGroup = function() {
            $rootScope.selectedGroup._data.title = $scope.group.title;
            $rootScope.selectedGroup._data.path = $scope.removeFirstSlash($scope.group.path);
            $rootScope.selectedGroup.save(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error saving group");
                } else {
                    $rootScope.$broadcast("alert", "success", "group saved");
                }
            });
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("GroupsMembersCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.membersSelected = "active";
        $scope.previous_display = "none";
        $scope.next_display = "none";
        $scope.user = "";
        $scope.master = "";
        $scope.hasMembers = false;
        ug.getUsersTypeAhead();
        $scope.usersTypeaheadValues = [];
        $scope.$on("users-typeahead-received", function(event, users) {
            $scope.usersTypeaheadValues = users;
            $scope.applyScope();
        });
        $scope.addGroupToUserDialog = function(modalId) {
            if ($scope.user) {
                var path = $rootScope.selectedGroup.get("path");
                ug.addUserToGroup($scope.user.uuid, path);
                $scope.user = "";
                $scope.hideModal(modalId);
            } else {
                $rootScope.$broadcast("alert", "error", "Please select a user.");
            }
        };
        $scope.removeUsersFromGroupDialog = function(modalId) {
            $scope.deleteEntities($scope.groupsCollection.users, "group-update-received", "Error removing user from group");
            $scope.hideModal(modalId);
        };
        $scope.get = function() {
            if (!$rootScope.selectedGroup.get) {
                return;
            }
            var options = {
                type: "groups/" + $rootScope.selectedGroup.get("path") + "/users"
            };
            $scope.groupsCollection.addCollection("users", options, function(err) {
                $scope.groupMembersSelected = false;
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting users for group");
                } else {
                    $scope.hasMembers = $scope.groupsCollection.users._list.length > 0;
                    $scope.checkNextPrev();
                    $scope.applyScope();
                }
            });
        };
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.groupsCollection.users.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($scope.groupsCollection.users.hasNextPage()) {
                $scope.next_display = "block";
            }
        };
        if (!$rootScope.selectedGroup) {
            $location.path("/groups");
            return;
        } else {
            $scope.get();
        }
        $scope.getPrevious = function() {
            $scope.groupsCollection.users.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of users");
                }
                $scope.checkNextPrev();
                if (!$rootScope.$$phase) {
                    $rootScope.$apply();
                }
            });
        };
        $scope.getNext = function() {
            $scope.groupsCollection.users.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of users");
                }
                $scope.checkNextPrev();
                if (!$rootScope.$$phase) {
                    $rootScope.$apply();
                }
            });
        };
        $scope.$on("group-update-received", function(event) {
            $scope.get();
        });
        $scope.$on("user-added-to-group-received", function(event) {
            $scope.get();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("GroupsRolesCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.rolesSelected = "active";
        $scope.roles_previous_display = "none";
        $scope.roles_next_display = "none";
        $scope.name = "";
        $scope.master = "";
        $scope.hasRoles = false;
        $scope.hasPermissions = false;
        $scope.permissions = {};
        $scope.addGroupToRoleDialog = function(modalId) {
            if ($scope.name) {
                var path = $rootScope.selectedGroup.get("path");
                ug.addGroupToRole(path, $scope.name);
                $scope.hideModal(modalId);
                $scope.name = "";
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a role name.");
            }
        };
        $scope.leaveRoleDialog = function(modalId) {
            var path = $rootScope.selectedGroup.get("path");
            var roles = $scope.groupsCollection.roles._list;
            for (var i = 0; i < roles.length; i++) {
                if (roles[i].checked) {
                    ug.removeUserFromGroup(path, roles[i]._data.name);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.addGroupPermissionDialog = function(modalId) {
            if ($scope.permissions.path) {
                var permission = $scope.createPermission(null, null, $scope.removeFirstSlash($scope.permissions.path), $scope.permissions);
                var path = $rootScope.selectedGroup.get("path");
                ug.newGroupPermission(permission, path);
                $scope.hideModal(modalId);
                if ($scope.permissions) {
                    $scope.permissions = {};
                }
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a name for the permission.");
            }
        };
        $scope.deleteGroupPermissionDialog = function(modalId) {
            var path = $rootScope.selectedGroup.get("path");
            var permissions = $rootScope.selectedGroup.permissions;
            for (var i = 0; i < permissions.length; i++) {
                if (permissions[i].checked) {
                    ug.deleteGroupPermission(permissions[i].perm, path);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.resetNextPrev = function() {
            $scope.roles_previous_display = "none";
            $scope.roles_next_display = "none";
            $scope.permissions_previous_display = "none";
            $scope.permissions_next_display = "none";
        };
        $scope.resetNextPrev();
        $scope.checkNextPrevRoles = function() {
            $scope.resetNextPrev();
            if ($scope.groupsCollection.roles.hasPreviousPage()) {
                $scope.roles_previous_display = "block";
            }
            if ($scope.groupsCollection.roles.hasNextPage()) {
                $scope.roles_next_display = "block";
            }
        };
        $scope.checkNextPrevPermissions = function() {
            if ($scope.groupsCollection.permissions.hasPreviousPage()) {
                $scope.permissions_previous_display = "block";
            }
            if ($scope.groupsCollection.permissions.hasNextPage()) {
                $scope.permissions_next_display = "block";
            }
        };
        $scope.getRoles = function() {
            var path = $rootScope.selectedGroup.get("path");
            var options = {
                type: "groups/" + path + "/roles"
            };
            $scope.groupsCollection.addCollection("roles", options, function(err) {
                $scope.groupRoleSelected = false;
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting roles for group");
                } else {
                    $scope.hasRoles = $scope.groupsCollection.roles._list.length > 0;
                    $scope.checkNextPrevRoles();
                    $scope.applyScope();
                }
            });
        };
        $scope.getPermissions = function() {
            $rootScope.selectedGroup.permissions = [];
            $rootScope.selectedGroup.getPermissions(function(err, data) {
                $scope.groupPermissionsSelected = false;
                $scope.hasPermissions = $scope.selectedGroup.permissions.length;
                if (err) {} else {
                    $scope.applyScope();
                }
            });
        };
        $scope.getPreviousRoles = function() {
            $scope.groupsCollection.roles.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of roles");
                }
                $scope.checkNextPrevRoles();
                $scope.applyScope();
            });
        };
        $scope.getNextRoles = function() {
            $scope.groupsCollection.roles.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of roles");
                }
                $scope.checkNextPrevRoles();
                $scope.applyScope();
            });
        };
        $scope.getPreviousPermissions = function() {
            $scope.groupsCollection.permissions.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of permissions");
                }
                $scope.checkNextPrevPermissions();
                $scope.applyScope();
            });
        };
        $scope.getNextPermissions = function() {
            $scope.groupsCollection.permissions.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of permissions");
                }
                $scope.checkNextPrevPermissions();
                $scope.applyScope();
            });
        };
        $scope.$on("role-update-received", function(event) {
            $scope.getRoles();
        });
        $scope.$on("permission-update-received", function(event) {
            $scope.getPermissions();
        });
        $scope.$on("groups-received", function(evt, data) {
            $scope.groupsCollection = data;
            $scope.getRoles();
            $scope.getPermissions();
        });
        if (!$rootScope.selectedGroup) {
            $location.path("/groups");
            return;
        } else {
            ug.getRolesTypeAhead();
            ug.getGroups();
        }
    } ]);
    "use strict";
    AppServices.Controllers.controller("ForgotPasswordCtrl", [ "ug", "$scope", "$rootScope", "$location", "$sce", "utility", function(ug, $scope, $rootScope, $location, $sce) {
        $rootScope.activeUI && $location.path("/");
        $scope.forgotPWiframeURL = $sce.trustAsResourceUrl($scope.apiUrl + "/management/users/resetpw");
    } ]);
    "use strict";
    AppServices.Controllers.controller("LoginCtrl", [ "ug", "$scope", "$rootScope", "$routeParams", "$location", "utility", function(ug, $scope, $rootScope, $routeParams, $location, utility) {
        $scope.loading = false;
        $scope.login = {};
        $scope.activation = {};
        $scope.requiresDeveloperKey = $scope.options.client.requiresDeveloperKey || false;
        if (!$scope.requiresDeveloperKey && $scope.options.client.apiKey) {
            ug.setClientProperty("developerkey", $scope.options.client.apiKey);
        }
        $rootScope.gotoForgotPasswordPage = function() {
            $location.path("/forgot-password");
        };
        $rootScope.gotoSignUp = function() {
            $location.path("/register");
        };
        $scope.login = function() {
            var username = $scope.login.username;
            var password = $scope.login.password;
            $scope.loginMessage = "";
            $scope.loading = true;
            if ($scope.requiresDeveloperKey) {
                ug.setClientProperty("developerkey", $scope.login.developerkey);
            }
            ug.orgLogin(username, password);
        };
        $scope.$on("loginFailed", function() {
            $scope.loading = false;
            ug.setClientProperty("developerkey", null);
            $scope.loginMessage = "Error: the username / password combination was not valid";
            $scope.applyScope();
        });
        $scope.logout = function() {
            ug.logout();
            ug.setClientProperty("developerkey", null);
            if ($scope.use_sso) {
                window.location = $rootScope.urls().LOGOUT_URL + "?redirect=no&callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
            } else {
                $location.path("/login");
                $scope.applyScope();
            }
        };
        $rootScope.$on("userNotAuthenticated", function(event) {
            if ("/forgot-password" !== $location.path()) {
                $location.path("/login");
                $scope.logout();
            }
            $scope.applyScope();
        });
        $scope.$on("loginSuccesful", function(event, user, organizations, applications) {
            $scope.loading = false;
            $scope.login = {};
            if ($rootScope.currentPath === "/login" || $rootScope.currentPath === "/login/loading" || typeof $rootScope.currentPath === "undefined") {
                $location.path("/org-overview");
            } else {
                $location.path($rootScope.currentPath);
            }
            $scope.applyScope();
        });
        $scope.resendActivationLink = function(modalId) {
            var id = $scope.activation.id;
            ug.resendActivationLink(id);
            $scope.activation = {};
            $scope.hideModal(modalId);
        };
        $scope.$on("resend-activate-success", function(evt, data) {
            $scope.activationId = "";
            $scope.$apply();
            $rootScope.$broadcast("alert", "success", "Activation link sent successfully.");
        });
        $scope.$on("resend-activate-error", function(evt, data) {
            $rootScope.$broadcast("alert", "error", "Activation link failed to send.");
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("LogoutCtrl", [ "ug", "$scope", "$rootScope", "$routeParams", "$location", "utility", function(ug, $scope, $rootScope, $routeParams, $location, utility) {
        ug.logout();
        if ($scope.use_sso) {
            window.location = $rootScope.urls().LOGOUT_URL + "?callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
        } else {
            $location.path("/login");
            $scope.applyScope();
        }
    } ]);
    "use strict";
    AppServices.Controllers.controller("RegisterCtrl", [ "ug", "$scope", "$rootScope", "$routeParams", "$location", "utility", function(ug, $scope, $rootScope, $routeParams, $location, utility) {
        $rootScope.activeUI && $location.path("/");
        var init = function() {
            $scope.registeredUser = {};
        };
        init();
        $scope.cancel = function() {
            $location.path("/");
        };
        $scope.register = function() {
            var user = $scope.registeredUser.clone();
            if (user.password === user.confirmPassword) {
                ug.signUpUser(user.orgName, user.userName, user.name, user.email, user.password);
            } else {
                $rootScope.$broadcast("alert", "error", "Passwords do not match." + name);
            }
        };
        $scope.$on("register-error", function(event, data) {
            $scope.signUpSuccess = false;
            $rootScope.$broadcast("alert", "error", "Error registering: " + (data && data.error_description ? data.error_description : name));
        });
        $scope.$on("register-success", function(event, data) {
            $scope.registeredUser = {};
            $scope.signUpSuccess = true;
            init();
            $scope.$apply();
        });
    } ]);
    "use strict";
    AppServices.Directives.directive("menu", [ "$location", "$rootScope", "$log", function($location, $rootScope, $log) {
        return {
            link: function linkFn(scope, lElement, attrs) {
                var menuContext, parentMenuItems, activeParentElement, menuItems, activeMenuElement, locationPath, subMenuContext;
                function setActiveElement(ele, locationPath, $rootScope, isParentClick) {
                    if (!ele) {
                        return;
                    }
                    ele.removeClass("active");
                    var newActiveElement = ele.parent().find('a[href*="#!' + locationPath + '"]'), menuItem, parentMenuItem;
                    if (newActiveElement.length === 0) {
                        parentMenuItem = ele;
                    } else {
                        menuItem = newActiveElement.parent();
                        if (menuItem.hasClass("option")) {
                            parentMenuItem = menuItem[0];
                        } else {
                            if (menuItem.size() === 1) {
                                parentMenuItem = newActiveElement.parent().parent().parent();
                                parentMenuItem.addClass("active");
                            } else {
                                parentMenuItem = menuItem[0];
                                menuItem = menuItem[1];
                            }
                        }
                        try {
                            var menuItemCompare = parentMenuItem[0] || parentMenuItem;
                            if (ele[0] !== menuItemCompare && isParentClick) {
                                if (ele.find("ul")[0]) {
                                    ele.find("ul")[0].style.height = 0;
                                }
                            }
                            var subMenuSizer = angular.element(parentMenuItem).find(".nav-list")[0];
                            if (subMenuSizer) {
                                var clientHeight = subMenuSizer.getAttribute("data-height"), heightCounter = 1, heightChecker;
                                if (!clientHeight && !heightChecker) {
                                    heightChecker = setInterval(function() {
                                        var tempHeight = subMenuSizer.getAttribute("data-height") || subMenuSizer.clientHeight;
                                        heightCounter = subMenuSizer.clientHeight;
                                        if (heightCounter === 0) {
                                            heightCounter = 1;
                                        }
                                        if (typeof tempHeight === "string") {
                                            tempHeight = parseInt(tempHeight, 10);
                                        }
                                        if (tempHeight > 0 && heightCounter === tempHeight) {
                                            subMenuSizer.setAttribute("data-height", tempHeight);
                                            menuItem.addClass("active");
                                            subMenuSizer.style.height = tempHeight + "px";
                                            clearInterval(heightChecker);
                                        }
                                        heightCounter = tempHeight;
                                    }, 20);
                                } else {
                                    menuItem.addClass("active");
                                    subMenuSizer.style.height = clientHeight + "px";
                                }
                                $rootScope.menuExecute = true;
                            } else {
                                menuItem.addClass("active");
                            }
                        } catch (e) {
                            $log.error("Problem calculating size of menu", e);
                        }
                    }
                    return {
                        menuitem: menuItem,
                        parentMenuItem: parentMenuItem
                    };
                }
                function setupMenuState() {
                    menuContext = attrs.menu;
                    parentMenuItems = lElement.find("li.option");
                    activeParentElement;
                    if (lElement.find("li.option.active").length !== 0) {
                        $rootScope[menuContext + "Parent"] = lElement.find("li.option.active");
                    }
                    activeParentElement = $rootScope[menuContext + "Parent"] || null;
                    if (activeParentElement) {
                        activeParentElement = angular.element(activeParentElement);
                    }
                    menuItems = lElement.find("li.option li");
                    locationPath = $location.path();
                    if (activeParentElement) {
                        activeMenuElement = angular.element(activeParentElement);
                        activeMenuElement = activeMenuElement.find("li.active");
                        activeMenuElement.removeClass("active");
                        if (activeParentElement.find("a")[0]) {
                            subMenuContext = activeParentElement.find("a")[0].href.split("#!")[1];
                            var tempMenuContext = subMenuContext.split("/");
                            subMenuContext = "/" + tempMenuContext[1];
                            if (tempMenuContext.length > 2) {
                                subMenuContext += "/" + tempMenuContext[2];
                            }
                        }
                    }
                    var activeElements;
                    if (locationPath !== "" && locationPath.indexOf(subMenuContext) === -1) {
                        activeElements = setActiveElement(activeParentElement, locationPath, scope);
                        if (activeElements) {
                            $rootScope[menuContext + "Parent"] = activeElements.parentMenuItem;
                            $rootScope[menuContext + "Menu"] = activeElements.menuitem;
                        }
                    } else {
                        setActiveElement(activeParentElement, subMenuContext, scope);
                    }
                }
                var bound = false;
                scope.$watch("menuItems");
                scope.$on("$routeChangeSuccess", function() {
                    setTimeout(function() {
                        setupMenuState();
                        if (!bound) {
                            bound = true;
                            parentMenuItems.bind("click", function(cevent) {
                                var previousParentSelection = angular.element($rootScope[menuContext + "Parent"]), targetPath = angular.element(cevent.currentTarget).find("> a")[0].href.split("#!")[1];
                                previousParentSelection.find(".nav > li").removeClass("active");
                                var activeElements = setActiveElement(previousParentSelection, targetPath, scope, true);
                                $rootScope[menuContext + "Parent"] = activeElements.parentMenuItem;
                                $rootScope[menuContext + "Menu"] = activeElements.menuitem;
                                scope.$broadcast("menu-selection");
                            });
                            menuItems.bind("click", function(cevent) {
                                var previousMenuSelection = $rootScope[menuContext + "Menu"], targetElement = cevent.currentTarget;
                                if (previousMenuSelection !== targetElement) {
                                    if (previousMenuSelection) {
                                        angular.element(previousMenuSelection).removeClass("active");
                                    } else {
                                        activeMenuElement.removeClass("active");
                                    }
                                    scope.$apply(function() {
                                        angular.element($rootScope[menuContext]).addClass("active");
                                    });
                                    $rootScope[menuContext + "Menu"] = targetElement;
                                    angular.element($rootScope[menuContext + "Parent"]).find("a")[0].setAttribute("href", angular.element(cevent.currentTarget).find("a")[0].href);
                                }
                            });
                        }
                    }, 500);
                });
            }
        };
    } ]);
    AppServices.Directives.directive("timeFilter", [ "$location", "$routeParams", "$rootScope", function($location, $routeParams, $rootScope) {
        return {
            restrict: "A",
            transclude: true,
            template: '<li ng-repeat="time in timeFilters" class="filterItem"><a ng-click="changeTimeFilter(time)">{{time.label}}</a></li>',
            link: function linkFn(scope, lElement, attrs) {
                var menuContext = attrs.filter;
                scope.changeTimeFilter = function(newTime) {
                    $rootScope.selectedtimefilter = newTime;
                    $routeParams.timeFilter = newTime.value;
                };
                lElement.bind("click", function(cevent) {
                    menuBindClick(scope, lElement, cevent, menuContext);
                });
            }
        };
    } ]);
    AppServices.Directives.directive("chartFilter", [ "$location", "$routeParams", "$rootScope", function($location, $routeParams, $rootScope) {
        return {
            restrict: "ACE",
            scope: "=",
            template: '<li ng-repeat="chart in chartCriteriaOptions" class="filterItem"><a ng-click="changeChart(chart)">{{chart.chartName}}</a></li>',
            link: function linkFn(scope, lElement, attrs) {
                var menuContext = attrs.filter;
                scope.changeChart = function(newChart) {
                    $rootScope.selectedChartCriteria = newChart;
                    $routeParams.currentCompare = "NOW";
                    $routeParams[newChart.type + "ChartFilter"] = newChart.chartCriteriaId;
                };
                lElement.bind("click", function(cevent) {
                    menuBindClick(scope, lElement, cevent, menuContext);
                });
            }
        };
    } ]);
    function menuBindClick(scope, lElement, cevent, menuContext) {
        var currentSelection = angular.element(cevent.srcElement).parent();
        var previousSelection = scope[menuContext];
        if (previousSelection !== currentSelection) {
            if (previousSelection) {
                angular.element(previousSelection).removeClass("active");
            }
            scope[menuContext] = currentSelection;
            scope.$apply(function() {
                currentSelection.addClass("active");
            });
        }
    }
    AppServices.Directives.directive("orgMenu", [ "$location", "$routeParams", "$rootScope", "ug", function($location, $routeParams, $rootScope, ug) {
        return {
            restrict: "ACE",
            scope: "=",
            replace: true,
            templateUrl: "menus/orgMenu.html",
            link: function linkFn(scope, lElement, attrs) {
                scope.orgChange = function(orgName) {
                    var oldOrg = ug.get("orgName");
                    ug.set("orgName", orgName);
                    $rootScope.currentOrg = orgName;
                    $location.path("/org-overview");
                    $rootScope.$broadcast("org-changed", oldOrg, orgName);
                };
                scope.$on("change-org", function(args, org) {
                    scope.orgChange(org);
                });
            }
        };
    } ]);
    AppServices.Directives.directive("appMenu", [ "$location", "$routeParams", "$rootScope", "ug", function($location, $routeParams, $rootScope, ug) {
        return {
            restrict: "ACE",
            scope: "=",
            replace: true,
            templateUrl: "menus/appMenu.html",
            link: function linkFn(scope, lElement, attrs) {
                scope.myApp = {};
                var bindApplications = function(applications) {
                    scope.applications = applications;
                    var size = 0, key;
                    for (key in applications) {
                        if (applications.hasOwnProperty(key)) size++;
                    }
                    scope.hasApplications = Object.keys(applications).length > 0;
                    if (!scope.myApp.currentApp) {
                        $rootScope.currentApp = scope.myApp.currentApp = ug.get("appName");
                    }
                    var hasApplications = Object.keys(applications).length > 0;
                    if (!applications[scope.myApp.currentApp]) {
                        if (hasApplications) {
                            $rootScope.currentApp = scope.myApp.currentApp = applications[Object.keys(applications)[0]].name;
                        } else {
                            $rootScope.currentApp = scope.myApp.currentApp = "";
                        }
                    }
                    setTimeout(function() {
                        if (!scope.hasApplications) {
                            scope.showModal("newApplication");
                        } else {
                            scope.hideModal("newApplication");
                        }
                    }, 1e3);
                };
                scope.appChange = function(newApp) {
                    var oldApp = scope.myApp.currentApp;
                    ug.set("appName", newApp);
                    $rootScope.currentApp = scope.myApp.currentApp = newApp;
                    $rootScope.$broadcast("app-changed", oldApp, newApp);
                };
                scope.$on("app-initialized", function() {
                    bindApplications(scope.applications);
                    scope.applyScope();
                });
                scope.$on("applications-received", function(event, applications) {
                    bindApplications(applications);
                    scope.applyScope();
                });
                scope.$on("applications-created", function(evt, applications, name) {
                    $rootScope.$broadcast("alert", "info", 'New application "' + scope.newApp.name + '" created!');
                    scope.appChange(name);
                    $location.path("/getting-started/setup");
                    scope.newApp.name = "";
                });
                scope.newApplicationDialog = function(modalId) {
                    var createNewApp = function() {
                        var found = false;
                        if (scope.applications) {
                            for (var app in scope.applications) {
                                if (app === scope.newApp.name.toLowerCase()) {
                                    found = true;
                                    break;
                                }
                            }
                        }
                        if (scope.newApp.name && !found) {
                            ug.createApplication(scope.newApp.name);
                        } else {
                            $rootScope.$broadcast("alert", "error", !found ? "You must specify a name." : "Application already exists.");
                        }
                        return found;
                    };
                    scope.hasCreateApplicationError = createNewApp();
                    if (!scope.hasCreateApplicationError) {
                        scope.applyScope();
                    }
                    scope.hideModal(modalId);
                };
                if (scope.applications) {
                    bindApplications(scope.applications);
                }
            }
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("OrgOverviewCtrl", [ "ug", "help", "$scope", "$rootScope", "$routeParams", "$location", function(ug, help, $scope, $rootScope, $routeParams, $location) {
        var init = function(oldOrg) {
            var orgName = $scope.currentOrg;
            var orgUUID = "";
            if (orgName && $scope.organizations[orgName]) {
                orgUUID = $scope.organizations[orgName].uuid;
            } else {
                console.error("Your current user is not authenticated for this organization.");
                setTimeout(function() {
                    $rootScope.$broadcast("change-org", oldOrg || $scope.organizations[Object.keys($scope.organizations)[0]].name);
                }, 1e3);
                return;
            }
            $scope.currentOrganization = {
                name: orgName,
                uuid: orgUUID
            };
            $scope.applications = [ {
                name: "...",
                uuid: "..."
            } ];
            $scope.orgAdministrators = [];
            $scope.activities = [];
            $scope.orgAPICredentials = {
                client_id: "...",
                client_secret: "..."
            };
            $scope.admin = {};
            $scope.newApp = {};
            ug.getApplications();
            ug.getOrgCredentials();
            ug.getAdministrators();
            ug.getFeed();
        };
        $scope.$on("org-changed", function(args, oldOrg, newOrg) {
            init(oldOrg);
        });
        $scope.$on("app-initialized", function() {
            init();
        });
        $scope.regenerateCredentialsDialog = function(modalId) {
            $scope.orgAPICredentials = {
                client_id: "regenerating...",
                client_secret: "regenerating..."
            };
            ug.regenerateOrgCredentials();
            $scope.hideModal(modalId);
        };
        $scope.newAdministratorDialog = function(modalId) {
            if ($scope.admin.email) {
                ug.createAdministrator($scope.admin.email);
                $scope.hideModal(modalId);
                $rootScope.$broadcast("alert", "success", "Administrator created successfully.");
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify an email address.");
            }
        };
        $scope.$on("applications-received", function(event, applications) {
            $scope.applications = applications;
            $scope.applyScope();
        });
        $scope.$on("administrators-received", function(event, administrators) {
            $scope.orgAdministrators = administrators;
            $scope.applyScope();
        });
        $scope.$on("org-creds-updated", function(event, credentials) {
            $scope.orgAPICredentials = credentials;
            $scope.applyScope();
        });
        $scope.$on("feed-received", function(event, feed) {
            $scope.activities = feed;
            $scope.applyScope();
        });
        if ($scope.activeUI) {
            init();
        }
    } ]);
    "use strict";
    AppServices.Controllers.controller("AccountCtrl", [ "$scope", "$rootScope", "ug", "utility", "$route", function($scope, $rootScope, ug, utility, $route) {
        $scope.currentAccountPage = {};
        var route = $scope.use_sso ? "/profile/organizations" : "/profile/profile";
        $scope.currentAccountPage.template = $route.routes[route].templateUrl;
        $scope.currentAccountPage.route = route;
        $scope.applyScope();
        $scope.selectAccountPage = function(route) {
            $scope.currentAccountPage.template = $route.routes[route].templateUrl;
            $scope.currentAccountPage.route = route;
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("OrgCtrl", [ "$scope", "$rootScope", "ug", "utility", function($scope, $rootScope, ug, utility) {
        $scope.org = {};
        $scope.currentOrgPage = {};
        var createOrgsArray = function() {
            var orgs = [];
            for (var org in $scope.organizations) {
                orgs.push($scope.organizations[org]);
            }
            $scope.orgs = orgs;
            $scope.selectOrganization(orgs[0]);
        };
        $scope.selectOrganization = function(org) {
            org.usersArray = [];
            for (var user in org.users) {
                org.usersArray.push(org.users[user]);
            }
            org.applicationsArray = [];
            for (var app in org.applications) {
                org.applicationsArray.push({
                    name: app.replace(org.name + "/", ""),
                    uuid: org.applications[app]
                });
            }
            $scope.selectedOrg = org;
            $scope.applyScope();
            return false;
        };
        $scope.addOrganization = function(modalId) {
            $scope.hideModal(modalId);
            ug.addOrganization($rootScope.currentUser, $scope.org.name);
        };
        $scope.$on("user-add-org-success", function(evt, orgs) {
            $scope.org = {};
            $scope.applyScope();
            ug.reAuthenticate($rootScope.userEmail, "org-reauthenticate");
            $rootScope.$broadcast("alert", "success", "successfully added the new organization.");
        });
        $scope.$on("user-add-org-error", function(evt, data) {
            $rootScope.$broadcast("alert", "error", "An error occurred attempting to add the organization.");
        });
        $scope.$on("org-reauthenticate-success", function() {
            createOrgsArray();
            $scope.applyScope();
        });
        $scope.doesOrgHaveUsers = function(org) {
            var test = org.usersArray.length > 1;
            return test;
        };
        $scope.leaveOrganization = function(org) {
            ug.leaveOrganization($rootScope.currentUser, org);
        };
        $scope.$on("user-leave-org-success", function(evt, orgs) {
            ug.reAuthenticate($rootScope.userEmail, "org-reauthenticate");
            $rootScope.$broadcast("alert", "success", "User has left the selected organization(s).");
        });
        $scope.$on("user-leave-org-error", function(evt, data) {
            $rootScope.$broadcast("alert", "error", "An error occurred attempting to leave the selected organization(s).");
        });
        createOrgsArray();
    } ]);
    "use strict";
    AppServices.Controllers.controller("ProfileCtrl", [ "$scope", "$rootScope", "ug", "utility", function($scope, $rootScope, ug, utility) {
        $scope.loading = false;
        $scope.saveUserInfo = function() {
            $scope.loading = true;
            ug.updateUser($scope.user);
        };
        $scope.$on("user-update-error", function() {
            $scope.loading = false;
            $rootScope.$broadcast("alert", "error", "Error updating user info");
        });
        $scope.$on("user-update-success", function() {
            $scope.loading = false;
            $rootScope.$broadcast("alert", "success", "Profile information updated successfully!");
            if ($scope.user.oldPassword && $scope.user.newPassword != "undefined") {
                ug.resetUserPassword($scope.user);
            }
        });
        $scope.$on("user-reset-password-success", function() {
            $rootScope.$broadcast("alert", "success", "Password updated successfully!");
            $scope.user = $rootScope.currentUser.clone();
        });
        $scope.$on("app-initialized", function() {
            $scope.user = $rootScope.currentUser.clone();
        });
        if ($rootScope.activeUI) {
            $scope.user = $rootScope.currentUser.clone();
            $scope.applyScope();
        }
    } ]);
    "use strict";
    AppServices.Controllers.controller("RolesCtrl", [ "ug", "$scope", "$rootScope", "$location", "$route", function(ug, $scope, $rootScope, $location, $route) {
        $scope.rolesCollection = {};
        $rootScope.selectedRole = {};
        $scope.previous_display = "none";
        $scope.next_display = "none";
        $scope.roles_check_all = "";
        $scope.rolename = "";
        $scope.hasRoles = false;
        $scope.newrole = {};
        $scope.currentRolesPage = {};
        $scope.selectRolePage = function(route) {
            $scope.currentRolesPage.template = $route.routes[route].templateUrl;
            $scope.currentRolesPage.route = route;
        };
        ug.getRoles();
        $scope.newRoleDialog = function(modalId) {
            if ($scope.newRole.name) {
                ug.createRole($scope.newRole.name, $scope.newRole.title);
                $rootScope.$broadcast("alert", "success", "Role created successfully.");
                $scope.hideModal(modalId);
                $scope.newRole = {};
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a role name.");
            }
        };
        $scope.deleteRoleDialog = function(modalId) {
            $scope.deleteEntities($scope.rolesCollection, "role-deleted", "error deleting role");
            $scope.hideModal(modalId);
        };
        $scope.$on("role-deleted", function() {
            $rootScope.$broadcast("alert", "success", "Role deleted successfully.");
            $scope.master = "";
            $scope.newRole = {};
        });
        $scope.$on("role-deleted-error", function() {
            ug.getRoles();
        });
        $scope.$on("roles-received", function(event, roles) {
            $scope.rolesSelected = false;
            $scope.rolesCollection = roles;
            $scope.newRole = {};
            if (roles._list.length > 0) {
                $scope.hasRoles = true;
                $scope.selectRole(roles._list[0]._data.uuid);
            }
            $scope.checkNextPrev();
            $scope.applyScope();
        });
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.rolesCollection.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($scope.rolesCollection.hasNextPage()) {
                $scope.next_display = "block";
            }
        };
        $scope.selectRole = function(uuid) {
            $rootScope.selectedRole = $scope.rolesCollection.getEntityByUUID(uuid);
            $scope.currentRolesPage.template = "roles/roles-settings.html";
            $scope.currentRolesPage.route = "/roles/settings";
            $rootScope.$broadcast("role-selection-changed", $rootScope.selectedRole);
        };
        $scope.getPrevious = function() {
            $scope.rolesCollection.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of roles");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $scope.rolesCollection.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of roles");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("RolesGroupsCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.groupsSelected = "active";
        $scope.previous_display = "none";
        $scope.next_display = "none";
        $scope.path = "";
        $scope.hasGroups = false;
        ug.getGroupsTypeAhead();
        $scope.groupsTypeaheadValues = [];
        $scope.$on("groups-typeahead-received", function(event, groups) {
            $scope.groupsTypeaheadValues = groups;
            $scope.applyScope();
        });
        $scope.addRoleToGroupDialog = function(modalId) {
            if ($scope.path) {
                var name = $rootScope.selectedRole._data.uuid;
                ug.addGroupToRole($scope.path, name);
                $scope.hideModal(modalId);
                $scope.path = "";
                $scope.title = "";
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a group.");
            }
        };
        $scope.setRoleModal = function(group) {
            $scope.path = group.path;
            $scope.title = group.title;
        };
        $scope.removeGroupFromRoleDialog = function(modalId) {
            var roleName = $rootScope.selectedRole._data.uuid;
            var groups = $scope.rolesCollection.groups._list;
            for (var i = 0; i < groups.length; i++) {
                if (groups[i].checked) {
                    ug.removeUserFromGroup(groups[i]._data.path, roleName);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.get = function() {
            var options = {
                type: "roles/" + $rootScope.selectedRole._data.name + "/groups",
                qs: {
                    ql: "order by title"
                }
            };
            $scope.rolesCollection.addCollection("groups", options, function(err) {
                $scope.roleGroupsSelected = false;
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting groups for role");
                } else {
                    $scope.hasGroups = $scope.rolesCollection.groups._list.length;
                    $scope.checkNextPrev();
                    $scope.applyScope();
                }
            });
        };
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.rolesCollection.groups.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($scope.rolesCollection.groups.hasNextPage()) {
                $scope.next_display = "block";
            }
        };
        if (!$rootScope.selectedRole) {
            $location.path("/roles");
            return;
        } else {
            $scope.get();
        }
        $scope.getPrevious = function() {
            $scope.rolesCollection.groups.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of groups");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $scope.rolesCollection.groups.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of groups");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.$on("role-update-received", function(event) {
            $scope.get();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("RolesSettingsCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.settingsSelected = "active";
        $scope.hasSettings = false;
        var init = function() {
            if (!$rootScope.selectedRole) {
                $location.path("/roles");
                return;
            } else {
                $scope.permissions = {};
                $scope.permissions.path = "";
                if ($scope.permissions) {
                    $scope.permissions.getPerm = false;
                    $scope.permissions.postPerm = false;
                    $scope.permissions.putPerm = false;
                    $scope.permissions.deletePerm = false;
                }
                $scope.role = $rootScope.selectedRole.clone();
                $scope.getPermissions();
                $scope.applyScope();
            }
        };
        $scope.$on("role-selection-changed", function() {
            init();
        });
        $scope.$on("permission-update-received", function(event) {
            $scope.getPermissions();
        });
        $scope.$on("role-selection-changed", function() {
            $scope.getPermissions();
        });
        $scope.addRolePermissionDialog = function(modalId) {
            if ($scope.permissions.path) {
                var permission = $scope.createPermission(null, null, $scope.permissions.path, $scope.permissions);
                var name = $scope.role._data.name;
                ug.newRolePermission(permission, name);
                $scope.hideModal(modalId);
                init();
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a name for the permission.");
            }
        };
        $scope.deleteRolePermissionDialog = function(modalId) {
            var name = $scope.role._data.name;
            var permissions = $scope.role.permissions;
            for (var i = 0; i < permissions.length; i++) {
                if (permissions[i].checked) {
                    ug.deleteRolePermission(permissions[i].perm, name);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.getPermissions = function() {
            $rootScope.selectedRole.getPermissions(function(err, data) {
                $scope.role.permissions = $rootScope.selectedRole.permissions.clone();
                $scope.permissionsSelected = false;
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting permissions");
                } else {
                    $scope.hasSettings = data.data.length;
                    $scope.applyScope();
                }
            });
        };
        $scope.updateInactivity = function() {
            $rootScope.selectedRole._data.inactivity = $scope.role._data.inactivity;
            $rootScope.selectedRole.save(function(err, data) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error saving inactivity value");
                } else {
                    $rootScope.$broadcast("alert", "success", "inactivity value was updated");
                    init();
                }
            });
        };
        init();
    } ]);
    "use strict";
    AppServices.Controllers.controller("RolesUsersCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.usersSelected = "active";
        $scope.previous_display = "none";
        $scope.next_display = "none";
        $scope.user = {};
        $scope.master = "";
        $scope.hasUsers = false;
        ug.getUsersTypeAhead();
        $scope.usersTypeaheadValues = [];
        $scope.$on("users-typeahead-received", function(event, users) {
            $scope.usersTypeaheadValues = users;
            $scope.applyScope();
        });
        $scope.addRoleToUserDialog = function(modalId) {
            if ($scope.user.uuid) {
                var roleName = $rootScope.selectedRole._data.uuid;
                ug.addUserToRole($scope.user.uuid, roleName);
                $scope.hideModal(modalId);
                $scope.user = null;
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a user.");
            }
        };
        $scope.removeUsersFromGroupDialog = function(modalId) {
            var roleName = $rootScope.selectedRole._data.uuid;
            var users = $scope.rolesCollection.users._list;
            for (var i = 0; i < users.length; i++) {
                if (users[i].checked) {
                    ug.removeUserFromRole(users[i]._data.uuid, roleName);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.get = function() {
            var options = {
                type: "roles/" + $rootScope.selectedRole._data.name + "/users"
            };
            $scope.rolesCollection.addCollection("users", options, function(err) {
                $scope.roleUsersSelected = false;
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting users for role");
                } else {
                    $scope.hasUsers = $scope.rolesCollection.users._list.length;
                    $scope.checkNextPrev();
                    $scope.applyScope();
                }
            });
        };
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.rolesCollection.users.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($scope.rolesCollection.users.hasNextPage()) {
                $scope.next_display = "block";
            }
        };
        if (!$rootScope.selectedRole) {
            $location.path("/roles");
            return;
        } else {
            $scope.get();
        }
        $scope.getPrevious = function() {
            $scope.rolesCollection.users.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of users");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $scope.rolesCollection.users.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of users");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.$on("role-update-received", function(event) {
            $scope.get();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("ShellCtrl", [ "ug", "$scope", "$log", "$sce", function(ug, $scope, $log, $sce) {
        $scope.shell = {
            input: "",
            output: ""
        };
        $scope.submitCommand = function() {
            if (!$scope.shell.input || !$scope.shell.input.length) {
                return;
            }
            handleShellCommand($scope.shell.input);
        };
        var handleShellCommand = function(s) {
            var path = "";
            var params = "";
            var shouldScroll = false;
            var hasMatchLength = function(expression) {
                var res = s.match(expression);
                return res && res.length > 0;
            };
            try {
                switch (true) {
                  case hasMatchLength(/^\s*\//):
                    path = encodePathString(s);
                    printLnToShell(path);
                    ug.runShellQuery("GET", path, null);
                    break;

                  case hasMatchLength(/^\s*get\s*\//i):
                    path = encodePathString(s.substring(4));
                    printLnToShell(path);
                    ug.runShellQuery("GET", path, null);
                    break;

                  case hasMatchLength(/^\s*put\s*\//i):
                    params = encodePathString(s.substring(4), true);
                    printLnToShell(params.path);
                    ug.runShellQuery("PUT", params.path, params.payload);
                    break;

                  case hasMatchLength(/^\s*post\s*\//i):
                    params = encodePathString(s.substring(5), true);
                    printLnToShell(params.path);
                    ug.runShellQuery("POST", params.path, params.payload);
                    break;

                  case hasMatchLength(/^\s*delete\s*\//i):
                    path = encodePathString(s.substring(7));
                    printLnToShell(path);
                    ug.runShellQuery("DELETE", path, null);
                    break;

                  case hasMatchLength(/^\s*clear|cls\s*/i):
                    $scope.shell.output = "";
                    shouldScroll = true;
                    break;

                  case hasMatchLength(/(^\s*help\s*|\?{1,2})/i):
                    shouldScroll = true;
                    printLnToShell("/&lt;path&gt; - API get request");
                    printLnToShell("get /&lt;path&gt; - API get request");
                    printLnToShell("put /&lt;path&gt; {&lt;json&gt;} - API put request");
                    printLnToShell("post /&lt;path&gt; {&lt;json&gt;} - API post request");
                    printLnToShell("delete /&lt;path&gt; - API delete request");
                    printLnToShell("cls, clear - clear the screen");
                    printLnToShell("help - show this help");
                    break;

                  case s === "":
                    shouldScroll = true;
                    printLnToShell("ok");
                    break;

                  default:
                    shouldScroll = true;
                    printLnToShell("<strong>syntax error!</strong>");
                    break;
                }
            } catch (e) {
                $log.error(e);
                printLnToShell("<strong>syntax error!</strong>");
            }
            shouldScroll && scroll();
        };
        var printLnToShell = function(s) {
            if (!s) s = "&nbsp;";
            $scope.shell.outputhidden = s;
            var html = '<div class="shell-output-line"><div class="shell-output-line-content">' + s + "</div></div>";
            html += " ";
            var trustedHtml = $sce.trustAsHtml(html);
            $scope.shell.output += trustedHtml.toString();
        };
        $scope.$on("shell-success", function(evt, data) {
            printLnToShell(JSON.stringify(data, null, "  "));
            scroll();
        });
        $scope.$on("shell-error", function(evt, data) {
            printLnToShell(JSON.stringify(data, null, "  "));
            scroll();
        });
        var scroll = function() {
            $scope.shell.output += "<hr />";
            $scope.applyScope();
            setTimeout(function() {
                var myshell = $("#shell-output");
                myshell.animate({
                    scrollTop: myshell[0].scrollHeight
                }, 800);
            }, 200);
        };
        function encodePathString(path, returnParams) {
            var i = 0;
            var segments = new Array();
            var payload = null;
            while (i < path.length) {
                var c = path.charAt(i);
                if (c == "{") {
                    var bracket_start = i;
                    i++;
                    var bracket_count = 1;
                    while (i < path.length && bracket_count > 0) {
                        c = path.charAt(i);
                        if (c == "{") {
                            bracket_count++;
                        } else if (c == "}") {
                            bracket_count--;
                        }
                        i++;
                    }
                    if (i > bracket_start) {
                        var segment = path.substring(bracket_start, i);
                        segments.push(JSON.parse(segment));
                    }
                    continue;
                } else if (c == "/") {
                    i++;
                    var segment_start = i;
                    while (i < path.length) {
                        c = path.charAt(i);
                        if (c == " " || c == "/" || c == "{") {
                            break;
                        }
                        i++;
                    }
                    if (i > segment_start) {
                        var segment = path.substring(segment_start, i);
                        segments.push(segment);
                    }
                    continue;
                } else if (c == " ") {
                    i++;
                    var payload_start = i;
                    while (i < path.length) {
                        c = path.charAt(i);
                        i++;
                    }
                    if (i > payload_start) {
                        var json = path.substring(payload_start, i).trim();
                        payload = JSON.parse(json);
                    }
                    break;
                }
                i++;
            }
            var newPath = "";
            for (i = 0; i < segments.length; i++) {
                var segment = segments[i];
                if (typeof segment === "string") {
                    newPath += "/" + segment;
                } else {
                    if (i == segments.length - 1) {
                        if (returnParams) {
                            return {
                                path: newPath,
                                params: segment,
                                payload: payload
                            };
                        }
                        newPath += "?";
                    } else {
                        newPath += ";";
                    }
                    newPath += encodeParams(segment);
                }
            }
            if (returnParams) {
                return {
                    path: newPath,
                    params: null,
                    payload: payload
                };
            }
            return newPath;
        }
        function encodeParams(params) {
            var tail = [];
            if (params instanceof Array) {
                for (i in params) {
                    var item = params[i];
                    if (item instanceof Array && item.length > 1) {
                        tail.push(item[0] + "=" + encodeURIComponent(item[1]));
                    }
                }
            } else {
                for (var key in params) {
                    if (params.hasOwnProperty(key)) {
                        var value = params[key];
                        if (value instanceof Array) {
                            for (i in value) {
                                var item = value[i];
                                tail.push(key + "=" + encodeURIComponent(item));
                            }
                        } else {
                            tail.push(key + "=" + encodeURIComponent(value));
                        }
                    }
                }
            }
            return tail.join("&");
        }
    } ]);
    angular.module("appservices").run([ "$templateCache", function($templateCache) {
        "use strict";
        $templateCache.put("activities/activities.html", '<section class="row-fluid">\n' + '  <div class="span12">\n' + '    <div class="page-filters">\n' + '      <h1 class="title" class="pull-left"><i class="pictogram title">&#128241;</i> Activities</h1>\n' + "    </div>\n" + "  </div>\n" + "\n" + "</section>\n" + '<section class="row-fluid">\n' + '  <div class="span12 tab-content">\n' + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + "        <td>Date</td>\n" + "        <td></td>\n" + "        <td>User</td>\n" + "        <td>Content</td>\n" + "        <td>Verb</td>\n" + "        <td>UUID</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="activity in activities">\n' + "        <td>{{formatDate(activity.created)}}</td>\n" + '        <td class="gravatar20"> <img ng-src="{{activity.actor.picture}}"/>\n' + "        </td>\n" + "        <td>{{activity.actor.displayName}}</td>\n" + "        <td>{{activity.content}}</td>\n" + "        <td>{{activity.verb}}</td>\n" + "        <td>{{activity.uuid}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "  </div>\n" + "</section>");
        $templateCache.put("app-overview/app-overview.html", '<div class="app-overview-content" >\n' + '  <section class="row-fluid">\n' + "\n" + '      <page-title title=" Summary" icon="&#128241;"></page-title>\n' + '  <section class="row-fluid">\n' + '      <h2 class="title" id="app-overview-title">{{currentApp}}</h2>\n' + "  </section>\n" + '  <section class="row-fluid">\n' + "\n" + '    <div class="span6">\n' + '      <chart id="appOverview"\n' + '             chartdata="appOverview.chart"\n' + '             type="column"></chart>\n' + "    </div>\n" + "\n" + '    <div class="span6">\n' + '      <table class="table table-striped">\n' + '        <tr class="table-header">\n' + "          <td>Path</td>\n" + "          <td>Title</td>\n" + "        </tr>\n" + '        <tr class="zebraRows" ng-repeat="(k,v) in collections">\n' + "          <td>{{v.title}}</td>\n" + "          <td>{{v.count}}</td>\n" + "        </tr>\n" + "      </table>\n" + "    </div>\n" + "\n" + "  </section>\n" + "</div>");
        $templateCache.put("app-overview/doc-includes/android.html", "<h2>1. Integrate the SDK into your project</h2>\n" + "<p>You can integrate Apigee features into your app by including the SDK in your project.&nbsp;&nbsp;You can do one of the following:</p>\n" + "\n" + '<ul class="nav nav-tabs" id="myTab">\n' + '	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n' + '	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n' + "</ul>\n" + "\n" + '<div class="tab-content">\n' + '	<div class="tab-pane active" id="existing_project">\n' + '		<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n' + "		<p>If you've already got&nbsp;an Android&nbsp;project, you can integrate the&nbsp;Apigee&nbsp;SDK into your project as you normally would:</p>\n" + '		<div id="collapse">\n' + '			<a href="#jar_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>			\n' + "		</div>\n" + '		<div id="jar_collapse" class="collapse">\n' + "			<p>Add <code>apigee-android-&lt;version&gt;.jar</code> to your class path by doing the following:</p>\n" + "	\n" + "			<h3>Android 4.0 (or later) projects</h3>\n" + "			<p>Copy the jar file into the <code>/libs</code> folder in your project.</p>\n" + "			\n" + "			<h3>Android 3.0 (or earlier) projects</h3>\n" + "			<ol>\n" + "				<li>In the&nbsp;Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n" + "				<li>Click the&nbsp;<strong>File &gt; Properties</strong>&nbsp;menu.</li>\n" + "				<li>In the <strong>Java Build Path</strong> section, click the <strong>Libraries</strong> tab, click <strong>Add External JARs</strong>.</li>\n" + "				<li>Browse to <code>apigee-android-&lt;version&gt;.jar</code>, then click&nbsp;<strong>Open</strong>.</li>\n" + "				<li>Order the <code>apigee-android-&lt;version&gt;.jar</code> at the top of the class path:\n" + "					<ol>\n" + "						<li>In the Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n" + "						<li>Click the&nbsp;<strong>File &gt; Properties</strong> menu.</li>\n" + "						<li>In the properties dialog, in the&nbsp;<strong>Java Build Path</strong> section,&nbsp;click&nbsp;the <strong>Order and Export</strong>&nbsp;tab.</li>\n" + "						<li>\n" + "							<p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-&lt;version&gt;.jar</code>, then click the <strong>Top</strong>&nbsp;button.</p>\n" + "						</li>\n" + "					</ol>\n" + "				</li>\n" + "			</ol>\n" + '			<div class="warning">\n' + "				<h3>Applications using Ant</h3>\n" + "				<p>If you are using Ant to build your application, you must also copy <code>apigee-android-&lt;version&gt;.jar</code> to the <code>/libs</code> folder in your application.</p>\n" + "			</div>\n" + "		</div>\n" + "	</div>\n" + '	<div class="tab-pane" id="new_project">\n' + '		<a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n' + "		<p>If you don't have a&nbsp;project yet, you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n" + "		<ul>\n" + "			<li>Locate the project template in the expanded SDK. It should be at the following location:\n" + "				<pre>&lt;sdk_root&gt;/new-project-template</pre>\n" + "			</li>\n" + "		</ul>\n" + "	</div>\n" + "</div>\n" + "<h2>2. Update permissions in AndroidManifest.xml</h2>\n" + "<p>Add the following Internet permissions to your application's <code>AndroidManifest.xml</code> file if they have not already been added. Note that with the exception of INTERNET, enabling all other permissions are optional.</p>\n" + "<pre>\n" + '&lt;uses-permission android:name="android.permission.INTERNET" /&gt;\n' + '&lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;\n' + '&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;\n' + '&lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&gt;\n' + '&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;\n' + "</pre>\n" + "<h2>3. Initialize the SDK</h2>\n" + "<p>To initialize the App Services SDK, you must instantiate the <code>ApigeeClient</code> class. There are multiple ways to handle this step, but we recommend that you do the following:</p>\n" + "<ol>\n" + "	<li>Subclass the <code>Application</code> class, and add an instance variable for the <code>ApigeeClient</code> to it, along with getter and setter methods.\n" + "		<pre>\n" + "public class YourApplication extends Application\n" + "{\n" + "        \n" + "        private ApigeeClient apigeeClient;\n" + "        \n" + "        public YourApplication()\n" + "        {\n" + "                this.apigeeClient = null;\n" + "        }\n" + "        \n" + "        public ApigeeClient getApigeeClient()\n" + "        {\n" + "                return this.apigeeClient;\n" + "        }\n" + "        \n" + "        public void setApigeeClient(ApigeeClient apigeeClient)\n" + "        {\n" + "                this.apigeeClient = apigeeClient;\n" + "        }\n" + "}			\n" + "		</pre>\n" + "	</li>\n" + "	<li>Declare the <code>Application</code> subclass in your <code>AndroidManifest.xml</code>. For example:\n" + "		<pre>\n" + "&lt;application&gt;\n" + '    android:allowBackup="true"\n' + '    android:icon="@drawable/ic_launcher"\n' + '    android:label="@string/app_name"\n' + '    android:name=".YourApplication"\n' + "	…\n" + "&lt;/application&gt;			\n" + "		</pre>\n" + "	</li>\n" + "	<li>Instantiate the <code>ApigeeClient</code> class in the <code>onCreate</code> method of your first <code>Activity</code> class:\n" + "		<pre>\n" + "import com.apigee.sdk.ApigeeClient;\n" + "\n" + "@Override\n" + "protected void onCreate(Bundle savedInstanceState) {\n" + "    super.onCreate(savedInstanceState);		\n" + "	\n" + '	String ORGNAME = "{{currentOrg}}";\n' + '	String APPNAME = "{{currentApp}}";\n' + "	\n" + "	ApigeeClient apigeeClient = new ApigeeClient(ORGNAME,APPNAME,this.getBaseContext());\n" + "\n" + "	// hold onto the ApigeeClient instance in our application object.\n" + "	YourApplication yourApp = (YourApplication) getApplication;\n" + "	yourApp.setApigeeClient(apigeeClient);			\n" + "}\n" + "		</pre>\n" + "		<p>This will make the instance of <code>ApigeeClient</code> available to your <code>Application</code> class.</p>\n" + "	</li>\n" + "</ol>\n" + "<h2>4. Import additional SDK classes</h2>\n" + "<p>The following classes will enable you to call common SDK methods:</p>\n" + "<pre>\n" + "import com.apigee.sdk.data.client.DataClient; //App Services data methods\n" + "import com.apigee.sdk.apm.android.MonitoringClient; //App Monitoring methods\n" + "import com.apigee.sdk.data.client.callbacks.ApiResponseCallback; //API response handling\n" + "import com.apigee.sdk.data.client.response.ApiResponse; //API response object\n" + "</pre>\n" + "		\n" + "<h2>5. Verify SDK installation</h2>\n" + "\n" + "<p>Once initialized, App Services will also automatically instantiate the <code>MonitoringClient</code> class and begin logging usage, crash and error metrics for your app.</p>\n" + '<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n' + "<p>To verify that the SDK has been properly initialized, run your app, then go to 'Monitoring' > 'App Usage' in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n" + '<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n' + "\n" + "<h2>Installation complete! Try these next steps</h2>\n" + "<ul>\n" + "	<li>\n" + "		<h3><strong>Call additional SDK methods in your code</strong></h3>\n" + "		<p>The <code>DataClient</code> and <code>MonitoringClient</code> classes are also automatically instantiated for you, and accessible with the following accessors:</p>\n" + "		<ul>\n" + "			<li>\n" + "				<pre>DataClient dataClient = apigeeClient.getDataClient();</pre>\n" + "				<p>Use this object to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</p>\n" + "			</li>\n" + "			<li>\n" + "				<pre>MonitoringClient monitoringClient = apigeeClient.getMonitoringClient();</pre>\n" + "				<p>Use this object to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</p>\n" + "			</li>\n" + "		</ul>\n" + "	</li>	\n" + "	<li>	\n" + "		<h3><strong>Add App Services features to your app</strong></h3>\n" + "		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n" + "		<ul>\n" + '			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n' + '			<li><strong>App Monitoring</strong>: When you initialize the App Services SDK, a suite of valuable, <a href="http://apigee.com/docs/node/13190">customizable</a> application monitoring features are automatically enabled that deliver the data you need to fine tune performance, analyze issues, and improve user experience.\n' + "				<ul>\n" + '					<li><strong><a href="http://apigee.com/docs/node/13176">App Usage Monitoring</a></strong>: Visit the <a href="https://apigee.com/usergrid">App Services admin portal</a> to view usage data for your app, including data on device models, platforms and OS versions running your app.</li>				\n' + '					<li><strong><a href="http://apigee.com/docs/node/12861">API Performance Monitoring</a></strong>: Network performance is key to a solid user experience. In the <a href="https://apigee.com/usergrid">App Services admin portal</a> you can view key metrics, including response time, number of requests and raw API request logs.</li>	\n' + '					<li><strong><a href="http://apigee.com/docs/node/13177">Error &amp; Crash Monitoring</a></strong>: Get alerted to any errors or crashes, then view them in the <a href="https://apigee.com/usergrid">App Services admin portal</a>, where you can also analyze raw error and crash logs.</li>\n' + "				</ul>		\n" + "			</li>\n" + '			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n' + "		</ul>\n" + "	</li>\n" + "	<li>	\n" + "		<h3><strong>Check out the sample apps</strong></h3>\n" + "		<p>The SDK includes samples that illustrate Apigee&nbsp;features. You'll find the samples in the following location in your SDK download:</p>\n" + "		<pre>\n" + "apigee-android-sdk-&lt;version&gt;\n" + "	...\n" + "	/samples\n" + "		</pre>\n" + '		<div id="collapse">\n' + '			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n' + "		</div>\n" + '		<div id="samples_collapse" class="collapse">\n' + "			<p>The samples include the following:</p>\n" + '			<table class="table">\n' + "				<thead>\n" + "					<tr>\n" + '						<th scope="col">Sample</th>\n' + '						<th scope="col">Description</th>\n' + "					</tr>\n" + "				</thead>\n" + "				<tbody>\n" + "					<tr>\n" + "						<td>books</td>\n" + "						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>messagee</td>\n" + "						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>push</td>\n" + "						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n" + "					</tr>\n" + "				</tbody>\n" + "			</table>\n" + "		</div>\n" + "	</li>\n" + "</ul>\n");
        $templateCache.put("app-overview/doc-includes/ios.html", "<h2>1. Integrate ApigeeiOSSDK.framework</h2>\n" + '<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n' + '<ul class="nav nav-tabs" id="myTab">\n' + '	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n' + '	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n' + "</ul>\n" + '<div class="tab-content">\n' + '	<div class="tab-pane active" id="existing_project">\n' + "		<p>If you've already got&nbsp;an Xcode iOS project, add it into your project as you normally would.</p>\n" + '		<div id="collapse"><a class="btn" data-toggle="collapse" href="#framework_collapse">Details</a></div>\n' + '		<div class="collapse" id="framework_collapse">\n' + "			<ol>\n" + "				<li>\n" + "					<p>Locate the SDK framework file so you can add it to your project. For example, you'll find the file at the following path:</p>\n" + "					<pre>\n" + "&lt;sdk_root&gt;/bin/ApigeeiOSSDK.framework</pre>\n" + "				</li>\n" + "				<li>In the <strong>Project Navigator</strong>, click on your project file, and then the <strong>Build Phases</strong> tab. Expand <strong>Link Binary With Libraries</strong>.</li>\n" + "				<li>Link the Apigee iOS SDK into your project.\n" + "					<ul>\n" + "						<li>Drag ApigeeiOSSDK.framework into the Frameworks group created by Xcode.</li>\n" + "					</ul>\n" + "					<p>OR</p>\n" + "					<ol>\n" + "						<li>At the bottom of the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button. Then click&nbsp;<strong>Add Other</strong>.</li>\n" + "						<li>Navigate to the directory that contains ApigeeiOSSDK.framework, and choose the ApigeeiOSSDK.framework folder.</li>\n" + "					</ol>\n" + "				</li>\n" + "			</ol>\n" + "		</div>\n" + "	</div>\n" + '	<div class="tab-pane" id="new_project"><a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n' + "		<p>If you're starting with a clean slate (you don't have a&nbsp;project yet), you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n" + "		<ol>\n" + "			<li>\n" + "				<p>Locate the project template in the expanded SDK. It should be at the following location:</p>\n" + "				<pre>\n" + "&lt;sdk_root&gt;/new-project-template</pre>\n" + "			</li>\n" + "			<li>In the project template directory, open the project file:&nbsp;Apigee App Services iOS Template.xcodeproj.</li>\n" + "			<li>Get acquainted with the template by looking at its readme file.</li>\n" + "		</ol>\n" + "	</div>\n" + "</div>\n" + "<h2>2. Add required iOS frameworks</h2>\n" + "<p>Ensure that the following iOS frameworks are part of your project. To add them, under the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button, type the name of the framework you want to add, select the framework found by Xcode, then click <strong>Add</strong>.</p>\n" + "<ul>\n" + "	<li>QuartzCore.framework</li>\n" + "	<li>CoreLocation.framework</li>\n" + "	<li>CoreTelephony.framework&nbsp;</li>\n" + "	<li>Security.framework</li>\n" + "	<li>SystemConfiguration.framework</li>\n" + "	<li>UIKit.framework</li>\n" + "</ul>\n" + "<h2>3. Update 'Other Linker Flags'</h2>\n" + "<p>In the <strong>Build Settings</strong> panel, add the following under <strong>Other Linker Flags</strong>:</p>\n" + "<pre>\n" + "-ObjC -all_load</pre>\n" + "<p>Confirm that flags are set for both <strong>DEBUG</strong> and <strong>RELEASE</strong>.</p>\n" + "<h2>4. Initialize the SDK</h2>\n" + '<p>The <em>ApigeeClient</em> class initializes the App Services SDK. To do this you will need your organization name and application name, which are available in the <em>Getting Started</em> tab of the <a href="https://www.apigee.com/usergrid/">App Service admin portal</a>, under <strong>Mobile SDK Keys</strong>.</p>\n' + "<ol>\n" + "	<li>Import the SDK\n" + "		<p>Add the following to your source code to import the SDK:</p>\n" + "		<pre>\n" + "#import &lt;ApigeeiOSSDK/Apigee.h&gt;</pre>\n" + "	</li>\n" + "	<li>\n" + "		<p>Declare the following properties in <code>AppDelegate.h</code>:</p>\n" + "		<pre>\n" + "@property (strong, nonatomic) ApigeeClient *apigeeClient; \n" + "@property (strong, nonatomic) ApigeeMonitoringClient *monitoringClient;\n" + "@property (strong, nonatomic) ApigeeDataClient *dataClient;	\n" + "		</pre>\n" + "	</li>\n" + "	<li>\n" + "		<p>Instantiate the <code>ApigeeClient</code> class inside the <code>didFinishLaunching</code> method of <code>AppDelegate.m</code>:</p>\n" + "		<pre>\n" + "//Replace 'AppDelegate' with the name of your app delegate class to instantiate it\n" + "AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n" + "\n" + "//Sepcify your App Services organization and application names\n" + 'NSString *orgName = @"{{currentOrg}}";\n' + 'NSString *appName = @"{{currentApp}}";\n' + "\n" + "//Instantiate ApigeeClient to initialize the SDK\n" + "appDelegate.apigeeClient = [[ApigeeClient alloc]\n" + "                            initWithOrganizationId:orgName\n" + "                            applicationId:appName];\n" + "                            \n" + "//Retrieve instances of ApigeeClient.monitoringClient and ApigeeClient.dataClient\n" + "self.monitoringClient = [appDelegate.apigeeClient monitoringClient]; \n" + "self.dataClient = [appDelegate.apigeeClient dataClient]; \n" + "		</pre>\n" + "	</li>\n" + "</ol>\n" + "\n" + "<h2>5. Verify SDK installation</h2>\n" + "\n" + "<p>Once initialized, App Services will also automatically instantiate the <code>ApigeeMonitoringClient</code> class and begin logging usage, crash and error metrics for your app.</p>\n" + "\n" + "<p>To verify that the SDK has been properly initialized, run your app, then go to <strong>'Monitoring' > 'App Usage'</strong> in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n" + '<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n' + '<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n' + "\n" + "<h2>Installation complete! Try these next steps</h2>\n" + "<ul>	\n" + "	<li>\n" + "		<h3><strong>Call additional SDK methods in your code</strong></h3>\n" + "		<p>Create an instance of the AppDelegate class, then use <code>appDelegate.dataClient</code> or <code>appDelegate.monitoringClient</code> to call SDK methods:</p>\n" + '		<div id="collapse"><a class="btn" data-toggle="collapse" href="#client_collapse">Details</a></div>\n' + '		<div class="collapse" id="client_collapse">\n' + "			<ul>\n" + "				<li><code>appDelegate.dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</li>\n" + "				<li><code>appDelegate.monitoringClient</code>: Used to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n" + "			</ul>\n" + "			<h3>Example</h3>\n" + "			<p>For example, you could create a new entity with the following:</p>\n" + "			<pre>\n" + "AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n" + "ApigeeClientResponse *response = [appDelegate.dataClient createEntity:entity];\n" + "			</pre>\n" + "		</div>\n" + "\n" + "	</li>\n" + "	<li>\n" + "		<h3><strong>Add App Services features to your app</strong></h3>\n" + "		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n" + "		<ul>\n" + '			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n' + "		</ul>\n" + "	</li>\n" + "	<li>\n" + "		<h3><strong>Check out the sample apps</strong></h3>\n" + '		<p>The SDK includes samples that illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. To get a sample app running, open its project file, then follow the steps described in the section, <a target="_blank" href="http://apigee.com/docs/app-services/content/installing-apigee-sdk-ios">Add the SDK to an existing project</a>.</p>\n' + "		<p>You'll find the samples in the following location in your SDK download:</p>\n" + "		<pre>\n" + "apigee-ios-sdk-&lt;version&gt;\n" + "    ...\n" + "    /samples\n" + "		</pre>\n" + '		<div id="collapse"><a class="btn" data-toggle="collapse" href="#samples_collapse">Details</a></div>\n' + '		<div class="collapse" id="samples_collapse">\n' + "			<p>The samples include the following:</p>\n" + '			<table class="table">\n' + "				<thead>\n" + "					<tr>\n" + '						<th scope="col">Sample</th>\n' + '						<th scope="col">Description</th>\n' + "					</tr>\n" + "				</thead>\n" + "				<tbody>\n" + "					<tr>\n" + "						<td>books</td>\n" + "						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>messagee</td>\n" + "						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>push</td>\n" + "						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n" + "					</tr>\n" + "				</tbody>\n" + "			</table>\n" + "		</div>\n" + "		<p>&nbsp;</p>\n" + "	</li>\n" + "</ul>\n");
        $templateCache.put("app-overview/doc-includes/javascript.html", "<h2>1. Import the SDK into your HTML</h2>\n" + "<p>To enable support for Apigee-related functions in your HTML, you'll need to&nbsp;include <code>apigee.js</code> in your app. To do this, add the following to the <code>head</code> block of your HTML:</p>\n" + "<pre>\n" + '&lt;script type="text/javascript" src="path/to/js/sdk/apigee.js"&gt;&lt;/script&gt;\n' + "</pre>\n" + "<h2>2. Instantiate Apigee.Client</h2>\n" + "<p>Apigee.Client initializes the App Services SDK, and gives you access to all of the App Services SDK methods.</p>\n" + "<p>You will need to pass a JSON object with the UUID or name for your App Services organization and application when you instantiate it.</p>\n" + "<pre>\n" + "//Apigee account credentials, available in the App Services admin portal \n" + "var client_creds = {\n" + "        orgName:'{{currentOrg}}',\n" + "        appName:'{{currentApp}}'\n" + "    }\n" + "\n" + "//Initializes the SDK. Also instantiates Apigee.MonitoringClient\n" + "var dataClient = new Apigee.Client(client_creds);  \n" + "</pre>\n" + "\n" + "<h2>3. Verify SDK installation</h2>\n" + "\n" + "<p>Once initialized, App Services will also automatically instantiate <code>Apigee.MonitoringClient</code> and begin logging usage, crash and error metrics for your app.</p>\n" + "\n" + "<p>To verify that the SDK has been properly initialized, run your app, then go to <strong>'Monitoring' > 'App Usage'</strong> in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n" + '<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n' + '<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n' + "\n" + "<h2>Installation complete! Try these next steps</h2>\n" + "<ul>\n" + "	<li>	\n" + "		<h3><strong>Call additional SDK methods in your code</strong></h3>\n" + "		<p>Use <code>dataClient</code> or <code>dataClient.monitor</code> to call SDK methods:</p>\n" + '		<div id="collapse">\n' + '			<a href="#client_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n' + "		</div>\n" + '		<div id="client_collapse" class="collapse">\n' + "			<ul>\n" + "				<li><code>dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</li>\n" + "				<li><code>dataClient.monitor</code>: Used to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n" + "			</ul>\n" + "		</div>\n" + "	</li>	\n" + "	<li>\n" + "		<h3><strong>Add App Services features to your app</strong></h3>\n" + "		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n" + "		<ul>\n" + '			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Keep your app highly-relevant by targeting users or returning result sets based on user location.</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement registration, login and OAuth 2.0-compliant authentication.</li>\n' + "		</ul>\n" + "	</li>\n" + "	<li>\n" + "		<h3><strong>Check out the sample apps</strong></h3>\n" + "		<p>The SDK includes samples that illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. You'll find the samples in the following location in your SDK download:</p>\n" + "		<pre>\n" + "apigee-javascript-sdk-master\n" + "    ...\n" + "    /samples		\n" + "		</pre>\n" + '		<div id="collapse">\n' + '			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n' + "		</div>\n" + '		<div id="samples_collapse" class="collapse">\n' + "			<p>The samples include the following:</p>\n" + '			<table class="table">\n' + "				<thead>\n" + "					<tr>\n" + '						<th scope="col">Sample</th>\n' + '						<th scope="col">Description</th>\n' + "					</tr>\n" + "				</thead>\n" + "				<tbody>\n" + "					<tr>\n" + "						<td>booksSample.html</td>\n" + "						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>messagee</td>\n" + "						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>monitoringSample.html</td>\n" + "						<td>Shows basic configuration and initialization of the HTML5 app monitoring functionality. Works in browser, PhoneGap, Appcelerator, and Trigger.io.</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>readmeSample.html</td>\n" + "						<td>A simple app for reading data from an Apigee database.</td>\n" + "					</tr>\n" + "				</tbody>\n" + "			</table>\n" + "		</div>	\n" + "	</li>				\n" + "</ul>\n");
        $templateCache.put("app-overview/doc-includes/net.html", "");
        $templateCache.put("app-overview/doc-includes/node.html", "");
        $templateCache.put("app-overview/doc-includes/ruby.html", "");
        $templateCache.put("app-overview/getting-started.html", '<div class="setup-sdk-content" >\n' + "\n" + '  <bsmodal id="regenerateCredentials"\n' + '           title="Confirmation"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="regenerateCredentialsDialog"\n' + '           extrabuttonlabel="Yes"\n' + "           ng-cloak>\n" + "    Are you sure you want to regenerate the credentials?\n" + "  </bsmodal>\n" + "\n" + '    <page-title icon="&#128640;" title="Getting Started"></page-title>\n' + "\n" + '  <section class="row-fluid">\n' + "\n" + "\n" + "\n" + "\n" + '    <div class="span8">\n' + "\n" + '      <h2 class="title">Install the SDK for app {{currentApp}}</h2>\n' + "      <p>Click on a platform icon below to view SDK installation instructions for that platform.</p>\n" + '      <ul class="inline unstyled">\n' + '        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ios"><i class="sdk-icon-large-ios"></i></a></li>-->\n' + '        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#android"><i class="sdk-icon-large-android"></i></a></li>-->\n' + '        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#javascript"><i class="sdk-icon-large-js"></i></a></li>-->\n' + "\n" + "\n" + "        <li ng-click=\"showSDKDetail('ios')\"\n" + '            analytics-on="click"\n' + '            analytics-label="App Services"\n' + '            analytics-category="Getting Started"\n' + '            analytics-event="iOS SDK"><i class="sdk-icon-large-ios"></i></li>\n' + "        <li ng-click=\"showSDKDetail('android')\"\n" + '            analytics-on="click"\n' + '            analytics-label="App Services"\n' + '            analytics-category="Getting Started"\n' + '            analytics-event="Android SDK"><i class="sdk-icon-large-android"></i></li>\n' + "        <li ng-click=\"showSDKDetail('javascript')\"\n" + '            analytics-on="click"\n' + '            analytics-label="App Services"\n' + '            analytics-category="Getting Started"\n' + '            analytics-event="JS SDK"><i class="sdk-icon-large-js"></i></li>\n' + '        <li><a target="_blank"\n' + "               ng-click=\"showSDKDetail('nocontent')\"\n" + '               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#nodejs"\n' + '               analytics-on="click"\n' + '               analytics-label="App Services"\n' + '               analytics-category="Getting Started"\n' + '               analytics-event="Node SDK"><i class="sdk-icon-large-node"></i></a></li>\n' + '        <li><a target="_blank"\n' + "               ng-click=\"showSDKDetail('nocontent')\"\n" + '               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ruby"\n' + '               analytics-on="click"\n' + '               analytics-label="App Services"\n' + '               analytics-category="Getting Started"\n' + '               analytics-event="Ruby SDK"><i class="sdk-icon-large-ruby"></i></a></li>\n' + '        <li><a target="_blank"\n' + "               ng-click=\"showSDKDetail('nocontent')\"\n" + '               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#c"\n' + '               analytics-on="click"\n' + '               analytics-label="App Services"\n' + '               analytics-category="Getting Started"\n' + '               analytics-event="DotNet SDK"><i class="sdk-icon-large-net"></i></a></li>\n' + "       </ul>\n" + "\n" + '      <section id="intro-container" class="row-fluid intro-container">\n' + "\n" + '        <div class="sdk-intro">\n' + "        </div>\n" + "\n" + '        <div class="sdk-intro-content">\n' + "\n" + '          <a class="btn normal white pull-right" ng-href="{{sdkLink}}" target="_blank">\n' + "            Download SDK\n" + "          </a>\n" + '          <a class="btn normal white pull-right" ng-href="{{docsLink}}" target="_blank">\n' + "            More Docs\n" + "          </a>\n" + '          <h3 class="title"><i class="pictogram">&#128213;</i>{{contentTitle}}</h3>\n' + "\n" + '          <div ng-include="getIncludeURL()"></div>\n' + "        </div>\n" + "\n" + "      </section>\n" + "    </div>\n" + "\n" + '    <div class="span4 keys-creds">\n' + '      <h2 class="title">Mobile sdk keys</h2>\n' + "      <p>For mobile SDK initialization.</p>\n" + '      <dl class="app-creds">\n' + "        <dt>Org Name</dt>\n" + "        <dd>{{currentOrg}}</dd>\n" + "        <dt>App Name</dt>\n" + "        <dd>{{currentApp}}</dd>\n" + "      </dl>\n" + '      <h2 class="title">Server app credentials</h2>\n' + "      <p>For authenticating from a server side app (i.e. Ruby, .NET, etc.)</p>\n" + '      <dl class="app-creds">\n' + "        <dt>Client ID</dt>\n" + "        <dd>{{clientID}}</dd>\n" + "        <dt>Client Secret</dt>\n" + "        <dd>{{clientSecret}}</dd>\n" + "        <dt>\n" + "           &nbsp;\n" + "        </dt>\n" + "        <dd>&nbsp;</dd>\n" + "\n" + "        <dt>\n" + '          <a class="btn filter-selector" ng-click="showModal(\'regenerateCredentials\')">Regenerate</a>\n' + "        </dt>\n" + "        <dd></dd>\n" + "      </dl>\n" + "\n" + "    </div>\n" + "\n" + "  </section>\n" + "</div>");
        $templateCache.put("data/data.html", '<div class="content-page">\n' + "\n" + '  <bsmodal id="newCollection"\n' + '           title="Create new collection"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="newCollectionDialog"\n' + '           extrabuttonlabel="Create"\n' + '           buttonid="collection"\n' + "           ng-cloak>\n" + "    <fieldset>\n" + '      <div class="control-group">\n' + '        <label for="new-collection-name">Collection Name:</label>\n' + '        <div class="controls">\n' + '          <input type="text" ug-validate required ng-pattern="collectionNameRegex" ng-attr-title="{{collectionNameRegexDescription}}" ng-model="$parent.newCollection.name" name="collection" id="new-collection-name" class="input-xlarge"/>\n' + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + "    </fieldset>\n" + "  </bsmodal>\n" + "\n" + '  <div id="intro-page">    \n' + '    <page-title title=" Collections" icon="&#128254;"></page-title>\n' + "  </div>\n" + "\n" + '  <section class="row-fluid">\n' + '    <div id="intro-list" class="span3 user-col">\n' + '      <a class="btn btn-primary" id="new-collection-link" ng-click="showModal(\'newCollection\')">New Collection</a>\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data new collection\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_new_collection}}" tooltip-placement="right">(?)</a>\n' + '        <ul  class="user-list">\n' + "          <li ng-class=\"queryCollection._type === entity.name ? 'selected' : ''\" ng-repeat=\"entity in collectionList\" ng-click=\"loadCollection('/'+entity.name);\">\n" + '            <a id="collection-{{entity.name}}-link" href="javaScript:void(0)">/{{entity.name}} </a>\n' + "          </li>\n" + "        </ul>\n" + "\n" + "  </div>\n" + "\n" + '    <div class="span9 tab-content">\n' + '      <div class="content-page">\n' + '        <form id="intro-collection-query" name="dataForm" ng-submit="run();">\n' + "        <fieldset>\n" + '          <div class="control-group">\n' + '            <div class="" data-toggle="buttons-radio">\n' + '              <!--a class="btn" id="button-query-back">&#9664; Back</a-->\n' + "              <!--Added disabled class to change the way button looks but their functionality is as usual -->\n" + '              <label class="control-label" style="display:none"><strong>Method</strong> <a id="query-method-help" href="#" class="help-link">get help</a></label>\n' + '              <input type="radio" id="create-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPOST();" ng-checked="verb==\'POST\'"> CREATE &nbsp; &nbsp;\n' + '              <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ &nbsp; &nbsp;\n' + '              <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE &nbsp; &nbsp;\n' + '                <input type="radio" id="delete-rb" name="query-action" style="margin-top: -2px;" ng-click="selectDELETE();" ng-checked="verb==\'DELETE\'"> DELETE             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data query verbs\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_verb_buttons}}" tooltip-placement="right">(?)</a>\n' + "            </div>\n" + "          </div>\n" + "\n" + '          <div class="control-group">\n' + "            <strong>Path </strong>\n" + '            <div class="controls">\n' + '              <input ng-model="data.queryPath" type="text" ug-validate id="pathDataQuery" ng-attr-title="{{pathRegexDescription}}" ng-pattern="pathRegex" class="span6" autocomplete="off" placeholder="ex: /users" required/>\n' + '              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data query path\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_path_box}}" tooltip-placement="right">(?)</a>\n' + "            </div>\n" + "          </div>\n" + '          <div class="control-group">\n' + '            <a id="back-to-collection" class="outside-link" style="display:none">Back to collection</a>\n' + "          </div>\n" + '          <div class="control-group">\n' + "            <strong>Query</strong>\n" + '            <div class="controls">\n' + '              <input ng-model="data.searchString" type="text" class="span6" autocomplete="off" placeholder="ex: select * where name=\'fred\'"/>\n' + '              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data query string\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_query_box}}" tooltip-placement="right">(?)</a>\n' + '              <div style="display:none">\n' + '                <a class="btn dropdown-toggle " data-toggle="dropdown">\n' + '                  <span id="query-collections-caret" class="caret"></span>\n' + "                </a>\n" + '                <ul id="query-collections-indexes-list" class="dropdown-menu ">\n' + "                </ul>\n" + "              </div>\n" + "            </div>\n" + "          </div>\n" + "\n" + "\n" + "          <div class=\"control-group\" ng-show=\"verb=='GET' || verb=='DELETE'\">\n" + '            <label class="control-label" for="query-limit"><strong>Limit</strong>\n' + '              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data limit\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_limit}}" tooltip-placement="right">(?)</a><a id="query-limit-help" href="#" ng-show="false" class="help-link">get help</a></label>\n' + '            <div class="controls">\n' + '              <div class="input-append">\n' + '                <input ng-model="data.queryLimit" type="text" class="span5" id="query-limit" placeholder="ex: 10">\n' + "              </div>\n" + "            </div>\n" + "          </div>\n" + "\n" + '          <div class="control-group" style="display:{{queryBodyDisplay}}">\n' + '            <label class="control-label" for="query-source"><strong>JSON Body</strong>\n' + '              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data json body\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_json_body}}" tooltip-placement="right">(?)</a> <a id="query-json-help" href="#" ng-show="false" class="help-link">get help</a></label>\n' + '            <div class="controls">\n' + '            <textarea ng-model="data.queryBody" id="query-source" class="span6 pull-left" rows="4">\n' + '      { "name":"value" }\n' + "            </textarea>\n" + "              <br>\n" + '            <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n' + '                <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data validate json\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_json_validate}}" tooltip-placement="right">(?)</a>\n' + "            </div>\n" + "          </div>\n" + '          <div style="clear: both; height: 10px;"></div>\n' + '          <div class="control-group">\n' + '            <input type="submit" ng-disabled="!dataForm.$valid || loading" class="btn btn-primary" id="button-query"  value="{{loading ? loadingText : \'Run Query\'}}"/>\n' + '            <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data run query\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_run_query}}" tooltip-placement="right">(?)</a>\n' + "          </div>\n" + "        </fieldset>\n" + "       </form>\n" + '        <div id="intro-entity-list">\n' + "          <div ng-include=\"display=='generic' ? 'data/display-generic.html' : ''\"></div>\n" + "          <div ng-include=\"display=='users' ? 'data/display-users.html' : ''\"></div>\n" + "          <div ng-include=\"display=='groups' ? 'data/display-groups.html' : ''\"></div>\n" + "          <div ng-include=\"display=='roles' ? 'data/display-roles.html' : ''\"></div>\n" + "        </div>\n" + "\n" + "      </div>\n" + "\n" + "      </div>\n" + "    </section>\n" + "\n" + "</div>\n" + "\n");
        $templateCache.put("data/display-generic.html", "\n" + "\n" + '<bsmodal id="deleteEntities"\n' + '         title="Are you sure you want to delete the entities(s)?"\n' + '         close="hideModal"\n' + '         closelabel="Cancel"\n' + '         extrabutton="deleteEntitiesDialog"\n' + '         extrabuttonlabel="Delete"\n' + '         buttonid="del-entity"\n' + "         ng-cloak>\n" + "    <fieldset>\n" + '        <div class="control-group">\n' + "        </div>\n" + "    </fieldset>\n" + "</bsmodal>\n" + "\n" + '<span class="button-strip">\n' + '  <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data entities list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_entities_list}}" tooltip-placement="left">(?)</a>\n' + '  <button class="btn btn-primary" ng-disabled="!valueSelected(queryCollection._list) || deleteLoading" ng-click="deleteEntitiesDialog()">{{deleteLoading ? loadingText : \'Delete Entity(s)\'}}</button>\n' + "</span>\n" + '<table class="table table-striped collection-list">\n' + "  <thead>\n" + '  <tr class="table-header">\n' + '    <th><input type="checkbox" ng-show="queryCollection._list.length > 0" id="selectAllCheckbox" ng-model="queryBoxesSelected" ng-click="selectAllEntities(queryCollection._list,$parent,\'queryBoxesSelected\',true)"></th>\n' + "    <th ng-if=\"hasProperty('name')\">Name</th>\n" + "    <th>UUID</th>\n" + "    <th></th>\n" + "  </tr>\n" + "  </thead>\n" + '  <tbody ng-repeat="entity in queryCollection._list">\n' + '  <tr class="zebraRows" >\n' + "    <td>\n" + "      <input\n" + '        type="checkbox"\n' + '        id="entity-{{entity._data.name}}-cb"\n' + '        ng-value="entity._data.uuid"\n' + '        ng-model="entity.checked"\n' + "        >\n" + "    </td>\n" + "    <td ng-if=\"hasProperty('name')\">{{entity._data.name}}</td>\n" + "    <td>{{entity._data.uuid}}</td>\n" + "    <td><a href=\"javaScript:void(0)\" ng-click=\"entitySelected[$index] = !entitySelected[$index]; selectEntity(entity._data.uuid, entitySelected[$index]);\">{{entitySelected[$index] ? 'Hide' : 'View'}} Details</a></td>\n" + "  </tr>\n" + '  <tr ng-if="entitySelected[$index]">\n' + '    <td colspan="5">\n' + "\n" + "\n" + '      <h4 style="margin: 0 0 20px 0">Entity Detail</h4>\n' + "\n" + "\n" + '      <ul class="formatted-json">\n' + '        <li ng-repeat="(k,v) in entity._data track by $index">\n' + '          <span class="key">{{k}} :</span>\n' + "          <!--todo - doing manual recursion to get this out the door for launch, please fix-->\n" + '          <span ng-switch on="isDeep(v)">\n' + '            <ul ng-switch-when="true">\n' + '              <li ng-repeat="(k2,v2) in v"><span class="key">{{k2}} :</span>\n' + "\n" + '                <span ng-switch on="isDeep(v2)">\n' + '                  <ul ng-switch-when="true">\n' + '                    <li ng-repeat="(k3,v3) in v2"><span class="key">{{k3}} :</span><span class="value">{{v3}}</span></li>\n' + "                  </ul>\n" + '                  <span ng-switch-when="false">\n' + '                    <span class="value">{{v2}}</span>\n' + "                  </span>\n" + "                </span>\n" + "              </li>\n" + "            </ul>\n" + '            <span ng-switch-when="false">\n' + '              <span class="value">{{v}}</span>\n' + "            </span>\n" + "          </span>\n" + "        </li>\n" + "      </ul>\n" + "\n" + '    <div class="control-group">\n' + '      <h4 style="margin: 20px 0 20px 0">Edit Entity <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data edit entity\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_edit_entity}}" tooltip-placement="right">(?)</a></h4>\n' + '      <div class="controls">\n' + '        <textarea ng-model="entity._json" class="span12" rows="12"></textarea>\n' + "        <br>\n" + '        <a class="btn btn-primary toolbar pull-left" ng-click="validateJson();">Validate JSON</a><button type="button" class="btn btn-primary pull-right" id="button-query" ng-click="saveEntity(entity);">Save</button>\n' + "      </div>\n" + "    </div>\n" + "  </td>\n" + "  </tr>\n" + "\n" + '  <tr ng-show="queryCollection._list.length == 0">\n' + '    <td colspan="4">No data found</td>\n' + "  </tr>\n" + "  </tbody>\n" + "</table>\n" + '<div style="padding: 10px 5px 10px 5px">\n' + '  <button class="btn btn-primary toolbar" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n' + '  <button class="btn btn-primary toolbar" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n' + "</div>\n" + "\n");
        $templateCache.put("data/display-groups.html", "");
        $templateCache.put("data/display-roles.html", "roles---------------------------------");
        $templateCache.put("data/display-users.html", "\n" + '<table id="query-response-table" class="table">\n' + "  <tbody>\n" + '  <tr class="zebraRows users-row">\n' + '    <td class="checkboxo">\n' + '      <input type="checkbox" onclick="Usergrid.console.selectAllEntities(this);"></td>\n' + '    <td class="gravatar50-td">&nbsp;</td>\n' + '    <td class="user-details bold-header">Username</td>\n' + '    <td class="user-details bold-header">Display Name</td>\n' + '    <td class="user-details bold-header">UUID</td>\n' + '    <td class="view-details">&nbsp;</td>\n' + "  </tr>\n" + '  <tr class="zebraRows users-row">\n' + '    <td class="checkboxo">\n' + '      <input class="listItem" type="checkbox" name="/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7" value="bf9a95da-d508-11e2-bf44-236d2eee13a7">\n' + "    </td>\n" + '    <td class="gravatar50-td">\n' + '      <img src="http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e" class="gravatar50">\n' + "    </td>\n" + '    <td class="details">\n' + "      <a onclick=\"Usergrid.console.getCollection('GET', '/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/'+'bf9a95da-d508-11e2-bf44-236d2eee13a7'); $('#data-explorer').show(); return false;\" class=\"view-details\">10</a>\n" + "    </td>\n" + '    <td class="details">      #"&gt;&lt;img src=x onerror=prompt(1);&gt;   </td>\n' + '    <td class="details">     bf9a95da-d508-11e2-bf44-236d2eee13a7   </td>\n' + '    <td class="view-details">\n' + '      <a href="" onclick="$(\'#query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7\').toggle(); $(\'#data-explorer\').show(); return false;" class="view-details">Details</a>\n' + "    </td>\n" + "  </tr>\n" + '  <tr id="query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n' + '    <td colspan="5">\n' + "      <div>\n" + '        <div style="padding-bottom: 10px;">\n' + '          <button type="button" class="btn btn-small query-button active" id="button-query-show-row-JSON" onclick="Usergrid.console.activateQueryRowJSONButton(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">JSON</button>\n' + '          <button type="button" class="btn btn-small query-button disabled" id="button-query-show-row-content" onclick="Usergrid.console.activateQueryRowContentButton();$(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">Content</button>\n' + "        </div>\n" + '        <div id="query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7">\n' + "              <pre>{\n" + '  "picture": "http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e",\n' + '  "uuid": "bf9a95da-d508-11e2-bf44-236d2eee13a7",\n' + '  "type": "user",\n' + '  "name": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;",\n' + '  "created": 1371224432557,\n' + '  "modified": 1371851347024,\n' + '  "username": "10",\n' + '  "email": "fdsafdsa@ookfd.com",\n' + '  "activated": "true",\n' + '  "adr": {\n' + '    "addr1": "",\n' + '    "addr2": "",\n' + '    "city": "",\n' + '    "state": "",\n' + '    "zip": "",\n' + '    "country": ""\n' + "  },\n" + '  "metadata": {\n' + '    "path": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7",\n' + '    "sets": {\n' + '      "rolenames": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames",\n' + '      "permissions": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions"\n' + "    },\n" + '    "collections": {\n' + '      "activities": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities",\n' + '      "devices": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices",\n' + '      "feed": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed",\n' + '      "groups": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups",\n' + '      "roles": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles",\n' + '      "following": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following",\n' + '      "followers": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers"\n' + "    }\n" + "  },\n" + '  "title": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;"\n' + "}</pre>\n" + "        </div>\n" + '        <div id="query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n' + "          <table>\n" + "            <tbody>\n" + "            <tr>\n" + "              <td>picture</td>\n" + '              <td>http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e</td></tr><tr><td>uuid</td><td>bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>type</td><td>user</td></tr><tr><td>name</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td></tr><tr><td>created</td><td>1371224432557</td></tr><tr><td>modified</td><td>1371851347024</td></tr><tr><td>username</td><td>10</td></tr><tr><td>email</td><td>fdsafdsa@ookfd.com</td></tr><tr><td>activated</td><td>true</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>addr1</td><td></td></tr><tr><td>addr2</td><td></td></tr><tr><td>city</td><td></td></tr><tr><td>state</td><td></td></tr><tr><td>zip</td><td></td></tr><tr><td>country</td><td></td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>path</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>rolenames</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames</td></tr><tr><td>permissions</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions</td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>activities</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities</td></tr><tr><td>devices</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices</td></tr><tr><td>feed</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed</td></tr><tr><td>groups</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups</td></tr><tr><td>roles</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles</td></tr><tr><td>following</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following</td></tr><tr><td>followers</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers</td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td>title</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td>\n' + "            </tr>\n" + "            </tbody>\n" + "          </table>\n" + "        </div>\n" + "      </div>\n" + "    </td>\n" + "  </tr>\n" + "  </tbody>\n" + "</table>");
        $templateCache.put("data/entity.html", '<div class="content-page">\n' + "\n" + "  <h4>Entity Detail</h4>\n" + '  <div class="well">\n' + '    <a href="#!/data" class="outside-link"><< Back to collection</a>\n' + "  </div>\n" + "  <fieldset>\n" + '    <div class="control-group">\n' + "      <strong>Path </strong>\n" + '      <div class="controls">\n' + "        {{entityType}}/{{entityUUID}}\n" + "      </div>\n" + "    </div>\n" + "\n" + '    <div class="control-group">\n' + '      <label class="control-label" for="query-source"><strong>JSON Body</strong></label>\n' + '      <div class="controls">\n' + '        <textarea ng-model="queryBody" class="span6 pull-left" rows="12">{{queryBody}}</textarea>\n' + "        <br>\n" + '        <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n' + "      </div>\n" + "    </div>\n" + '    <div style="clear: both; height: 10px;"></div>\n' + '    <div class="control-group">\n' + '      <button type="button" class="btn btn-primary" id="button-query" ng-click="saveEntity();">Save</button>\n' + '      <!--button type="button" class="btn btn-primary" id="button-query" ng-click="run();">Delete</button-->\n' + "    </div>\n" + "  </fieldset>\n" + "\n" + "</div>\n" + "\n");
        $templateCache.put("dialogs/modal.html", '    <div class="modal show fade" tabindex="-1" role="dialog" aria-hidden="true">\n' + '        <form ng-submit="extraDelegate(extrabutton)" name="dialogForm" novalidate>\n' + "\n" + '        <div class="modal-header">\n' + '            <h1 class="title">{{title}}</h1>\n' + "        </div>\n" + "\n" + '        <div class="modal-body" ng-transclude></div>\n' + '        <div class="modal-footer">\n' + "            {{footertext}}\n" + '            <input type="submit" class="btn" id="dialogButton-{{buttonId}}" ng-if="extrabutton" ng-disabled="!dialogForm.$valid" aria-hidden="true" ng-value="extrabuttonlabel"/>\n' + '            <button class="btn cancel pull-left" data-dismiss="modal" aria-hidden="true"\n' + '                    ng-click="closeDelegate(close)">{{closelabel}}\n' + "            </button>\n" + "        </div>\n" + "        </form>    </div>\n");
        $templateCache.put("global/appswitcher-template.html", '<li id="globalNav" class="dropdown dropdownContainingSubmenu active">\n' + '  <a class="dropdown-toggle" data-toggle="dropdown">API Platform<b class="caret"></b></a>\n' + '  <ul class="dropdown-menu pull-right">\n' + '    <li id="globalNavSubmenuContainer">\n' + "      <ul>\n" + '        <li data-globalNavDetail="globalNavDetailApigeeHome"><a target="_blank" href="http://apigee.com">Apigee Home</a></li>\n' + '        <li data-globalNavDetail="globalNavDetailAppServices" class="active"><a target="_blank" href="https://apigee.com/usergrid/">App Services</a></li>\n' + '        <li data-globalNavDetail="globalNavDetailApiPlatform" ><a target="_blank" href="https://enterprise.apigee.com">API Platform</a></li>\n' + '        <li data-globalNavDetail="globalNavDetailApiConsoles"><a target="_blank" href="http://apigee.com/providers">API Consoles</a></li>\n' + "      </ul>\n" + "    </li>\n" + '    <li id="globalNavDetail">\n' + '      <div id="globalNavDetailApigeeHome">\n' + '        <div class="globalNavDetailApigeeLogo"></div>\n' + '        <div class="globalNavDetailDescription">You need apps and apps need APIs. Apigee is the leading API platform for enterprises and developers.</div>\n' + "      </div>\n" + '      <div id="globalNavDetailAppServices">\n' + '        <div class="globalNavDetailSubtitle">For App Developers</div>\n' + '        <div class="globalNavDetailTitle">App Services</div>\n' + '        <div class="globalNavDetailDescription">Build engaging applications, store data, manage application users, and more.</div>\n' + "      </div>\n" + '      <div id="globalNavDetailApiPlatform">\n' + '        <div class="globalNavDetailSubtitle">For API Developers</div>\n' + '        <div class="globalNavDetailTitle">API Platform</div>\n' + '        <div class="globalNavDetailDescription">Create, configure, manage and analyze your APIs and resources.</div>\n' + "      </div>\n" + '      <div id="globalNavDetailApiConsoles">\n' + '        <div class="globalNavDetailSubtitle">For API Developers</div>\n' + '        <div class="globalNavDetailTitle">API Consoles</div>\n' + '        <div class="globalNavDetailDescription">Explore over 100 APIs with the Apigee API Console, or create and embed your own API Console.</div>\n' + "      </div>\n" + "    </li>\n" + "  </ul>\n" + "</li>");
        $templateCache.put("global/insecure-banner.html", '<div ng-if="securityWarning" ng-cloak class="demo-holder">\n' + '    <div class="alert alert-demo alert-animate">\n' + '        <div class="alert-text">\n' + '            <i class="pictogram">&#9888;</i>Warning: This application has "sandbox" permissions and is not production ready. <a target="_blank" href="http://apigee.com/docs/app-services/content/securing-your-app">Please go to our security documentation to find out more.</a></span>\n' + "        </div>\n" + "    </div>\n" + "</div>");
        $templateCache.put("global/page-title.html", '<section class="row-fluid">\n' + '    <div class="span12">\n' + '        <div class="page-filters">\n' + '            <h1 class="title pull-left" id="pageTitle"><i class="pictogram title" style="padding-right: 5px;">{{icon}}</i>{{title}} <a class="super-help" href="http://community.apigee.com/content/apigee-customer-support" target="_blank"  >(need help?)</a></h1>\n' + "        </div>\n" + "    </div>\n" + '    <bsmodal id="need-help"\n' + '             title="Need Help?"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="sendHelp"\n' + '             extrabuttonlabel="Get Help"\n' + "             ng-cloak>\n" + "        <p>Do you want to contact support? Support will get in touch with you as soon as possible.</p>\n" + "    </bsmodal>\n" + "</section>\n" + "\n");
        $templateCache.put("groups/groups-activities.html", '<div class="content-page" ng-controller="GroupsActivitiesCtrl">\n' + "\n" + "  <br>\n" + "  <div>\n" + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + "        <td>Date</td>\n" + "        <td>Content</td>\n" + "        <td>Verb</td>\n" + "        <td>UUID</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="activity in selectedGroup.activities">\n' + "        <td>{{activity.createdDate}}</td>\n" + "        <td>{{activity.content}}</td>\n" + "        <td>{{activity.verb}}</td>\n" + "        <td>{{activity.uuid}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "  </div>\n" + "\n" + "\n" + "</div>");
        $templateCache.put("groups/groups-details.html", '<div class="content-page" ng-controller="GroupsDetailsCtrl">\n' + "\n" + "  <div>\n" + '      <form name="updateGroupDetailForm" ng-submit="saveSelectedGroup()" novalidate>\n' + '          <div style="float: left; padding-right: 30px;">\n' + '              <h4 class="ui-dform-legend">Group Information</h4>\n' + '              <label for="group-title" class="ui-dform-label">Group Title</label>\n' + '              <input type="text" id="group-title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required class="ui-dform-text" ng-model="group.title" ug-validate>\n' + '                  <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group title box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_title}}" tooltip-placement="right">(?)</a>\n' + "              <br/>\n" + '            <label for="group-path" class="ui-dform-label">Group Path</label>\n' + '            <input type="text" id="group-path" required ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" class="ui-dform-text" ng-model="group.path" ug-validate>\n' + '                <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_path}}" tooltip-placement="right">(?)</a>\n' + "            <br/>\n" + "          </div>\n" + '          <br style="clear:both"/>\n' + "\n" + '          <div style="width:100%;float:left;padding: 20px 0">\n' + '              <input type="submit" value="Save Group" style="margin-right: 15px;" ng-disabled="!updateGroupDetailForm.$valid" class="btn btn-primary" />\n' + "          </div>\n" + "\n" + '          <div class="content-container">\n' + '              <h4>JSON Group Object <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group json object\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_json_object}}" tooltip-placement="right">(?)</a></h4>\n' + '              <pre id="{{help.showJsonId}}">{{json}}</pre>\n' + "          </div>\n" + "      </form>\n" + "  </div>\n" + "\n" + "\n" + "</div>");
        $templateCache.put("groups/groups-members.html", '<div class="content-page" ng-controller="GroupsMembersCtrl">\n' + "\n" + "\n" + '  <bsmodal id="removeFromGroup"\n' + '           title="Confirmation"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="removeUsersFromGroupDialog"\n' + '           extrabuttonlabel="Delete"\n' + "           ng-cloak>\n" + "    <p>Are you sure you want to remove the users from the seleted group(s)?</p>\n" + "  </bsmodal>\n" + "\n" + '  <bsmodal id="addGroupToUser"\n' + '           title="Add user to group"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="addGroupToUserDialog"\n' + '           extrabuttonlabel="Add"\n' + "           ng-cloak>\n" + '    <div class="btn-group">\n' + '      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n' + "        <span class=\"filter-label\">{{$parent.user != '' ? $parent.user.username : 'Select a user...'}}</span>\n" + '        <span class="caret"></span>\n' + "      </a>\n" + '      <ul class="dropdown-menu">\n' + '        <li ng-repeat="user in $parent.usersTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.user = user">{{user.username}}</a></li>\n' + "      </ul>\n" + "    </div>\n" + "  </bsmodal>\n" + "\n" + "\n" + '  <div class="button-strip">\n' + '    <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group add user button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_users_add_user}}" tooltip-placement="left">(?)</a>\n' + '    <button class="btn btn-primary"  ng-click="showModal(\'addGroupToUser\')">Add User to Group</button>\n' + '    <button class="btn btn-primary" ng-disabled="!hasMembers || !valueSelected(groupsCollection.users._list)" ng-click="showModal(\'removeFromGroup\')">Remove User(s) from Group</button>\n' + "  </div>\n" + '  <table class="table table-striped">\n' + '    <tr class="table-header">\n' + '      <td style="width: 30px;"><input type="checkbox" ng-show="hasMembers" id="selectAllCheckbox" ng-model="groupMembersSelected" ng-click="selectAllEntities(groupsCollection.users._list,this,\'groupMembersSelected\')"></td>\n' + '      <td style="width: 50px;"></td>\n' + "      <td>Username</td>\n" + "      <td>Display Name</td>\n" + "    </tr>\n" + '    <tr class="zebraRows" ng-repeat="user in groupsCollection.users._list">\n' + "      <td>\n" + "        <input\n" + '          type="checkbox"\n' + '          ng-model="user.checked"\n' + "          >\n" + "      </td>\n" + '      <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n' + "      <td>{{user.get('username')}}</td>\n" + "      <td>{{user.get('name')}}</td>\n" + "    </tr>\n" + "  </table>\n" + '  <div style="padding: 10px 5px 10px 5px">\n' + '    <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n' + '    <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n' + "  </div>\n" + "</div>");
        $templateCache.put("groups/groups-roles.html", '<div class="content-page" ng-controller="GroupsRolesCtrl">\n' + "\n" + '  <bsmodal id="addGroupToRole"\n' + '           title="Add group to role"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="addGroupToRoleDialog"\n' + '           extrabuttonlabel="Add"\n' + "           ng-cloak>\n" + '    <div class="btn-group">\n' + '      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n' + "        <span class=\"filter-label\">{{$parent.name != '' ? $parent.name : 'Role name...'}}</span>\n" + '        <span class="caret"></span>\n' + "      </a>\n" + '      <ul class="dropdown-menu">\n' + '        <li ng-repeat="role in $parent.rolesTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.name = role.name">{{role.name}}</a></li>\n' + "      </ul>\n" + "    </div>\n" + "  </bsmodal>\n" + "\n" + '  <bsmodal id="leaveRoleFromGroup"\n' + '           title="Confirmation"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="leaveRoleDialog"\n' + '           extrabuttonlabel="Leave"\n' + "           ng-cloak>\n" + "    <p>Are you sure you want to remove the group from the role(s)?</p>\n" + "  </bsmodal>\n" + "\n" + "\n" + '  <div class="button-strip">\n' + '    <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles add role button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_add_leave_role}}" tooltip-placement="left">(?)</a>\n' + '    <button class="btn btn-primary" ng-click="showModal(\'addGroupToRole\')">Add Role to Group</button>\n' + '    <button class="btn btn-primary" ng-disabled="!hasRoles || !valueSelected(groupsCollection.roles._list)" ng-click="showModal(\'leaveRoleFromGroup\')">Remove Role(s) from Group</button>\n' + "  </div>\n" + '  <h4>Roles <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles roles list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_roles}}" tooltip-placement="top">(?)</a></h4>\n' + '  <table class="table table-striped">\n' + "    <tbody>\n" + '    <tr class="table-header">\n' + '      <td style="width: 30px;"><input type="checkbox" ng-show="hasRoles" id="groupsSelectAllCheckBox" ng-model="groupRoleSelected" ng-click="selectAllEntities(groupsCollection.roles._list,this,\'groupRoleSelected\')" ></td>\n' + "      <td>Role Name</td>\n" + "      <td>Role title</td>\n" + "    </tr>\n" + '    <tr class="zebraRows" ng-repeat="role in groupsCollection.roles._list">\n' + "      <td>\n" + "        <input\n" + '          type="checkbox"\n' + '          ng-model="role.checked"\n' + "          >\n" + "      </td>\n" + "      <td>{{role._data.name}}</td>\n" + "      <td>{{role._data.title}}</td>\n" + "    </tr>\n" + "    </tbody>\n" + "  </table>\n" + '  <div style="padding: 10px 5px 10px 5px">\n' + '    <button class="btn btn-primary" ng-click="getPreviousRoles()" style="display:{{roles_previous_display}}">< Previous</button>\n' + '    <button class="btn btn-primary" ng-click="getNextRoles()" style="display:{{roles_next_display}};float:right;">Next ></button>\n' + "  </div>\n" + "\n" + "\n" + '  <bsmodal id="deletePermission"\n' + '           title="Confirmation"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="deleteGroupPermissionDialog"\n' + '           extrabuttonlabel="Delete"\n' + "           ng-cloak>\n" + "    <p>Are you sure you want to delete the permission(s)?</p>\n" + "  </bsmodal>\n" + "\n" + "\n" + '  <bsmodal id="addPermission"\n' + '           title="New Permission"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="addGroupPermissionDialog"\n' + '           extrabuttonlabel="Add"\n' + "           ng-cloak>\n" + '    <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" id="groupsrolespermissions" type="text" ng-pattern="pathRegex" ng-attr-title="{{pathRegexDescription}}" required ug-validate  /> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_new_permission_path}}" tooltip-placement="right">(?)</a></p>\n' + '    <div class="control-group">\n' + '      <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_new_permission_verbs}}" tooltip-placement="right">(?)</a>\n' + "    </div>\n" + '    <div class="control-group">\n' + '      <input type="checkbox" ng-model="$parent.permissions.postPerm"> POST\n' + "    </div>\n" + '    <div class="control-group">\n' + '      <input type="checkbox" ng-model="$parent.permissions.putPerm"> PUT\n' + "    </div>\n" + '    <div class="control-group">\n' + '      <input type="checkbox" ng-model="$parent.permissions.deletePerm"> DELETE\n' + "    </div>\n" + "  </bsmodal>\n" + "\n" + "\n" + '  <div class="button-strip">\n' + '    <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_add_delete_permission}}" tooltip-placement="left">(?)</a>\n' + '    <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n' + '    <button class="btn btn-primary" ng-disabled="!hasPermissions || !valueSelected(selectedGroup.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n' + "  </div>\n" + '  <h4>Permissions <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles permissions list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_permissions}}" tooltip-placement="top">(?)</a>\n' + "  </h4>\n" + '  <table class="table table-striped">\n' + "    <tbody>\n" + '    <tr class="table-header">\n' + '      <td style="width: 30px;"><input ng-show="hasPermissions" type="checkbox" id="permissionsSelectAllCheckBox" ng-model="groupPermissionsSelected" ng-click="selectAllEntities(selectedGroup.permissions,this,\'groupPermissionsSelected\')"  ></td>\n' + "      <td>Path</td>\n" + "      <td>GET</td>\n" + "      <td>POST</td>\n" + "      <td>PUT</td>\n" + "      <td>DELETE</td>\n" + "    </tr>\n" + '    <tr class="zebraRows" ng-repeat="permission in selectedGroup.permissions">\n' + "      <td>\n" + "        <input\n" + '          type="checkbox"\n' + '          ng-model="permission.checked"\n' + "          >\n" + "      </td>\n" + "      <td>{{permission.path}}</td>\n" + "      <td>{{permission.operations.get}}</td>\n" + "      <td>{{permission.operations.post}}</td>\n" + "      <td>{{permission.operations.put}}</td>\n" + "      <td>{{permission.operations.delete}}</td>\n" + "    </tr>\n" + "    </tbody>\n" + "  </table>\n" + "\n" + "</div>");
        $templateCache.put("groups/groups-tabs.html", '<div class="content-page">\n' + "\n" + '  <section class="row-fluid">\n' + "\n" + '    <div class="span12">\n' + '      <div class="page-filters">\n' + '        <h1 class="title" class="pull-left"><i class="pictogram title">&#128101;</i> Groups</h1>\n' + "      </div>\n" + "    </div>\n" + "\n" + "  </section>\n" + "\n" + '  <div id="user-panel" class="panel-buffer">\n' + '    <ul id="user-panel-tab-bar" class="nav nav-tabs">\n' + '      <li><a href="javaScript:void(0);" ng-click="gotoPage(\'groups\')">Group List</a></li>\n' + '      <li ng-class="detailsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/details\')">Details</a></li>\n' + '      <li ng-class="membersSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/members\')">Users</a></li>\n' + '      <li ng-class="activitiesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/activities\')">Activities</a></li>\n' + '      <li ng-class="rolesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/roles\')">Roles &amp; Permissions</a></li>\n' + "    </ul>\n" + "  </div>\n" + "\n" + '  <div style="float: left; margin-right: 10px;">\n' + '    <div style="float: left;">\n' + "      <div class=\"user-header-title\"><strong>Group Path: </strong>{{selectedGroup.get('path')}}</div>\n" + "      <div class=\"user-header-title\"><strong>Group Title: </strong>{{selectedGroup.get('title')}}</div>\n" + "    </div>\n" + "  </div>\n" + "</div>\n" + "<br>\n" + "<br>\n");
        $templateCache.put("groups/groups.html", '<div class="content-page">\n' + "\n" + '  <div id="intro-page" >\n' + '  <page-title title=" Groups" icon="&#128101;"></page-title>\n' + "    \n" + "  </div>\n" + '  <bsmodal id="newGroup"\n' + '           title="New Group"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="newGroupDialog"\n' + '           extrabuttonlabel="Add"\n' + '           ng-model="dialog"\n' + "           ng-cloak>\n" + "    <fieldset>\n" + '      <div class="control-group">\n' + '        <label for="title">Title</label>\n' + '        <div class="controls">\n' + '          <input type="text" id="title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required ng-model="newGroup.title"class="input-xlarge" ug-validate/>\n' + '          <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group title box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_title}}" tooltip-placement="right">(?)</a>\n' + "        </div>\n" + "      </div>\n" + '      <div class="control-group">\n' + '        <label for="path">Path</label>\n' + '        <div class="controls">\n' + '          <input id="path" type="text" ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" required ng-model="newGroup.path" class="input-xlarge" ug-validate/>\n' + '          <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_path}}" tooltip-placement="right">(?)</a>\n' + "        </div>\n" + "      </div>\n" + "    </fieldset>\n" + "  </bsmodal>\n" + "\n" + '  <bsmodal id="deleteGroup"\n' + '           title="Delete Group"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="deleteGroupsDialog"\n' + '           extrabuttonlabel="Delete"\n' + "           ng-cloak>\n" + "    <p>Are you sure you want to delete the group(s)?</p>\n" + "  </bsmodal>\n" + "\n" + "\n" + '  <section class="row-fluid">\n' + '    <div id="intro-list" class="span3 user-col">\n' + '      <div class="button-toolbar span12">\n' + '        <a title="Select All" class="btn btn-primary select-all toolbar" ng-show="hasGroups" ng-click="selectAllEntities(groupsCollection._list,this,\'groupBoxesSelected\',true)"> <i class="pictogram">&#8863;</i></a>\n' + '        <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">&#9749;</i></button>\n' + '        <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram">&#59136;</i></button>\n' + '        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_add_remove_buttons}}" tooltip-placement="right">(?)</a>\n' + "      </div>\n" + '      <ul class="user-list">\n' + '        <li ng-class="selectedGroup._data.uuid === group._data.uuid ? \'selected\' : \'\'" ng-repeat="group in groupsCollection._list" ng-click="selectGroup(group._data.uuid)">\n' + "          <input\n" + '              type="checkbox"\n' + '              ng-value="group._data.uuid"\n' + '              ng-checked="group.checked"\n' + '              ng-model="group.checked"\n' + "              >\n" + "          <a href=\"javaScript:void(0)\" >{{group.get('title')}}</a>\n" + "          <br/>\n" + "          <span ng-if=\"group.get('path')\" class=\"label\">Path:</span>/{{group.get('path')}}\n" + "        </li>\n" + "      </ul>\n" + "\n" + "\n" + '      <div style="padding: 10px 5px 10px 5px">\n' + '        <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n' + '        <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n' + "      </div>\n" + "    </div>\n" + "\n" + '    <div id="{{help.showTabsId}}" class="span9 tab-content" ng-show="selectedGroup.get" >\n' + '      <div class="menu-toolbar">\n' + '        <ul class="inline" >\n' + '          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/details\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/details\')"><i class="pictogram">&#59170;</i>Details</a>\n' + '             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups details tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_details_tab}}" tooltip-placement="right">(?)</a></div>\n' + "          </li>\n" + '          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/members\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/members\')"><i class="pictogram">&#128101;</i>Users</a>\n' + '             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups users tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_users_tab}}" tooltip-placement="right">(?)</a></div>\n' + "          </li>\n" + '          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/activities\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/activities\')"><i class="pictogram">&#59194;</i>Activities</a>\n' + '             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups activities tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_activities_tab}}" tooltip-placement="right">(?)</a></div>\n' + "          </li>\n" + '          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/roles\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/roles\')"><i class="pictogram">&#127758;</i>Roles &amp; Permissions</a>\n' + '             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups role tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_tab}}" tooltip-placement="right">(?)</a></div>\n' + "          </li>\n" + "        </ul>\n" + "      </div>\n" + '      <span ng-include="currentGroupsPage.template"></span>\n' + "\n" + "  </section>\n" + "</div>\n");
        $templateCache.put("login/forgot-password.html", '<div class="login-content" ng-controller="ForgotPasswordCtrl">\n' + '	<iframe class="container" ng-src="{{forgotPWiframeURL}}" id="forgot-password-frame" border="0" style="border:0;width:600px;height:620px;">\n' + '	<p>Email Address: <input id="resetPasswordEmail" name="resetPasswordEmail" /></p>\n' + '	<button class="btn btn-primary" ng-click="">Reset Password</button>\n' + "</div>\n");
        $templateCache.put("login/loading.html", "\n" + "\n" + "<h1>Loading...</h1>");
        $templateCache.put("login/login.html", '<div class="login-content">\r' + "\n" + '  <bsmodal id="sendActivationLink"\r' + "\n" + '           title="Resend Activation Link"\r' + "\n" + '           close="hideModal"\r' + "\n" + '           closelabel="Cancel"\r' + "\n" + '           extrabutton="resendActivationLink"\r' + "\n" + '           extrabuttonlabel="Send Activation"\r' + "\n" + "           ng-cloak>\r" + "\n" + "    <fieldset>\r" + "\n" + '      <p>Email to send to: <input type="email" required ng-model="$parent.activation.id" ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}" name="activationId" id="user-activationId" class="input-xlarge"/></p>\r' + "\n" + "    </fieldset>\r" + "\n" + "  </bsmodal>\r" + "\n" + '  <div class="login-holder">\r' + "\n" + '  <form name="loginForm" id="login-form"  ng-submit="login()" class="form-horizontal" novalidate>\r' + "\n" + '    <h1 class="title">Enter your credentials</h1>\r' + "\n" + '    <div class="alert-error" id="loginError" ng-if="loginMessage">{{loginMessage}}</div>\r' + "\n" + '    <div class="control-group">\r' + "\n" + '      <label class="control-label" for="login-username">Email or Username:</label>\r' + "\n" + '      <div class="controls">\r' + "\n" + '        <input type="text" ng-model="login.username"  title="Please add a username or email."  class="" id="login-username" required ng-value="login.username" size="20" ug-validate>\r' + "\n" + "      </div>\r" + "\n" + "    </div>\r" + "\n" + '    <div class="control-group">\r' + "\n" + '      <label class="control-label" for="login-password">Password:</label>\r' + "\n" + '      <div class="controls">\r' + "\n" + '        <input type="password" ng-model="login.password"  required id="login-password" class="" ng-value="login.password" size="20" ug-validate>\r' + "\n" + "      </div>\r" + "\n" + "    </div>\r" + "\n" + '    <div class="control-group" ng-show="requiresDeveloperKey">\r' + "\n" + '      <label class="control-label" for="login-developerkey">Developer Key:</label>\r' + "\n" + '      <div class="controls">\r' + "\n" + '        <input type="text" ng-model="login.developerkey" id="login-developerkey" class="" ng-value="login.developerkey" size="20" ug-validate>\r' + "\n" + "      </div>\r" + "\n" + "    </div>\r" + "\n" + '    <div class="form-actions">\r' + "\n" + '      <div class="submit">\r' + "\n" + '        <input type="submit" name="button-login" id="button-login" ng-disabled="!loginForm.$valid || loading" value="{{loading ? loadingText : \'Log In\'}}" class="btn btn-primary pull-right">\r' + "\n" + "      </div>\r" + "\n" + "    </div>\r" + "\n" + "  </form>\r" + "\n" + "  </div>\r" + "\n" + '  <div class="extra-actions">\r' + "\n" + '    <div class="submit">\r' + "\n" + '      <a ng-click="gotoSignUp()"   name="button-signUp" id="button-signUp" value="Sign Up"\r' + "\n" + '         class="btn btn-primary pull-left">Register</a>\r' + "\n" + "    </div>\r" + "\n" + '    <div class="submit">\r' + "\n" + '      <a ng-click="gotoForgotPasswordPage()" name="button-forgot-password" id="button-forgot-password"\r' + "\n" + '         value="" class="btn btn-primary pull-left">Forgot Password?</a>\r' + "\n" + "    </div>\r" + "\n" + '    <a ng-click="showModal(\'sendActivationLink\')"  name="button-resend-activation" id="button-resend-activation"\r' + "\n" + '       value="" class="btn btn-primary pull-left">Resend Activation Link</a>\r' + "\n" + "  </div>\r" + "\n" + '  <div id="gtm" style="width: 450px;margin-top: 4em;" />\r' + "\n" + "</div>\r" + "\n");
        $templateCache.put("login/logout.html", '<div id="logut">Logging out...</div>');
        $templateCache.put("login/register.html", '<div class="signUp-content">\n' + '  <div class="signUp-holder">\n' + '    <form name="signUpform" id="signUp-form" ng-submit="register()" class="form-horizontal" ng-show="!signUpSuccess" novalidate>\n' + '      <h1 class="title">Register</h1>\n' + "\n" + '      <div class="alert" ng-if="loginMessage">{{loginMessage}}</div>\n' + '      <div class="control-group">\n' + '        <label class="control-label" for="register-orgName">Organization:</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="text" ng-model="registeredUser.orgName" id="register-orgName" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" ug-validate  required class="" size="20">\n' + "        </div>\n" + "      </div>\n" + "\n" + '      <div class="control-group">\n' + '        <label class="control-label" for="register-name">Name:</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="text" ng-model="registeredUser.name" id="register-name" ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" ug-validate required class="" size="20">\n' + "        </div>\n" + "      </div>\n" + "\n" + '      <div class="control-group">\n' + '        <label class="control-label" for="register-userName">Username:</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="text" ng-model="registeredUser.userName" id="register-userName" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}" ug-validate required class="" size="20">\n' + "        </div>\n" + "      </div>\n" + "\n" + '      <div class="control-group">\n' + '        <label class="control-label" for="register-email">Email:</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="email" ng-model="registeredUser.email" id="register-email"  ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}"  required class="" ug-validate size="20">\n' + "        </div>\n" + "      </div>\n" + "\n" + "\n" + '      <div class="control-group">\n' + '        <label class="control-label" for="register-password">Password:</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="password" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" ug-validate ng-model="registeredUser.password" id="register-password" required class=""\n' + '                 size="20">\n' + "        </div>\n" + "      </div>\n" + '      <div class="control-group">\n' + '        <label class="control-label" for="register-confirmPassword">Re-enter Password:</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="password" ng-model="registeredUser.confirmPassword" required id="register-confirmPassword" ug-validate class="" size="20">\n' + "        </div>\n" + "      </div>\n" + '      <div class="form-actions">\n' + '        <div class="submit">\n' + '          <input type="submit" name="button-login" ng-disabled="!signUpform.$valid" id="button-login" value="Register"\n' + '                 class="btn btn-primary pull-right">\n' + "        </div>\n" + '        <div class="submit">\n' + '          <a ng-click="cancel()" type="submit" name="button-cancel" id="button-cancel"\n' + '             class="btn btn-primary pull-right">Cancel</a>\n' + "        </div>\n" + "      </div>\n" + "    </form>\n" + '    <div class="console-section well thingy" ng-show="signUpSuccess">\n' + '      <span class="title">We\'re holding a seat for you!</span>\n' + "      <br><br>\n" + "\n" + "      <p>Thanks for signing up for a spot on our private beta. We will send you an email as soon as we're ready for\n" + "        you!</p>\n" + "\n" + "      <p>In the mean time, you can stay up to date with App Services on our <a\n" + '          href="https://groups.google.com/forum/?fromgroups#!forum/usergrid">GoogleGroup</a>.</p>\n' + "\n" + '      <p> <a href="#!/login">Back to login</a></p>\n' + "    </div>\n" + "  </div>\n" + "\n" + "</div>\n");
        $templateCache.put("menu.html", '<ul class="nav nav-list" menu="sideMenu">\n' + '    <li class="option {{item.active ? \'active\' : \'\'}}" ng-cloak="" ng-repeat="item in menuItems"><a data-ng-href="{{item.path}}"><i class="pictogram" ng-bind-html="item.pic"></i>{{item.title}}</a>\n' + '        <ul class="nav nav-list" ng-if="item.items">\n' + '            <li ng-repeat="subItem in item.items"><a data-ng-href="{{subItem.path}}"><i class="pictogram sub" ng-bind-html="subItem.pic"></i>{{subItem.title}}</a>\n' + "            </li>\n" + "        </ul>\n" + "    </li>\n" + "</ul>");
        $templateCache.put("menus/appMenu.html", '<ul id="app-menu" class="nav top-nav span12">\n' + '    <li class="span7">\n' + '      <bsmodal id="newApplication"\n' + '               title="Create New Application"\n' + '               close="hideModal"\n' + '               closelabel="Cancel"\n' + '               extrabutton="newApplicationDialog"\n' + '               extrabuttonlabel="Create"\n' + '               buttonid="app"\n' + "               ng-cloak>\n" + '        <div ng-show="!hasApplications" class="modal-instructions" >You have no applications, please create one.</div>\n' + '        <div  ng-show="hasCreateApplicationError" class="alert-error">Application already exists!</div>\n' + '        <p>New application name: <input ng-model="$parent.newApp.name" id="app-name-input" ng-pattern="appNameRegex"  ng-attr-title="{{appNameRegexDescription}}" type="text" required ug-validate /></p>\n' + "      </bsmodal>\n" + '        <div class="btn-group">\n' + '            <a class="btn dropdown-toggle top-selector app-selector" id="current-app-selector" data-toggle="dropdown">\n' + '                <i class="pictogram">&#9881;</i> {{myApp.currentApp}}\n' + '                <span class="caret"></span>\n' + "            </a>\n" + '            <ul class="dropdown-menu app-nav">\n' + '                <li name="app-selector" ng-repeat="app in applications">\n' + '                    <a id="app-{{app.name}}-link-id" ng-click="appChange(app.name)">{{app.name}}</a>\n' + "                </li>\n" + "            </ul>\n" + "        </div>\n" + "    </li>\n" + '    <li class="span5">\n' + '      <a ng-if="activeUI"\n' + '         class="btn btn-create zero-out pull-right"\n' + "         ng-click=\"showModal('newApplication')\"\n" + '         analytics-on="click"\n' + '         analytics-category="App Services"\n' + '         analytics-label="Button"\n' + '         analytics-event="Add New App"\n' + "        >\n" + '        <i class="pictogram">&#8862;</i>\n' + "        Add New App\n" + "      </a>\n" + "    </li>\n" + "</ul>");
        $templateCache.put("menus/orgMenu.html", '<ul class="nav top-nav org-nav">\n' + "  <li>\n" + '<div class="btn-group ">\n' + '    <a class="btn dropdown-toggle top-selector org-selector" id="current-org-selector" data-toggle="dropdown">\n' + '        <i class="pictogram">&#128193</i> {{currentOrg}}<span class="caret"></span>\n' + "        </a>\n" + '    <ul class="dropdown-menu org-nav">\n' + '          <li name="org-selector" ng-repeat="(k,v) in organizations">\n' + '              <a id="org-{{v.name}}-selector" class="org-overview" ng-click="orgChange(v.name)"> {{v.name}}</a>\n' + "            </li>\n" + "         </ul>\n" + "    </div>\n" + "  </li></ul>");
        $templateCache.put("org-overview/org-overview.html", '<div class="org-overview-content" ng-show="activeUI">\n' + "\n" + '  <page-title title=" Org Administration" icon="&#128362;"></page-title>\n' + "\n" + '  <section class="row-fluid">\n' + "\n" + '  <div class="span6">\n' + '  	<bsmodal id="introjs"\n' + '             title="Welcome to the API BaaS Admin Portal"\n' + '             close="hideModal"\n' + '             closelabel="Skip"\n' + '             extrabutton="startFirstTimeUser"\n' + '             extrabuttonlabel="Take the tour"\n' + "             ng-cloak>\n" + "      <p>To get started, click 'Take the tour' for a full walkthrough of the admin portal, or click 'Skip' to start working right away.</p>\n" + "    </bsmodal>\n" + '		<div id="intro-4-current-org">	\n' + '	    <h2 class="title">Current Organization <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'current org\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_current_org}}" tooltip-placement="right">(?)</a></h2>\n' + '	    <table class="table table-striped">\n' + "	      <tr>\n" + '	        <td id="org-overview-name">{{currentOrganization.name}}</td>\n' + '	        <td style="text-align: right">{{currentOrganization.uuid}}</td>\n' + "	      </tr>\n" + "	    </table>\n" + "		</div>\n" + "\n" + '    <bsmodal id="newApplication"\n' + '             title="Create New Application"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="newApplicationDialog"\n' + '             extrabuttonlabel="Create"\n' + "             ng-cloak>\n" + '      <p>New application name: <input ng-model="$parent.newApp.name"  ug-validate required type="text" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" /></p>\n' + "    </bsmodal>\n" + '		<div id="intro-5-applications">		\n' + '	    <h2 class="title" > Applications <a class="help_tooltip" ng-show="help.helpTooltipsEnabled" ng-mouseover="help.sendTooltipGA(\'applications\')" href="#" ng-attr-tooltip="{{tooltip_applications}}" tooltip-placement="right">(?)</a>\n' + '	      <div class="header-button btn-group pull-right">\n' + "	        <a class=\"btn filter-selector\" style=\"{{applicationsSize === 10 ? 'width:290px':''}}\"  ng-click=\"showModal('newApplication')\">\n" + '	          <span class="filter-label">Add New App</span>\n' + "	        </a>\n" + "	      </div>\n" + "	    </h2>\n" + "		\n" + '	    <table class="table table-striped">\n' + '	      <tr ng-repeat="application in applications">\n' + "	        <td>{{application.name}}</td>\n" + '	        <td style="text-align: right">{{application.uuid}}</td>\n' + "	      </tr>\n" + "	    </table>\n" + "		</div>\n" + '    <bsmodal id="regenerateCredentials"\n' + '             title="Confirmation"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="regenerateCredentialsDialog"\n' + '             extrabuttonlabel="Yes"\n' + "             ng-cloak>\n" + "      Are you sure you want to regenerate the credentials?\n" + "    </bsmodal>\n" + '		<div id="intro-6-org-api-creds">\n' + '	    <h2 class="title" >Organization API Credentials <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'api org credentials\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_org_api_creds}}" tooltip-placement="right">(?)</a>\n' + '	      <div class="header-button btn-group pull-right">\n' + '	        <a class="btn filter-selector" ng-click="showModal(\'regenerateCredentials\')">\n' + '	          <span class="filter-label">Regenerate Org Credentials</span>\n' + "	        </a>\n" + "	      </div>\n" + "	    </h2>\n" + "	\n" + '	    <table class="table table-striped">\n' + "	      <tr>\n" + "	        <td >Client ID</td>\n" + '	        <td style="text-align: right" >{{orgAPICredentials.client_id}}</td>\n' + "	      </tr>\n" + "	      <tr>\n" + "	        <td>Client Secret</td>\n" + '	        <td style="text-align: right">{{orgAPICredentials.client_secret}}</td>\n' + "	      </tr>\n" + "	    </table>\n" + "		</div>\n" + '    <bsmodal id="newAdministrator"\n' + '             title="Create New Administrator"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="newAdministratorDialog"\n' + '             extrabuttonlabel="Create"\n' + "             ng-cloak>\n" + '      <p>New administrator email: <input id="newAdminInput" ug-validate ng-model="$parent.admin.email" pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}" required type="email" /></p>\n' + "    </bsmodal>\n" + '		<div id="intro-7-org-admins">\n' + '	    <h2 class="title" >Organization Administrators <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'org admins\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_org_admins}}" tooltip-placement="right">(?)</a>\n' + '	      <div class="header-button btn-group pull-right">\n' + '	        <a class="btn filter-selector" ng-click="showModal(\'newAdministrator\')">\n' + '	          <span class="filter-label">Add New Administrator</span>\n' + "	        </a>\n" + "	      </div>\n" + "	    </h2>\n" + "	\n" + '	    <table class="table table-striped">\n' + '	      <tr ng-repeat="administrator in orgAdministrators">\n' + '	        <td><img style="width:30px;height:30px;" ng-src="{{administrator.image}}"> {{administrator.name}}</td>\n' + '	        <td style="text-align: right">{{administrator.email}}</td>\n' + "	      </tr>\n" + "	    </table>\n" + "			</div>\n" + "  </div>\n" + "\n" + '  <div class="span6">\n' + '  	<div id="intro-8-activities">\n' + '	    <h2 class="title">Activities <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'activities\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities}}" tooltip-placement="right">(?)</a></h2>\n' + '	    <table class="table table-striped">\n' + '	      <tr ng-repeat="activity in activities">\n' + "	        <td>{{activity.title}}</td>\n" + '	        <td style="text-align: right">{{activity.date}}</td>\n' + "	      </tr>\n" + "	    </table>\n" + "	</div>\n" + "  </div>\n" + "\n" + "\n" + "  </section>\n" + "</div>");
        $templateCache.put("profile/account.html", '<page-title title=" Account Settings" icon="&#59170"></page-title>\n' + "\n" + '<section class="row-fluid">\n' + '  <div class="span12 tab-content">\n' + '    <div class="menu-toolbar">\n' + '      <ul class="inline">\n' + '        <li class="tab" ng-show="!use_sso" ng-class="currentAccountPage.route === \'/profile/profile\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" id="profile-link" ng-click="selectAccountPage(\'/profile/profile\')"><i class="pictogram">&#59170;</i>Profile</a></li>\n' + '        <li class="tab" ng-class="currentAccountPage.route === \'/profile/organizations\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" id="account-link" ng-click="selectAccountPage(\'/profile/organizations\')"><i class="pictogram">&#128101;</i>Organizations</a></li>\n' + "      </ul>\n" + "    </div>\n" + '    <span ng-include="currentAccountPage.template"></span>\n' + "  </div>\n" + "</section>");
        $templateCache.put("profile/organizations.html", '<div class="content-page"   ng-controller="OrgCtrl">\n' + "\n" + "\n" + "\n" + '  <bsmodal id="newOrganization"\n' + '           title="Create New Organization"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="addOrganization"\n' + '           extrabuttonlabel="Create"\n' + "           ng-cloak>\n" + "    <fieldset>\n" + "\n" + '      <div class="control-group">\n' + '        <label for="new-user-orgname">Organization Name</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="text" required title="Name" ug-validate ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" ng-model="$parent.org.name" name="name" id="new-user-orgname" class="input-xlarge"/>\n' + "\n" + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + "\n" + "    </fieldset>\n" + "  </bsmodal>\n" + "\n" + "\n" + '      <div class="row-fluid" >\n' + '      <div class="span3 user-col ">\n' + "\n" + '        <div class="button-toolbar span12">\n' + "\n" + '          <button class="btn btn-primary toolbar" ng-click="showModal(\'newOrganization\')" ng-show="true"><i class="pictogram">&#59136;</i>\n' + "          </button>\n" + "        </div>\n" + '        <ul class="user-list">\n' + "          <li ng-class=\"selectedOrg.uuid === org.uuid ? 'selected' : ''\"\n" + '              ng-repeat="org in orgs" ng-click=" selectOrganization(org)">\n' + "\n" + '            <a href="javaScript:void(0)">{{org.name}}</a>\n' + "          </li>\n" + "        </ul>\n" + "      </div>\n" + '      <div class="span9">\n' + '        <div class="row-fluid" >\n' + "          <h4>Organization Information</h4>\n" + '          <div class="span11" ng-show="selectedOrg">\n' + '            <label  class="ui-dform-label">Applications</label>\n' + '            <table class="table table-striped">\n' + '              <tr ng-repeat="app in selectedOrg.applicationsArray">\n' + "                <td> {{app.name}}</td>\n" + '                <td style="text-align: right">{{app.uuid}}</td>\n' + "              </tr>\n" + "            </table>\n" + "            <br/>\n" + '            <label  class="ui-dform-label">Users</label>\n' + '            <table class="table table-striped">\n' + '              <tr ng-repeat="user in selectedOrg.usersArray">\n' + "                <td> {{user.name}}</td>\n" + '                <td style="text-align: right">{{user.email}}</td>\n' + "              </tr>\n" + "            </table>\n" + '            <form ng-submit="leaveOrganization(selectedOrg)">\n' + '              <input type="submit" name="button-leave-org" id="button-leave-org" title="Can only leave if organization has more than 1 user." ng-disabled="!doesOrgHaveUsers(selectedOrg)" value="Leave Organization" class="btn btn-primary pull-right">\n' + "            </form>\n" + "          </div>\n" + "        </div>\n" + "\n" + "      </div>\n" + "        </div>\n" + "</div>");
        $templateCache.put("profile/profile.html", '<div class="content-page" ng-controller="ProfileCtrl">\n' + "\n" + '  <div id="account-panels">\n' + '    <div class="panel-content">\n' + '      <div class="console-section">\n' + '        <div class="console-section-contents">\n' + '          <form name="updateAccountForm" id="update-account-form" ng-submit="saveUserInfo()" class="form-horizontal">\n' + "            <fieldset>\n" + '              <div class="control-group">\n' + '                <label id="update-account-id-label" class="control-label" for="update-account-id">UUID</label>\n' + '                <div class="controls">\n' + '                  <span id="update-account-id" class="monospace">{{user.uuid}}</span>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="update-account-username">Username </label>\n' + '                <div class="controls">\n' + '                  <input type="text" ug-validate name="update-account-username" required ng-pattern="usernameRegex" id="update-account-username" ng-attr-title="{{usernameRegexDescription}}"  class="span4" ng-model="user.username" size="20"/>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="update-account-name">Name </label>\n' + '                <div class="controls">\n' + '                  <input type="text" ug-validate name="update-account-name" id="update-account-name" ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" class="span4" ng-model="user.name" size="20"/>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="update-account-email"> Email</label>\n' + '                <div class="controls">\n' + '                  <input type="email" ug-validate required name="update-account-email" ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}"  id="update-account-email" class="span4" ng-model="user.email" size="20"/>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="update-account-picture-img">Picture <br />(from <a href="http://gravatar.com">gravatar.com</a>) </label>\n' + '                <div class="controls">\n' + '                  <img id="update-account-picture-img" ng-src="{{user.profileImg}}" width="50" />\n' + "                </div>\n" + "              </div>\n" + '              <span class="help-block">Leave blank any of the following to keep the current password unchanged</span>\n' + "              <br />\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="old-account-password">Old Password</label>\n' + '                <div class="controls">\n' + '                  <input type="password" ug-validate name="old-account-password"  id="old-account-password" class="span4" ng-model="user.oldPassword" size="20"/>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="update-account-password">New Password</label>\n' + '                <div class="controls">\n' + '                  <input type="password"  ug-validate name="update-account-password" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" id="update-account-password" class="span4" ng-model="user.newPassword" size="20"/>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group" style="display:none">\n' + '                <label class="control-label" for="update-account-password-repeat">Confirm New Password</label>\n' + '                <div class="controls">\n' + '                  <input type="password" ug-validate name="update-account-password-repeat" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" id="update-account-password-repeat" class="span4" ng-model="user.newPasswordConfirm" size="20"/>\n' + "                </div>\n" + "              </div>\n" + "            </fieldset>\n" + '            <div class="form-actions">\n' + '              <input type="submit"  class="btn btn-primary"  name="button-update-account" ng-disabled="!updateAccountForm.$valid || loading" id="button-update-account" value="{{loading ? loadingText : \'Update\'}}"  class="btn btn-usergrid"/>\n' + "            </div>\n" + "          </form>\n" + "        </div>\n" + "      </div>\n" + "    </div>\n" + "  </div>\n" + "</div>");
        $templateCache.put("roles/roles-groups.html", '<div class="content-page" ng-controller="RolesGroupsCtrl">\n' + "\n" + "\n" + '  <bsmodal id="addRoleToGroup"\n' + '           title="Add group to role"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="addRoleToGroupDialog"\n' + '           extrabuttonlabel="Add"\n' + "           ng-cloak>\n" + '    <div class="btn-group">\n' + '      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n' + "        <span class=\"filter-label\">{{$parent.path !== '' ? $parent.title : 'Select a group...'}}</span>\n" + '        <span class="caret"></span>\n' + "      </a>\n" + '      <ul class="dropdown-menu">\n' + '        <li ng-repeat="group in $parent.groupsTypeaheadValues" class="filterItem"><a ng-click="setRoleModal(group)">{{group.title}}</a></li>\n' + "      </ul>\n" + "    </div>\n" + "  </bsmodal>\n" + "\n" + '  <bsmodal id="removeGroupFromRole"\n' + '           title="Confirmation"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="removeGroupFromRoleDialog"\n' + '           extrabuttonlabel="Leave"\n' + "           ng-cloak>\n" + "    <p>Are you sure you want to remove the group from the role(s)?</p>\n" + "  </bsmodal>\n" + "\n" + "\n" + '  <div class="users-section">\n' + '    <div class="button-strip">\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group add user button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_groups_add_group}}" tooltip-placement="left">(?)</a>\n' + '        <button class="btn btn-primary" ng-click="showModal(\'addRoleToGroup\')">Add Group to Role</button>\n' + '        <button class="btn btn-primary"  ng-disabled="!hasGroups || !valueSelected(rolesCollection.groups._list)" ng-click="showModal(\'removeGroupFromRole\')">Remove Group(s) from Role</button>\n' + "    </div>\n" + '    <table class="table table-striped">\n' + '      <tr class="table-header">\n' + '        <td style="width: 30px;"><input type="checkbox" ng-show="hasGroups" id="selectAllCheckBox" ng-model="roleGroupsSelected" ng-click="selectAllEntities(rolesCollection.groups._list,this,\'roleGroupsSelected\')"></td>\n' + "        <td>Title</td>\n" + "        <td>Path</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="group in rolesCollection.groups._list">\n' + "        <td>\n" + "          <input\n" + '            type="checkbox"\n' + '            ng-model="group.checked"\n' + "            >\n" + "        </td>\n" + "        <td>{{group._data.title}}</td>\n" + "        <td>{{group._data.path}}</td>\n" + "      </tr>\n" + "    </table>\n" + '    <div style="padding: 10px 5px 10px 5px">\n' + '      <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n' + '      <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}" style="float:right;">Next ></button>\n' + "    </div>\n" + "  </div>\n" + "</div>");
        $templateCache.put("roles/roles-settings.html", '<div class="content-page" ng-controller="RolesSettingsCtrl">\n' + '  <bsmodal id="deletePermission"\n' + '           title="Confirmation"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="deleteRolePermissionDialog"\n' + '           extrabuttonlabel="Delete"\n' + "           ng-cloak>\n" + "    <p>Are you sure you want to delete the permission(s)?</p>\n" + "  </bsmodal>\n" + "\n" + "\n" + '  <bsmodal id="addPermission"\n' + '           title="New Permission"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="addRolePermissionDialog"\n' + '           extrabuttonlabel="Add"\n' + "           ng-cloak>\n" + '    <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" required ng-pattern="pathRegex" ng-attr-title="{{pathRegexDescription}}" ug-validate id="rolePermissionsPath"/> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_roles_new_permission_path}}" tooltip-placement="right">(?)</a></p>\n' + '    <div class="control-group">\n' + '      <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add permission verbs\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_new_permission_verbs}}" tooltip-placement="right">(?)</a>\n' + "    </div>\n" + '    <div class="control-group">\n' + '      <input type="checkbox" ng-model="$parent.permissions.postPerm"> POST\n' + "    </div>\n" + '    <div class="control-group">\n' + '      <input type="checkbox" ng-model="$parent.permissions.putPerm"> PUT\n' + "    </div>\n" + '    <div class="control-group">\n' + '      <input type="checkbox" ng-model="$parent.permissions.deletePerm"> DELETE\n' + "    </div>\n" + "  </bsmodal>\n" + "\n" + "  <div>\n" + '    <h4>Inactivity <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles inactivity\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_inactivity}}" tooltip-placement="right">(?)</a></h4>\n' + '    <div id="role-permissions">\n' + "        <p>Integer only. 0 (zero) means no expiration.</p>\n" + "\n" + '        <form name="updateActivity" ng-submit="updateInactivity()" novalidate>\n' + '            Seconds: <input style="margin: 0" type="number" required name="role-inactivity"\n' + '                            id="role-inactivity-input" min="0" ng-model="role._data.inactivity" title="Please input a positive integer >= 0."  step = "any" ug-validate >\n' + '            <input type="submit" class="btn btn-primary" ng-disabled="!updateActivity.$valid" value="Set"/>\n' + "        </form>\n" + "    </div>\n" + "\n" + "    <br/>\n" + '    <div class="button-strip">\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles details add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_delete_permission}}" tooltip-placement="left">(?)</a>\n' + '      <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n' + '      <button class="btn btn-primary"  ng-disabled="!hasSettings || !valueSelected(role.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n' + "    </div>\n" + "\n" + '    <h4>Permissions <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles settings permissions list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_permissions}}" tooltip-placement="top">(?)</a></h4>\n' + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + '        <td style="width: 30px;"><input type="checkbox" ng-show="hasSettings" id="selectAllCheckBox" ng-model="permissionsSelected" ng-click="selectAllEntities(role.permissions,this,\'permissionsSelected\')" ></td>\n' + "        <td>Path</td>\n" + "        <td>GET</td>\n" + "        <td>POST</td>\n" + "        <td>PUT</td>\n" + "        <td>DELETE</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="permission in role.permissions">\n' + "        <td>\n" + "          <input\n" + '            type="checkbox"\n' + '            ng-model="permission.checked"\n' + "            >\n" + "        </td>\n" + "        <td>{{permission.path}}</td>\n" + "        <td>{{permission.operations.get}}</td>\n" + "        <td>{{permission.operations.post}}</td>\n" + "        <td>{{permission.operations.put}}</td>\n" + "        <td>{{permission.operations.delete}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "  </div>\n" + "</div>");
        $templateCache.put("roles/roles-tabs.html", '<div class="content-page">\n' + '  <section class="row-fluid">\n' + "\n" + '    <div class="span12">\n' + '      <div class="page-filters">\n' + '        <h1 class="title" class="pull-left"><i class="pictogram title">&#59170;</i> Roles </h1>\n' + '        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles page title\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_page_title}}" tooltip-placement="right">(?)</a>\n' + "      </div>\n" + "    </div>\n" + "\n" + "  </section>\n" + "\n" + '  <div id="user-panel" class="panel-buffer">\n' + '    <ul id="user-panel-tab-bar" class="nav nav-tabs">\n' + '      <li><a href="javaScript:void(0);" ng-click="gotoPage(\'roles\')">Roles List</a></li>\n' + '      <li ng-class="settingsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'roles/settings\')">Settings</a></li>\n' + '      <li ng-class="usersSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'roles/users\')">Users</a></li>\n' + '      <li ng-class="groupsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'roles/groups\')">Groups</a></li>\n' + "    </ul>\n" + "  </div>\n" + "\n" + '  <div style="float: left; margin-right: 10px;">\n' + '    <div style="float: left;">\n' + '      <div class="user-header-title"><strong>Role Name: </strong>{{selectedRole.name}}</div>\n' + '      <div class="user-header-title"><strong>Role Title: </strong>{{selectedRole.title}}</div>\n' + "    </div>\n" + "  </div>\n" + "\n" + "</div>\n" + "<br>\n" + "<br>");
        $templateCache.put("roles/roles-users.html", '<div class="content-page" ng-controller="RolesUsersCtrl">\n' + '  <bsmodal id="removeFromRole"\n' + '           title="Confirmation"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="removeUsersFromGroupDialog"\n' + '           extrabuttonlabel="Delete"\n' + "           ng-cloak>\n" + "    <p>Are you sure you want to remove the users from the seleted role(s)?</p>\n" + "  </bsmodal>\n" + "\n" + '  <bsmodal id="addRoleToUser"\n' + '           title="Add user to role"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="addRoleToUserDialog"\n' + '           extrabuttonlabel="Add"\n' + "           ng-cloak>\n" + '    <div class="btn-group">\n' + '      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n' + "        <span class=\"filter-label\">{{$parent.user.username ? $parent.user.username : 'Select a user...'}}</span>\n" + '        <span class="caret"></span>\n' + "      </a>\n" + '      <ul class="dropdown-menu">\n' + '        <li ng-repeat="user in $parent.usersTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.user = user">{{user.username}}</a></li>\n' + "      </ul>\n" + "    </div>\n" + "  </bsmodal>\n" + "\n" + '  <div class="users-section">\n' + '    <div class="button-strip">\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles add user button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_users_add_user}}" tooltip-placement="left">(?)</a>\n' + '        <button class="btn btn-primary" ng-click="showModal(\'addRoleToUser\')">Add User to Role</button>\n' + '        <button class="btn btn-primary"  ng-disabled="!hasUsers || !valueSelected(rolesCollection.users._list)" ng-click="showModal(\'removeFromRole\')">Remove User(s) from Role</button>\n' + "    </div>\n" + '    <table class="table table-striped">\n' + '      <tr class="table-header">\n' + '        <td style="width: 30px;"><input type="checkbox" ng-show="hasUsers" id="selectAllCheckBox" ng-model="roleUsersSelected" ng-click="selectAllEntities(rolesCollection.users._list,this,\'roleUsersSelected\')" ng-model="master"></td>\n' + '        <td style="width: 50px;"></td>\n' + "        <td>Username</td>\n" + "        <td>Display Name</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="user in rolesCollection.users._list">\n' + "        <td>\n" + "          <input\n" + '            type="checkbox"\n' + '            ng-model="user.checked"\n' + "            >\n" + "        </td>\n" + '        <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n' + "        <td>{{user._data.username}}</td>\n" + "        <td>{{user._data.name}}</td>\n" + "      </tr>\n" + "    </table>\n" + '    <div style="padding: 10px 5px 10px 5px">\n' + '      <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n' + '      <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n' + "    </div>\n" + "  </div>\n" + "</div>");
        $templateCache.put("roles/roles.html", '<div class="content-page">\n' + '  <div id="intro-page" >\n' + '    <page-title title=" Roles" icon="&#59170;"></page-title>\n' + "  </div>\n" + "\n" + '  <bsmodal id="newRole"\n' + '           title="New Role"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="newRoleDialog"\n' + '           extrabuttonlabel="Create"\n' + '           buttonid="roles"\n' + "           ng-cloak>\n" + "          <fieldset>\n" + '            <div class="control-group">\n' + '              <label for="new-role-roletitle">Title</label>\n' + '              <div class="controls">\n' + '                <input type="text" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required ng-model="$parent.newRole.title" name="roletitle" id="new-role-roletitle" class="input-xlarge" ug-validate/>\n' + '                <p class="help-block hide"></p>\n' + "              </div>\n" + "            </div>\n" + '            <div class="control-group">\n' + '              <label for="new-role-rolename">Role Name</label>\n' + '              <div class="controls">\n' + '                <input type="text" required ng-pattern="roleNameRegex" ng-attr-title="{{roleNameRegexDescription}}" ng-model="$parent.newRole.name" name="rolename" id="new-role-rolename" class="input-xlarge" ug-validate/>\n' + '                <p class="help-block hide"></p>\n' + "              </div>\n" + "            </div>\n" + "          </fieldset>\n" + "  </bsmodal>\n" + "\n" + '  <bsmodal id="deleteRole"\n' + '           title="Delete Role"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           buttonid="deleteroles"\n' + '           extrabutton="deleteRoleDialog"\n' + '           extrabuttonlabel="Delete"\n' + "           ng-cloak>\n" + "    <p>Are you sure you want to delete the role(s)?</p>\n" + "  </bsmodal>\n" + "\n" + '  <section class="row-fluid">\n' + '    <div id="intro-list" class="span3 user-col">\n' + "\n" + '      <div class="button-toolbar span12">\n' + '        <a title="Select All" class="btn btn-primary select-all toolbar" ng-show="hasRoles" ng-click="selectAllEntities(rolesCollection._list,this,\'rolesSelected\',true)"> <i class="pictogram">&#8863;</i></a>\n' + '        <button id="delete-role-btn" title="Delete" class="btn btn-primary toolbar"  ng-disabled="!hasRoles || !valueSelected(rolesCollection._list)" ng-click="showModal(\'deleteRole\')"><i class="pictogram">&#9749;</i></button>\n' + '        <button id="add-role-btn" title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newRole\')"><i class="pictogram">&#59136;</i></button>\n' + '        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add remove buttons\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_remove_buttons}}" tooltip-placement="right">(?)</a>      </div>\n' + "\n" + '      <ul class="user-list">\n' + '        <li ng-class="selectedRole._data.uuid === role._data.uuid ? \'selected\' : \'\'" ng-repeat="role in rolesCollection._list" ng-click="selectRole(role._data.uuid)">\n' + "          <input\n" + '              type="checkbox"\n' + "              ng-value=\"role.get('uuid')\"\n" + '              ng-checked="master"\n' + '              ng-model="role.checked"\n' + "              id=\"role-{{role.get('title')}}-cb\"\n" + "              >\n" + "          <a id=\"role-{{role.get('title')}}-link\">{{role.get('title')}}</a>\n" + "          <br/>\n" + "          <span ng-if=\"role.get('name')\" class=\"label\">Role Name:</span>{{role.get('name')}}\n" + "        </li>\n" + "      </ul>\n" + "\n" + "\n" + "\n" + '  <div style="padding: 10px 5px 10px 5px">\n' + '    <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n' + '    <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}};float:right;">Next ></button>\n' + "  </div>\n" + "\n" + "    </div>\n" + "    \n" + '    <div id="intro-information-tabs" class="span9 tab-content" ng-show="hasRoles">\n' + '      <div class="menu-toolbar">\n' + '        <ul class="inline">\n' + '          <li class="tab" ng-class="currentRolesPage.route === \'/roles/settings\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectRolePage(\'/roles/settings\')"><i class="pictogram">&#59170;</i>Settings</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles settings tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_settings_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentRolesPage.route === \'/roles/users\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectRolePage(\'/roles/users\')"><i class="pictogram">&#128101;</i>Users</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles users tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_users_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentRolesPage.route === \'/roles/groups\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectRolePage(\'/roles/groups\')"><i class="pictogram">&#59194;</i>Groups</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles groups tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_groups_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + "        </ul>\n" + "      </div>\n" + '      <span ng-include="currentRolesPage.template"></span>\n' + "    </div>\n" + "  </section>\n" + "</div>");
        $templateCache.put("shell/shell.html", '<page-title title=" Shell" icon="&#128241;"></page-title>\n' + "\n" + '<section class="row-fluid">\n' + '  <div class="console-section-contents" id="shell-panel">\n' + '    <div id="shell-input-div">\n' + '      <p> Type "help" to view a list of the available commands.</p>\n' + "      <hr>\n" + "\n" + '      <form name="shellForm" ng-submit="submitCommand()" >\n' + "        <span>&nbsp;&gt;&gt; </span>\n" + '        <input  type="text" id="shell-input"  ng-model="shell.input" autofocus="autofocus" required\n' + '                  ng-form="shellForm">\n' + '        <input style="display: none" type="submit" ng-form="shellForm" value="submit" ng-disabled="!shell.input"/>\n' + "      </form>\n" + "    </div>\n" + '    <pre id="shell-output" class="prettyprint lang-js" style="overflow-x: auto; height: 400px;" ng-bind-html="shell.output">\n' + "\n" + "    </pre>\n" + '    <div id="lastshelloutput" ng-bind-html="shell.outputhidden" style="visibility:hidden"></div>\n' + "  </div>\n" + "</section>\n");
        $templateCache.put("users/users-activities.html", '<div class="content-page" ng-controller="UsersActivitiesCtrl" >\n' + "\n" + '  <bsmodal id="addActivityToUser"\n' + '           title="Add activity to user"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="addActivityToUserDialog"\n' + '           extrabuttonlabel="Add"\n' + "           ng-cloak>\n" + '    <p>Content: <input id="activityMessage" ng-model="$parent.newActivity.activityToAdd" required name="activityMessage" ug-validate /> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add activity content\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities_add_activity_content}}" tooltip-placement="right">(?)</a></p>\n' + "  </bsmodal>\n" + "\n" + "\n" + "  <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "  <br>\n" + '    <div class="button-strip"><a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add activity button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities_add_activity}}" tooltip-placement="left">(?)</a> \n' + '    <button class="btn btn-primary" ng-click="showModal(\'addActivityToUser\')">Add activity to user</button>\n' + "  </div>\n" + "  <div>\n" + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + "        <td>Date</td>\n" + "        <td>Content</td>\n" + "        <td>Verb</td>\n" + "        <td>UUID</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="activity in activities">\n' + "        <td>{{activity.createdDate}}</td>\n" + "        <td>{{activity.content}}</td>\n" + "        <td>{{activity.verb}}</td>\n" + "        <td>{{activity.uuid}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "  </div>\n" + "\n" + "\n" + "</div>\n");
        $templateCache.put("users/users-feed.html", '<div class="content-page" ng-controller="UsersFeedCtrl" >\n' + "\n" + "    <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "    <br>\n" + "    <div>\n" + '        <table class="table table-striped">\n' + "            <tbody>\n" + '            <tr class="table-header">\n' + "                <td>Date</td>\n" + "                <td>User</td>\n" + "                <td>Content</td>\n" + "                <td>Verb</td>\n" + "                <td>UUID</td>\n" + "            </tr>\n" + '            <tr class="zebraRows" ng-repeat="activity in activities">\n' + "                <td>{{activity.createdDate}}</td>\n" + "                <td>{{activity.actor.displayName}}</td>\n" + "                <td>{{activity.content}}</td>\n" + "                <td>{{activity.verb}}</td>\n" + "                <td>{{activity.uuid}}</td>\n" + "            </tr>\n" + "            </tbody>\n" + "        </table>\n" + "    </div>\n" + "\n" + "\n" + "</div>\n");
        $templateCache.put("users/users-graph.html", '<div class="content-page" ng-controller="UsersGraphCtrl">\n' + "\n" + "  <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "\n" + "  <div>\n" + "\n" + '    <bsmodal id="followUser"\n' + '             title="Follow User"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="followUserDialog"\n' + '             extrabuttonlabel="Add"\n' + "             ng-cloak>\n" + '      <div class="btn-group">\n' + '        <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n' + "          <span class=\"filter-label\">{{$parent.user != '' ? $parent.user.username : 'Select a user...'}}</span>\n" + '          <span class="caret"></span>\n' + "        </a>\n" + '        <ul class="dropdown-menu">\n' + '          <li ng-repeat="user in $parent.usersTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.user = user">{{user.username}}</a></li>\n' + "        </ul>\n" + "      </div>\n" + "    </bsmodal>\n" + "\n" + "\n" + '    <div class="button-strip">\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users follow user\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_follow_user}}" tooltip-placement="left">(?)</a> \n' + '      <button class="btn btn-primary" ng-click="showModal(\'followUser\')">Follow User</button>\n' + "    </div>\n" + "    <br>\n" + '      <h4>Following <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users following list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_following}}" tooltip-placement="right">(?)</a></h4>\n' + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + "        <td>Image</td>\n" + "        <td>Username</td>\n" + "        <td>Email</td>\n" + "        <td>UUID</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="user in selectedUser.following">\n' + '        <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n' + "        <td>{{user.username}}</td>\n" + "        <td>{{user.email}}</td>\n" + "        <td>{{user.uuid}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "\n" + '      <h4>Followers <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users followers list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_followers}}" tooltip-placement="right">(?)</a></h4>\n' + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + "        <td>Image</td>\n" + "        <td>Username</td>\n" + "        <td>Email</td>\n" + "        <td>UUID</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="user in selectedUser.followers">\n' + '        <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n' + "        <td>{{user.username}}</td>\n" + "        <td>{{user.email}}</td>\n" + "        <td>{{user.uuid}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "\n" + "  </div>\n" + "</div>");
        $templateCache.put("users/users-groups.html", '<div class="content-page" ng-controller="UsersGroupsCtrl">\n' + "\n" + "  <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "\n" + "  <div>\n" + "\n" + '    <bsmodal id="addUserToGroup"\n' + '             title="Add user to group"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="addUserToGroupDialog"\n' + '             extrabuttonlabel="Add"\n' + "             ng-cloak>\n" + '      <div class="btn-group">\n' + '        <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n' + "          <span class=\"filter-label\">{{$parent.title && $parent.title !== '' ? $parent.title : 'Select a group...'}}</span>\n" + '          <span class="caret"></span>\n' + "        </a>\n" + '        <ul class="dropdown-menu">\n' + '          <li ng-repeat="group in $parent.groupsTypeaheadValues" class="filterItem"><a ng-click="selectGroup(group)">{{group.title}}</a></li>\n' + "        </ul>\n" + "      </div>\n" + "    </bsmodal>\n" + "\n" + '    <bsmodal id="leaveGroup"\n' + '             title="Confirmation"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="leaveGroupDialog"\n' + '             extrabuttonlabel="Leave"\n' + "             ng-cloak>\n" + "      <p>Are you sure you want to remove the user from the seleted group(s)?</p>\n" + "    </bsmodal>\n" + "\n" + '    <div class="button-strip">\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add leave group buttons\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_add_leave_buttons}}" tooltip-placement="left">(?)</a>\n' + '      <button class="btn btn-primary" ng-click="showModal(\'addUserToGroup\')">Add to group</button>\n' + '      <button class="btn btn-primary" ng-disabled="!hasGroups || !valueSelected(userGroupsCollection._list)" ng-click="showModal(\'leaveGroup\')">Leave group(s)</button>\n' + "    </div>\n" + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + "        <td>\n" + '          <input type="checkbox" ng-show="hasGroups" id="selectAllCheckBox" ng-model="userGroupsSelected" ng-click="selectAllEntities(userGroupsCollection._list,this,\'userGroupsSelected\')" >\n' + "        </td>\n" + '        <td>Group Name <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'add user group list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_group_name}}" tooltip-placement="top">(?)</a></td>\n' + "        <td>Path</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="group in userGroupsCollection._list">\n' + "        <td>\n" + "          <input\n" + '            type="checkbox"\n' + "            ng-value=\"group.get('uuid')\"\n" + '            ng-model="group.checked"\n' + "            >\n" + "        </td>\n" + "        <td>{{group.get('title')}}</td>\n" + "        <td>{{group.get('path')}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "  </div>\n" + '  <div style="padding: 10px 5px 10px 5px">\n' + '    <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n' + '    <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n' + "  </div>\n" + "\n" + "</div>\n");
        $templateCache.put("users/users-profile.html", '<div class="content-page" ng-controller="UsersProfileCtrl">\n' + "\n" + "  <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "\n" + '  <div class="row-fluid">\n' + "\n" + '  <form ng-submit="saveSelectedUser()" name="profileForm" novalidate>\n' + '    <div class="span6">\n' + '      <h4>User Information <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users profile information\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_profile_information}}" tooltip-placement="top">(?)</a></h4>\n' + '      <label for="ui-form-username" class="ui-dform-label">Username</label>\n' + '      <input type="text" ug-validate required  name="ui-form-username" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}" id="ui-form-username" class="ui-dform-text" ng-model="user.username">\n' + "      <br/>\n" + '      <label for="ui-form-name" class="ui-dform-label">Full Name</label>\n' + '      <input type="text" ug-validate ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" required name="ui-form-name" id="ui-form-name" class="ui-dform-text" ng-model="user.name">\n' + "      <br/>\n" + '      <label for="ui-form-title" class="ui-dform-label">Title</label>\n' + '      <input type="text" ug-validate name="ui-form-title" id="ui-form-title" class="ui-dform-text" ng-model="user.title">\n' + "      <br/>\n" + '      <label for="ui-form-url" class="ui-dform-label">Home Page</label>\n' + '      <input type="url" ug-validate name="ui-form-url" id="ui-form-url" title="Please enter a valid url." class="ui-dform-text" ng-model="user.url">\n' + "      <br/>\n" + '      <label for="ui-form-email" class="ui-dform-label">Email</label>\n' + '      <input type="email" ug-validate required name="ui-form-email" id="ui-form-email"  ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}" class="ui-dform-text" ng-model="user.email">\n' + "      <br/>\n" + '      <label for="ui-form-tel" class="ui-dform-label">Telephone</label>\n' + '      <input type="tel" ug-validate name="ui-form-tel" id="ui-form-tel" class="ui-dform-text" ng-model="user.tel">\n' + "      <br/>\n" + '      <label for="ui-form-picture" class="ui-dform-label">Picture URL</label>\n' + '      <input type="url" ug-validate name="ui-form-picture" id="ui-form-picture" title="Please enter a valid url." ng class="ui-dform-text" ng-model="user.picture">\n' + "      <br/>\n" + '      <label for="ui-form-bday" class="ui-dform-label">Birthday</label>\n' + '      <input type="date" ug-validate name="ui-form-bday" id="ui-form-bday" class="ui-dform-text" ng-model="user.bday">\n' + "      <br/>\n" + "    </div>\n" + '    <div class="span6">\n' + "      <h4>Address</h4>\n" + '      <label for="ui-form-addr1" class="ui-dform-label">Street 1</label>\n' + '      <input type="text" ug-validate name="ui-form-addr1" id="ui-form-addr1" class="ui-dform-text" ng-model="user.adr.addr1">\n' + "      <br/>\n" + '      <label for="ui-form-addr2" class="ui-dform-label">Street 2</label>\n' + '      <input type="text" ug-validate name="ui-form-addr2" id="ui-form-addr2" class="ui-dform-text" ng-model="user.adr.addr2">\n' + "      <br/>\n" + '      <label for="ui-form-city" class="ui-dform-label">City</label>\n' + '      <input type="text" ug-validate name="ui-form-city" id="ui-form-city" class="ui-dform-text" ng-model="user.adr.city">\n' + "      <br/>\n" + '      <label for="ui-form-state" class="ui-dform-label">State</label>\n' + '      <input type="text" ug-validate name="ui-form-state" id="ui-form-state"  ng-attr-title="{{stateRegexDescription}}" ng-pattern="stateRegex" class="ui-dform-text" ng-model="user.adr.state">\n' + "      <br/>\n" + '      <label for="ui-form-zip" class="ui-dform-label">Zip</label>\n' + '      <input type="text" ug-validate name="ui-form-zip" ng-pattern="zipRegex" ng-attr-title="{{zipRegexDescription}}" id="ui-form-zip" class="ui-dform-text" ng-model="user.adr.zip">\n' + "      <br/>\n" + '      <label for="ui-form-country" class="ui-dform-label">Country</label>\n' + '      <input type="text" ug-validate name="ui-form-country" ng-attr-title="{{countryRegexDescription}}" ng-pattern="countryRegex" id="ui-form-country" class="ui-dform-text" ng-model="user.adr.country">\n' + "      <br/>\n" + "    </div>\n" + "\n" + '      <div class="span6">\n' + '        <input type="submit" class="btn btn-primary margin-35" ng-disabled="!profileForm.$valid"  value="Save User"/>\n' + "      </div>\n" + "\n" + "\n" + '    <div class="content-container">\n' + '      <legend>JSON User Object <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users profile json\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_profile_json}}" tooltip-placement="top">(?)</a></legend>\n' + '      <pre id="{{help.showJsonId}}">{{user.json}}</pre>\n' + "    </div>\n" + "    </form>\n" + "  </div>\n" + "\n" + "</div>\n");
        $templateCache.put("users/users-roles.html", '<div class="content-page" ng-controller="UsersRolesCtrl">\n' + "\n" + "  <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "\n" + "  <div>\n" + "\n" + '    <bsmodal id="addRole"\n' + '             title="Add user to role"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="addUserToRoleDialog"\n' + '             extrabuttonlabel="Add"\n' + "             ng-cloak>\n" + '      <div class="btn-group">\n' + '        <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n' + "          <span class=\"filter-label\">{{$parent.name != '' ? $parent.name : 'Select a Role...'}}</span>\n" + '          <span class="caret"></span>\n' + "        </a>\n" + '        <ul class="dropdown-menu">\n' + '          <li ng-repeat="role in $parent.rolesTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.name = role.name">{{role.name}}</a></li>\n' + "        </ul>\n" + "      </div>\n" + "    </bsmodal>\n" + "\n" + '    <bsmodal id="leaveRole"\n' + '             title="Confirmation"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="leaveRoleDialog"\n' + '             extrabuttonlabel="Leave"\n' + "             ng-cloak>\n" + "      <p>Are you sure you want to remove the user from the role(s)?</p>\n" + "    </bsmodal>\n" + "\n" + '<div ng-controller="UsersRolesCtrl">\n' + "\n" + '<div class="button-strip">\n' + '  <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add role button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_leave_role}}" tooltip-placement="left">(?)</a>\n' + '      <button class="btn btn-primary" ng-click="showModal(\'addRole\')">Add Role</button>\n' + '      <button class="btn btn-primary" ng-disabled="!hasRoles || !valueSelected(selectedUser.roles)" ng-click="showModal(\'leaveRole\')">Leave role(s)</button>\n' + "    </div>\n" + "    <br>\n" + '      <h4>Roles <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles roles list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_roles}}" tooltip-placement="top">(?)</a></h4>\n' + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + '        <td style="width: 30px;"><input type="checkbox" ng-show="hasRoles" id="rolesSelectAllCheckBox" ng-model="usersRolesSelected" ng-click="selectAllEntities(selectedUser.roles,this,\'usersRolesSelected\',true)" ></td>\n' + "        <td>Role Name</td>\n" + "        <td>Role title</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="role in selectedUser.roles">\n' + "        <td>\n" + "          <input\n" + '            type="checkbox"\n' + '            ng-model="role.checked"\n' + "            >\n" + "        </td>\n" + "        <td>{{role.name}}</td>\n" + "        <td>{{role.title}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "\n" + '    <bsmodal id="deletePermission"\n' + '             title="Confirmation"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="deletePermissionDialog"\n' + '             extrabuttonlabel="Delete"\n' + "             ng-cloak>\n" + "      <p>Are you sure you want to delete the permission(s)?</p>\n" + "    </bsmodal>\n" + "\n" + '    <bsmodal id="addPermission"\n' + '             title="New Permission"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="addUserPermissionDialog"\n' + '             extrabuttonlabel="Add"\n' + "             ng-cloak>\n" + '      <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" id="usersRolePermissions" type="text" ng-pattern="pathRegex" required ug-validate ng-attr-title="{{pathRegexDescription}}" /> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_new_permission_path}}" tooltip-placement="right">(?)</a></p>\n' + '      <div class="control-group">\n' + '        <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission verbs check boxes\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_new_permission_verbs}}" tooltip-placement="right">(?)</a>\n' + "      </div>\n" + '      <div class="control-group">\n' + '        <input type="checkbox" ng-model="$parent.permissions.postPerm"> POST\n' + "      </div>\n" + '      <div class="control-group">\n' + '        <input type="checkbox" ng-model="$parent.permissions.putPerm"> PUT\n' + "      </div>\n" + '      <div class="control-group">\n' + '        <input type="checkbox" ng-model="$parent.permissions.deletePerm"> DELETE\n' + "      </div>\n" + "    </bsmodal>\n" + "\n" + '    <div class="button-strip">\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_delete_permission}}" tooltip-placement="left">(?)</a>\n' + '      <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n' + '      <button class="btn btn-primary" ng-disabled="!hasPermissions || !valueSelected(selectedUser.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n' + "    </div>\n" + "    <br>\n" + '      <h4>Permissions <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles permissions list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_permissions}}" tooltip-placement="top">(?)</a></h4>\n' + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + '        <td style="width: 30px;"><input type="checkbox" ng-show="hasPermissions"  id="permissionsSelectAllCheckBox" ng-model="usersPermissionsSelected" ng-click="selectAllEntities(selectedUser.permissions,this,\'usersPermissionsSelected\',true)"  ></td>\n' + "        <td>Path</td>\n" + "        <td>GET</td>\n" + "        <td>POST</td>\n" + "        <td>PUT</td>\n" + "        <td>DELETE</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="permission in selectedUser.permissions">\n' + "        <td>\n" + "          <input\n" + '            type="checkbox"\n' + '            ng-model="permission.checked"\n' + "            >\n" + "        </td>\n" + "        <td>{{permission.path}}</td>\n" + "        <td>{{permission.operations.get}}</td>\n" + "        <td>{{permission.operations.post}}</td>\n" + "        <td>{{permission.operations.put}}</td>\n" + "        <td>{{permission.operations.delete}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "  </div>\n" + " </div>\n" + "\n" + "</div>\n");
        $templateCache.put("users/users-tabs.html", "\n" + "\n" + "\n");
        $templateCache.put("users/users.html", '<div class="content-page">\n' + "\n" + '  <div id="intro-page">    \n' + '    <page-title title=" Users" icon="&#128100;"></page-title>\n' + "  </div>\n" + '  <bsmodal id="newUser"\n' + '           title="Create New User"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           buttonid="users"\n' + '           extrabutton="newUserDialog"\n' + '           extrabuttonlabel="Create"\n' + "           ng-cloak>\n" + "    <fieldset>\n" + '      <div class="control-group">\n' + '        <label for="new-user-username">Username</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="text" required ng-model="$parent.newUser.newusername" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}"  name="username" id="new-user-username" class="input-xlarge" ug-validate/>\n' + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + '      <div class="control-group">\n' + '        <label for="new-user-fullname">Full name</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="text" required  ng-attr-title="{{nameRegexDescription}}" ng-pattern="nameRegex" ng-model="$parent.newUser.name" name="name" id="new-user-fullname" class="input-xlarge" ug-validate/>\n' + "\n" + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + '      <div class="control-group">\n' + '        <label for="new-user-email">Email</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="email" required  ng-model="$parent.newUser.email" pattern="emailRegex"   ng-attr-title="{{emailRegexDescription}}"  name="email" id="new-user-email" class="input-xlarge" ug-validate/>\n' + "\n" + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + '      <div class="control-group">\n' + '        <label for="new-user-password">Password</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="password" required ng-pattern="passwordRegex"  ng-attr-title="{{passwordRegexDescription}}" ng-model="$parent.newUser.newpassword" name="password" id="new-user-password" ug-validate\n' + '                 class="input-xlarge"/>\n' + "\n" + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + '      <div class="control-group">\n' + '        <label for="new-user-re-password">Confirm password</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="password" required ng-pattern="passwordRegex"  ng-attr-title="{{passwordRegexDescription}}" ng-model="$parent.newUser.repassword" name="re-password" id="new-user-re-password" ug-validate\n' + '                 class="input-xlarge"/>\n' + "\n" + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + "    </fieldset>\n" + "  </bsmodal>\n" + "\n" + '  <bsmodal id="deleteUser"\n' + '           title="Delete User"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="deleteUsersDialog"\n' + '           extrabuttonlabel="Delete"\n' + '           buttonid="deleteusers"\n' + "           ng-cloak>\n" + "    <p>Are you sure you want to delete the user(s)?</p>\n" + "  </bsmodal>\n" + "\n" + '  <section class="row-fluid">\n' + '    <div id="intro-list" class="span3 user-col">\n' + "      \n" + '      <div class="button-toolbar span12">\n' + '          <a title="Select All" class="btn btn-primary toolbar select-all" ng-show="hasUsers" ng-click="selectAllEntities(usersCollection._list,this,\'usersSelected\',true)" ng-model="usersSelected"> <i class="pictogram">&#8863;</i></a>\n' + '          <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasUsers || !valueSelected(usersCollection._list)" ng-click="showModal(\'deleteUser\')" id="delete-user-button"><i class="pictogram">&#9749;</i></button>\n' + '        <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newUser\')" id="new-user-button" ng-attr-id="new-user-button"><i class="pictogram">&#59136;</i></button>\n' + '        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add remove buttons\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_users_add_remove_buttons}}" tooltip-placement="right">(?)</a>\n' + "      </div>\n" + '      <ul class="user-list">\n' + '          <li ng-class="selectedUser._data.uuid === user._data.uuid ? \'selected\' : \'\'" ng-repeat="user in usersCollection._list" ng-click="selectUser(user._data.uuid)">\n' + "            <input\n" + '                type="checkbox"\n' + "                id=\"user-{{user.get('username')}}-checkbox\"\n" + "                ng-value=\"user.get('uuid')\"\n" + '                ng-checked="master"\n' + '                ng-model="user.checked"\n' + "                >\n" + "              <a href=\"javaScript:void(0)\"  id=\"user-{{user.get('username')}}-link\" >{{user.get('username')}}</a>\n" + '              <span ng-if="user.name" class="label">Display Name:</span>{{user.name}}\n' + "            </li>\n" + "        </ul>\n" + '        <div style="padding: 10px 5px 10px 5px">\n' + '          <button class="btn btn-primary toolbar" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous\n' + "          </button>\n" + '          <button class="btn btn-primary toolbar" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next >\n' + "          </button>\n" + "        </div>\n" + "      \n" + "    </div>\n" + "\n" + '    <div id="{{help.showTabsId}}" class="span9 tab-content" ng-show="hasUsers">\n' + '      <div class="menu-toolbar">\n' + '        <ul class="inline">\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/profile\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/profile\')"><i class="pictogram">&#59170;</i>Profile</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users profile tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_profile_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/groups\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/groups\')"><i class="pictogram">&#128101;</i>Groups</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users groups tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/activities\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/activities\')"><i class="pictogram">&#59194;</i>Activities</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users activities tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/feed\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/feed\')"><i class="pictogram">&#128196;</i>Feed</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users feed tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_feed_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/graph\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/graph\')"><i class="pictogram">&#9729;</i>Graph</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users graph tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_tab}}" tooltip-placement="top">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/roles\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/roles\')"><i class="pictogram">&#127758;</i>Roles &amp; Permissions</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_tab}}" tooltip-placement="top">(?)</a></div></li>\n' + "        </ul>\n" + "      </div>\n" + '      <span ng-include="currentUsersPage.template"></span>\n' + "    </div>\n" + "  </section>\n" + "</div>");
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersActivitiesCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.activitiesSelected = "active";
        $scope.activityToAdd = "";
        $scope.activities = [];
        $scope.newActivity = {};
        var getActivities = function() {
            ug.getEntityActivities($rootScope.selectedUser);
        };
        if (!$rootScope.selectedUser) {
            $location.path("/users");
            return;
        } else {
            getActivities();
        }
        $scope.addActivityToUserDialog = function(modalId) {
            ug.addUserActivity($rootScope.selectedUser, $scope.newActivity.activityToAdd);
            $scope.hideModal(modalId);
            $scope.newActivity = {};
        };
        $scope.$on("user-activity-add-error", function() {
            $rootScope.$broadcast("alert", "error", "could not create activity");
        });
        $scope.$on("user-activity-add-success", function() {
            $scope.newActivity.activityToAdd = "";
            getActivities();
        });
        $scope.$on("users-activities-error", function() {
            $rootScope.$broadcast("alert", "error", "could not create activity");
        });
        $scope.$on("users-activities-received", function(evt, entities) {
            $scope.activities = entities;
            $scope.applyScope();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersCtrl", [ "ug", "$scope", "$rootScope", "$location", "$route", function(ug, $scope, $rootScope, $location, $route) {
        $scope.newUser = {};
        $scope.usersCollection = {};
        $rootScope.selectedUser = {};
        $scope.previous_display = "none";
        $scope.next_display = "none";
        $scope.hasUsers = false;
        $scope.currentUsersPage = {};
        $scope.selectUserPage = function(route) {
            $scope.currentUsersPage.template = $route.routes[route].templateUrl;
            $scope.currentUsersPage.route = route;
            clearNewUserForm();
        };
        $scope.deleteUsersDialog = function(modalId) {
            $scope.deleteEntities($scope.usersCollection, "user-deleted", "error deleting user");
            $scope.hideModal(modalId);
            clearNewUserForm();
        };
        $scope.$on("user-deleted-error", function() {
            ug.getUsers();
        });
        var clearNewUserForm = function() {
            $scope.newUser = {};
        };
        $scope.newUserDialog = function(modalId) {
            switch (true) {
              case $scope.newUser.newpassword !== $scope.newUser.repassword:
                $rootScope.$broadcast("alert", "error", "Passwords do not match.");
                break;

              default:
                ug.createUser($scope.newUser.newusername, $scope.newUser.name, $scope.newUser.email, $scope.newUser.newpassword);
                $scope.hideModal(modalId);
                clearNewUserForm();
                break;
            }
        };
        ug.getUsers();
        $scope.$on("users-received", function(event, users) {
            $scope.usersCollection = users;
            $scope.usersSelected = false;
            $scope.hasUsers = users._list.length;
            if (users._list.length > 0) {
                $scope.selectUser(users._list[0]._data.uuid);
            }
            $scope.checkNextPrev();
            $scope.applyScope();
        });
        $scope.$on("users-create-success", function() {
            $rootScope.$broadcast("alert", "success", "User successfully created.");
        });
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.usersCollection.hasPreviousPage()) {
                $scope.previous_display = "";
            }
            if ($scope.usersCollection.hasNextPage()) {
                $scope.next_display = "";
            }
        };
        $scope.selectUser = function(uuid) {
            $rootScope.selectedUser = $scope.usersCollection.getEntityByUUID(uuid);
            $scope.currentUsersPage.template = "users/users-profile.html";
            $scope.currentUsersPage.route = "/users/profile";
            $rootScope.$broadcast("user-selection-changed", $rootScope.selectedUser);
        };
        $scope.getPrevious = function() {
            $scope.usersCollection.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of users");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $scope.usersCollection.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of users");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.$on("user-deleted", function(event) {
            $rootScope.$broadcast("alert", "success", "User deleted successfully.");
            ug.getUsers();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersFeedCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.activitiesSelected = "active";
        $scope.activityToAdd = "";
        $scope.activities = [];
        $scope.newActivity = {};
        var getFeed = function() {
            ug.getEntityActivities($rootScope.selectedUser, true);
        };
        if (!$rootScope.selectedUser) {
            $location.path("/users");
            return;
        } else {
            getFeed();
        }
        $scope.$on("users-feed-error", function() {
            $rootScope.$broadcast("alert", "error", "could not create activity");
        });
        $scope.$on("users-feed-received", function(evt, entities) {
            $scope.activities = entities;
            $scope.applyScope();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersGraphCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.graphSelected = "active";
        $scope.user = "";
        ug.getUsersTypeAhead();
        $scope.followUserDialog = function(modalId) {
            if ($scope.user) {
                ug.followUser($scope.user.uuid);
                $scope.hideModal(modalId);
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a user to follow.");
            }
        };
        if (!$rootScope.selectedUser) {
            $location.path("/users");
            return;
        } else {
            $rootScope.selectedUser.activities = [];
            $rootScope.selectedUser.getFollowing(function(err, data) {
                if (err) {} else {
                    if (!$rootScope.$$phase) {
                        $rootScope.$apply();
                    }
                }
            });
            $rootScope.selectedUser.getFollowers(function(err, data) {
                if (err) {} else {
                    if (!$rootScope.$$phase) {
                        $rootScope.$apply();
                    }
                }
            });
            $scope.$on("follow-user-received", function(event) {
                $rootScope.selectedUser.getFollowing(function(err, data) {
                    if (err) {} else {
                        if (!$rootScope.$$phase) {
                            $rootScope.$apply();
                        }
                    }
                });
            });
        }
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersGroupsCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.userGroupsCollection = {};
        $scope.groups_previous_display = "none";
        $scope.groups_next_display = "none";
        $scope.groups_check_all = "";
        $scope.groupsSelected = "active";
        $scope.title = "";
        $scope.master = "";
        $scope.hasGroups = false;
        var init = function() {
            $scope.name = "";
            if (!$rootScope.selectedUser) {
                $location.path("/users");
                return;
            } else {
                ug.getGroupsForUser($rootScope.selectedUser.get("uuid"));
            }
            ug.getGroupsTypeAhead();
        };
        init();
        $scope.addUserToGroupDialog = function(modalId) {
            if ($scope.path) {
                var username = $rootScope.selectedUser.get("uuid");
                ug.addUserToGroup(username, $scope.path);
                $scope.hideModal(modalId);
                $scope.path = "";
                $scope.title = "";
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a group.");
            }
        };
        $scope.selectGroup = function(group) {
            $scope.path = group.path;
            $scope.title = group.title;
        };
        $scope.leaveGroupDialog = function(modalId) {
            $scope.deleteEntities($scope.userGroupsCollection, "user-left-group", "error removing user from group");
            $scope.hideModal(modalId);
        };
        $scope.$on("user-groups-received", function(event, groups) {
            $scope.userGroupsCollection = groups;
            $scope.userGroupsSelected = false;
            $scope.hasGroups = groups._list.length;
            $scope.checkNextPrev();
            if (!$rootScope.$$phase) {
                $rootScope.$apply();
            }
        });
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.userGroupsCollection.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($scope.userGroupsCollection.hasNextPage()) {
                $scope.next_display = "block";
            }
        };
        $rootScope.getPrevious = function() {
            $scope.userGroupsCollection.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of groups");
                }
                $scope.checkNextPrev();
                if (!$rootScope.$$phase) {
                    $rootScope.$apply();
                }
            });
        };
        $rootScope.getNext = function() {
            $scope.userGroupsCollection.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of groups");
                }
                $scope.checkNextPrev();
                if (!$rootScope.$$phase) {
                    $rootScope.$apply();
                }
            });
        };
        $scope.$on("user-left-group", function(event) {
            $scope.checkNextPrev();
            $scope.userGroupsSelected = false;
            if (!$rootScope.$$phase) {
                $rootScope.$apply();
            }
            init();
        });
        $scope.$on("user-added-to-group-received", function(event) {
            $scope.checkNextPrev();
            if (!$rootScope.$$phase) {
                $rootScope.$apply();
            }
            init();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersProfileCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.user = $rootScope.selectedUser._data.clone();
        $scope.user.json = $scope.user.json || $scope.user.stringifyJSON();
        $scope.profileSelected = "active";
        if (!$rootScope.selectedUser) {
            $location.path("/users");
            return;
        }
        $scope.$on("user-selection-changed", function(evt, selectedUser) {
            $scope.user = selectedUser._data.clone();
            $scope.user.json = $scope.user.json || selectedUser._data.stringifyJSON();
        });
        $scope.saveSelectedUser = function() {
            $rootScope.selectedUser.set($scope.user.clone());
            $rootScope.selectedUser.save(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error saving user");
                } else {
                    $rootScope.$broadcast("alert", "success", "user saved");
                }
            });
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersRolesCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.rolesSelected = "active";
        $scope.usersRolesSelected = false;
        $scope.usersPermissionsSelected = false;
        $scope.name = "";
        $scope.master = "";
        $scope.hasRoles = $scope.hasPermissions = false;
        $scope.permissions = {};
        var clearPermissions = function() {
            if ($scope.permissions) {
                $scope.permissions.path = "";
                $scope.permissions.getPerm = false;
                $scope.permissions.postPerm = false;
                $scope.permissions.putPerm = false;
                $scope.permissions.deletePerm = false;
            }
            $scope.applyScope();
        };
        var clearRole = function() {
            $scope.name = "";
            $scope.applyScope();
        };
        ug.getRolesTypeAhead();
        $scope.addUserToRoleDialog = function(modalId) {
            if ($scope.name) {
                var username = $rootScope.selectedUser.get("uuid");
                ug.addUserToRole(username, $scope.name);
                $scope.hideModal(modalId);
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a role.");
            }
        };
        $scope.leaveRoleDialog = function(modalId) {
            var username = $rootScope.selectedUser.get("uuid");
            var roles = $rootScope.selectedUser.roles;
            for (var i = 0; i < roles.length; i++) {
                if (roles[i].checked) {
                    ug.removeUserFromRole(username, roles[i].name);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.deletePermissionDialog = function(modalId) {
            var username = $rootScope.selectedUser.get("uuid");
            var permissions = $rootScope.selectedUser.permissions;
            for (var i = 0; i < permissions.length; i++) {
                if (permissions[i].checked) {
                    ug.deleteUserPermission(permissions[i].perm, username);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.addUserPermissionDialog = function(modalId) {
            if ($scope.permissions.path) {
                var permission = $scope.createPermission(null, null, $scope.removeFirstSlash($scope.permissions.path), $scope.permissions);
                var username = $rootScope.selectedUser.get("uuid");
                ug.newUserPermission(permission, username);
                $scope.hideModal(modalId);
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a name for the permission.");
            }
        };
        if (!$rootScope.selectedUser) {
            $location.path("/users");
            return;
        } else {
            $rootScope.selectedUser.permissions = [];
            $rootScope.selectedUser.roles = [];
            $rootScope.selectedUser.getPermissions(function(err, data) {
                $scope.clearCheckbox("permissionsSelectAllCheckBox");
                if (err) {} else {
                    $scope.hasPermissions = data.data.length > 0;
                    $scope.applyScope();
                }
            });
            $rootScope.selectedUser.getRoles(function(err, data) {
                if (err) {} else {
                    $scope.hasRoles = data.entities.length > 0;
                    $scope.applyScope();
                }
            });
            $scope.$on("role-update-received", function(event) {
                $rootScope.selectedUser.getRoles(function(err, data) {
                    $scope.usersRolesSelected = false;
                    if (err) {} else {
                        $scope.hasRoles = data.entities.length > 0;
                        clearRole();
                        $scope.applyScope();
                    }
                });
            });
            $scope.$on("permission-update-received", function(event) {
                $rootScope.selectedUser.getPermissions(function(err, data) {
                    $scope.usersPermissionsSelected = false;
                    if (err) {} else {
                        clearPermissions();
                        $scope.hasPermissions = data.data.length > 0;
                        $scope.applyScope();
                    }
                });
            });
        }
    } ]);
})({}, function() {
    return this;
}());