 /**
  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.10  */
(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;
                setTimeout(setupMenuState, 500);
                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;
}());