{"version":3,"sources":["scripts/app-054d1cb9fe.js"],"names":["angular","module","UserAddController","$log","$scope","$state","$timeout","$rootScope","$filter","userService","formsService","panelService","flashService","Notification","addUser","create","vm","user","then","response","message","log","debug","error","hide","success","reload","this","users","hasError","showError","canSave","$inject","controller","TeamMemberAddEditController","teamMemberService","errorResponseService","$stateParams","Upload","AWS_S3_UPLOAD","saveTeamMember","teamMember","imageUrl","editing","updateTeamMember","isTeamMemberPending","addTeamMember","uploadThumbnail","imageFile","config","url","data","filename","err","status","evt","progressPercentage","parseInt","loaded","total","progress","file","name","cleanedFilename","cleanFilename","fileExtension","substr","lastIndexOf","cleanedFilenameAndExtension","upload","s3url","method","key","AWSAccessKeyId","acl","policy","signature","Content-Type","type","headers","Authorization","undefined","inputString","timestamp","Date","now","outputString","replace","outputStringWithTimestamp","getErrorMessage","getTeamMemberById","getById","id","_id","created","updateById","deleteTeamMember","deleteById","PressReleaseAddEditController","pressReleaseService","utcDateHelperService","metaTagsHelperService","savePressRelease","pressRelease","pdfUrl","updatePressRelease","isPressReleasePending","addPressRelease","pdfFile","title","getPressReleaseById","body","date","contactInfo","extend","getMetaViewModel","isDatePast","releaseDate","highlight","metaSlug","deletePressRelease","isTimeValid","getCurrentDate","apply","arguments","NewsItemAddEditController","newsItemService","saveNewsItem","newsItem","thumbnailUrl","updateNewsItem","isNewsPending","addNewsItem","thumbnailFile","getNewsItemById","deleteNewsItem","LeadershipAddEditController","leadershipService","saveLeadership","leadership","updateLeadership","isLeadershipPending","addLeadership","getLeadershipById","position","bio","publications","order","deleteLeadership","EventAddEditController","eventService","saveEvent","event","updateEvent","isEventPending","addEvent","getEventById","startDate","endDate","location","deleteEvent","CategoryEditController","categoryService","getCategoryById","category","timeCreated","updateCategory","CategoryAddController","addCategory","BlogPostAddEditController","blogPostService","trixAttachmentAdd","e","attachment","uploadAttachment","uploadFile","href","setAttributes","setUploadProgress","saveBlogPost","applyCategories","blogPost","headerUrl","updateBlogPost","isPostPending","addBlogPost","headerFile","getBlogPostById","categories","author","categoryIds","forEach","cat","push","deleteBlogPost","AccountEditController","accountService","getAccountById","account","first","last","updateAccountDetails","deleteAccount","inviteClicked","inviteWasClicked","inviteEmail","email","isFileTableLoading","invite","statusCode","warning","inviteSent","AccountAddController","addAccount","accounts","nowDate","dateToCompare","getTime","service","factory","mapToModel","item","meta","metaTitle","slug","validateSlug","description","metaDescription","itemCopy","lowercased","trim","toLowerCase","encodeURI","isCtrlDefined","callback","ctrl","form","ngModelCtrl","$dirty","$invalid","$error","ngFormCtrl","$valid","initService","clearFlashMessage","flash","keepAfterLocationChange","$on","isDataLoading","info","parseMessage","extracted","exec","charAt","toUpperCase","slice","prettifyFieldName","spacePos","indexOf","fieldName","prettyFieldName","match","join","defaultMessage","validation","apiHelperService","$http","sendHTTPRequest","req","statusText","$aside","$q","REDIRECT","show","template","aside","templateUrl","controllerAs","container","placement","keyboard","animation","onHide","$promise","destroy","go","current","parent","highlightService","API","getAll","limit","page","sort","HIGHLIGHTS","params","getByIdOrIndex","idOrIndex","updateByIndex","index","deleteByIndex","authService","localStorageService","Session","login","post","LOGIN","username","password","session","loginForgot","LOGIN_FORGOT","loginReset","LOGIN_RESET","logout","get","LOGOUT","token","signup","invitationToken","SIGNUP","ADMIN","getInvitation","SIGNUP_INVITATION","getSession","update","isAuthenticated","isAdmin","isAuthorized","authorizedRoles","isArray","userRoles","userRole","Object","keys","foundRole","some","roles","getRole","roleName","obj","defaults","common","id_token","set","expiresAt","time","userId","userEmail","userName","remove","authSecurityService","loginModalService","requireAdminUser","defer","resolve","reject","promise","requireAuthenticatedUser","requireUnauthenticatedUser","authInterceptorService","$injector","responseError","stateService","USERS","getAllNotPaged","getMy","getByUsername","searchByUsername","createNotesById","notes","createStatusById","updateMy","updateMyPassword","updateUsernameLinkById","deleteUsernameLinkById","updateCache","result","u","getCachedById","TEAM","eventRouteConfig","$stateProvider","$urlRouterProvider","state","ncyBreadcrumb","label","onEnter","skip","TeamMemberController","getTeamMembers","tableState","isTableLoading","pagination","selectedPage","start","itemsByPage","teamMembers","items","pages","numberOfPages","PRESS","press","pressReleaseRouteConfig","PressReleaseController","getPressReleases","pressReleases","NEWS","newsItemRouteConfig","NewsItemController","getNewsItems","newsItems","LEADERSHIP","LeadershipController","getLeaderships","leaderships","EVENTS","ev","eventDateToUtc","moment","utc","toDate","EventController","getEvents","events","CATEGORIES","categoryRouteConfig","CategoryController","getCategories","BLOG","blogPostRouteConfig","BlogPostController","getBlogPosts","blogPosts","ACCOUNTS","profileImage","a","accountRouteConfig","AccountController","getAccounts","LoginResetController","$location","resetPassword","resetForm","$setPristine","valid","isPasswordConfirmed","passwordConfirmation","confirmPassword","search","$modal","loginModal","backdrop","LoginModalController","modalLogin","setUserId","setUsername","setFullname","closeLoginModal","LoginForgotController","forgot","loginForgotForm","phonenumberFilter","tel","value","toString","country","city","number","length","filter","formatTime","withtime","format","capitalize","input","scope","substring","categoryName","restrict","link","elem","categorySelect","selectedCategoryId","categoryMultiSelect","selectedCategoryIds","highlightSelect","highlights","selectionChanged","h","saveHighlight","r","topNavCollapse","$window","element","attrs","bind","pageYOffset","boolChangeClass","$apply","directive","routeConfig","SignupController","invitation","to","forgotpw","resetpw","LoginController","AdminController","ENV_VARS","currentUser","appName","appDesc","fullname","role","isActive","stateLocation","bodyId","toState","toParams","fromState","fromParams","bid","runBlock","run","admin","constant","apiUrl","version","base","ADMIN_GROUPS","ADMINS","AUTH_ATTEMPTS","CONTACT","SESSIONS","USERS_MY","USERS_MY_PASSWORD","document","ready","fix_height","heightWithoutNavbar","height","css","navbarHeigh","wrapperHeigh","window","hasClass","scroll","scrollTop","addClass","removeClass","width","$logProvider","$locationProvider","$httpProvider","NotificationProvider","$modalProvider","$provide","debugEnabled","hashPrefix","html5Mode","enabled","requireBase","interceptors","setOptions","startTop","startRight","html","$templateCache","put"],"mappings":"CAAA,WACI,YAEAA,SACKC,OAAO,oBAIhB,WACI,YAMA,SAASC,GAAkBC,EAAMC,EAAQC,EAAQC,EAAUC,EAAYC,EAASC,EAAaC,EAAcC,EAAcC,EAAcC,GAenI,QAASC,KAELL,EAAYM,OAAOC,EAAGC,MACjBC,KAAK,SAASC,GAENA,EAASC,SAkBVC,IAAIC,MAAM,4BAA6BH,GACvCP,EAAaW,MAAM,4BAhBnBpB,EAAKmB,MAAM,8BAA+BH,GAG1CR,EAAaa,OACbX,EAAaY,QAAQ,4BAIrBnB,EAAS,WACLD,EAAOqB,cA/B3B,GAAIV,GAAKW,IAETX,GAAGY,SACHZ,EAAGF,QAAUA,EACbE,EAAGC,QAGHb,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAdlC7B,EAAkB8B,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,UAAW,cAAe,eAAgB,eAAgB,eAAgB,gBAA7JhC,QACKC,OAAO,cACPgC,WAAW,oBAAqB/B,MAmDzC,WACI,YAEAF,SACKC,OAAO,0BAKhB,WACI,YAMA,SAASiC,GAA4B/B,EAAMC,EAAQC,EAAQC,EAAUC,EAAYC,EAAS2B,EAAmBzB,EAAc0B,EAAsBzB,EAAcC,EAAcC,EAAcwB,EAAcC,EAAQC,GA2B7M,QAASC,KAEDxB,EAAGyB,WAAWC,SAsBX1B,EAAG2B,QACFC,IACM5B,EAAG6B,oBACTC,IAEAlC,EAAaW,MAAM,oDA1BvBwB,EAAgB/B,EAAGgC,WAAW9B,KAC1B,SAASC,GACLH,EAAGyB,WAAWC,SAAWvB,EAAS8B,OAAOC,IAAM/B,EAAS8B,OAAOE,KAAKC,SACjEpC,EAAG2B,QACFC,KAEA5B,EAAG6B,qBAAsB,EACzBC,MAGR,SAASO,GACLlD,EAAKmB,MAAM,iBAAmB+B,EAAIC,QAClC1C,EAAaW,MAAM,4BAEvB,SAASgC,GACL,GAAIC,GAAqBC,SAAS,IAAQF,EAAIG,OAASH,EAAII,MAC3D3C,GAAG4C,SAAWJ,EACdrD,EAAKmB,MAAM,aAAekC,EAAqB,KAAOD,EAAIN,OAAOE,KAAKU,KAAKC,QAc3F,QAASf,GAAgBc,GACrB,GAAIE,GAAkBC,EAAchD,EAAGyB,WAAWqB,MAC9CG,EAAgBJ,EAAKC,KAAKI,UAAUL,EAAKC,KAAKK,YAAY,OAAS,GAAK,GACxEC,EAA8BL,EAAkB,IAAME,CAE1D,OAAO3B,GAAO+B,QACVnB,IAAKX,EAAc+B,MACnBC,OAAQ,OACRpB,MACIqB,IAAKT,EAAkB,IAAME,EAC7BQ,eAAgBlC,EAAckC,eAC9BC,IAAK,cACLC,OAAQpC,EAAcoC,OACtBC,UAAWrC,EAAcqC,UACzBC,eAA6B,IAAbhB,EAAKiB,KAAajB,EAAKiB,KAAO,2BAC9C1B,SAAUgB,EACVP,KAAMA,GAEVkB,SACIC,cAAiBC,UAK7B,QAASjB,GAAckB,GAEnB,GAAIC,GAAYC,KAAKC,MAEjBC,EAAeJ,EAAYK,QAAQ,6CAA8C,KAAKA,QAAQ,eAAe,IAC7GC,EAA4BF,EAAa,IAAIH,CAEjD,OADAhF,GAAKmB,MAAM,4CAA6CkE,GACjDA,EAMX,QAAS1C,KACLX,EAAkBpB,OAAOC,EAAGyB,YACvBvB,KAAK,SAASC,GAENA,EAASC,SAkBVjB,EAAKmB,MAAM,kCAAmCH,GAC9CP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,iCAjBnDhB,EAAKmB,MAAM,oCAAqCH,GAGhDR,EAAaa,OACbX,EAAaY,QAAQ,kCAIrBnB,EAAS,WACLD,EAAOqB,cAkB3B,QAASgE,KACLvD,EAAkBwD,QAAQtD,EAAauD,IAAI1E,KAAK,SAASC,GACjDA,IACAhB,EAAKmB,MAAM,2BAA4BH,GAEvCH,EAAGyB,WAAWoD,IAAM1E,EAAS0E,IAC7B7E,EAAGyB,WAAWqB,KAAO3C,EAAS2C,KAC9B9C,EAAGyB,WAAWC,SAAWvB,EAASuB,SAClC1B,EAAGyB,WAAWqD,QAAU3E,EAAS2E,WAK7C,QAASlD,KACLT,EAAkB4D,WAAW/E,EAAGyB,YAC3BvB,KAAK,SAASC,GAENA,EAASC,SAaVjB,EAAKmB,MAAM,oCAAqCH,GAChDP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,oCAbnDhB,EAAKmB,MAAM,sCAAuCH,GAElDR,EAAaa,OACbX,EAAaY,QAAQ,qCACrBnB,EAAS,WACLD,EAAOqB,cAc3B,QAASsE,KACL7D,EAAkB8D,WAAWjF,EAAGyB,YAAYvB,KAAK,SAASC,GAClDA,EAASI,MAOTV,EAAaU,MAAM,kCANnBZ,EAAaa,OACbX,EAAaY,QAAQ,qCACrBnB,EAAS,WACLD,EAAOqB,cA/KvB,GAAIV,GAAKW,IAETX,GAAGyB,cAEHzB,EAAGwB,eAAiBA,EACpBxB,EAAG8B,cAAgBA,EACnB9B,EAAG0E,kBAAoBA,EACvB1E,EAAG4B,iBAAmBA,EACtB5B,EAAGgF,iBAAmBA,EAGtB5F,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAK9B,WACIf,EAAG2B,UAAYN,EAAauD,GACzB5E,EAAG2B,SAAS+C,OAxBvBxD,EAA4BF,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,UAAW,oBAAqB,eAAgB,uBAAwB,eAAgB,eAAgB,eAAgB,eAAgB,SAAU,iBAD/OhC,QACKC,OAAO,oBACPgC,WAAW,8BAA+BC,MA8LnD,WACI,YAEAlC,SACKC,OAAO,4BAIhB,WACI,YAMA,SAASiG,GAA8B/F,EAAMC,EAAQC,EAAQC,EAAUC,EAAYC,EAAS2F,EACpFzF,EAAc0F,EAAsBhE,EAAsBzB,EAAc0F,EACxEzF,EAAcC,EAAcwB,EAAcC,EAAQC,GAiCtD,QAAS+D,KAEDtF,EAAGuF,aAAaC,OAsBbxF,EAAG2B,QACF8D,IACMzF,EAAG0F,sBACTC,IAEA/F,EAAaW,MAAM,qDA1BvBwB,EAAgB/B,EAAG4F,SAAS1F,KACxB,SAASC,GACLH,EAAGuF,aAAaC,OAASrF,EAAS8B,OAAOC,IAAM/B,EAAS8B,OAAOE,KAAKC,SACjEpC,EAAG2B,QACF8D,KAEAzF,EAAG0F,uBAAwB,EAC3BC,MAGR,SAAStD,GACLlD,EAAKmB,MAAM,iBAAmB+B,EAAIC,QAClC1C,EAAaW,MAAM,4BAEvB,SAASgC,GACL,GAAIC,GAAqBC,SAAS,IAAQF,EAAIG,OAASH,EAAII,MAC3D3C,GAAG4C,SAAWJ,EACdrD,EAAKmB,MAAM,aAAekC,EAAqB,KAAOD,EAAIN,OAAOE,KAAKU,KAAKC,QAc3F,QAASf,GAAgBc,GACrB,GAAIE,GAAkBC,EAAchD,EAAGuF,aAAaM,OAChD5C,EAAgBJ,EAAKC,KAAKI,UAAUL,EAAKC,KAAKK,YAAY,OAAS,GAAK,GACxEC,EAA8BL,EAAkB,IAAME,CAE1D,OAAO3B,GAAO+B,QACVnB,IAAKX,EAAc+B,MACnBC,OAAQ,OACRpB,MACIqB,IAAKT,EAAkB,IAAME,EAC7BQ,eAAgBlC,EAAckC,eAC9BC,IAAK,cACLC,OAAQpC,EAAcoC,OACtBC,UAAWrC,EAAcqC,UACzBC,eAA6B,IAAbhB,EAAKiB,KAAajB,EAAKiB,KAAO,2BAC9C1B,SAAUgB,EACVP,KAAMA,GAEVkB,SACIC,cAAiBC,UAK7B,QAASjB,GAAckB,GAEnB,GAAIC,GAAYC,KAAKC,MAEjBC,EAAeJ,EAAYK,QAAQ,6CAA8C,KAAKA,QAAQ,eAAe,IAC7GC,EAA4BF,EAAa,IAAIH,CAEjD,OADAhF,GAAKmB,MAAM,4CAA6CkE,GACjDA,EAMX,QAASmB,KACLR,EAAoBpF,OAAOC,EAAGuF,cACzBrF,KAAK,SAASC,GAENA,EAASC,SAkBVjB,EAAKmB,MAAM,kCAAmCH,GAC9CP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,mCAjBnDhB,EAAKmB,MAAM,sCAAuCH,GAGlDR,EAAaa,OACbX,EAAaY,QAAQ,qCAIrBnB,EAAS,WACLD,EAAOqB,cAkB3B,QAASoF,KACLX,EAAoBR,QAAQtD,EAAauD,IAAI1E,KAAK,SAASC,GACvD,GAAIA,EAAU,CACVhB,EAAKmB,MAAM,6BAA8BH,GAEzCH,EAAGuF,aAAaV,IAAM1E,EAAS0E,IAC/B7E,EAAGuF,aAAaM,MAAQ1F,EAAS0F,MACjC7F,EAAGuF,aAAaQ,KAAO5F,EAAS4F,KAChC/F,EAAGuF,aAAaS,KAAO7F,EAAS6F,KAChChG,EAAGuF,aAAaC,OAASrF,EAASqF,OAClCxF,EAAGuF,aAAaU,YAAc9F,EAAS8F,YACvCjG,EAAGuF,aAAaT,QAAU3E,EAAS2E,QAEnC9F,QAAQkH,OAAOlG,EAAGuF,aAAcF,EAAsBc,iBAAiBhG,GAEvE,IAAIiG,GAAahB,EAAqBgB,WAAWjG,EAASkG,YAC1DrG,GAAGuF,aAAac,YAAcD,EAAa,KAAOjG,EAASkG,YAE3DrG,EAAGsG,UAAUxC,KAAO,gBACpB9D,EAAGsG,UAAUT,MAAQ7F,EAAGuF,aAAaM,MACrC7F,EAAGsG,UAAUN,KAAOhG,EAAGuF,aAAaS,KAGpChG,EAAGsG,UAAUpE,IAAMlC,EAAGuF,aAAagB,YAK/C,QAASd,KACLN,EAAoBJ,WAAW/E,EAAGuF,cAC7BrF,KAAK,SAASC,GAENA,EAASC,SAaVjB,EAAKmB,MAAM,sCAAuCH,GAClDP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,sCAbnDhB,EAAKmB,MAAM,wCAAyCH,GAEpDR,EAAaa,OACbX,EAAaY,QAAQ,uCACrBnB,EAAS,WACLD,EAAOqB,cAc3B,QAAS8F,KACLrB,EAAoBF,WAAWjF,EAAGuF,cAAcrF,KAAK,SAASC,GACtDA,EAASI,MAOTV,EAAaU,MAAM,oCANnBZ,EAAaa,OACbX,EAAaY,QAAQ,uCACrBnB,EAAS,WACLD,EAAOqB,cAQvB,QAAS+F,KACL,GAAIJ,GAAcrG,EAAGuF,aAAac,WAClC,QAAQA,IAAgBjB,EAAqBgB,WAAWC,GAG5D,QAASK,KACL,MAAO,IAAItC,MAjNf,GAAIpE,GAAKW,IAETX,GAAGuF,gBACHvF,EAAGsG,aAEHtG,EAAGsF,iBAAmBA,EACtBtF,EAAG2F,gBAAkBA,EACrB3F,EAAG8F,oBAAsBA,EACzB9F,EAAGyF,mBAAqBA,EACxBzF,EAAGwG,mBAAqBA,EACxBxG,EAAGyG,YAAcA,EACjBzG,EAAG0G,eAAiBA,EAGpBtH,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAU,WACb,MAAOrB,GAAaqB,QAAQ4F,MAAMvH,EAAQwH,YAAcH,KAM5D,WACIzG,EAAG2B,UAAYN,EAAauD,GACzB5E,EAAG2B,SAASmE,OA/BvBZ,EAA8BlE,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,UAAW,sBAAuB,eAAgB,uBAAwB,uBAAwB,eAAgB,wBAAyB,eAAgB,eAAgB,eAAgB,SAAU,iBAFpShC,QACKC,OAAO,sBACPgC,WAAW,gCAAiCiE,MA8NrD,WACI,YAEAlG,SACKC,OAAO,wBAIhB,WACI,YAMA,SAAS4H,GAA0B1H,EAAMC,EAAQC,EAAQC,EAAUC,EAAYC,EAASsH,EAAiB1B,EAAsB1F,EAAc0B,EAAsBzB,EAAcC,EAAcC,EAAcwB,EAAcC,EAAQC,GAqC/N,QAASwF,KAED/G,EAAGgH,SAASC,aAsBTjH,EAAG2B,QACFuF,IACMlH,EAAGmH,cACTC,IAEAxH,EAAaW,MAAM,uDA1BvBwB,EAAgB/B,EAAGqH,eAAenH,KAC9B,SAASC,GACLH,EAAGgH,SAASC,aAAe9G,EAAS8B,OAAOC,IAAM/B,EAAS8B,OAAOE,KAAKC,SACnEpC,EAAG2B,QACFuF,KAEAlH,EAAGmH,eAAgB,EACnBC,MAGR,SAAS/E,GACLlD,EAAKmB,MAAM,iBAAmB+B,EAAIC,QAClC1C,EAAaW,MAAM,4BAEvB,SAASgC,GACL,GAAIC,GAAqBC,SAAS,IAAQF,EAAIG,OAASH,EAAII,MAC3D3C,GAAG4C,SAAWJ,EACdrD,EAAKmB,MAAM,aAAekC,EAAqB,KAAOD,EAAIN,OAAOE,KAAKU,KAAKC,QAc3F,QAASf,GAAgBc,GACrB,GAAIE,GAAkBC,EAAchD,EAAGgH,SAASnB,OAC5C5C,EAAgBJ,EAAKC,KAAKI,UAAUL,EAAKC,KAAKK,YAAY,OAAS,GAAK,GACxEC,EAA8BL,EAAkB,IAAME,CAE1D,OAAO3B,GAAO+B,QACVnB,IAAKX,EAAc+B,MACnBC,OAAQ,OACRpB,MACIqB,IAAKT,EAAkB,IAAME,EAC7BQ,eAAgBlC,EAAckC,eAC9BC,IAAK,cACLC,OAAQpC,EAAcoC,OACtBC,UAAWrC,EAAcqC,UACzBC,eAA6B,IAAbhB,EAAKiB,KAAajB,EAAKiB,KAAO,2BAC9C1B,SAAUgB,EACVP,KAAMA,GAEVkB,SACIC,cAAiBC,UAK7B,QAASjB,GAAckB,GAEnB,GAAIC,GAAYC,KAAKC,MAEjBC,EAAeJ,EAAYK,QAAQ,6CAA8C,KAAKA,QAAQ,eAAe,IAC7GC,EAA4BF,EAAa,IAAIH,CAEjD,OADAhF,GAAKmB,MAAM,4CAA6CkE,GACjDA,EAMX,QAAS4C,KACLN,EAAgB/G,OAAOC,EAAGgH,UACrB9G,KAAK,SAASC,GAENA,EAASC,SAkBVjB,EAAKmB,MAAM,kCAAmCH,GAC9CP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,+BAjBnDhB,EAAKmB,MAAM,kCAAmCH,GAG9CR,EAAaa,OACbX,EAAaY,QAAQ,iCAIrBnB,EAAS,WACLD,EAAOqB,cAkB3B,QAAS4G,KACLR,EAAgBnC,QAAQtD,EAAauD,IAAI1E,KAAK,SAASC,GACnD,GAAIA,EAAU,CACVhB,EAAKmB,MAAM,yBAA0BH,GAErCH,EAAGgH,SAASnC,IAAM1E,EAAS0E,IAC3B7E,EAAGgH,SAASnB,MAAQ1F,EAAS0F,MAC7B7F,EAAGgH,SAAS9E,IAAM/B,EAAS+B,IAC3BlC,EAAGgH,SAAShB,KAAO7F,EAAS6F,KAC5BhG,EAAGgH,SAASC,aAAe9G,EAAS8G,aACpCjH,EAAGgH,SAASlC,QAAU3E,EAAS2E,OAE/B,IAAIsB,GAAahB,EAAqBgB,WAAWjG,EAASkG,YAC1DrG,GAAGgH,SAASX,YAAcD,EAAa,KAAOjG,EAASkG,YAEvDrG,EAAGsG,UAAUxC,KAAO,YACpB9D,EAAGsG,UAAUT,MAAQ7F,EAAGgH,SAASnB,MACjC7F,EAAGsG,UAAUN,KAAOhG,EAAGgH,SAAShB,KAChChG,EAAGsG,UAAUpE,IAAMlC,EAAGgH,SAAS9E,OAK3C,QAASgF,KACLJ,EAAgB/B,WAAW/E,EAAGgH,UACzB9G,KAAK,SAASC,GAENA,EAASC,SAaVjB,EAAKmB,MAAM,kCAAmCH,GAC9CP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,kCAbnDhB,EAAKmB,MAAM,oCAAqCH,GAEhDR,EAAaa,OACbX,EAAaY,QAAQ,mCACrBnB,EAAS,WACLD,EAAOqB,cAc3B,QAAS6G,KACLT,EAAgB7B,WAAWjF,EAAGgH,UAAU9G,KAAK,SAASC,GAC9CA,EAASI,MAOTV,EAAaU,MAAM,gCANnBZ,EAAaa,OACbX,EAAaY,QAAQ,mCACrBnB,EAAS,WACLD,EAAOqB,cAQvB,QAAS+F,KACL,GAAIJ,GAAcrG,EAAGgH,SAASX,WAC9B,QAAQA,IAAgBjB,EAAqBgB,WAAWC,GAG5D,QAASK,KACL,MAAO,IAAItC,MAjNf,GAAIpE,GAAKW,IAETX,GAAGgH,YACHhH,EAAGsG,aAEHtG,EAAG+G,aAAeA,EAClB/G,EAAGoH,YAAcA,EACjBpH,EAAGsH,gBAAkBA,EACrBtH,EAAGkH,eAAiBA,EACpBlH,EAAGuH,eAAiBA,EACpBvH,EAAGyG,YAAcA,EACjBzG,EAAG0G,eAAiBA,EAQpBtH,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAU,WACb,MAAOrB,GAAaqB,QAAQ4F,MAAMvH,EAAQwH,YAAcH,KAM5D,WACIzG,EAAG2B,UAAYN,EAAauD,GACzB5E,EAAG2B,SAAS2F,OAhCvBT,EAA0B7F,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,UAAW,kBAAmB,uBAAwB,eAAgB,uBAAwB,eAAgB,eAAgB,eAAgB,eAAgB,SAAU,iBAHnQhC,QACKC,OAAO,kBACPgC,WAAW,4BAA6B4F,MA2NjD,WACI,YAEA7H,SACKC,OAAO,0BAKhB,WACI,YAMA,SAASuI,GAA4BrI,EAAMC,EAAQC,EAAQC,EAAUC,EAAYC,EAASiI,EAAmB/H,EAAc0B,EAAsBzB,EAAcC,EAAcC,EAAcwB,EAAcC,EAAQC,GA2B7M,QAASmG,KAED1H,EAAG2H,WAAWjG,SAsBX1B,EAAG2B,QACFiG,IACM5H,EAAG6H,oBACTC,IAEAlI,EAAaW,MAAM,oDA1BvBwB,EAAgB/B,EAAGgC,WAAW9B,KAC1B,SAASC,GACLH,EAAG2H,WAAWjG,SAAWvB,EAAS8B,OAAOC,IAAM/B,EAAS8B,OAAOE,KAAKC,SACjEpC,EAAG2B,QACFiG,KAEA5H,EAAG6H,qBAAsB,EACzBC,MAGR,SAASzF,GACLlD,EAAKmB,MAAM,iBAAmB+B,EAAIC,QAClC1C,EAAaW,MAAM,4BAEvB,SAASgC,GACL,GAAIC,GAAqBC,SAAS,IAAQF,EAAIG,OAASH,EAAII,MAC3D3C,GAAG4C,SAAWJ,EACdrD,EAAKmB,MAAM,aAAekC,EAAqB,KAAOD,EAAIN,OAAOE,KAAKU,KAAKC,QAc3F,QAASf,GAAgBc,GACrB,GAAIE,GAAkBC,EAAchD,EAAG2H,WAAW7E,MAC9CG,EAAgBJ,EAAKC,KAAKI,UAAUL,EAAKC,KAAKK,YAAY,OAAS,GAAK,GACxEC,EAA8BL,EAAkB,IAAME,CAE1D,OAAO3B,GAAO+B,QACVnB,IAAKX,EAAc+B,MACnBC,OAAQ,OACRpB,MACIqB,IAAKT,EAAkB,IAAME,EAC7BQ,eAAgBlC,EAAckC,eAC9BC,IAAK,cACLC,OAAQpC,EAAcoC,OACtBC,UAAWrC,EAAcqC,UACzBC,eAA6B,IAAbhB,EAAKiB,KAAajB,EAAKiB,KAAO,2BAC9C1B,SAAUgB,EACVP,KAAMA,GAEVkB,SACIC,cAAiBC,UAK7B,QAASjB,GAAckB,GAEnB,GAAIC,GAAYC,KAAKC,MAEjBC,EAAeJ,EAAYK,QAAQ,6CAA8C,KAAKA,QAAQ,eAAe,IAC7GC,EAA4BF,EAAa,IAAIH,CAEjD,OADAhF,GAAKmB,MAAM,4CAA6CkE,GACjDA,EAMX,QAASsD,KACLL,EAAkB1H,OAAOC,EAAG2H,YACvBzH,KAAK,SAASC,GAENA,EAASC,SAkBVjB,EAAKmB,MAAM,kCAAmCH,GAC9CP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,gCAjBnDhB,EAAKmB,MAAM,oCAAqCH,GAGhDR,EAAaa,OACbX,EAAaY,QAAQ,kCAIrBnB,EAAS,WACLD,EAAOqB,cAkB3B,QAASqH,KACLN,EAAkB9C,QAAQtD,EAAauD,IAAI1E,KAAK,SAASC,GACjDA,IACAhB,EAAKmB,MAAM,2BAA4BH,GAEvCH,EAAG2H,WAAW9C,IAAM1E,EAAS0E,IAC7B7E,EAAG2H,WAAW7E,KAAO3C,EAAS2C,KAC9B9C,EAAG2H,WAAWjG,SAAWvB,EAASuB,SAClC1B,EAAG2H,WAAWK,SAAW7H,EAAS6H,SAClChI,EAAG2H,WAAWM,IAAM9H,EAAS8H,IAC7BjI,EAAG2H,WAAWO,aAAe/H,EAAS+H,aACtClI,EAAG2H,WAAW7C,QAAU3E,EAAS2E,QACjC9E,EAAG2H,WAAWQ,MAAQhI,EAASgI,SAK3C,QAASP,KACLH,EAAkB1C,WAAW/E,EAAG2H,YAC3BzH,KAAK,SAASC,GAENA,EAASC,SAaVjB,EAAKmB,MAAM,oCAAqCH,GAChDP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,mCAbnDhB,EAAKmB,MAAM,sCAAuCH,GAElDR,EAAaa,OACbX,EAAaY,QAAQ,oCACrBnB,EAAS,WACLD,EAAOqB,cAc3B,QAAS0H,KACLX,EAAkBxC,WAAWjF,EAAG2H,YAAYzH,KAAK,SAASC,GAClDA,EAASI,MAOTV,EAAaU,MAAM,iCANnBZ,EAAaa,OACbX,EAAaY,QAAQ,oCACrBnB,EAAS,WACLD,EAAOqB,cAnLvB,GAAIV,GAAKW,IAETX,GAAG2H,cAEH3H,EAAG0H,eAAiBA,EACpB1H,EAAG8H,cAAgBA,EACnB9H,EAAG+H,kBAAoBA,EACvB/H,EAAG4H,iBAAmBA,EACtB5H,EAAGoI,iBAAmBA,EAGtBhJ,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAK9B,WACIf,EAAG2B,UAAYN,EAAauD,GACzB5E,EAAG2B,SAASoG,OArBvBP,EAA4BxG,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,UAAW,oBAAqB,eAAgB,uBAAwB,eAAgB,eAAgB,eAAgB,eAAgB,SAAU,iBAJ/OhC,QACKC,OAAO,oBACPgC,WAAW,8BAA+BuG,MAkMnD,WACI,YAEAxI,SACKC,OAAO,qBAIhB,WACI,YAMA,SAASoJ,GAAuBlJ,EAAMC,EAAQC,EAAQC,EAAUC,EAAYC,EAAS8I,EAAc5I,EAAc0B,EAAsBzB,EAAcC,EAAcC,EAAcwB,EAAcC,EAAQC,GA2BnM,QAASgH,KAEDvI,EAAGwI,MAAMvB,aAsBNjH,EAAG2B,QACF8G,IACMzI,EAAG0I,eACTC,IAEA/I,EAAaW,MAAM,mDA1BvBwB,EAAgB/B,EAAGqH,eAAenH,KAC9B,SAASC,GACLH,EAAGwI,MAAMvB,aAAe9G,EAAS8B,OAAOC,IAAM/B,EAAS8B,OAAOE,KAAKC,SAChEpC,EAAG2B,QACF8G,KAEAzI,EAAG0I,gBAAiB,EACpBC,MAGR,SAAStG,GACLlD,EAAKmB,MAAM,iBAAmB+B,EAAIC,QAClC1C,EAAaW,MAAM,4BAEvB,SAASgC,GACL,GAAIC,GAAqBC,SAAS,IAAQF,EAAIG,OAASH,EAAII,MAC3D3C,GAAG4C,SAAWJ,EACdrD,EAAKmB,MAAM,aAAekC,EAAqB,KAAOD,EAAIN,OAAOE,KAAKU,KAAKC,QAc3F,QAASf,GAAgBc,GACrB,GAAIE,GAAkBC,EAAchD,EAAGwI,MAAM3C,OACzC5C,EAAgBJ,EAAKC,KAAKI,UAAUL,EAAKC,KAAKK,YAAY,OAAS,GAAK,GACxEC,EAA8BL,EAAkB,IAAME,CAE1D,OAAO3B,GAAO+B,QACVnB,IAAKX,EAAc+B,MACnBC,OAAQ,OACRpB,MACIqB,IAAKT,EAAkB,IAAME,EAC7BQ,eAAgBlC,EAAckC,eAC9BC,IAAK,cACLC,OAAQpC,EAAcoC,OACtBC,UAAWrC,EAAcqC,UACzBC,eAA6B,IAAbhB,EAAKiB,KAAajB,EAAKiB,KAAO,2BAC9C1B,SAAUgB,EACVP,KAAMA,GAEVkB,SACIC,cAAiBC,UAK7B,QAASjB,GAAckB,GAEnB,GAAIC,GAAYC,KAAKC,MAEjBC,EAAeJ,EAAYK,QAAQ,6CAA8C,KAAKA,QAAQ,eAAe,IAC7GC,EAA4BF,EAAa,IAAIH,CAEjD,OADAhF,GAAKmB,MAAM,4CAA6CkE,GACjDA,EAMX,QAASmE,KACLL,EAAavI,OAAOC,EAAGwI,OAClBtI,KAAK,SAASC,GAENA,EAASC,SAkBVjB,EAAKmB,MAAM,kCAAmCH,GAC9CP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,2BAjBnDhB,EAAKmB,MAAM,+BAAgCH,GAG3CR,EAAaa,OACbX,EAAaY,QAAQ,6BAIrBnB,EAAS,WACLD,EAAOqB,cAkB3B,QAASkI,KACLN,EAAa3D,QAAQtD,EAAauD,IAAI1E,KAAK,SAASC,GAC5CA,IACAhB,EAAKmB,MAAM,sBAAuBH,GAElCH,EAAGwI,MAAM3D,IAAM1E,EAAS0E,IACxB7E,EAAGwI,MAAM3C,MAAQ1F,EAAS0F,MAC1B7F,EAAGwI,MAAMtG,IAAM/B,EAAS+B,IACxBlC,EAAGwI,MAAMK,UAAY1I,EAAS0I,UAC9B7I,EAAGwI,MAAMM,QAAU3I,EAAS2I,QAC5B9I,EAAGwI,MAAMvB,aAAe9G,EAAS8G,aACjCjH,EAAGwI,MAAMO,SAAW5I,EAAS4I,SAC7B/I,EAAGwI,MAAM1D,QAAU3E,EAAS2E,WAKxC,QAAS2D,KACLH,EAAavD,WAAW/E,EAAGwI,OACtBtI,KAAK,SAASC,GAENA,EAASC,SAaVjB,EAAKmB,MAAM,+BAAgCH,GAC3CP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,8BAbnDhB,EAAKmB,MAAM,iCAAkCH,GAE7CR,EAAaa,OACbX,EAAaY,QAAQ,+BACrBnB,EAAS,WACLD,EAAOqB,cAc3B,QAASsI,KACLV,EAAarD,WAAWjF,EAAGwI,OAAOtI,KAAK,SAASC,GACxCA,EAASI,MAOTV,EAAaU,MAAM,4BANnBZ,EAAaa,OACbX,EAAaY,QAAQ,+BACrBnB,EAAS,WACLD,EAAOqB,cAnLvB,GAAIV,GAAKW,IAETX,GAAGwI,SAEHxI,EAAGuI,UAAYA,EACfvI,EAAG2I,SAAWA,EACd3I,EAAG4I,aAAeA,EAClB5I,EAAGyI,YAAcA,EACjBzI,EAAGgJ,YAAcA,EAGjB5J,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAK9B,WACIf,EAAG2B,UAAYN,EAAauD,GACzB5E,EAAG2B,SAASiH,OApBvBP,EAAuBrH,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,UAAW,eAAgB,eAAgB,uBAAwB,eAAgB,eAAgB,eAAgB,eAAgB,SAAU,iBALrOhC,QACKC,OAAO,eACPgC,WAAW,yBAA0BoH,MAkM9C,WACI,YAEArJ,SACKC,OAAO,wBAIhB,WACI,YAMA,SAASgK,GAAuB9J,EAAMC,EAAQC,EAAQgC,EAAc/B,EAAUE,EAASD,EAAY2J,EAAiBxJ,EAAcC,EAAcC,EAAcC,GAwB1J,QAASsJ,KAKLD,EAAgBvE,QAAQtD,EAAauD,IAAI1E,KAAK,SAASC,GAC/CA,IACAhB,EAAKmB,MAAM,yBAA0BH,GAErCH,EAAGoJ,SAASvE,IAAM1E,EAAS0E,IAC3B7E,EAAGoJ,SAAStG,KAAO3C,EAAS2C,KAC5B9C,EAAGoJ,SAASC,YAAclJ,EAASkJ,eAK/C,QAASC,KAELJ,EAAgBnE,WAAW/E,EAAGoJ,UACzBlJ,KAAK,SAASC,GAENA,EAASC,SAkBVjB,EAAKmB,MAAM,kCAAmCH,GAC9CP,EAAaW,MAAM,4BAhBnBpB,EAAKmB,MAAM,oCAAqCH,GAGhDR,EAAaa,OACbX,EAAaY,QAAQ,kCAErBnB,EAAS,WACLD,EAAOqB,cAtD3B,GAAIV,GAAKW,IAETX,GAAGoJ,YACHpJ,EAAGoJ,SAASxE,GAAK,GACjB5E,EAAGoJ,SAAStG,KAAO,GACnB9C,EAAGoJ,SAASC,YAAc,GAE1BrJ,EAAGmJ,gBAAkBA,EACrBnJ,EAAGsJ,eAAiBA,EAGpBlK,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAM9B,WACIoI,OAnBRF,EAAuBjI,SAAW,OAAQ,SAAU,SAAU,eAAgB,WAAY,UAAW,aAAc,kBAAmB,eAAgB,eAAgB,eAAgB,gBANtLhC,QACKC,OAAO,kBACPgC,WAAW,yBAA0BgI,MA0E9C,WACI,YAMA,SAASM,GAAsBpK,EAAMC,EAAQC,EAAQC,EAAUC,EAAYC,EAAS0J,EAAiBxJ,EAAcC,EAAcC,EAAcC,GAY3I,QAAS2J,KAILN,EAAgBnJ,OAAOC,EAAGoJ,UACrBlJ,KAAK,SAASC,GAENA,EAASC,SAkBVjB,EAAKmB,MAAM,gCAAiCH,GAC5CP,EAAaW,MAAM,4BAhBnBpB,EAAKmB,MAAM,kCAAmCH,GAG9CR,EAAaa,OACbX,EAAaY,QAAQ,gCAIrBnB,EAAS,WACLD,EAAOqB,cA9B3B,GAAIV,GAAKW,IACTX,GAAGwJ,YAAcA,EAGjBpK,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAJlCwI,EAAsBvI,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,UAAW,kBAAmB,eAAgB,eAAgB,eAAgB,gBAPrKhC,QACKC,OAAO,kBACPgC,WAAW,wBAAyBsI,MAkD7C,WACI,YAEAvK,SACKC,OAAO,wBAIhB,WACI,YAMA,SAASwK,GAA0BtK,EAAMC,EAAQC,EAAQC,EAAUC,EAAY8F,EACvE7F,EAASkK,EAAiBhK,EAAc0F,EAAsBhE,EAC9DzB,EAAcC,EAAcC,EAAcwB,EAAcC,EAAQC,GAsCpE,QAASoI,GAAkBC,GACvB,GAAIC,EAEJ,OADAA,GAAaD,EAAEC,WACXA,EAAWhH,KACJiH,EAAiBD,GAD5B,OAKJ,QAASC,GAAiBD,GACtB,MAAOE,GAAWF,EAAWhH,MAAM3C,KAC/B,SAASC,GACL,GAAI+B,GAAK8H,CAET,OADA9H,GAAM8H,EAAO7J,EAAS8B,OAAOC,IAAM/B,EAAS8B,OAAOE,KAAKC,SACjDyH,EAAWI,eACd/H,IAAKA,EACL8H,KAAMA,KAGd,SAAS3H,GACLlD,EAAKmB,MAAM,iBAAmB+B,EAAIC,QAClC1C,EAAaW,MAAM,sCAEvB,SAASgC,GACL,GAAIC,GAAqBC,SAAS,IAAQF,EAAIG,OAASH,EAAII,MAE3D,OADAxD,GAAKmB,MAAM,aAAekC,EAAqB,KAAOD,EAAIN,OAAOE,KAAKU,KAAKC,MACpE+G,EAAWK,kBAAkB1H,KAOhD,QAAS2H,KACLC,IAEIpK,EAAGqK,SAASC,UAsBRtK,EAAG2B,QACH4I,IACMvK,EAAGwK,cACTC,IAEA7K,EAAaW,MAAM,6BA1BvBwJ,EAAW/J,EAAG0K,YAAYxK,KACtB,SAASC,GACLH,EAAGqK,SAASC,UAAYnK,EAAS8B,OAAOC,IAAM/B,EAAS8B,OAAOE,KAAKC,SAChEpC,EAAG2B,QACF4I,KAEAvK,EAAGwK,eAAgB,EACnBC,MAGR,SAASpI,GACLlD,EAAKmB,MAAM,iBAAmB+B,EAAIC,QAClC1C,EAAaW,MAAM,4BAEvB,SAASgC,GACL,GAAIC,GAAqBC,SAAS,IAAQF,EAAIG,OAASH,EAAII,MAC3D3C,GAAG4C,SAAWJ,EACdrD,EAAKmB,MAAM,aAAekC,EAAqB,KAAOD,EAAIN,OAAOE,KAAKU,KAAKC,QAc3F,QAASiH,GAAWlH,GAChB,GAAIE,GAAkBC,EAAchD,EAAGqK,SAASxE,OAAS,mBACrD5C,EAAgBJ,EAAKC,KAAKI,UAAUL,EAAKC,KAAKK,YAAY,OAAS,GAAK,GACxEC,EAA8BL,EAAkB,IAAME,CAE1D,OAAO3B,GAAO+B,QACVnB,IAAKX,EAAc+B,MACnBC,OAAQ,OACRpB,MACIqB,IAAKT,EAAkB,IAAME,EAC7BQ,eAAgBlC,EAAckC,eAC9BC,IAAK,cACLC,OAAQpC,EAAcoC,OACtBC,UAAWrC,EAAcqC,UACzBC,eAA6B,IAAbhB,EAAKiB,KAAajB,EAAKiB,KAAO,2BAC9C1B,SAAUgB,EACVP,KAAMA,GAEVkB,SACIC,cAAiBC,UAK7B,QAASjB,GAAckB,GAEnB,GAAIC,GAAYC,KAAKC,MAEjBC,EAAeJ,EAAYK,QAAQ,6CAA8C,KAAKA,QAAQ,eAAe,IAC7GC,EAA4BF,EAAa,IAAIH,CAEjD,OADAhF,GAAKmB,MAAM,4CAA6CkE,GACjDA,EAMX,QAASiG,KACLf,EAAgB3J,OAAOC,EAAGqK,UACrBnK,KAAK,SAASC,GAENA,EAASC,SAiBVjB,EAAKmB,MAAM,kCAAmCH,GAC9CP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,+BAhBnDhB,EAAKmB,MAAM,kCAAmCH,GAG9CR,EAAaa,OACbX,EAAaY,QAAQ,iCAIrBnB,EAAS,WACLD,EAAOqB,cAiB3B,QAASiK,KACLjB,EAAgB/E,QAAQtD,EAAauD,IAAI1E,KAAK,SAASC,GACnD,GAAIA,EAAU,CACVhB,EAAKmB,MAAM,yBAA0BH,GAErCH,EAAGqK,SAASxF,IAAM1E,EAAS0E,IAC3B7E,EAAGqK,SAASxE,MAAQ1F,EAAS0F,MAC7B7F,EAAGqK,SAASO,WAAazK,EAASyK,WAClC5K,EAAGqK,SAASQ,OAAS1K,EAAS0K,OAC9B7K,EAAGqK,SAAStE,KAAO5F,EAAS4F,KAC5B/F,EAAGqK,SAASC,UAAYnK,EAASmK,UACjCtK,EAAGqK,SAASvF,QAAU3E,EAAS2E,QAE/B9F,QAAQkH,OAAOlG,EAAGqK,SAAUhF,EAAsBc,iBAAiBhG,GAEnE,IAAIiG,GAAahB,EAAqBgB,WAAWjG,EAASkG,YAC1DrG,GAAGqK,SAAShE,YAAcD,EAAa,KAAOjG,EAASkG,YAEvDrG,EAAG8K,eACH9K,EAAGqK,SAASO,WAAWG,QAAQ,SAASC,GACrChL,EAAG8K,YAAYG,KAAKD,EAAIpG,SAMvC,QAAS2F,KACLb,EAAgB3E,WAAW/E,EAAGqK,UACzBnK,KAAK,SAASC,GAENA,EAASC,SAYVjB,EAAKmB,MAAM,kCAAmCH,GAC9CP,EAAaW,MACTa,EAAqBqD,gBAAgBtE,EAAU,kCAZnDhB,EAAKmB,MAAM,oCAAqCH,GAEhDR,EAAaa,OACbX,EAAaY,QAAQ,mCACrBnB,EAAS,WACLD,EAAOqB,cAa3B,QAASwK,KACLxB,EAAgBzE,WAAWjF,EAAGqK,UAAUnK,KAAK,SAASC,GAC9CA,EAASI,MAOTV,EAAaU,MAAM,gCANnBZ,EAAaa,OACbX,EAAaY,QAAQ,mCACrBnB,EAAS,WACLD,EAAOqB,cAQvB,QAAS0J,KACLpK,EAAGqK,SAASO,eACX5K,EAAG8K,iBAAmBC,QAAQ,SAASC,GACpChL,EAAGqK,SAASO,WAAWK,MAAOrG,GAAIoG,MAI1C,QAASvE,KACL,GAAIJ,GAAcrG,EAAGqK,SAAShE,WAC9B,QAAQA,IAAgBjB,EAAqBgB,WAAWC,GAG5D,QAASK,KACL,MAAO,IAAItC,MA1Pf,GAAIpE,GAAKW,IAETX,GAAGqK,YACHrK,EAAG8K,eAEH9K,EAAGmK,aAAeA,EAClBnK,EAAGyK,YAAcA,EACjBzK,EAAG2K,gBAAkBA,EACrB3K,EAAGuK,eAAiBA,EACpBvK,EAAGkL,eAAiBA,EACpBlL,EAAG2J,kBAAoBA,EACvB3J,EAAG0G,eAAiBA,EACpB1G,EAAGyG,YAAcA,EAQjBrH,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAU,WACb,MAAOrB,GAAaqB,QAAQ4F,MAAMvH,EAAQwH,YAAcH,KAK5D,WACIzG,EAAG2B,UAAYN,EAAauD,GACzB5E,EAAG2B,SAASgJ,OA9BvBlB,EAA0BzI,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,wBAAyB,UAAW,kBAAmB,eAAgB,uBAAwB,uBAAwB,eAAgB,eAAgB,eAAgB,eAAgB,SAAU,iBAR5RhC,QACKC,OAAO,kBACPgC,WAAW,4BAA6BwI,MAsQjD,WACI,YAEAzK,SACKC,OAAO,uBAIhB,WACI,YAMA,SAASkM,GAAsBhM,EAAMC,EAAQC,EAAQgC,EAAc/B,EAAUE,EAASD,EAAY6L,EAAgB1L,EAAcC,EAAcC,EAAcC,GA8BxJ,QAASwL,KAKLD,EAAezG,QAAQtD,EAAauD,IAAI1E,KAAK,SAASC,GAE9CA,IACAhB,EAAKmB,MAAM,wBAAyBH,GAEpCH,EAAGsL,QAAQ1G,GAAKzE,EAAS0E,IACzB7E,EAAGsL,QAAQC,MAAQpL,EAAS2C,KAAKyI,MACjCvL,EAAGsL,QAAQE,KAAOrL,EAAS2C,KAAK0I,KAChCxL,EAAGsL,QAAQjC,YAAclJ,EAASkJ,eAK9C,QAASoC,KAELtM,EAAKmB,MAAM,qCAAsCN,EAAGsL,SAEpDtL,EAAGsL,QAAQC,MAAQ/L,EAAQ,cAAcQ,EAAGsL,QAAQC,OACpDvL,EAAGsL,QAAQE,KAAOhM,EAAQ,cAAcQ,EAAGsL,QAAQE,MAEnDJ,EAAerG,WAAW/E,EAAGsL,SACxBpL,KAAK,SAASC,GAENA,EAASC,SAmBVjB,EAAKmB,MAAM,iCAAkCH,GAC7CP,EAAaW,MAAM,+BAjBnBpB,EAAKmB,MAAM,mCAAoCH,GAG/CR,EAAaa,OACbX,EAAaY,QAAQ,iCAIrBnB,EAAS,WACLD,EAAOqB,cAa3B,QAASgL,KACLN,EAAenG,WAAWjF,EAAGsL,SAASpL,KAAK,SAASC,GAChDR,EAAaa,OACbX,EAAaY,QAAQ,iCAErBnB,EAAS,WACLD,EAAOqB,aAKnB,QAASiL,KACL,IAAG3L,EAAG4L,kBAEe,MAAlB5L,EAAG6L,aAA0C,KAAnB7L,EAAG6L,YAAoB,CAChD,GAAIP,IACA1G,GAAI5E,EAAGsL,QAAQ1G,GACfkH,MAAO9L,EAAG6L,YAGd7L,GAAG+L,oBAAqB,EAExBX,EAAeY,OAAOV,GAASpL,KAAK,SAASC,GACzCH,EAAG+L,oBAAqB,EACpB5L,EAASI,MACkB,MAAxBJ,EAAS8L,YACRpM,EAAaqM,QAAQ/L,EAASC,SAC9BJ,EAAGmM,YAAa,GAEhBtM,EAAaU,MAAM,+BAGvBV,EAAaY,QAAQ,oBACrBT,EAAGmM,YAAa,MAnHhC,GAAInM,GAAKW,IAETX,GAAGsL,WACHtL,EAAGsL,QAAQ1G,GAAK,GAChB5E,EAAGsL,QAAQC,MAAQ,GACnBvL,EAAGsL,QAAQE,KAAO,GAClBxL,EAAGsL,QAAQjC,YAAc,GACzBrJ,EAAG6L,YAAc,GACjB7L,EAAGmM,YAAa,EAChBnM,EAAG4L,kBAAmB,EAEtB5L,EAAGqL,eAAiBA,EACpBrL,EAAGyL,qBAAuBA,EAC1BzL,EAAG0L,cAAgBA,EACnB1L,EAAG2L,cAAgBA,EAGnBvM,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAM9B,WACIsK,OAtBRF,EAAsBnK,SAAW,OAAQ,SAAU,SAAU,eAAgB,WAAY,UAAW,aAAc,iBAAkB,eAAgB,eAAgB,eAAgB,gBATpLhC,QACKC,OAAO,iBACPgC,WAAW,wBAAyBkK,MAgI7C,WACI,YAMA,SAASiB,GAAqBjN,EAAMC,EAAQC,EAAQC,EAAUC,EAAYC,EAAS4L,EAAgB1L,EAAcC,EAAcC,EAAcC,GAezI,QAASwM,KAILjB,EAAerL,OAAOC,EAAGC,MACpBC,KAAK,SAASC,GAENA,EAASC,SAkBVjB,EAAKmB,MAAM,+BAAgCH,GAC3CP,EAAaW,MAAM,4BAhBnBpB,EAAKmB,MAAM,iCAAkCH,GAG7CR,EAAaa,OACbX,EAAaY,QAAQ,+BAIrBnB,EAAS,WACLD,EAAOqB,cAjC3B,GAAIV,GAAKW,IAETX,GAAGsM,YACHtM,EAAGqM,WAAaA,EAChBrM,EAAGC,QAGHb,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAJlCqL,EAAqBpL,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,UAAW,iBAAkB,eAAgB,eAAgB,eAAgB,gBAVnKhC,QACKC,OAAO,iBACPgC,WAAW,uBAAwBmL,MAqD5C,WACI,YAEApN,SACKC,OAAO,8BAMhB,WACI,YAMA,SAASmG,KAoBL,QAASgB,GAAWJ,GAGhB,GAAIuG,GAAUnI,KAAKC,MACfmI,EAAgB,GAAIpI,MAAK4B,GAAMyG,SACnC,OAAuBF,GAAhBC,EAxBX,GAAIE,KAKJ,OAFAA,GAAQtG,WAAaA,EAEdsG,EAVX1N,QACKC,OAAO,wBACP0N,QAAQ,uBAAwBvH,MA2CzC,WACI,YAMA,SAASC,KAML,QAASuH,GAAWC,GAChB,GAAIC,IACAjH,MAAOgH,EAAKE,UACZC,KAAMC,EAAaJ,EAAKtG,UACxB2G,YAAaL,EAAKM,iBAElBC,EAAWpO,QAAQkH,UAAW2G,EAKlC,cAJOO,GAASL,gBACTK,GAAS7G,eACT6G,GAASD,gBAETnO,QAAQkH,UAAWkH,GAAYN,KAAMA,IAGhD,QAAS3G,GAAiB0G,GACtB,MAAOA,GAAKC,MACRC,UAAWF,EAAKC,KAAKjH,MACrBU,SAAUsG,EAAKC,KAAKE,KACpBG,gBAAiBN,EAAKC,KAAKI,gBAInC,QAASD,GAAaD,GAClB,IAAKA,EAAM,MAAO,EAClB,IAAIK,GAAaL,EAAKM,OAAOC,aAC7B,OAAOC,WAAUH,EAAW9I,QAAQ,IAAK,MA9B7C,OACIqI,WAAYA,EACZzG,iBAAkBA,GAP1BnH,QACKC,OAAO,wBACP0N,QAAQ,wBAAyBtH,MAuC1C,WACI,YAMA,SAAS3F,GAAaP,GAGlB,QAASsO,GAAcC,GACnB,MAAO,YACH,GAAIC,GAAO/G,UAAU,EACrB,OAAoB,mBAAT+G,IACA,EAEJD,EAAS/G,MAAM+G,EAAU9G,YARxC,GAAIgH,KAsBJ,OAVAA,GAAK/M,SAAW4M,EAAc,SAASI,GACnC,MAAOA,GAAYC,QAAUD,EAAYE,WAE7CH,EAAK9M,UAAY2M,EAAc,SAASI,EAAaxL,GACjD,MAAOwL,GAAYC,QAAUD,EAAYG,OAAO3L,KAEpDuL,EAAK7M,QAAU0M,EAAc,SAASQ,GAClC,MAAOA,GAAWH,QAAUG,EAAWC,SAGpCN,EAhBXlO,EAAasB,SAAW,QAXxBhC,QACKC,OAAO,wBACP0N,QAAQ,eAAgBjN,MA+BjC,WACI,YAMA,SAASE,GAAaT,EAAMI,GAaxB,QAAS4O,KAOL,QAASC,KACL,GAAIC,GAAQ9O,EAAW8O,KACnBA,KACKA,EAAMC,wBAIPD,EAAMC,yBAA0B,QAHzB/O,GAAW8O,OAT9B9O,EAAWgP,IAAI,oBAAqB,WAEhCH,MAiBR,QAAS3N,GAAQL,EAASkO,GAEtB/O,EAAWiP,eAAgB,EAE3BjP,EAAW8O,OACPjO,QAASA,EACT0D,KAAM,UACNwK,wBAAyBA,GAIjC,QAAS/N,GAAMH,EAASkO,GAEpB/O,EAAWiP,eAAgB,EAE3BjP,EAAW8O,OACPjO,QAASA,EACT0D,KAAM,SACNwK,wBAAyBA,GAIjC,QAASG,GAAKrO,EAASkO,GAEnB/O,EAAWiP,eAAgB,EAE3BjP,EAAW8O,OACPjO,QAASA,EACT0D,KAAM,OACNwK,wBAAyBA,GAIjC,QAASpC,GAAQ9L,EAASkO,GAEtB/O,EAAWiP,eAAgB,EAE3BjP,EAAW8O,OACPjO,QAASA,EACT0D,KAAM,UACNwK,wBAAyBA,GAxEjC,GAAI5B,KASJ,OAPAA,GAAQjM,QAAUA,EAClBiM,EAAQnM,MAAQA,EAChBmM,EAAQ+B,KAAOA,EACf/B,EAAQR,QAAUA,EAElBiC,IAEOzB,EAHX9M,EAAaoB,SAAW,OAAQ,cAZhChC,QACKC,OAAO,wBACP0N,QAAQ,eAAgB/M,MAoFjC,WACI,YAMA,SAASwB,KAOL,QAASsN,GAAavO,GAClB,GAAIwO,GAAY,YAAYC,KAAKzO,EAASC,QAC1C,KAAKuO,IAAcA,EAAU,GACzB,MAAOxO,GAASC,OAEpB,IAAIA,GAAUuO,EAAU,GAAGpK,QAAQ,KAAM,GACzC,OAAOnE,GAAQyO,OAAO,GAAGC,cAAgB1O,EAAQ2O,MAAM,GAG3D,QAASC,GAAkB5O,GACvB,GAAI6O,GAAW7O,EAAQ8O,QAAQ,IAC/B,IAAiB,KAAbD,EACA,MAAO7O,EAEX,IAAI+O,GAAY/O,EAAQ8C,OAAO,EAAG+L,GAC9BG,EAAkBD,EAAUE,MAAM,gBAAgBC,KAAK,IAC3D,OAAOF,GAAkBhP,EAAQ8C,OAAO+L,GAG5C,QAASxK,GAAgBtE,EAAUoP,GAC/B,MAAKpP,GAASqP,WAIPR,EAAkBN,EAAavO,IAF3BoP,EA5Bf,GAAI7C,KAIJ,OAFAA,GAAQjI,gBAAkBA,EAEnBiI,EATX1N,QACKC,OAAO,wBACP0N,QAAQ,uBAAwBvL,MAwCzC,WACI,YAMA,SAASqO,GAAiBtQ,EAAMuQ,GAM5B,QAASC,GAAgBC,GAIrB,MAAOF,GAAME,GAAK1P,KAAK,SAASC,GAG5B,MAAOA,GAASgC,MAEjB,SAAS5B,GAGR,MADApB,GAAKoB,MAAM,0BAA2BA,EAAM+B,OAAS,KAAO/B,EAAMsP,YAC3DtP,EAAM4B,OAhBrB,OACIwN,gBAAiBA,GAMzBF,EAAiBzO,SAAW,OAAQ,SAbpChC,QACKC,OAAO,wBACP0N,QAAQ,mBAAoB8C,MA4BrC,WACI,YAMA,SAAS9P,GAAamQ,EAAQzQ,EAAQgC,EAAclC,EAAM4Q,EAAIC,GAY1D,QAASC,GAAKC,EAAUjP,GAkBpB,MAdAkP,GAAQL,GACJM,YAAaF,EACbjP,WAAYA,EACZoP,aAAc,KACdC,UAAW,OACXC,UAAW,QACXC,UAAU,EACVC,UAAW,iBACXR,MAAM,EACNS,OAAQ,WACJlQ,OAID2P,EAAMQ,SAASzQ,KAAKiQ,EAAMF,MAOrC,QAASzP,KAED2P,IAIAA,EAAMS,UACNvR,EAAOwR,GAAGxR,EAAOyR,QAAQC,SA1CjC,OACId,KAAMA,EACNzP,KAAMA,EAGV,IAAI2P,GAGRxQ,EAAaqB,SAAW,SAAU,SAAU,eAAgB,OAAQ,KAAM,YAd1EhC,QACKC,OAAO,wBACP0N,QAAQ,eAAgBhN,MAyDjC,WACI,YAEAX,SACKC,OAAO,gCAKhB,WACI,YAMA,SAAS+R,GAAiB7R,EAAM8R,EAAKxB,GAkBjC,QAASyB,GAAOC,EAAOC,EAAMC,GAEzBlS,EAAKmB,MAAM,2BAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAIK,WACTC,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAG5C,QAAS4B,GAAeC,GACpB,GAAI7B,IACArM,OAAQ,MACRrB,IAAK+O,EAAIK,WAAa,IAAMG,EAEhC,OAAOhC,GAAiBE,gBAAgBC,GAQ5C,QAAS7K,GAAWuB,GAEhBnH,EAAKmB,MAAM,wBAAyBgG,EAEpC,IAAIsJ,IACArM,OAAQ,MACRrB,IAAK+O,EAAIK,WAAY,IAAKhL,EAAUzB,IACpC1C,KAAMmE,EAEV,OAAOmJ,GAAiBE,gBAAgBC,GAG5C,QAAS8B,GAAcpL,GAEnBnH,EAAKmB,MAAM,wBAAyBgG,EAEpC,IAAIsJ,IACArM,OAAQ,MACRrB,IAAK+O,EAAIK,WAAY,IAAKhL,EAAUqL,MACpCxP,KAAMmE,EAEV,OAAOmJ,GAAiBE,gBAAgBC,GAO5C,QAAS3K,GAAWqB,GAEhB,GAAIsJ,IACArM,OAAQ,SACRrB,IAAK+O,EAAIK,WAAY,IAAKhL,EAAUzB,IAExC,OAAO4K,GAAiBE,gBAAgBC,GAG5C,QAASgC,GAActL,GAEnB,GAAIsJ,IACArM,OAAQ,SACRrB,IAAK+O,EAAIK,WAAY,IAAKhL,EAAUqL,MAExC,OAAOlC,GAAiBE,gBAAgBC,GA1F5C,OAEIsB,OAAQA,EACRM,eAAgBA,EAGhBE,cAAeA,EACf3M,WAAYA,EAGZE,WAAYA,EACZ2M,cAAeA,GADvBZ,EAAiBhQ,SAAW,OAAQ,MAAO,oBAf3ChC,QACKC,OAAO,0BACP0N,QAAQ,mBAAoBqE,MAuGrC,WACI,YAEAhS,SACKC,OAAO,2BAMhB,WACI,YAMA,SAAS4S,GAAY1S,EAAMG,EAAUyQ,EAAIL,EAAOrQ,EAAQyS,EAAqBjS,EAAckS,EAASd,EAAKjB,EAAUP,GAmB/G,QAASuC,GAAM/R,EAAMyN,GAEjB,MAAOgC,GAAMuC,KAAKhB,EAAIiB,OACdC,SAAUlS,EAAKkS,SACfC,SAAUnS,EAAKmS,WAElB3R,QAAQ,SAASN,GAGVA,EAASkS,SAETlT,EAAKmB,MAAM,yBAA0BH,GAGrC4R,EAAQhS,OAAOI,IAIfhB,EAAKoB,MAAM,uBAAwBJ,EAASC,WAS5D,QAASkS,GAAYxG,GAEjB,MAAO4D,GAAMuC,KAAKhB,EAAIsB,cAAgBzG,MAAOA,IACxC5L,KAAK,SAASC,GAEX,MADAhB,GAAKmB,MAAM,sCAAuCH,GAC3CA,IAHRuP,SAKI,SAASnP,GAEZ,KADApB,GAAKoB,MAAM,oCAAqCA,GAC1CA,IAOlB,QAASiS,GAAWrQ,GAEhB,MAAOuN,GAAMuC,KAAKhB,EAAIwB,YAAatQ,GAC9BjC,KAAK,SAASC,GAEX,MADAhB,GAAKmB,MAAM,qCAAsCH,GAC1CA,IAHRuP,SAKI,SAASnP,GAEZ,KADApB,GAAKoB,MAAM,mCAAoCA,GACzCA,IAOlB,QAASmS,KAGL,MAAIZ,GAAoBa,IAAI,WAIjBjD,EAAAA,UAAauB,EAAI2B,QACnB1S,KAAK,SAASC,GAGX4R,EAAQnB,UAGRmB,EAAQc,MAAM,KAGd1T,EAAKmB,MAAM,0BAA2BH,GACtCN,EAAaY,QAAQ,mCAGrBpB,EAAOwR,GAAGb,EAASkC,QAEpB,SAAS3R,GAERpB,EAAKoB,MAAM,wBAAyBA,GAGpCwR,EAAQnB,UAGRmB,EAAQc,MAAM,KAGdxT,EAAOwR,GAAGb,EAASkC,UAI3B/S,EAAKmB,MAAM,+CAEXjB,GAAOwR,GAAGb,EAASkC,QAO3B,QAASY,GAAO3Q,EAAM4Q,GAGlB,MAFA5Q,GAAK4Q,gBAAkBA,EAEhBrD,EAAMuC,KAAKhB,EAAI+B,OAAQ7Q,GACzB1B,QAAQ,SAASN,GAEVA,EAASkS,SAKTN,EAAQhS,OAAOI,GAGfd,EAAOwR,GAAGb,EAASiD,QAKnB9T,EAAKoB,MAAM,wBAAyBJ,EAASC,WAM7D,QAAS8S,GAAcL,GACnB,GAAIjD,IACArM,OAAQ,MACRrB,IAAK+O,EAAIkC,kBAAoB,IAAMN,EAEvC,OAAOpD,GAAiBE,gBAAgBC,GAQ5C,QAASwD,KAMDtB,EAAoBa,IAAI,YAExBxT,EAAKmB,MAAM,2CAGXyR,EAAQsB,UAIRlU,EAAKmB,MAAM,8CASnB,QAASgT,KAEL,QAASvB,EAAQc,MAGrB,QAASU,KACL,MAAOC,GAAa,SAQxB,QAASA,GAAaC,GACbzU,QAAQ0U,QAAQD,KAEjBA,GAAmBA,GAIvB,IAAIE,GAAY5B,EAAQ6B,SAAWC,OAAOC,KAAK/B,EAAQ6B,UAAY,GAG/DG,EAAYN,EAAgBO,KAAK,SAASC,GAAS,MAAmC,IAA5BN,EAAUzE,QAAQ+E,IAQhF,OAAQX,MAAqBS,EAGjC,QAASG,GAAQC,GACb,MAAOpC,GAAQ6B,SAASO,GA7N5B,OACInC,MAAOA,EACPM,YAAaA,EACbE,WAAYA,EACZE,OAAQA,EACRI,OAAQA,EACRM,WAAYA,EACZE,gBAAiBA,EACjBE,aAAcA,EACdN,cAAeA,EACfK,QAASA,EACTW,QAASA,GADjBrC,EAAY7Q,SAAW,OAAQ,WAAY,KAAM,QAAS,SAAU,sBAAuB,eAAgB,UAAW,MAAO,WAAY,oBAhBzIhC,QACKC,OAAO,qBACP0N,QAAQ,cAAekF,MAsOhC,WACI,YAMA,SAASE,GAAQ5S,EAAMuQ,EAAOoC,GAQ1B,QAAS/R,GAAOqU,GAIZ1E,EAAM2E,SAAStQ,QAAQuQ,OAAOtQ,cAAgB,UAAYoQ,EAAIG,SAQ9DzC,EAAoB0C,IAAI,WACpB5P,GAAYwP,EAAI/B,QAAQxN,IACxB4P,UAAYL,EAAI/B,QAAQqC,KACxBlR,IAAY4Q,EAAI/B,QAAQ7O,IACxBmR,OAAYP,EAAI/B,QAAQsC,OACxBC,UAAYR,EAAInU,KAAK6L,MACrB+I,SAAYT,EAAInU,KAAKkS,SACrByB,SAAYQ,EAAInU,KAAKgU,MACrBpB,MAAYuB,EAAIG,WAIpBlC,EAAQzN,GAAgBwP,EAAI/B,QAAQxN,IACpCwN,EAAQoC,UAAgBL,EAAI/B,QAAQqC,KACpCrC,EAAQ7O,IAAgB4Q,EAAI/B,QAAQ7O,IACpC6O,EAAQsC,OAAgBP,EAAI/B,QAAQsC,OACpCtC,EAAQuC,UAAgBR,EAAInU,KAAK6L,MACjCuG,EAAQwC,SAAgBT,EAAInU,KAAKkS,SACjCE,EAAQuB,SAAgBQ,EAAInU,KAAKgU,MACjC5B,EAAQQ,MAAgBuB,EAAIG,SAOhC,QAASlB,KAEL3D,EAAM2E,SAAStQ,QAAQuQ,OAAOtQ,cAAgB,UAAY8N,EAAoBa,IAAI,WAAWE,MAI7FR,EAAQzN,GAAgBkN,EAAoBa,IAAI,WAAW/N,GAC3DyN,EAAQoC,UAAgB3C,EAAoBa,IAAI,WAAW8B,UAC3DpC,EAAQ7O,IAAgBsO,EAAoBa,IAAI,WAAWnP,IAC3D6O,EAAQsC,OAAgB7C,EAAoBa,IAAI,WAAWgC,OAC3DtC,EAAQuC,UAAgB9C,EAAoBa,IAAI,WAAWiC,UAC3DvC,EAAQwC,SAAgB/C,EAAoBa,IAAI,WAAWkC,SAC3DxC,EAAQuB,SAAgB9B,EAAoBa,IAAI,WAAWiB,SAC3DvB,EAAQQ,MAAgBf,EAAoBa,IAAI,WAAWE,MAI/D,QAASjC,KAELzR,EAAKmB,MAAM,0CAEXoP,EAAM2E,SAAStQ,QAAQuQ,OAAOtQ,cAAc,GAE5C8N,EAAoBgD,OAAO,WAnE/B,GAAIzC,IACAtS,OAAQA,EACRsT,OAAQA,EACRzC,QAASA,EAqEb,OAAOyB,GA7DXN,EAAQ/Q,SAAW,OAAQ,QAAS,uBAjBpChC,QACKC,OAAO,qBACP0N,QAAQ,UAAWoF,MAiF5B,WACI,YAMA,SAASgD,GAAoB5V,EAAMG,EAAUD,EAAQ0Q,EAAIxQ,EAAYsS,EAAamD,EAAmBnV,EAAcmQ,GAgB/G,QAASiF,KAGL,GAAIC,GAAQnF,EAAGmF,QACXzB,GAAmB,QAAS,UAwChC,OArCI5B,GAAY2B,aAAaC,IAGzBtU,EAAKmB,MAAM,gEAKX4U,EAAMC,WAEDtD,EAAYyB,mBAEjBnU,EAAKmB,MAAM,yEACXT,EAAaqM,SAAS9L,QAAS,iDAAkDyF,MAAO,mBAGxFvG,EAAS,WACLuS,EAAYa,SACZrT,EAAOwR,GAAGb,EAASkC,SAEvBgD,EAAME,WAGNjW,EAAKmB,MAAM,2FAIXhB,EAAS,WACLH,EAAKmB,MAAM,+CAEXjB,EAAOwR,GAAGb,EAASkC,SAIvBgD,EAAME,UAGHF,EAAMG,QAMjB,QAASC,KAGL,GAAIJ,GAAQnF,EAAGmF,OAcf,OAXIrD,GAAYyB,mBAGZnU,EAAKmB,MAAM,0EACX4U,EAAMC,YAGNhW,EAAKmB,MAAM,6EACX0U,EAAkB/E,OAClBiF,EAAME,UAEHF,EAAMG,QAMjB,QAASE,KAGL,GAAIL,GAAQnF,EAAGmF,OAkBf,OAhBIrD,GAAYyB,mBAEZnU,EAAKmB,MAAM,sDACXT,EAAaqM,SAAS9L,QAAS,wBAAyByF,MAAO,kBAG/DvG,EAAS,WACLD,EAAOwR,GAAGb,EAASiD,SAEvBiC,EAAME,WAGNjW,EAAKmB,MAAM,oDAAqDjB,GAEhE6V,EAAMC,WAEHD,EAAMG,QA5GjB,OACIJ,iBAAkBA;AAClBK,yBAA0BA,EAC1BC,2BAA4BA,GASpCR,EAAoB/T,SAAW,OAAQ,WAAY,SAAU,KAAM,aAAc,cAAe,oBAAqB,eAAgB,YAlBrIhC,QACKC,OAAO,qBACP0N,QAAQ,sBAAuBoI,MAkLxC,WACI,YAMA,SAASS,GAAuBjW,EAAYwQ,EAAI5Q,EAAMsW,GAMlD,QAASC,GAAcvV,GAGnB,GAAwB,MAApBA,EAASmC,OAAgB,CACzBnD,EAAKmB,MAAM,0CAA2CH,EAOtD,IAAIwV,GAAeF,EAAU9C,IAAI,UAC7Bd,EAAc4D,EAAU9C,IAAI,cAEhCd,GAAYa,SACZiD,EAAa9E,GAAGb,SAASkC,OAM7B,MAAOnC,GAAGqF,OAAOjV,GAzBrB,OACIuV,cAAeA,GAYvBF,EAAuBxU,SAAW,aAAc,KAAM,OAAQ,aAnB9DhC,QACKC,OAAO,qBACP0N,QAAQ,yBAA0B6I,MAsC3C,WACI,YAMA,SAAS/V,GAAYN,EAAM8R,EAAKxB,GAuC5B,QAASyB,GAAOC,EAAOC,EAAMC,GAEzBlS,EAAKmB,MAAM,sBAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2E,MACTrE,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAG5C,QAASiG,KAEL1W,EAAKmB,MAAM,8BAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2E,MAAQ,OAErB,OAAOnG,GAAiBE,gBAAgBC,GAG5C,QAASkG,KAEL,GAAIlG,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2E,MAAO,MAEpB,OAAOnG,GAAiBE,gBAAgBC,GAI5C,QAASjL,GAAQC,GAEb,GAAIgL,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2E,MAAQ,IAAIhR,EAEzB,OAAO6K,GAAiBE,gBAAgBC,GAI5C,QAASmG,GAAc5D,GAEnB,GAAIvC,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2E,MAAQ,IAAIzD,EAAU,WAEnC,OAAO1C,GAAiBE,gBAAgBC,GAI5C,QAASoG,GAAiB7D,GAEtB,GAAIvC,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2E,MAAQ,IAAIzD,EAAU,UAEnC,OAAO1C,GAAiBE,gBAAgBC,GAO5C,QAAS7P,GAAOE,GAEZ,GAAI2P,IACArM,OAAQ,OACRrB,IAAK+O,EAAI2E,MACTzT,KAAMlC,EAEV,OAAOwP,GAAiBE,gBAAgBC,GAG5C,QAASqG,GAAgBhW,GAErB,GAAI2P,IACArM,OAAQ,OACRrB,IAAK+O,EAAI2E,MAAO,IAAK3V,EAAK2E,GAAI,SAC9BzC,KAAMlC,EAAKiW,MAEf,OAAOzG,GAAiBE,gBAAgBC,GAG5C,QAASuG,GAAiBlW,GAEtB,GAAI2P,IACArM,OAAQ,OACRrB,IAAK+O,EAAI2E,MAAO,IAAK3V,EAAK2E,GAAI,UAC9BzC,KAAMlC,EAAKqC,OAEf,OAAOmN,GAAiBE,gBAAgBC,GAM5C,QAASwG,GAASnW,GAEd,GAAI2P,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2E,MAAO,MAChBzT,MACIgQ,SAAUlS,EAAKkS,SACfrG,MAAO7L,EAAK6L,OAGpB,OAAO2D,GAAiBE,gBAAgBC,GAG5C,QAASyG,GAAiBjE,GAEtB,GAAIxC,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2E,MAAO,eAChBzT,MACIiQ,SAAUA,GAGlB,OAAO3C,GAAiBE,gBAAgBC,GAG5C,QAAS7K,GAAW9E,GAEhBd,EAAKmB,MAAM,mBAAoBL,EAE/B,IAAI2P,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2E,MAAO,IAAK3V,EAAK2E,GAC1BzC,MACIW,MACIyI,MAAOtL,EAAKsL,MACZC,KAAMvL,EAAKuL,OAIvB,OAAOiE,GAAiBE,gBAAgBC,GAG5C,QAAS0G,GAAuBrW,GAE5B,GAAI2P,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2E,MAAO,IAAK3V,EAAK2E,GAAI,QAC9BzC,KAAMlC,EAAKkS,SAEf,OAAO1C,GAAiBE,gBAAgBC,GAO5C,QAAS3K,GAAWhF,GAEhB,GAAI2P,IACArM,OAAQ,SACRrB,IAAK+O,EAAI2E,MAAO,IAAK3V,EAAK2E,GAE9B,OAAO6K,GAAiBE,gBAAgBC,GAG5C,QAAS2G,GAAuBtW,GAE5B,GAAI2P,IACArM,OAAQ,SACRrB,IAAK+O,EAAI2E,MAAO,IAAK3V,EAAK2E,GAAI,QAElC,OAAO6K,GAAiBE,gBAAgBC,GAM5C,QAAS4G,GAAYrF,EAAOC,EAAMC,GAC9B,GAAIzB,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2E,MACTrE,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAAK1P,KAAK,SAASuW,GAKvD,MAHAA,GAAOtU,KAAK4I,QAAQ,SAAS2L,GACzB9V,EAAM8V,EAAE7R,KAAO6R,IAEZD,IAIf,QAASE,GAAc/R,GACnB,MAAOhE,GAAMgE,GA/OjB,GAAIhE,KAEJ,QAGIsQ,OAAQA,EACR2E,eAAgBA,EAChBC,MAAOA,EACPnR,QAASA,EACToR,cAAeA,EACfC,iBAAkBA,EAGlBjW,OAAQA,EACRkW,gBAAiBA,EACjBE,iBAAkBA,EAGlBC,SAAUA,EACVC,iBAAkBA,EAClBtR,WAAYA,EACZuR,uBAAwBA,EAGxBrR,WAAYA,EACZsR,uBAAwBA,EAGxBC,YAAaA,EACbG,cAAeA,GAfvBlX,EAAYuB,SAAW,OAAQ,MAAO,oBApBtChC,QACKC,OAAO,cACP0N,QAAQ,cAAelN,MA6PhC,WACI,YAMA,SAAS0B,GAAkBhC,EAAM8R,EAAKxB,GAmBlC,QAASyB,GAAOC,EAAOC,EAAMC,GAEzBlS,EAAKmB,MAAM,4BAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2F,KACTrF,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAG5C,QAASjL,GAAQC,GACb,GAAIgL,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2F,KAAO,IAAMhS,EAE1B,OAAO6K,GAAiBE,gBAAgBC,GAO5C,QAAS7P,GAAO0B,GAEZ,GAAImO,IACArM,OAAQ,OACRrB,IAAK+O,EAAI2F,KACTzU,KAAMV,EAEV,OAAOgO,GAAiBE,gBAAgBC,GAO5C,QAAS7K,GAAWtD,GAEhBtC,EAAKmB,MAAM,yBAA0BmB,EAErC,IAAImO,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2F,KAAM,IAAKnV,EAAWoD,IAC/B1C,KAAMV,EAEV,OAAOgO,GAAiBE,gBAAgBC,GAO5C,QAAS3K,GAAWxD,GAEhB,GAAImO,IACArM,OAAQ,SACRrB,IAAK+O,EAAI2F,KAAM,IAAKnV,EAAWoD,IAEnC,OAAO4K,GAAiBE,gBAAgBC,GAnF5C,OAEIsB,OAAQA,EACRvM,QAASA,EAGT5E,OAAQA,EAGRgF,WAAYA,EAGZE,WAAYA,GAIpB9D,EAAkBH,SAAW,OAAQ,MAAO,oBArB5ChC,QACKC,OAAO,oBACP0N,QAAQ,oBAAqBxL,MAgGtC,WACI,YAMA,SAAS0V,GAAiBC,EAAgBC,GAEtCD,EAKCE,MAAM,oBACHjG,OAAQ,QACR7O,IAAK,QACLkO,YAAa,uDACbnP,WAAY,uBACZoP,aAAc,KACd4G,eACIC,MAAO,iBAQdF,MAAM,kBACHjG,OAAQ,mBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,qFACA,iCAGRgH,eACIG,MAAM,KAIbJ,MAAM,mBACHjG,OAAQ,mBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,qFACA,iCAGRgH,eACIG,MAAM,KA5BlBP,EAAiB7V,SAAW,iBAAkB,sBAtB9ChC,QACKC,OAAO,oBACPgD,OAAO4U,MAuDhB,WACI,YAMA,SAASQ,GAAqBlY,EAAMC,EAAQC,EAAQC,EAAUC,EAAY4B,EAAmBzB,EAAcC,EAAcC,EAAcC,GAmBnI,QAASyX,GAAeC,GAEpBvX,EAAGwX,gBAAiB,CAEpB,IAAIC,GAAaF,EAAWE,WACxBC,EAAeD,EAAWE,MAAM,EAEhCtG,EAAO,YAKXF,GAAQnR,EAAG4X,YACXxG,EAAOsG,GAAgB,EAGvBvW,EAAkB+P,OAAOC,EAAOC,EAAMC,GAAMnR,KAAK,SAASC,GAClDA,EAASgC,OAGTnC,EAAG6X,YAAc1X,EAASgC,KAC1BgP,EAAQhR,EAAS2X,MAAM3G,MACvBC,EAAOjR,EAAS4X,MAAMpV,MACtB4U,EAAWE,WAAWO,cAAgB7X,EAAS4X,MAAMpV,MAErD3C,EAAGwX,gBAAiB,KA3ChC,GAAIxX,GAAKW,IAETX,GAAG6X,eACH7X,EAAGsX,eAAiBA,EACpBtX,EAAGC,QAEHD,EAAG4X,YAAc,EACjB,IAAIzG,GAAM,GACNC,EAAK,EAGThS,GAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAKlCsW,EAAqBrW,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,oBAAqB,eAAgB,eAAgB,eAAgB,gBAvB3JhC,QACKC,OAAO,oBACPgC,WAAW,uBAAwBoW,MAsD5C,WACI,YAEArY,SACKC,OAAO,wBAIhB,WACI,YAMA,SAASkG,GAAoBhG,EAAM8R,EAAKxB,EAAkBpK,GAmBtD,QAAS6L,GAAOC,EAAOC,EAAMC,GAEzBlS,EAAKmB,MAAM,8BAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAIgH,MACT1G,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAG5C,QAASjL,GAAQC,GACb,GAAIgL,IACArM,OAAQ,MACRrB,IAAK+O,EAAIgH,MAAQ,IAAMrT,EAE3B,OAAO6K,GAAiBE,gBAAgBC,GAO5C,QAAS7P,GAAOwF,GACZ,GAAI2S,GAAQ7S,EAAsBuH,WAAWrH,GACzCqK,GACArM,OAAQ,OACRrB,IAAK+O,EAAIgH,MACT9V,KAAM+V,EAEV,OAAOzI,GAAiBE,gBAAgBC,GAO5C,QAAS7K,GAAWQ,GAEhBpG,EAAKmB,MAAM,2BAA4BiF,EACvC,IAAI2S,GAAQ7S,EAAsBuH,WAAWrH,GACzCqK,GACArM,OAAQ,MACRrB,IAAK+O,EAAIgH,MAAO,IAAK1S,EAAaV,IAClC1C,MACI0D,MAAON,EAAaM,MACpBE,KAAMR,EAAaQ,KACnBC,KAAMT,EAAaS,KACnBC,YAAaV,EAAaU,YAC1BT,OAAQD,EAAaC,OACrBa,YAAad,EAAac,YAC1ByG,KAAMoL,EAAMpL,MAIpB,OAAO2C,GAAiBE,gBAAgBC,GAO5C,QAAS3K,GAAWM,GAEhB,GAAIqK,IACArM,OAAQ,SACRrB,IAAK+O,EAAIgH,MAAO,IAAK1S,EAAaV,IAEtC,OAAO4K,GAAiBE,gBAAgBC,GA5F5C,OAEIsB,OAAQA,EACRvM,QAASA,EAGT5E,OAAQA,EAGRgF,WAAYA,EAGZE,WAAYA,GAOpBE,EAAoBnE,SAAW,OAAQ,MAAO,mBAAoB,yBAxBlEhC,QACKC,OAAO,sBACP0N,QAAQ,sBAAuBxH,MAyGxC,WACI,YAMA,SAASgT,GAAwBrB,EAAgBC,GAE7CD,EAKCE,MAAM,sBACHjG,OAAQ,QACR7O,IAAK,SACLkO,YAAa,2DACbnP,WAAY,yBACZoP,aAAc,KACd4G,eACIC,MAAO,oBAQdF,MAAM,oBACHjG,OAAQ,qBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,2FACA,mCAGRgH,eACIG,MAAM,KAIbJ,MAAM,qBACHjG,OAAQ,qBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,2FACA,mCAGRgH,eACIG,MAAM,KAzBlBe,EAAwBnX,SAAW,iBAAkB,sBAzBrDhC,QACKC,OAAO,sBACPgD,OAAOkW,MAuDhB,WACI,YAMA,SAASC,GAAuBjZ,EAAMC,EAAQC,EAAQC,EAAUC,EAAY4F,EAAqBzF,EAAcC,EAAcC,EAAcC,GAmBvI,QAASwY,GAAiBd,GAEtBvX,EAAGwX,gBAAiB,CAEpB,IAAIC,GAAaF,EAAWE,WACxBC,EAAeD,EAAWE,MAAM,EAEhCtG,EAAO,OAKXF,GAAQnR,EAAG4X,YACXxG,EAAOsG,GAAgB,EAGvBvS,EAAoB+L,OAAOC,EAAOC,EAAMC,GAAMnR,KAAK,SAASC,GAEpDA,EAASgC,OAGTnC,EAAGsY,cAAgBnY,EAASgC,KAC5BgP,EAAQhR,EAAS2X,MAAM3G,MACvBC,EAAOjR,EAAS4X,MAAMpV,MACtB4U,EAAWE,WAAWO,cAAgB7X,EAAS4X,MAAMpV,MAErD3C,EAAGwX,gBAAiB,KA5ChC,GAAIxX,GAAKW,IAETX,GAAGsY,iBACHtY,EAAGqY,iBAAmBA,EACtBrY,EAAGC,QAEHD,EAAG4X,YAAc,EACjB,IAAIzG,GAAM,GACNC,EAAK,EAGThS,GAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAQlCqX,EAAuBpX,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,sBAAuB,eAAgB,eAAgB,eAAgB,gBA1B/JhC,QACKC,OAAO,sBACPgC,WAAW,yBAA0BmX,MAuD9C,WACI,YAMA,SAAStR,GAAgB3H,EAAM8R,EAAKxB,GAmBhC,QAASyB,GAAOC,EAAOC,EAAMC,GAEzBlS,EAAKmB,MAAM,0BAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAIsH,KACThH,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAG5C,QAASjL,GAAQC,GACb,GAAIgL,IACArM,OAAQ,MACRrB,IAAK+O,EAAIsH,KAAO,IAAM3T,EAE1B,OAAO6K,GAAiBE,gBAAgBC,GAO5C,QAAS7P,GAAOiH,GAEZ,GAAI4I,IACArM,OAAQ,OACRrB,IAAK+O,EAAIsH,KACTpW,KAAM6E,EAEV,OAAOyI,GAAiBE,gBAAgBC,GAO5C,QAAS7K,GAAWiC,GAEhB7H,EAAKmB,MAAM,uBAAwB0G,EAEnC,IAAI4I,IACArM,OAAQ,MACRrB,IAAK+O,EAAIsH,KAAM,IAAKvR,EAASnC,IAC7B1C,MACI0D,MAAOmB,EAASnB,MAChB3D,IAAK8E,EAAS9E,IACd8D,KAAMgB,EAAShB,KACfiB,aAAcD,EAASC,aACvBZ,YAAaW,EAASX,aAG9B,OAAOoJ,GAAiBE,gBAAgBC,GAO5C,QAAS3K,GAAW+B,GAEhB,GAAI4I,IACArM,OAAQ,SACRrB,IAAK+O,EAAIsH,KAAM,IAAKvR,EAASnC,IAEjC,OAAO4K,GAAiBE,gBAAgBC,GAzF5C,OAEIsB,OAAQA,EACRvM,QAASA,EAGT5E,OAAQA,EAGRgF,WAAYA,EAGZE,WAAYA,GAUpB6B,EAAgB9F,SAAW,OAAQ,MAAO,oBA3B1ChC,QACKC,OAAO,kBACP0N,QAAQ,kBAAmB7F,MAsGpC,WACI,YAMA,SAAS0R,GAAoB1B,EAAgBC,GAEzCD,EAKCE,MAAM,kBACHjG,OAAQ,QACR7O,IAAK,QACLkO,YAAa,mDACbnP,WAAY,qBACZoP,aAAc,KACd4G,eACIC,MAAO,gBAQdF,MAAM,gBACHjG,OAAQ,iBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,+EACA,+BAGRgH,eACIG,MAAM,KAIbJ,MAAM,iBACHjG,OAAQ,iBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,+EACA,+BAGRgH,eACIG,MAAM,KAtBlBoB,EAAoBxX,SAAW,iBAAkB,sBA5BjDhC,QACKC,OAAO,kBACPgD,OAAOuW,MAuDhB,WACI,YAMA,SAASC,GAAmBtZ,EAAMC,EAAQC,EAAQC,EAAUC,EAAYuH,EAAiBpH,EAAcC,EAAcC,EAAcC,GAmB/H,QAAS6Y,GAAanB,GAElBvX,EAAGwX,gBAAiB,CAEpB,IAAIC,GAAaF,EAAWE,WACxBC,EAAeD,EAAWE,MAAM,EAEhCtG,EAAO,OAKXF,GAAQnR,EAAG4X,YACXxG,EAAOsG,GAAgB,EAGvB5Q,EAAgBoK,OAAOC,EAAOC,EAAMC,GAAMnR,KAAK,SAASC,GAEhDA,EAASgC,OAGTnC,EAAG2Y,UAAYxY,EAASgC,KACxBgP,EAAQhR,EAAS2X,MAAM3G,MACvBC,EAAOjR,EAAS4X,MAAMpV,MACtB4U,EAAWE,WAAWO,cAAgB7X,EAAS4X,MAAMpV,MAErD3C,EAAGwX,gBAAiB,KA5ChC,GAAIxX,GAAKW,IAETX,GAAG2Y,aACH3Y,EAAG0Y,aAAeA,EAClB1Y,EAAGC,QAEHD,EAAG4X,YAAc,EACjB,IAAIzG,GAAM,GACNC,EAAK,EAGThS,GAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAWlC0X,EAAmBzX,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,kBAAmB,eAAgB,eAAgB,eAAgB,gBA7BvJhC,QACKC,OAAO,kBACPgC,WAAW,qBAAsBwX,MAuD1C,WACI,YAMA,SAAShR,GAAkBtI,EAAM8R,EAAKxB,GAmBlC,QAASyB,GAAOC,EAAOC,EAAMC,GAEzBlS,EAAKmB,MAAM,4BAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2H,WACTrH,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAG5C,QAASjL,GAAQC,GACb,GAAIgL,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2H,WAAa,IAAMhU,EAEhC,OAAO6K,GAAiBE,gBAAgBC,GAO5C,QAAS7P,GAAO4H,GAEZ,GAAIiI,IACArM,OAAQ,OACRrB,IAAK+O,EAAI2H,WACTzW,KAAMwF,EAEV,OAAO8H,GAAiBE,gBAAgBC,GAO5C,QAAS7K,GAAW4C,GAEhBxI,EAAKmB,MAAM,yBAA0BqH,EAErC,IAAIiI,IACArM,OAAQ,MACRrB,IAAK+O,EAAI2H,WAAY,IAAKjR,EAAW9C,IACrC1C,KAAMwF,EAEV,OAAO8H,GAAiBE,gBAAgBC,GAO5C,QAAS3K,GAAW0C,GAEhB,GAAIiI,IACArM,OAAQ,SACRrB,IAAK+O,EAAI2H,WAAY,IAAKjR,EAAW9C,IAEzC,OAAO4K,GAAiBE,gBAAgBC,GAnF5C,OAEIsB,OAAQA,EACRvM,QAASA,EAGT5E,OAAQA,EAGRgF,WAAYA,EAGZE,WAAYA,GAapBwC,EAAkBzG,SAAW,OAAQ,MAAO,oBA9B5ChC,QACKC,OAAO,oBACP0N,QAAQ,oBAAqBlF,MAgGtC,WACI,YAMA,SAASoP,GAAiBC,EAAgBC,GAEtCD,EAKKE,MAAM,oBACPjG,OAAQ,QACR7O,IAAK,cACLkO,YAAa,qDACbnP,WAAY,uBACZoP,aAAc,KACd4G,eACIC,MAAO,gBAQdF,MAAM,kBACHjG,OAAQ,mBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,kFACA,iCAGRgH,eACIG,MAAM,KAIbJ,MAAM,mBACHjG,OAAQ,mBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,kFACA,iCAGRgH,eACIG,MAAM,KAnBlBP,EAAiB7V,SAAW,iBAAkB,sBA/B9ChC,QACKC,OAAO,oBACPgD,OAAO4U,MAsDhB,WACI,YAMA,SAASgC,GAAqB1Z,EAAMC,EAAQC,EAAQC,EAAUC,EAAYkI,EAAmB/H,EAAcC,EAAcC,EAAcC,GAmBnI,QAASiZ,GAAevB,GACpBvX,EAAGwX,gBAAiB,CAEpB,IAAIC,GAAaF,EAAWE,WACxBC,EAAeD,EAAWE,MAAM,EAEhCtG,EAAO,YAKXF,GAAQnR,EAAG4X,YACXxG,EAAOsG,GAAgB,EAGvBjQ,EAAkByJ,OAAOC,EAAOC,EAAMC,GAAMnR,KAAK,SAASC,GACtDhB,EAAKmB,MAAMH,GACPA,EAASgC,OAGTnC,EAAG+Y,YAAc5Y,EAASgC,KAC1BgP,EAAQhR,EAAS2X,MAAM3G,MACvBC,EAAOjR,EAAS4X,MAAMpV,MACtB4U,EAAWE,WAAWO,cAAgB7X,EAAS4X,MAAMpV,MAErD3C,EAAGwX,gBAAiB,KA3ChC,GAAIxX,GAAKW,IAETX,GAAG+Y,eACH/Y,EAAG8Y,eAAiBA,EACpB9Y,EAAGC,QAEHD,EAAG4X,YAAc,EACjB,IAAIzG,GAAM,GACNC,EAAK,EAGThS,GAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAclC8X,EAAqB7X,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,oBAAqB,eAAgB,eAAgB,eAAgB,gBAhC3JhC,QACKC,OAAO,oBACPgC,WAAW,uBAAwB4X,MAsD5C,WACI,YAMA,SAASvQ,GAAanJ,EAAM8R,EAAKxB,GAmB7B,QAASyB,GAAOC,EAAOC,EAAMC,GAEzBlS,EAAKmB,MAAM,uBAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAI+H,OACTzH,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAG5C,QAASjL,GAAQC,GACb,GAAIgL,IACArM,OAAQ,MACRrB,IAAK+O,EAAI+H,OAAS,IAAMpU,EAE5B,OAAO6K,GAAiBE,gBAAgBC,GAO5C,QAAS7P,GAAOkZ,GACZ,GAAIzQ,GAAQ0Q,EAAeD,GACvBrJ,GACArM,OAAQ,OACRrB,IAAK+O,EAAI+H,OACT7W,KAAMqG,EAEV,OAAOiH,GAAiBE,gBAAgBC,GAO5C,QAAS7K,GAAWkU,GAChB,GAAIzQ,GAAQ0Q,EAAeD,EAC3B9Z,GAAKmB,MAAM,oBAAqBkI,EAEhC,IAAIoH,IACArM,OAAQ,MACRrB,IAAK+O,EAAI+H,OAAQ,IAAKxQ,EAAM3D,IAC5B1C,MACI0D,MAAO2C,EAAM3C,MACb3D,IAAKsG,EAAMtG,IACX2G,UAAWL,EAAMK,UACjBC,QAASN,EAAMM,QACf7B,aAAcuB,EAAMvB,aACpB8B,SAAUP,EAAMO,UAGxB,OAAO0G,GAAiBE,gBAAgBC,GAO5C,QAAS3K,GAAWuD,GAEhB,GAAIoH,IACArM,OAAQ,SACRrB,IAAK+O,EAAI+H,OAAQ,IAAKxQ,EAAM3D,IAEhC,OAAO4K,GAAiBE,gBAAgBC,GAG5C,QAASsJ,GAAe1Q,GACpB,GAAIyQ,GAAKja,QAAQkH,UAAWsC,EAG5B,OAFAyQ,GAAGpQ,UAAYsQ,OAAOC,IAAIH,EAAGpQ,WAAWwQ,SACxCJ,EAAGnQ,QAAUqQ,OAAOC,IAAIH,EAAGnQ,SAASuQ,SAC7BJ,EAjGX,OAEI/H,OAAQA,EACRvM,QAASA,EAGT5E,OAAQA,EAGRgF,WAAYA,EAGZE,WAAYA,GAgBpBqD,EAAatH,SAAW,OAAQ,MAAO,oBAjCvChC,QACKC,OAAO,eACP0N,QAAQ,eAAgBrE,MA8GjC,WACI,YAMA,SAASuO,GAAiBC,EAAgBC,GAEtCD,EAKCE,MAAM,eACHjG,OAAQ,QACR7O,IAAK,UACLkO,YAAa,2CACbnP,WAAY,kBACZoP,aAAc,KACd4G,eACIC,MAAO,YAQdF,MAAM,aACHjG,OAAQ,cACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,mEACA,4BAGRgH,eACIG,MAAM,KAIbJ,MAAM,cACHjG,OAAQ,cACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,mEACA,4BAGRgH,eACIG,MAAM,KAhBlBP,EAAiB7V,SAAW,iBAAkB,sBAlC9ChC,QACKC,OAAO,eACPgD,OAAO4U,MAuDhB,WACI,YAMA,SAASyC,GAAgBna,EAAMC,EAAQC,EAAQC,EAAUC,EAAY+I,EAAc5I,EAAcC,EAAcC,EAAcC,GAmBzH,QAAS0Z,GAAUhC,GAEfvX,EAAGwX,gBAAiB,CAEpB,IAAIC,GAAaF,EAAWE,WACxBC,EAAeD,EAAWE,MAAM,EAEhCtG,EAAO,YAKXF,GAAQnR,EAAG4X,YACXxG,EAAOsG,GAAgB,EAGvBpP,EAAa4I,OAAOC,EAAOC,EAAMC,GAAMnR,KAAK,SAASC,GAC7CA,EAASgC,OAGTnC,EAAGwZ,OAASrZ,EAASgC,KACrBgP,EAAQhR,EAAS2X,MAAM3G,MACvBC,EAAOjR,EAAS4X,MAAMpV,MACtB4U,EAAWE,WAAWO,cAAgB7X,EAAS4X,MAAMpV,MAErD3C,EAAGwX,gBAAiB,KA3ChC,GAAIxX,GAAKW,IAETX,GAAGwZ,UACHxZ,EAAGuZ,UAAYA,EACfvZ,EAAGC,QAEHD,EAAG4X,YAAc,EACjB,IAAIzG,GAAM,GACNC,EAAK,EAGThS,GAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAiBlCuY,EAAgBtY,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,eAAgB,eAAgB,eAAgB,eAAgB,gBAnCjJhC,QACKC,OAAO,eACPgC,WAAW,kBAAmBqY,MAsDvC,WACI,YAMA,SAASpQ,GAAgB/J,EAAM8R,EAAKxB,GAmBhC,QAASyB,GAAOC,EAAOC,EAAMC,GAEzBlS,EAAKmB,MAAM,0BAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAIwI,WACTlI,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAG5C,QAASjL,GAAQC,GACb,GAAIgL,IACArM,OAAQ,MACRrB,IAAK+O,EAAIwI,WAAa,IAAM7U,EAEhC,OAAO6K,GAAiBE,gBAAgBC,GAO5C,QAAS7P,GAAOqJ,GAEZ,GAAIwG,IACArM,OAAQ,OACRrB,IAAK+O,EAAIwI,WACTtX,KAAMiH,EAEV,OAAOqG,GAAiBE,gBAAgBC,GAO5C,QAAS7K,GAAWqE,GAEhBjK,EAAKmB,MAAM,uBAAwB8I,EAEnC,IAAIwG,IACArM,OAAQ,MACRrB,IAAK+O,EAAIwI,WAAY,IAAKrQ,EAASvE,IACnC1C,MACIW,KAAMsG,EAAStG,MAGvB,OAAO2M,GAAiBE,gBAAgBC,GAO5C,QAAS3K,GAAWmE,GAEhB,GAAIwG,IACArM,OAAQ,SACRrB,IAAK+O,EAAIwI,WAAY,IAAKrQ,EAASvE,IAEvC,OAAO4K,GAAiBE,gBAAgBC,GArF5C,OAEIsB,OAAQA,EACRvM,QAASA,EAGT5E,OAAQA,EAGRgF,WAAYA,EAGZE,WAAYA,GAmBpBiE,EAAgBlI,SAAW,OAAQ,MAAO,oBApC1ChC,QACKC,OAAO,kBACP0N,QAAQ,kBAAmBzD,MAkGpC,WACI,YAMA,SAASwQ,GAAoB5C,EAAgBC,GAEzCD,EAKCE,MAAM,kBACHjG,OAAQ,QACR7O,IAAK,cACLkO,YAAa,iDACbnP,WAAY,qBACZoP,aAAc,KACd4G,eACIC,MAAO,gBAQdF,MAAM,gBACHjG,OAAQ,iBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,kEACA,2BAGRgH,eACIG,MAAM,KAIbJ,MAAM,iBACHjG,OAAQ,iBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,oEACA,4BAGRgH,eACIG,MAAM,KAblBsC,EAAoB1Y,SAAW,iBAAkB,sBArCjDhC,QACKC,OAAO,kBACPgD,OAAOyX,MAuDhB,WACI,YAMA,SAASC,GAAmBxa,EAAMC,EAAQC,EAAQC,EAAUC,EAAY2J,EAAiBxJ,EAAcC,EAAcC,EAAcC,GAmB/H,QAAS+Z,GAAcrC,GAEnBvX,EAAGwX,gBAAiB,CAEpB,IAAIC,GAAaF,EAAWE,WACxBC,EAAeD,EAAWE,MAAM,EAEhCtG,EAAO,cAKXF,GAAQnR,EAAG4X,YACXxG,EAAOsG,GAAgB,EAGvBxO,EAAgBgI,OAAOC,EAAOC,EAAMC,GAAMnR,KAAK,SAASC,GAEhDA,EAASgC,OAGTnC,EAAG4K,WAAazK,EAASgC,KACzBgP,EAAQhR,EAAS2X,MAAM3G,MACvBC,EAAOjR,EAAS4X,MAAMpV,MACtB4U,EAAWE,WAAWO,cAAgB7X,EAAS4X,MAAMpV,MAErD3C,EAAGwX,gBAAiB,KA5ChC,GAAIxX,GAAKW,IAETX,GAAG4K,cACH5K,EAAG4Z,cAAgBA,EACnB5Z,EAAGC,QAEHD,EAAG4X,YAAc,EACjB,IAAIzG,GAAM,GACNC,EAAK,EAGThS,GAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAoBlC4Y,EAAmB3Y,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,kBAAmB,eAAgB,eAAgB,eAAgB,gBAtCvJhC,QACKC,OAAO,kBACPgC,WAAW,qBAAsB0Y,MAuD1C,WACI,YAMA,SAASjQ,GAAgBvK,EAAM8R,EAAKxB,EAAkBpK,GAmBlD,QAAS6L,GAAOC,EAAOC,EAAMC,GAEzBlS,EAAKmB,MAAM,0BAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAI4I,KACTtI,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAG5C,QAASjL,GAAQC,GACb,GAAIgL,IACArM,OAAQ,MACRrB,IAAK+O,EAAI4I,KAAO,IAAMjV,EAE1B,OAAO6K,GAAiBE,gBAAgBC,GAO5C,QAAS7P,GAAOsK,GACZ,GAAI4H,GAAO5M,EAAsBuH,WAAWvC,GACxCuF,GACArM,OAAQ,OACRrB,IAAK+O,EAAI4I,KACT1X,KAAM8P,EAEV,OAAOxC,GAAiBE,gBAAgBC,GAO5C,QAAS7K,GAAWsF,GAEhBlL,EAAKmB,MAAM,uBAAwB+J,EAEnC,IAAI4H,GAAO5M,EAAsBuH,WAAWvC,GACxCuF,GACArM,OAAQ,MACRrB,IAAK+O,EAAI4I,KAAM,IAAKxP,EAASxF,IAC7B1C,KAAM8P,EAEV,OAAOxC,GAAiBE,gBAAgBC,GAO5C,QAAS3K,GAAWoF,GAEhB,GAAIuF,IACArM,OAAQ,SACRrB,IAAK+O,EAAI4I,KAAM,IAAKxP,EAASxF,IAEjC,OAAO4K,GAAiBE,gBAAgBC,GApF5C,OAEIsB,OAAQA,EACRvM,QAASA,EAGT5E,OAAQA,EAGRgF,WAAYA,EAGZE,WAAYA,GAsBpByE,EAAgB1I,SAAW,OAAQ,MAAO,mBAAoB,yBAvC9DhC,QACKC,OAAO,kBACP0N,QAAQ,kBAAmBjD,MAiGpC,WACI,YAMA,SAASoQ,GAAoBhD,EAAgBC,GAEzCD,EAKCE,MAAM,kBACHjG,OAAQ,QACR7O,IAAK,QACLkO,YAAa,mDACbnP,WAAY,qBACZoP,aAAc,KACd4G,eACIC,MAAO,gBAQdF,MAAM,gBACHjG,OAAQ,iBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,+EACA,+BAGRgH,eACIG,MAAM,KAIbJ,MAAM,iBACHjG,OAAQ,iBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACdA,EAAasQ,KACT,+EACA,+BAGRgH,eACIG,MAAM,KAVlB0C,EAAoB9Y,SAAW,iBAAkB,sBAxCjDhC,QACKC,OAAO,kBACPgD,OAAO6X,MAuDhB,WACI,YAMA,SAASC,GAAmB5a,EAAMC,EAAQC,EAAQC,EAAUC,EAAYmK,EAAiBhK,EAAcC,EAAcC,EAAcC,GAmB/H,QAASma,GAAazC,GAElBvX,EAAGwX,gBAAiB,CAEpB,IAAIC,GAAaF,EAAWE,WACxBC,EAAeD,EAAWE,MAAM,EAEhCtG,EAAO,UAKXF,GAAQnR,EAAG4X,YACXxG,EAAOsG,GAAgB,EAGvBhO,EAAgBwH,OAAOC,EAAOC,EAAMC,GAAMnR,KAAK,SAASC,GAEhDA,EAASgC,OAGTnC,EAAGia,UAAY9Z,EAASgC,KACxBgP,EAAQhR,EAAS2X,MAAM3G,MACvBC,EAAOjR,EAAS4X,MAAMpV,MACtB4U,EAAWE,WAAWO,cAAgB7X,EAAS4X,MAAMpV,MAErD3C,EAAGwX,gBAAiB,KA5ChC,GAAIxX,GAAKW,IAETX,GAAGia,aACHja,EAAGga,aAAeA,EAClBha,EAAGC,QAEHD,EAAG4X,YAAc,EACjB,IAAIzG,GAAM,GACNC,EAAK,EAGThS,GAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAuBlCgZ,EAAmB/Y,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,kBAAmB,eAAgB,eAAgB,eAAgB,gBAzCvJhC,QACKC,OAAO,kBACPgC,WAAW,qBAAsB8Y,MAuD1C,WACI,YAEA/a,SACKC,OAAO,sBAIhB,WACI,YAEAD,SACKC,OAAO,4BAIhB,WACI,YAMA,SAASmM,GAAejM,EAAM8R,EAAKxB,GAwC/B,QAASyB,GAAOC,EAAOC,EAAMC,GAEzBlS,EAAKmB,MAAM,yBAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAIiJ,SACT3I,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAG5C,QAASiG,KAEL1W,EAAKmB,MAAM,iCAEX,IAAIsP,IACArM,OAAQ,MACRrB,IAAK+O,EAAIiJ,SAAW,OAExB,OAAOzK,GAAiBE,gBAAgBC,GAG5C,QAASkG,KAEL,GAAIlG,IACArM,OAAQ,MACRrB,IAAK+O,EAAIiJ,SAAU,MAEvB,OAAOzK,GAAiBE,gBAAgBC,GAI5C,QAASjL,GAAQC,GAEb,GAAIgL,IACArM,OAAQ,MACRrB,IAAK+O,EAAIiJ,SAAW,IAAItV,EAE5B,OAAO6K,GAAiBE,gBAAgBC,GAI5C,QAASmG,GAAc5D,GAEnB,GAAIvC,IACArM,OAAQ,MACRrB,IAAK+O,EAAIiJ,SAAW,IAAI/H,EAAU,WAEtC,OAAO1C,GAAiBE,gBAAgBC,GAI5C,QAASoG,GAAiB7D,GAEtB,GAAIvC,IACArM,OAAQ,MACRrB,IAAK+O,EAAIiJ,SAAW,IAAI/H,EAAU,UAEtC,OAAO1C,GAAiBE,gBAAgBC,GAO5C,QAAS7P,GAAOuL,GAEZ,GAAIsE,IACArM,OAAQ,OACRrB,IAAK+O,EAAIiJ,SACT/X,KAAMmJ,EAEV,OAAOmE,GAAiBE,gBAAgBC,GAG5C,QAASqG,GAAgB3K,GAErB,GAAIsE,IACArM,OAAQ,OACRrB,IAAK+O,EAAIiJ,SAAU,IAAK5O,EAAQ1G,GAAI,SACpCzC,KAAMmJ,EAAQ4K,MAElB,OAAOzG,GAAiBE,gBAAgBC,GAG5C,QAASuG,GAAiB7K,GAEtB,GAAIsE,IACArM,OAAQ,OACRrB,IAAK+O,EAAIiJ,SAAU,IAAK5O,EAAQ1G,GAAI,UACpCzC,KAAMmJ,EAAQhJ,OAElB,OAAOmN,GAAiBE,gBAAgBC,GAM5C,QAASwG,GAAS9K,GAEdnM,EAAKmB,MAAM,oBAAqBgL,EAEhC,IAAIsE,IACArM,OAAQ,MACRrB,IAAK+O,EAAIiJ,SAAU,MACnB/X,MACIW,MACIyI,MAAOD,EAAQC,MACfC,KAAMF,EAAQE,MAElB2O,aAAc7O,EAAQ6O,cAG9B,OAAO1K,GAAiBE,gBAAgBC,GAG5C,QAAS7K,GAAWuG,GAEhBnM,EAAKmB,MAAM,sBAAuBgL,EAElC,IAAIsE,IACArM,OAAQ,MACRrB,IAAK+O,EAAIiJ,SAAU,IAAK5O,EAAQ1G,GAChCzC,MACIW,MACIyI,MAAOD,EAAQC,MACfC,KAAMF,EAAQE,OAI1B,OAAOiE,GAAiBE,gBAAgBC,GAG5C,QAAS0G,GAAuBhL,GAE5B,GAAIsE,IACArM,OAAQ,MACRrB,IAAK+O,EAAIiJ,SAAU,IAAK5O,EAAQ1G,GAAI,QACpCzC,KAAMmJ,EAAQ6G,SAElB,OAAO1C,GAAiBE,gBAAgBC,GAO5C,QAAS3K,GAAWqG,GAEhB,GAAIsE,IACArM,OAAQ,SACRrB,IAAK+O,EAAIiJ,SAAU,IAAK5O,EAAQ1G,GAEpC,OAAO6K,GAAiBE,gBAAgBC,GAG5C,QAAS2G,GAAuBjL,GAE5B,GAAIsE,IACArM,OAAQ,SACRrB,IAAK+O,EAAIiJ,SAAU,IAAK5O,EAAQ1G,GAAI,QAExC,OAAO6K,GAAiBE,gBAAgBC,GAM5C,QAAS5D,GAAOV,GACZ,GAAIsE,IACArM,OAAQ,OACRrB,IAAK+O,EAAIiJ,SAAW,IAAM5O,EAAQ1G,GAAK,UACvCzC,KAAMmJ,EAEV,OAAOmE,GAAiBE,gBAAgBC,GAM5C,QAAS4G,GAAYrF,EAAOC,EAAMC,GAC9B,GAAIzB,IACArM,OAAQ,MACRrB,IAAK+O,EAAIiJ,SACT3I,QAEIF,KAAMA,EACNF,MAAOA,EACPC,KAAMA,GAGd,OAAO3B,GAAiBE,gBAAgBC,GAAK1P,KAAK,SAASuW,GAKvD,MAHAA,GAAOtU,KAAK4I,QAAQ,SAASqP,GACzB9N,EAAS8N,EAAEvV,KAAOuV,IAEf3D,IAIf,QAASE,GAAc/R,GACnB,MAAO0H,GAAS1H,GArPpB,GAAI0H,KAEJ,QAGI4E,OAAQA,EACR2E,eAAgBA,EAChBC,MAAOA,EACPnR,QAASA,EACToR,cAAeA,EACfC,iBAAkBA,EAGlBjW,OAAQA,EACRkW,gBAAiBA,EACjBE,iBAAkBA,EAGlBC,SAAUA,EACVrR,WAAYA,EACZuR,uBAAwBA,EAGxBrR,WAAYA,EACZsR,uBAAwBA,EAExBvK,OAAQA,EAGRwK,YAAaA,EACbG,cAAeA,GAMvBvL,EAAepK,SAAW,OAAQ,MAAO,oBA1CzChC,QACKC,OAAO,iBACP0N,QAAQ,iBAAkBvB,MAmQnC,WACI,YAMA,SAASiP,GAAmBvD,EAAgBC,GAExCD,EAKCE,MAAM,iBACHjG,OAAQ,QACR7O,IAAK,YACLkO,YAAa,+CACbnP,WAAY,oBACZoP,aAAc,KACd4G,eACIC,MAAO,cAQdF,MAAM,eACHjG,OAAQ,gBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACLA,EAAasQ,KAClB,+DACA,0BAGRgH,eACIG,MAAM,KAIbJ,MAAM,gBACHjG,OAAQ,gBACR7O,IAAK,OACLiV,SAAA,eAAS,SAASxX,GACLA,EAAasQ,KAClB,iEACA,2BAGRgH,eACIG,MAAM,KAPlBiD,EAAmBrZ,SAAW,iBAAkB,sBA3ChDhC,QACKC,OAAO,iBACPgD,OAAOoY,MAqEhB,WACI,YAMA,SAASC,GAAkBnb,EAAMC,EAAQC,EAAQC,EAAUC,EAAY6L,EAAgB1L,EAAcC,EAAcC,EAAcC,EAAcgS,GAqB3I,QAAS0I,GAAYhD,GAEjBvX,EAAGwX,gBAAiB,CAEpB,IAAIC,GAAaF,EAAWE,WACxBC,EAAeD,EAAWE,MAAM,EAEhCtG,EAAO,cAKXF,GAAQnR,EAAG4X,YACXxG,EAAOsG,GAAgB,EAGvBtM,EAAe8F,OAAOC,EAAOC,EAAMC,GAAMnR,KAAK,SAASC,GAE/CA,EAASgC,OAGTnC,EAAGsM,SAAWnM,EAASgC,KACvBgP,EAAQhR,EAAS2X,MAAM3G,MACvBC,EAAOjR,EAAS4X,MAAMpV,MACtB4U,EAAWE,WAAWO,cAAgB7X,EAAS4X,MAAMpV,MAErD3C,EAAGwX,gBAAiB,KA9ChC,GAAIxX,GAAKW,IAETX,GAAGsM,YACHtM,EAAGua,YAAcA,EACjBva,EAAGC,QAEHD,EAAG4X,YAAc,EACjB,IAAIzG,GAAM,GACNC,EAAK,EAGThS,GAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAE9B3B,EAAOmU,QAAU1B,EAAY0B,QAwBjC+G,EAAkBtZ,SAAW,OAAQ,SAAU,SAAU,WAAY,aAAc,iBAAkB,eAAgB,eAAgB,eAAgB,eAAgB,eA5CrKhC,QACKC,OAAO,iBACPgC,WAAW,oBAAqBqZ,MA6DzC,WACA,YAECtb,SACEC,OAAO,eAKV,WACI,YAMA,SAASub,GAAqBpb,EAAQG,EAAYJ,EAAMsb,EAAW1K,EAAIgC,EACzCF,EAAajS,EAAcF,GAyCrD,QAASgb,KACLnb,EAAWiP,eAAgB,EAC3BqD,EAAYW,YACRK,MAAO7S,EAAG6S,MACVT,SAAUpS,EAAGoS,WAEZlS,KAAK,SAASC,GACXhB,EAAKmB,MAAM,8CAA+CH,GAE1Df,EAAOub,UAAUC,eACjB5a,EAAGC,QACHD,EAAGS,SAAU,EACbb,EAAaa,QAAQ,0DACrBT,EAAG6a,OAAQ,EACXtb,EAAWiP,eAAgB,IAZnCqD,SAcW,SAAStR,GAEZpB,EAAKoB,MAAM,4CAA6CA,GAE7B,0BAAvBA,EAAM4B,KAAK/B,QACXR,EAAaW,MAAM,+FAInBX,EAAaW,MAAM,uEAEvBP,EAAG6a,OAAQ,EACXtb,EAAWiP,eAAgB,IAIvC,QAASsM,GAAqBC,GAC1B,MAAOhL,GAAG,SAAUoF,EAASC,GACrB2F,GAAwB/a,EAAGoS,SAC3B+C,IAEAC,MA5EZ,GAAIpV,GAAKW,IAGTX,GAAGoS,SAAW,GACdpS,EAAGgb,gBAAkB,GACrBhb,EAAG6S,MAAQ,GACX7S,EAAG6a,OAAQ,EAKX7a,EAAG0a,cAAgBA,EACnB1a,EAAG8a,oBAAsBA,EAGzB1b,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAG9B,WAGIgR,EAAQnB,UACRmB,EAAQc,MAAM,KAGV4H,EAAUQ,SAASpI,OACnB7S,EAAG6a,OAAQ,EACX7a,EAAG6S,MAAQ4H,EAAUQ,SAASpI,QAG9B1T,EAAKoB,MAAM,mCAAoC,YAC/CX,EAAaW,MAAM,sKAK/Bia,EAAqBxZ,SAAW,SAAU,aAAc,OAAQ,YAAa,KAAM,UAAW,cAAe,eAAgB,gBA7C7HhC,QACKC,OAAO,SACPgC,WAAW,uBAAwBuZ,MA2F5C,WACI,YAMA,SAASxF,GAAkB7V,EAAM4Q,EAAIxQ,EAAYF,EAAQ6b,EAAQlL,GAY7D,QAASC,KAIL,MAFA9Q,GAAKmB,MAAM,6BAEP6a,GACAhc,EAAKmB,MAAM,qEACJyP,EAAGqF,WAGd+F,EAAaD,GACT9K,YAAa,wCACbnP,WAAY,uBACZoP,aAAc,KACd+K,SAAU,SACV5K,UAAU,EACVP,MAAM,EACNS,OAAQ,WACJlQ,OAID2a,EAAWxK,SAASzQ,KAAKib,EAAWlL,OAM/C,QAASzP,KAED2a,IACAhc,EAAKmB,MAAM,6BACX6a,EAAW3a,OACX2a,EAAa,MA1CrB,OACIlL,KAAMA,EACNzP,KAAMA,EAGV,IAAI2a,GAmCRnG,EAAkBhU,SAAW,OAAQ,KAAM,aAAc,SAAU,SAAU,YA9C7EhC,QACKC,OAAO,SACP0N,QAAQ,oBAAqBqI,MAwDtC,WACI,YAMA,SAASqG,GAAqBjc,EAAQG,EAAYF,EAAQC,EAAUH,EAAM0S,EAAanS,EAAcqS,EAASiD,EAAmBpV,EAAcoQ,GAQ3I,QAASsL,KAEL/b,EAAWiP,eAAgB,EAE3BqD,EAAYG,MAAMhS,EAAGC,MAChBC,KAAK,SAASC,GAEXhB,EAAKmB,MAAM,kCAAmCH,GAI9CZ,EAAWgc,UAAUpb,EAASgC,KAAKlC,KAAK4E,KACxCtF,EAAWic,YAAYrb,EAASgC,KAAKlC,KAAKkS,UAC1C5S,EAAWkc,YAAYtb,EAASgC,KAAKlC,KAAKgU,MAAM3I,QAAQxI,MAGxDkS,EAAkBxU,OAQdnB,EAAOwR,GAAGb,EAASiD,OACnB3T,EAAS,WACLD,EAAOqB,YAIhB,SAASH,GAGRX,EAAaW,MAAMA,EAAM4B,KAAK/B,WAK1C,QAASsb,KAGL1G,EAAkBxU,OAClBnB,EAAOwR,GAAGb,EAASkC,OAhDvB,GAAIlS,GAAKW,IACTX,GAAGC,QACHD,EAAGsb,WAAaA,EAChBtb,EAAG0b,gBAAkBA,EAsCzBL,EAAqBra,SAAW,SAAU,aAAc,SAAU,WAAY,OAAQ,cAAe,eAAgB,UAAW,oBAAqB,eAAgB,YA/CrKhC,QACKC,OAAO,SACPgC,WAAW,uBAAwBoa,MA4D5C,WACI,YAMA,SAASM,GAAsBvc,EAAQG,EAAYJ,EAAM0S,EAAajS,EAAcF,GAYhF,QAASkc,KAELrc,EAAWiP,eAAgB,EAE3BqD,EAAYS,YAAYtS,EAAG8L,OACtB5L,KAAK,SAASC,GAEXf,EAAOyc,gBAAgBjB,eACvB5a,EAAG8L,MAAQ,GAEX3M,EAAKmB,MAAM,kCAAmCH,GAC9CP,EAAa6O,KAAK,iFAEnB,SAASlO,GAERpB,EAAKoB,MAAM,gCAAiCA,EAAM4B,MAClDvC,EAAaW,MAAM,qDA1B/B,GAAIP,GAAKW,IACTX,GAAG4b,OAASA,EACZ5b,EAAG8L,MAAQ,GAGX1M,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAmClC4a,EAAsB3a,SAAW,SAAU,aAAc,OAAQ,cAAe,eAAgB,gBAhDhGhC,QACKC,OAAO,SACPgC,WAAW,wBAAyB0a,MAqC7C,WACI,YAEA3c,SACKC,OAAO,gBACJ,oBACA,uBACA,8BAKZ,WACI,YAEAD,SACKC,OAAO,qBAIhB,WACI,YAMA,SAAS6c,KAEL,MAAO,UAASC,GACZ,IAAKA,EACD,MAAO,EAGX,IAAIC,GAAQD,EAAIE,WAAW3O,OAAO/I,QAAQ,MAAO,GAEjD,IAAIyX,EAAM3M,MAAM,UACZ,MAAO0M,EAGX,IAAIG,GAASC,EAAMC,CAEnB,QAAQJ,EAAMK,QACV,IAAK,IACDH,EAAU,EACVC,EAAOH,EAAMjN,MAAM,EAAG,GACtBqN,EAASJ,EAAMjN,MAAM,EACrB,MAEJ,KAAK,IACDmN,EAAUF,EAAM,GAChBG,EAAOH,EAAMjN,MAAM,EAAG,GACtBqN,EAASJ,EAAMjN,MAAM,EACrB,MAEJ,KAAK,IACDmN,EAAUF,EAAMjN,MAAM,EAAG,GACzBoN,EAAOH,EAAMjN,MAAM,EAAG,GACtBqN,EAASJ,EAAMjN,MAAM,EACrB,MAEJ,SACI,MAAOgN,GASf,MANe,IAAXG,IACAA,EAAU,IAGdE,EAASA,EAAOrN,MAAM,EAAG,GAAK,IAAMqN,EAAOrN,MAAM,IAEzCmN,EAAU,KAAOC,EAAO,KAAOC,GAAQ9O,QAhDvDtO,QACKC,OAAO,eACPqd,OAAO,oBAAqBR,MAyDrC,WACI,YAMA,SAASS,KAEL,MAAO,UAASpY,EAAWqY,GACvB,MAAKrY,GAGDqY,EACOrD,OAAOhV,GAAWsY,OAAO,OAG7BtD,OAAOhV,GAAWsY,OAAO,MAPhC,QAPRzd,QACKC,OAAO,eACPqd,OAAO,aAAcC,MAwB9B,WACI,YAMA,SAASG,KAEL,MAAO,UAASC,EAAOC,GACnB,MAAY,OAARD,GACIA,EAAMN,QAAQ,GACdM,EAAQA,EAAMpP,cACPoP,EAAME,UAAU,EAAG,GAAG/N,cAAgB6N,EAAME,UAAU,IAHrE,QAPR7d,QACKC,OAAO,eACPqd,OAAO,aAAcI,MAkB9B,WACI,YAEA1d,SACKC,OAAO,wBAIhB,WACI,YAojBA,SAAS6d,GAAa5T,GAClB,OACI6T,SAAU,KACVxY,SAAS,EACTqY,OACIhY,GAAI,KAERsL,SAAU,iCACV8M,KAAM,SAASJ,EAAOK,GAClB/T,EAAgBvE,QAAQiY,EAAMhY,IAAI1E,KAAK,SAASC,GAC5Cyc,EAAMxT,SAAWjJ,MAMjC,QAAS+c,GAAehU,GACpB,OACI3E,SAAS,EACTwY,SAAU,IACVH,OACIO,mBAAoB,KAExBjN,SACA,0QAIA8M,KAAM,SAASJ,EAAOK,GAClB/T,EAAgBgI,OAAO,IAAM,EAAG,SAAShR,KAAK,SAASC,GAC/CA,EAASgC,OACTya,EAAMhS,WAAazK,EAASgC,UAOhD,QAASib,GAAoBlU,GACzB,OACI3E,SAAS,EACTwY,SAAU,IACVH,OACIS,oBAAqB,KAEzBnN,SACA,sOAGA8M,KAAM,SAASJ,EAAOK,GAClB/T,EAAgBgI,OAAO,IAAM,EAAG,SAAShR,KAAK,SAASC,GAC/CA,EAASgC,OACTya,EAAMhS,WAAazK,EAASgC,UAmChD,QAASmb,GAAgBtM,EAAkBnR,EAAcV,GACrD,OACIoF,SAAS,EACTwY,SAAU,IACVH,OACItW,UAAW,KAEf4J,SACA,qgBAQAjP,YAAA,SAAY,SAAS7B,GACjBA,EAAOme,sBACPne,EAAOoe,iBAAmB,SAASC,GAC/Bre,EAAOkH,UAAUqL,MAAQ8L,GAE7Bre,EAAOse,cAAgB,WACnBve,EAAKmB,MAAM,mBAAoBlB,EAAOkH,WACtC0K,EAAiBU,cAActS,EAAOkH,WAAWpG,KAAK,SAASyd,GACtDA,EAAEvd,QAGHP,EAAaU,MAAM,wCAA0CnB,EAAOkH,UAAUqL,MAAQ,KAFtF9R,EAAaY,QAAQ,aAAerB,EAAOkH,UAAUqL,MAAQ,gCAarF,QAASiM,GAAeC,GAEpB,MAAO,UAASjB,EAAOkB,EAASC,GAC5B/e,QAAQ8e,QAAQD,GAASG,KAAK,SAAU,WAC/Brd,KAAKsd,aAAe,IACpBrB,EAAMsB,iBAAkB,EAGxBtB,EAAMsB,iBAAkB,EAG7BtB,EAAMuB,YAKlB,QAASvJ,GAAUnV,GACf,OACIsd,SAAU,KACVxY,SAAS,EACTqY,OACIhY,GAAI,KAERsL,SAAU,8BACV8M,KAAM,SAASJ,EAAOK,GAClBL,EAAM3c,KAAOR,EAAYkX,cAAciG,EAAMhY,MAvpBzDkY,EAAa9b,SAAW,mBACxBkc,EAAelc,SAAW,mBAC1Boc,EAAoBpc,SAAW,mBAC/Bsc,EAAgBtc,SAAW,mBAAoB,eAAgB,QAC/D4c,EAAe5c,SAAW,WAC1B4T,EAAU5T,SAAW,eAtDrBhC,QACKC,OAAO,kBAuBPmf,UAAU,eAAgBtB,GAC1BsB,UAAU,iBAAkBlB,GAC5BkB,UAAU,sBAAuBhB,GAEjCgB,UAAU,kBAAmBd,GAC7Bc,UAAU,iBAAkBR,GAC5BQ,UAAU,YAAaxJ,MAgtBhC,WACA,YAEC5V,SACEC,OAAO,gBAKV,WACI,YAMA,SAASof,GAAYvH,GAEjBA,EAECE,MAAM,UACH9U,IAAK,0BACLkO,YAAa,8BACbnP,WAAY,mBACZoP,aAAc,KACdxK,MAAO,UACPsP,SACIrC,QAAA,sBAAQ,SAASiC,GACb,MAAOA,GAAoBQ,kCAuC3C8I,EAAYrd,SAAW,kBAvDvBhC,QACKC,OAAO,UACPgD,OAAOoc,MAsBhB,WACI,YAMA,SAASC,GAAiBlf,EAAQG,EAAY8B,EAAclC,EAAM0S,EAAaE,EAASrS,EAAcE,GAgClG,QAASkT,KAELvT,EAAWiP,eAAgB,EAE3BqD,EAAYiB,OAAO9S,EAAGC,KAAMD,EAAG+S,iBAC1B7S,KAAK,SAASC,GAEXhB,EAAKmB,MAAM,6BAA8BH,GACzCP,EAAaa,QAAQ,kBAGrBlB,EAAWgc,UAAUpb,EAASgC,KAAKlC,KAAK4E,KACxCtF,EAAWic,YAAYrb,EAASgC,KAAKlC,KAAKkS,UAC1C5S,EAAWkc,YAAYtb,EAASgC,KAAKlC,KAAKgU,MAAM3I,QAAQxI,OAEzD,SAASvC,GAERpB,EAAKoB,MAAM,2BAA4BA,EAAM4B,MAC7CvC,EAAaW,MAAMA,EAAM4B,KAAK/B,WAhD1C,GAAIJ,GAAKW,IACTX,GAAG8S,OAASA,EACZ9S,EAAGC,QACHD,EAAG+S,gBAAkB1R,EAAa0R,gBAGlC3T,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QAG9B,WAGIgR,EAAQnB,UACRmB,EAAQc,MAAM,KACX7S,EAAG+S,iBACFlB,EAAYqB,cAAclT,EAAG+S,iBAAiB7S,KAC1C,SAASqe,GACFA,EACCve,EAAGC,KAAK6L,MAAQyS,EAAWC,GAE3Bxe,EAAG+S,gBAAkB,UA4B7CuL,EAAiBtd,SAAW,SAAU,aAAc,eAAgB,OAAQ,cAAe,UAAW,eAAgB,gBAxDtHhC,QACKC,OAAO,UACPgC,WAAW,mBAAoBqd,MA2DxC,WACI,YAMA,SAASD,GAAYvH,GAEjBA,EAECE,MAAM,SACH9U,IAAK,SACLkO,YAAa,4BACbnP,WAAY,kBACZoP,aAAc,KACdxK,MAAO,QACPsP,SACInD,OAAA,sBAAO,SAAS+C,GACZ,MAAOA,GAAoBQ,kCAKtCyB,MAAM,YACH9U,IAAK,gBACLkO,YAAa;AACbnP,WAAY,wBACZoP,aAAc,KACdxK,MAAO,kBACPsP,SACIsJ,UAAA,sBAAU,SAAS1J,GACf,MAAOA,GAAoBQ,kCAKtCyB,MAAM,WACH9U,IAAK,eACLkO,YAAa,wCACbnP,WAAY,uBACZoP,aAAc,KACdxK,MAAO,iBACPsP,SACIuJ,SAAA,sBAAS,SAAS3J,GACd,MAAOA,GAAoBQ,kCAKtCyB,MAAM,gBACH9U,IAAK,sBACLkO,YAAa,wCACbnP,WAAY,uBACZoP,aAAc,OAMtBgO,EAAYrd,SAAW,kBAzDvBhC,QACKC,OAAO,SACPgD,OAAOoc,MAmEhB,WACI,YAMA,SAASM,GAAgBvf,EAAQG,EAAYF,EAAQF,EAAM0S,EAAaE,EAASrS,EAAcE,EAAcoQ,EAAUvQ,GAkBnH,QAASuS,KAELzS,EAAWiP,eAAgB,EAE3BqD,EAAYG,MAAMhS,EAAGC,MAChBC,KAAK,SAASC,GAEXhB,EAAKmB,MAAM,4BAA6BH,GACxCP,EAAaa,QAAQ,kBAGrBlB,EAAWgc,UAAUpb,EAASgC,KAAKlC,KAAK4E,KACxCtF,EAAWic,YAAYrb,EAASgC,KAAKlC,KAAKkS,SAI1C,IAAItB,GAAK,WACLxR,EAAOwR,GAAGb,EAASiD,OAGpBpB,GAAY0B,UACX9T,EAAY+W,cAActW,KAAK2Q,GAE/BA,KAEL,SAAStQ,GAERpB,EAAKoB,MAAM,0BAA2BA,EAAM4B,MAC5CvC,EAAaW,MAAMA,EAAM4B,KAAK/B,WA5C1C,GAAIJ,GAAKW,IACTX,GAAGgS,MAAQA,EACXhS,EAAGC,QAGHb,EAAOyB,SAAWnB,EAAamB,SAC/BzB,EAAO0B,UAAYpB,EAAaoB,UAChC1B,EAAO2B,QAAUrB,EAAaqB,QA6ClC4d,EAAgB3d,SAAW,SAAU,aAAc,SAAU,OAAQ,cAAe,UAAW,eAAgB,eAAgB,WAAY,eA1D3IhC,QACKC,OAAO,SACPgC,WAAW,kBAAmB0d,MAwDvC,WACI,YAEA3f,SAAQC,OAAO,eAInB,WACI,YAMA,SAAS2f,GAAgBzf,EAAMC,EAAQC,EAAQgC,EAAc9B,EAAYsS,EAAaE,EAAS8M,EAAU7O,GAcrG,QAASgC,KACL7S,EAAKmB,MAAM,4BACXuR,EAAYG,QAGhB,QAASU,KACLvT,EAAKmB,MAAM,6BACXuR,EAAYa,SApBhB,GAAI1S,GAAKW,IAGTX,GAAG8e,YAAc/M,EAAQ8C,SAEzB7U,EAAGgS,MAAQA,EACXhS,EAAG0S,OAASA,EAuBZnT,EAAWwf,QAAUF,EAASE,QAG9Bxf,EAAWyf,QAAUH,EAASG,QAO9Bzf,EAAWgc,UAAY,SAAS5G,GAC5BpV,EAAWoV,OAASA,GAExBpV,EAAWic,YAAc,SAASrJ,GAC9B5S,EAAW4S,SAAWA,GAE1B5S,EAAWkc,YAAc,SAASwD,GAC9B1f,EAAW0f,SAAWA,GAK1B1f,EAAW4S,SAAS,GACpB5S,EAAW0f,SAAS,GAGhBpN,EAAYyB,oBACRvB,EAAQ4C,SACRpV,EAAWoV,OAAS5C,EAAQ4C,QAE5B5C,EAAQ8C,WACRtV,EAAW4S,SAAWJ,EAAQ8C,UAE9B9C,EAAQ6B,SAAStI,UACjB/L,EAAW0f,SAAWlN,EAAQ6B,SAAStI,QAAQxI,OAKvD1D,EAAOkU,gBAAkB,WACrB,MAAOzB,GAAYyB,mBAGvBlU,EAAOoU,aAAe,SAAS0L,GAC3B,MAAOrN,GAAY2B,aAAa0L,IAGpC9f,EAAO+f,SAAW,SAASC,GAEvB,MAAO/f,GAAOyR,QAAQhO,OAASsc,GASnCpf,EAAGqf,OAAS,GAEZjgB,EAAOmP,IAAI,sBAAuB,SAAS/F,EAAO8W,EAASC,EAAUC,EAAWC,GAC5E,GAAIH,EAAQnd,MAAQmd,EAAQnd,KAAKkd,OAAQ,CAErC,GAAIK,GAAMJ,EAAQnd,KAAKkd,MACvB,IAAIK,EAEA,YADA1f,EAAGqf,OAASC,EAAQnd,KAAKkd,YAK7Brf,GAAGqf,OAAS,KA7CxBT,EAAgB5d,SAAW,OAAQ,SAAU,SAAU,eAAgB,aAAc,cAAe,UAAW,WAAY,YA3D3HhC,QACKC,OAAO,SACPgC,WAAW,kBAAmB2d,MAkHvC,WACI,YAEA5f,SACGC,OAAO,OACN,YACA,UACA,aACA,aACA,YACA,SACA,WACA,gBACA,iBACA,kBACA,qBACA,eACA,cACA,yBACA,iBACA,eACA,cACA,eAEA,UACA,iBACA,cACA,eAEA,QACA,SAEA,QACA,aACA,gBACA,iBACA,cACA,iBACA,iBACA,qBACA,mBACA,wBAKR,WACI,YAMA,SAAS0gB,GAASxgB,EAAMuQ,EAAOnQ,EAAYF,EAAQgC,EAAcxB,EAAcgS,EAAapS,EAAa2L,GAIrGyG,EAAYuB,aAETvB,EAAYyB,mBAAqBzB,EAAY0B,YAC5C9T,EAAY+W,cACZpL,EAAeoL,eAgDvBmJ,EAAS3e,SAAW,OAAQ,QAAS,aAAc,SAAU,eAAgB,eAAgB,cAAe,cAAe,kBA5D3HhC,QACKC,OAAO,OACP2gB,IAAID,MAgBb,WACI,YAMA,SAAStB,GAAYvH,EAAgBC,GAEjCD,EAKCE,MAAM,SACH9U,IAAK,GACLkO,YAAa,4BACb6G,eACIG,MAAM,GAEVjV,MACIkd,OAAQ,WAIfrI,MAAM,cACH9U,IAAK,IACLkO,YAAa,4BACb6G,eACIG,MAAM,GAEVjV,MACIkd,OAAQ,cAEZlK,SACI0K,OAAA,sBAAO,SAAS9K,GACZ,MAAOA,GAAoBE,wBAqBtC+B,MAAM,YACHjG,OAAQ,QACR7O,IAAK,SACLkO,YAAa,gCACbvK,MAAO,iBACPoR,eACIG,MAAM,GAEVjC,SACA0K,OAAA,sBAAO,SAAS9K,GACZ,MAAOA,GAAoBE,wBAHvCoJ,EAAYrd,SAAW,iBAAkB,sBA7DzChC,QACKC,OAAO,OACPgD,OAAOoc,MAuEhBrf,QAAQC,OAAO,cACd6gB,SAAS,YACNf,QAAW,QACXC,QAAW,GACXe,OAAU,oCACVC,QAAW,UAEdF,SAAS,iBACNrc,eAAkB,uBAClBE,OAAU,2XACVC,UAAa,+BACbN,MAAS,2CAGb,WACI,YAEAtE,SACKC,OAAO,OACP6gB,SAAS,YACN5N,MAAY,QACZc,OAAY,SACZC,MAAY,eAEftG,QAAQ,OAAA,WAAQ,SAASkS,GAGtB,GAAIoB,GAAOpB,EAASkB,MAEpB,QACI7F,SAAoB+F,EAAO,eAC3BC,aAAoBD,EAAO,mBAC3BE,OAAoBF,EAAO,aAC3BG,cAAoBH,EAAO,oBAC3BxG,WAAoBwG,EAAO,iBAC3BI,QAAoBJ,EAAO,cAC3BpG,KAAoBoG,EAAO,WAC3BjH,OAAoBiH,EAAO,aAC3B3O,WAAoB2O,EAAO,iBAC3B/N,MAAoB+N,EAAO,YAC3B1N,aAAoB0N,EAAO,mBAC3BxN,YAAoBwN,EAAO,kBAC3BrN,OAAoBqN,EAAO,aAC3B1H,KAAoB0H,EAAO,WAC3BhI,MAAoBgI,EAAO,YAC3BK,SAAoBL,EAAO,eAC3BjN,OAAoBiN,EAAO,aAC3B9M,kBAAoB8M,EAAO,wBAC3BrH,WAAoBqH,EAAO,iBAC3BrJ,KAAoBqJ,EAAO,WAC3BrK,MAAoBqK,EAAO,YAC3BM,SAAoBN,EAAO,eAC3BO,kBAAoBP,EAAO,+BAW3CjhB,QAAQ8e,QAAQ2C,UAAUC,MAAM,SAASphB,GAGrC,QAASqhB,KACL,GAAIC,GAAsB5hB,QAAQ8e,QAAQ,mBAAmB+C,SAAW,EACxE7hB,SAAQ8e,QAAQ,mBAAmBgD,IAAI,aAAcF,EAAsB,KAE3E,IAAIG,GAAc/hB,QAAQ8e,QAAQ,sBAAsB+C,SACpDG,EAAehiB,QAAQ8e,QAAQ,iBAAiB+C,QAEhDE,GAAcC,GACdhiB,QAAQ8e,QAAQ,iBAAiBgD,IAAI,aAAcC,EAAc,MAGnDC,EAAdD,GACA/hB,QAAQ8e,QAAQ,iBAAiBgD,IAAI,aAAc9hB,QAAQ8e,QAAQmD,QAAQJ,SAAW,MAGtF7hB,QAAQ8e,QAAQ,QAAQoD,SAAS,eAC7BH,EAAcC,EACdhiB,QAAQ8e,QAAQ,iBAAiBgD,IAAI,aAAcC,EAAc,GAAK,MAGtE/hB,QAAQ8e,QAAQ,iBAAiBgD,IAAI,aAAc9hB,QAAQ8e,QAAQmD,QAAQJ,SAAW,GAAK,OAMvG7hB,QAAQ8e,QAAQmD,QAAQjD,KAAK,qBAAsB,WAC1Chf,QAAQ8e,QAAQ,QAAQoD,SAAS,eAClCP,MAKR3hB,QAAQ8e,QAAQmD,QAAQE,OAAO,WACvBniB,QAAQ8e,QAAQmD,QAAQG,YAAc,IAAMpiB,QAAQ8e,QAAQ,QAAQoD,SAAS,aAC7EliB,QAAQ8e,QAAQ,kBAAkBuD,SAAS,eAG3CriB,QAAQ8e,QAAQ,kBAAkBwD,YAAY,iBAItDhiB,EAAS,WACLqhB,MAKJ3hB,QAAQ8e,QAAQmD,QAAQjD,KAAK,cAAe,WACpChf,QAAQ8e,QAAQ2C,UAAUc,QAAU,IACpCviB,QAAQ8e,QAAQ,QAAQuD,SAAS,cAGjCriB,QAAQ8e,QAAQ,QAAQwD,YAAY,kBAMhD,WACI,YAMA,SAASrf,GAAOuf,EAAcC,EAAmBC,EAAeC,EAAsBC,EAAgBC,EAAUhD,GAGxF,QAAhBA,EAASve,MACTkhB,EAAaM,cAAa,GAG1BN,EAAaM,cAAa,GAI9BL,EAAkBM,WAAW,KAC7BN,EAAkBO,WAAYC,SAAS,EAAMC,aAAa,IAG1DR,EAAcS,aAAalX,KAAK,0BAGhC0W,EAAqBS,YACjBC,SAAU,GACVC,WAAY,KAIhBtjB,QAAQkH,OAAO0b,EAAevN,UAC1BkO,MAAM,IAiCdtgB,EAAOjB,SAAW,eAAgB,oBAAqB,gBAAiB,uBAAwB,iBAAkB,WAAY,YA9D9HhC,QACKC,OAAO,OACPgD,OAAOA,MAkChBjD,QAAQC,OAAO,OAAO2gB,KAAK,iBAAkB,SAAS4C,GAAiBA,EAAeC,IAAI,oBAAoB,8JAC9GD,EAAeC,IAAI,gCAAgC,8JACnDD,EAAeC,IAAI,uCAAuC,yJAC1DD,EAAeC,IAAI,mCAAmC,wGACtDD,EAAeC,IAAI,mCAAmC,2lBACtDD,EAAeC,IAAI,iCAAiC,oHACpDD,EAAeC,IAAI,oCAAoC,ynEACvDD,EAAeC,IAAI,4BAA4B,+WAC/CD,EAAeC,IAAI,4BAA4B,4zCAC/CD,EAAeC,IAAI,8BAA8B,mwDACjDD,EAAeC,IAAI,0CAA0C,4mCAC7DD,EAAeC,IAAI,wCAAwC,85CAC3DD,EAAeC,IAAI,wCAAwC,mvDAC3DD,EAAeC,IAAI,+CAA+C,6wCAClED,EAAeC,IAAI,mDAAmD,qrCACtED,EAAeC,IAAI,iDAAiD,kjCACpED,EAAeC,IAAI,2CAA2C,k5CAC9DD,EAAeC,IAAI,qDAAqD,uxCACxED,EAAeC,IAAI,mDAAmD,wxCACtED,EAAeC,IAAI,2DAA2D,4kCAC9ED,EAAeC,IAAI,uDAAuD,usCAC1ED,EAAeC,IAAI,+DAA+D,4vCAClFD,EAAeC,IAAI,iEAAiE;AACpFD,EAAeC,IAAI,+EAA+E,8pLAClGD,EAAeC,IAAI,kEAAkE,uwCACrFD,EAAeC,IAAI,oEAAoE,44CACvFD,EAAeC,IAAI,mEAAmE,i5IACtFD,EAAeC,IAAI,kFAAkF,o1GACrGD,EAAeC,IAAI,+EAA+E,6wIAClGD,EAAeC,IAAI,2FAA2F,kgLAC9GD,EAAeC,IAAI,qFAAqF,s0EACxGD,EAAeC,IAAI,sDAAsD","file":"scripts/app-054d1cb9fe.js","sourcesContent":["(function() {\n 'use strict';\n\n angular\n .module('admin.user', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.user')\n .controller('UserAddController', UserAddController);\n\n function UserAddController($log, $scope, $state, $timeout, $rootScope, $filter, userService, formsService, panelService, flashService, Notification) {\n var vm = this;\n\n vm.users = [];\n vm.addUser = addUser;\n vm.user = {};\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // ADD\n //////////////////////\n function addUser() {\n\n userService.create(vm.user)\n .then(function(response) {\n\n if (!response.message) {\n\n // post success\n $log.debug(\"userAdd.controller-success:\", response);\n\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"User Successfully Added!\");\n\n // push new row to table\n //vm.users.push(response);\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n log.debug(\"userAdd.controller-error:\", response);\n flashService.error(\"You must enter a name.\");\n }\n \n });\n }\n\n }\n\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('admin.teamMember', []);\n\n }\n)();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.teamMember')\n .controller('TeamMemberAddEditController', TeamMemberAddEditController);\n\n function TeamMemberAddEditController($log, $scope, $state, $timeout, $rootScope, $filter, teamMemberService, formsService, errorResponseService, panelService, flashService, Notification, $stateParams, Upload, AWS_S3_UPLOAD) {\n var vm = this;\n\n vm.teamMember = {};\n\n vm.saveTeamMember = saveTeamMember;\n vm.addTeamMember = addTeamMember;\n vm.getTeamMemberById = getTeamMemberById;\n vm.updateTeamMember = updateTeamMember;\n vm.deleteTeamMember = deleteTeamMember;\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // INIT\n //////////////////////\n (function(){\n vm.editing = !!$stateParams.id;\n if(vm.editing) getTeamMemberById();\n })();\n\n //////////////////////\n // SAVE\n //////////////////////\n function saveTeamMember() {\n // saving a news item add/edit with a changed or new image\n if(!vm.teamMember.imageUrl) {\n uploadThumbnail(vm.imageFile).then(\n function(response) {\n vm.teamMember.imageUrl = response.config.url + response.config.data.filename;\n if(vm.editing) {\n updateTeamMember();\n } else {\n vm.isTeamMemberPending = true;\n addTeamMember();\n }\n },\n function(err) {\n $log.debug('Error status: ' + err.status);\n flashService.error(\"Failed to upload image.\");\n },\n function(evt) {\n var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);\n vm.progress = progressPercentage;\n $log.debug('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);\n })\n } else {\n // no image added\n if(vm.editing) {\n updateTeamMember();\n } else if(vm.isTeamMemberPending) {\n addTeamMember();\n } else {\n flashService.error(\"Failed to save TeamMember - a image is required.\");\n }\n }\n }\n\n function uploadThumbnail(file) {\n var cleanedFilename = cleanFilename(vm.teamMember.name);\n var fileExtension = file.name.substr((~-file.name.lastIndexOf(\".\") >>> 0) + 2);\n var cleanedFilenameAndExtension = cleanedFilename + \".\" + fileExtension;\n\n return Upload.upload({\n url: AWS_S3_UPLOAD.s3url,\n method: 'POST',\n data: {\n key: cleanedFilename + \".\" + fileExtension, // the key to store the file on S3, could be file name or customized\n AWSAccessKeyId: AWS_S3_UPLOAD.AWSAccessKeyId,\n acl: 'public-read', // sets the access to the uploaded file in the bucket: private, public-read, ...\n policy: AWS_S3_UPLOAD.policy,\n signature: AWS_S3_UPLOAD.signature, // base64-encoded signature based on policy string (see article below)\n \"Content-Type\": file.type != '' ? file.type : 'application/octet-stream', // content type of the file (NotEmpty)\n filename: cleanedFilenameAndExtension,\n file: file\n },\n headers: {\n 'Authorization': undefined // we dont want to send auth: bearer JWT for s3 uploads\n }\n });\n }\n\n function cleanFilename(inputString){\n // get timestamp in milliseconds\n var timestamp = Date.now();\n //filename contains \"~!@#$%^&*()_+=`{}[]|\\:;'<>,./?Some actual text to keep, maybe...\",\n var outputString = inputString.replace(/([~!@#$%^&*()_+=`{}\\[\\]\\|\\\\:;'<>,.\\/? ])+/g, '-').replace(/^(-)+|(-)+$/g,'');\n var outputStringWithTimestamp = outputString+'-'+timestamp;\n $log.debug(\"cleanedFilename-outputStringWithTimestamp\", outputStringWithTimestamp);\n return outputStringWithTimestamp;\n }\n\n //////////////////////\n // ADD\n //////////////////////\n function addTeamMember() {\n teamMemberService.create(vm.teamMember)\n .then(function(response) {\n\n if (!response.message) {\n\n // post success\n $log.debug(\"teamMemberAdd.controller-success:\", response);\n\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"TeamMember Successfully Added!\");\n\n // push new row to table\n //vm.accounts.push(response);\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"news-item-add.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to add Team Member.\")\n );\n }\n\n });\n }\n\n //////////////////////\n // EDIT\n //////////////////////\n function getTeamMemberById() {\n teamMemberService.getById($stateParams.id).then(function(response) {\n if (response) {\n $log.debug('teamMember.edit-getById:', response);\n\n vm.teamMember._id = response._id;\n vm.teamMember.name = response.name;\n vm.teamMember.imageUrl = response.imageUrl;\n vm.teamMember.created = response.created;\n }\n });\n }\n\n function updateTeamMember() {\n teamMemberService.updateById(vm.teamMember)\n .then(function(response) {\n\n if (!response.message) {\n // post success\n $log.debug(\"teamMember.edit.controller-success:\", response);\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Team Member Successfully Updated!\");\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"teamMember.edit.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to update Team Member.\")\n );\n }\n });\n }\n\n function deleteTeamMember() {\n teamMemberService.deleteById(vm.teamMember).then(function(response){\n if(!response.error) {\n panelService.hide();\n Notification.success(\"Team Member Successfully Deleted!\");\n $timeout(function() {\n $state.reload();\n });\n } else {\n Notification.error(\"Failed to delete Team Member.\");\n }\n });\n }\n\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.pressRelease', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.pressRelease')\n .controller('PressReleaseAddEditController', PressReleaseAddEditController);\n\n function PressReleaseAddEditController($log, $scope, $state, $timeout, $rootScope, $filter, pressReleaseService, \n formsService, utcDateHelperService, errorResponseService, panelService, metaTagsHelperService,\n flashService, Notification, $stateParams, Upload, AWS_S3_UPLOAD) {\n\n var vm = this;\n\n vm.pressRelease = {};\n vm.highlight = {};\n\n vm.savePressRelease = savePressRelease;\n vm.addPressRelease = addPressRelease;\n vm.getPressReleaseById = getPressReleaseById;\n vm.updatePressRelease = updatePressRelease;\n vm.deletePressRelease = deletePressRelease;\n vm.isTimeValid = isTimeValid;\n vm.getCurrentDate = getCurrentDate;\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = function() {\n return formsService.canSave.apply($scope, arguments) && isTimeValid();\n };\n\n //////////////////////\n // INIT\n //////////////////////\n (function(){\n vm.editing = !!$stateParams.id;\n if(vm.editing) getPressReleaseById();\n })();\n\n //////////////////////\n // SAVE\n //////////////////////\n function savePressRelease() {\n // saving a news item add/edit with a changed or new pdf\n if(!vm.pressRelease.pdfUrl) {\n uploadThumbnail(vm.pdfFile).then(\n function(response) {\n vm.pressRelease.pdfUrl = response.config.url + response.config.data.filename;\n if(vm.editing) {\n updatePressRelease();\n } else {\n vm.isPressReleasePending = true;\n addPressRelease();\n }\n },\n function(err) {\n $log.debug('Error status: ' + err.status);\n flashService.error(\"Failed to upload image.\");\n },\n function(evt) {\n var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);\n vm.progress = progressPercentage;\n $log.debug('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);\n })\n } else {\n // no pdf added\n if(vm.editing) {\n updatePressRelease();\n } else if(vm.isPressReleasePending) {\n addPressRelease();\n } else {\n flashService.error(\"Failed to save Press Release - a pdf is required.\");\n }\n }\n }\n\n function uploadThumbnail(file) {\n var cleanedFilename = cleanFilename(vm.pressRelease.title);\n var fileExtension = file.name.substr((~-file.name.lastIndexOf(\".\") >>> 0) + 2);\n var cleanedFilenameAndExtension = cleanedFilename + \".\" + fileExtension;\n\n return Upload.upload({\n url: AWS_S3_UPLOAD.s3url,\n method: 'POST',\n data: {\n key: cleanedFilename + \".\" + fileExtension, // the key to store the file on S3, could be file name or customized\n AWSAccessKeyId: AWS_S3_UPLOAD.AWSAccessKeyId,\n acl: 'public-read', // sets the access to the uploaded file in the bucket: private, public-read, ...\n policy: AWS_S3_UPLOAD.policy,\n signature: AWS_S3_UPLOAD.signature, // base64-encoded signature based on policy string (see article below)\n \"Content-Type\": file.type != '' ? file.type : 'application/octet-stream', // content type of the file (NotEmpty)\n filename: cleanedFilenameAndExtension,\n file: file\n },\n headers: {\n 'Authorization': undefined // we dont want to send auth: bearer JWT for s3 uploads\n }\n });\n }\n\n function cleanFilename(inputString){\n // get timestamp in milliseconds\n var timestamp = Date.now();\n //filename contains \"~!@#$%^&*()_+=`{}[]|\\:;'<>,./?Some actual text to keep, maybe...\",\n var outputString = inputString.replace(/([~!@#$%^&*()_+=`{}\\[\\]\\|\\\\:;'<>,.\\/? ])+/g, '-').replace(/^(-)+|(-)+$/g,'');\n var outputStringWithTimestamp = outputString+'-'+timestamp;\n $log.debug(\"cleanedFilename-outputStringWithTimestamp\", outputStringWithTimestamp);\n return outputStringWithTimestamp;\n }\n\n //////////////////////\n // ADD\n //////////////////////\n function addPressRelease() {\n pressReleaseService.create(vm.pressRelease)\n .then(function(response) {\n\n if (!response.message) {\n\n // post success\n $log.debug(\"pressReleaseAdd.controller-success:\", response);\n\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Press Release Successfully Added!\");\n\n // push new row to table\n //vm.accounts.push(response);\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"news-item-add.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to add Press Release.\")\n );\n }\n\n });\n }\n\n //////////////////////\n // EDIT\n //////////////////////\n function getPressReleaseById() {\n pressReleaseService.getById($stateParams.id).then(function(response) {\n if (response) {\n $log.debug('pressRelease.edit-getById:', response);\n\n vm.pressRelease._id = response._id;\n vm.pressRelease.title = response.title;\n vm.pressRelease.body = response.body;\n vm.pressRelease.date = response.date;\n vm.pressRelease.pdfUrl = response.pdfUrl;\n vm.pressRelease.contactInfo = response.contactInfo;\n vm.pressRelease.created = response.created;\n \n angular.extend(vm.pressRelease, metaTagsHelperService.getMetaViewModel(response));\n\n var isDatePast = utcDateHelperService.isDatePast(response.releaseDate);\n vm.pressRelease.releaseDate = isDatePast ? null : response.releaseDate;\n\n vm.highlight.type = 'Press Release';\n vm.highlight.title = vm.pressRelease.title;\n vm.highlight.date = vm.pressRelease.date;\n // we put response id in url to seperate from external links like on news\n // this is kinda weird, should be changed to something more descriptive\n vm.highlight.url = vm.pressRelease.metaSlug;\n }\n });\n }\n\n function updatePressRelease() {\n pressReleaseService.updateById(vm.pressRelease)\n .then(function(response) {\n\n if (!response.message) {\n // post success\n $log.debug(\"pressRelease.edit.controller-success:\", response);\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Press Release Successfully Updated!\");\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"pressRelease.edit.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to update Press Release.\")\n );\n }\n });\n }\n\n function deletePressRelease() {\n pressReleaseService.deleteById(vm.pressRelease).then(function(response){\n if(!response.error) {\n panelService.hide();\n Notification.success(\"Press Release Successfully Deleted!\");\n $timeout(function() {\n $state.reload();\n });\n } else {\n Notification.error(\"Failed to delete Press Release.\");\n }\n });\n }\n\n function isTimeValid() {\n var releaseDate = vm.pressRelease.releaseDate;\n return !releaseDate || !utcDateHelperService.isDatePast(releaseDate);\n }\n\n function getCurrentDate() {\n return new Date();\n }\n\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.newsItem', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.newsItem')\n .controller('NewsItemAddEditController', NewsItemAddEditController);\n\n function NewsItemAddEditController($log, $scope, $state, $timeout, $rootScope, $filter, newsItemService, utcDateHelperService, formsService, errorResponseService, panelService, flashService, Notification, $stateParams, Upload, AWS_S3_UPLOAD) {\n var vm = this;\n\n vm.newsItem = {};\n vm.highlight = {};\n\n vm.saveNewsItem = saveNewsItem;\n vm.addNewsItem = addNewsItem;\n vm.getNewsItemById = getNewsItemById;\n vm.updateNewsItem = updateNewsItem;\n vm.deleteNewsItem = deleteNewsItem;\n vm.isTimeValid = isTimeValid;\n vm.getCurrentDate = getCurrentDate;\n /*\n - if we want to show & validate & use UTC on the admin side instead of local time\n - date stored in the db is always(!) UTC\n vm.minReleaseDate = utcDateHelperService.getCurrentUtcDate();\n */\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = function() {\n return formsService.canSave.apply($scope, arguments) && isTimeValid();\n };\n\n //////////////////////\n // INIT\n //////////////////////\n (function(){\n vm.editing = !!$stateParams.id;\n if(vm.editing) getNewsItemById();\n })();\n\n //////////////////////\n // SAVE\n //////////////////////\n function saveNewsItem() {\n // saving a news item add/edit with a changed or new thumbnail\n if(!vm.newsItem.thumbnailUrl) {\n uploadThumbnail(vm.thumbnailFile).then(\n function(response) {\n vm.newsItem.thumbnailUrl = response.config.url + response.config.data.filename;\n if(vm.editing) {\n updateNewsItem();\n } else {\n vm.isNewsPending = true;\n addNewsItem();\n }\n },\n function(err) {\n $log.debug('Error status: ' + err.status);\n flashService.error(\"Failed to upload image.\");\n },\n function(evt) {\n var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);\n vm.progress = progressPercentage;\n $log.debug('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);\n })\n } else {\n // no thumbnail added\n if(vm.editing) {\n updateNewsItem();\n } else if(vm.isNewsPending) {\n addNewsItem();\n } else {\n flashService.error(\"Failed to save News Item - a thumbnail is required.\");\n }\n }\n }\n\n function uploadThumbnail(file) {\n var cleanedFilename = cleanFilename(vm.newsItem.title);\n var fileExtension = file.name.substr((~-file.name.lastIndexOf(\".\") >>> 0) + 2);\n var cleanedFilenameAndExtension = cleanedFilename + \".\" + fileExtension;\n\n return Upload.upload({\n url: AWS_S3_UPLOAD.s3url,\n method: 'POST',\n data: {\n key: cleanedFilename + \".\" + fileExtension, // the key to store the file on S3, could be file name or customized\n AWSAccessKeyId: AWS_S3_UPLOAD.AWSAccessKeyId,\n acl: 'public-read', // sets the access to the uploaded file in the bucket: private, public-read, ...\n policy: AWS_S3_UPLOAD.policy,\n signature: AWS_S3_UPLOAD.signature, // base64-encoded signature based on policy string (see article below)\n \"Content-Type\": file.type != '' ? file.type : 'application/octet-stream', // content type of the file (NotEmpty)\n filename: cleanedFilenameAndExtension,\n file: file\n },\n headers: {\n 'Authorization': undefined // we dont want to send auth: bearer JWT for s3 uploads\n }\n });\n }\n\n function cleanFilename(inputString){\n // get timestamp in milliseconds\n var timestamp = Date.now();\n //filename contains \"~!@#$%^&*()_+=`{}[]|\\:;'<>,./?Some actual text to keep, maybe...\",\n var outputString = inputString.replace(/([~!@#$%^&*()_+=`{}\\[\\]\\|\\\\:;'<>,.\\/? ])+/g, '-').replace(/^(-)+|(-)+$/g,'');\n var outputStringWithTimestamp = outputString+'-'+timestamp;\n $log.debug(\"cleanedFilename-outputStringWithTimestamp\", outputStringWithTimestamp);\n return outputStringWithTimestamp;\n }\n\n //////////////////////\n // ADD\n //////////////////////\n function addNewsItem() {\n newsItemService.create(vm.newsItem)\n .then(function(response) {\n\n if (!response.message) {\n\n // post success\n $log.debug(\"newsItemAdd.controller-success:\", response);\n\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"News Item Successfully Added!\");\n\n // push new row to table\n //vm.accounts.push(response);\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"news-item-add.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to add News Item.\")\n );\n }\n\n });\n }\n\n //////////////////////\n // EDIT\n //////////////////////\n function getNewsItemById() {\n newsItemService.getById($stateParams.id).then(function(response) {\n if (response) {\n $log.debug('newsItem.edit-getById:', response);\n\n vm.newsItem._id = response._id;\n vm.newsItem.title = response.title;\n vm.newsItem.url = response.url;\n vm.newsItem.date = response.date;\n vm.newsItem.thumbnailUrl = response.thumbnailUrl;\n vm.newsItem.created = response.created;\n\n var isDatePast = utcDateHelperService.isDatePast(response.releaseDate);\n vm.newsItem.releaseDate = isDatePast ? null : response.releaseDate;\n\n vm.highlight.type = 'News Item';\n vm.highlight.title = vm.newsItem.title;\n vm.highlight.date = vm.newsItem.date;\n vm.highlight.url = vm.newsItem.url;\n }\n });\n }\n\n function updateNewsItem() {\n newsItemService.updateById(vm.newsItem)\n .then(function(response) {\n\n if (!response.message) {\n // post success\n $log.debug(\"newsItem.edit.controller-success:\", response);\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"News Item Successfully Updated!\");\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"newsItem.edit.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to update News Item.\")\n );\n }\n });\n }\n\n function deleteNewsItem() {\n newsItemService.deleteById(vm.newsItem).then(function(response){\n if(!response.error) {\n panelService.hide();\n Notification.success(\"News Item Successfully Deleted!\");\n $timeout(function() {\n $state.reload();\n });\n } else {\n Notification.error(\"Failed to delete News Item.\");\n }\n });\n }\n\n function isTimeValid() {\n var releaseDate = vm.newsItem.releaseDate;\n return !releaseDate || !utcDateHelperService.isDatePast(releaseDate);\n }\n\n function getCurrentDate() {\n return new Date();\n }\n\n }\n\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('admin.leadership', []);\n\n }\n)();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.leadership')\n .controller('LeadershipAddEditController', LeadershipAddEditController);\n\n function LeadershipAddEditController($log, $scope, $state, $timeout, $rootScope, $filter, leadershipService, formsService, errorResponseService, panelService, flashService, Notification, $stateParams, Upload, AWS_S3_UPLOAD) {\n var vm = this;\n\n vm.leadership = {};\n\n vm.saveLeadership = saveLeadership;\n vm.addLeadership = addLeadership;\n vm.getLeadershipById = getLeadershipById;\n vm.updateLeadership = updateLeadership;\n vm.deleteLeadership = deleteLeadership;\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // INIT\n //////////////////////\n (function(){\n vm.editing = !!$stateParams.id;\n if(vm.editing) getLeadershipById();\n })();\n\n //////////////////////\n // SAVE\n //////////////////////\n function saveLeadership() {\n // saving a news item add/edit with a changed or new image\n if(!vm.leadership.imageUrl) {\n uploadThumbnail(vm.imageFile).then(\n function(response) {\n vm.leadership.imageUrl = response.config.url + response.config.data.filename;\n if(vm.editing) {\n updateLeadership();\n } else {\n vm.isLeadershipPending = true;\n addLeadership();\n }\n },\n function(err) {\n $log.debug('Error status: ' + err.status);\n flashService.error(\"Failed to upload image.\");\n },\n function(evt) {\n var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);\n vm.progress = progressPercentage;\n $log.debug('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);\n })\n } else {\n // no image added\n if(vm.editing) {\n updateLeadership();\n } else if(vm.isLeadershipPending) {\n addLeadership();\n } else {\n flashService.error(\"Failed to save Leadership - a image is required.\");\n }\n }\n }\n\n function uploadThumbnail(file) {\n var cleanedFilename = cleanFilename(vm.leadership.name);\n var fileExtension = file.name.substr((~-file.name.lastIndexOf(\".\") >>> 0) + 2);\n var cleanedFilenameAndExtension = cleanedFilename + \".\" + fileExtension;\n\n return Upload.upload({\n url: AWS_S3_UPLOAD.s3url,\n method: 'POST',\n data: {\n key: cleanedFilename + \".\" + fileExtension, // the key to store the file on S3, could be file name or customized\n AWSAccessKeyId: AWS_S3_UPLOAD.AWSAccessKeyId,\n acl: 'public-read', // sets the access to the uploaded file in the bucket: private, public-read, ...\n policy: AWS_S3_UPLOAD.policy,\n signature: AWS_S3_UPLOAD.signature, // base64-encoded signature based on policy string (see article below)\n \"Content-Type\": file.type != '' ? file.type : 'application/octet-stream', // content type of the file (NotEmpty)\n filename: cleanedFilenameAndExtension,\n file: file\n },\n headers: {\n 'Authorization': undefined // we dont want to send auth: bearer JWT for s3 uploads\n }\n });\n }\n\n function cleanFilename(inputString){\n // get timestamp in milliseconds\n var timestamp = Date.now();\n //filename contains \"~!@#$%^&*()_+=`{}[]|\\:;'<>,./?Some actual text to keep, maybe...\",\n var outputString = inputString.replace(/([~!@#$%^&*()_+=`{}\\[\\]\\|\\\\:;'<>,.\\/? ])+/g, '-').replace(/^(-)+|(-)+$/g,'');\n var outputStringWithTimestamp = outputString+'-'+timestamp;\n $log.debug(\"cleanedFilename-outputStringWithTimestamp\", outputStringWithTimestamp);\n return outputStringWithTimestamp;\n }\n\n //////////////////////\n // ADD\n //////////////////////\n function addLeadership() {\n leadershipService.create(vm.leadership)\n .then(function(response) {\n\n if (!response.message) {\n\n // post success\n $log.debug(\"leadershipAdd.controller-success:\", response);\n\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Leadership Successfully Added!\");\n\n // push new row to table\n //vm.accounts.push(response);\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"news-item-add.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to add Leadership.\")\n );\n }\n\n });\n }\n\n //////////////////////\n // EDIT\n //////////////////////\n function getLeadershipById() {\n leadershipService.getById($stateParams.id).then(function(response) {\n if (response) {\n $log.debug('leadership.edit-getById:', response);\n\n vm.leadership._id = response._id;\n vm.leadership.name = response.name;\n vm.leadership.imageUrl = response.imageUrl;\n vm.leadership.position = response.position;\n vm.leadership.bio = response.bio;\n vm.leadership.publications = response.publications;\n vm.leadership.created = response.created;\n vm.leadership.order = response.order;\n }\n });\n }\n\n function updateLeadership() {\n leadershipService.updateById(vm.leadership)\n .then(function(response) {\n\n if (!response.message) {\n // post success\n $log.debug(\"leadership.edit.controller-success:\", response);\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Leadership Successfully Updated!\");\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"leadership.edit.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to update Leadership.\")\n );\n }\n });\n }\n\n function deleteLeadership() {\n leadershipService.deleteById(vm.leadership).then(function(response){\n if(!response.error) {\n panelService.hide();\n Notification.success(\"Leadership Successfully Deleted!\");\n $timeout(function() {\n $state.reload();\n });\n } else {\n Notification.error(\"Failed to delete Leadership.\");\n }\n });\n }\n\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.event', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.event')\n .controller('EventAddEditController', EventAddEditController);\n\n function EventAddEditController($log, $scope, $state, $timeout, $rootScope, $filter, eventService, formsService, errorResponseService, panelService, flashService, Notification, $stateParams, Upload, AWS_S3_UPLOAD) {\n var vm = this;\n\n vm.event = {};\n\n vm.saveEvent = saveEvent;\n vm.addEvent = addEvent;\n vm.getEventById = getEventById;\n vm.updateEvent = updateEvent;\n vm.deleteEvent = deleteEvent;\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // INIT\n //////////////////////\n (function(){\n vm.editing = !!$stateParams.id;\n if(vm.editing) getEventById();\n })();\n\n //////////////////////\n // SAVE\n //////////////////////\n function saveEvent() {\n // saving a news item add/edit with a changed or new thumbnail\n if(!vm.event.thumbnailUrl) {\n uploadThumbnail(vm.thumbnailFile).then(\n function(response) {\n vm.event.thumbnailUrl = response.config.url + response.config.data.filename;\n if(vm.editing) {\n updateEvent();\n } else {\n vm.isEventPending = true;\n addEvent();\n }\n },\n function(err) {\n $log.debug('Error status: ' + err.status);\n flashService.error(\"Failed to upload image.\");\n },\n function(evt) {\n var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);\n vm.progress = progressPercentage;\n $log.debug('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);\n })\n } else {\n // no thumbnail added\n if(vm.editing) {\n updateEvent();\n } else if(vm.isEventPending) {\n addEvent();\n } else {\n flashService.error(\"Failed to save Event - a thumbnail is required.\");\n }\n }\n }\n\n function uploadThumbnail(file) {\n var cleanedFilename = cleanFilename(vm.event.title);\n var fileExtension = file.name.substr((~-file.name.lastIndexOf(\".\") >>> 0) + 2);\n var cleanedFilenameAndExtension = cleanedFilename + \".\" + fileExtension;\n\n return Upload.upload({\n url: AWS_S3_UPLOAD.s3url,\n method: 'POST',\n data: {\n key: cleanedFilename + \".\" + fileExtension, // the key to store the file on S3, could be file name or customized\n AWSAccessKeyId: AWS_S3_UPLOAD.AWSAccessKeyId,\n acl: 'public-read', // sets the access to the uploaded file in the bucket: private, public-read, ...\n policy: AWS_S3_UPLOAD.policy,\n signature: AWS_S3_UPLOAD.signature, // base64-encoded signature based on policy string (see article below)\n \"Content-Type\": file.type != '' ? file.type : 'application/octet-stream', // content type of the file (NotEmpty)\n filename: cleanedFilenameAndExtension,\n file: file\n },\n headers: {\n 'Authorization': undefined // we dont want to send auth: bearer JWT for s3 uploads\n }\n });\n }\n\n function cleanFilename(inputString){\n // get timestamp in milliseconds\n var timestamp = Date.now();\n //filename contains \"~!@#$%^&*()_+=`{}[]|\\:;'<>,./?Some actual text to keep, maybe...\",\n var outputString = inputString.replace(/([~!@#$%^&*()_+=`{}\\[\\]\\|\\\\:;'<>,.\\/? ])+/g, '-').replace(/^(-)+|(-)+$/g,'');\n var outputStringWithTimestamp = outputString+'-'+timestamp;\n $log.debug(\"cleanedFilename-outputStringWithTimestamp\", outputStringWithTimestamp);\n return outputStringWithTimestamp;\n }\n\n //////////////////////\n // ADD\n //////////////////////\n function addEvent() {\n eventService.create(vm.event)\n .then(function(response) {\n\n if (!response.message) {\n\n // post success\n $log.debug(\"eventAdd.controller-success:\", response);\n\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Event Successfully Added!\");\n\n // push new row to table\n //vm.accounts.push(response);\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"news-item-add.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to add Event.\")\n );\n }\n\n });\n }\n\n //////////////////////\n // EDIT\n //////////////////////\n function getEventById() {\n eventService.getById($stateParams.id).then(function(response) {\n if (response) {\n $log.debug('event.edit-getById:', response);\n\n vm.event._id = response._id;\n vm.event.title = response.title;\n vm.event.url = response.url;\n vm.event.startDate = response.startDate;\n vm.event.endDate = response.endDate;\n vm.event.thumbnailUrl = response.thumbnailUrl;\n vm.event.location = response.location;\n vm.event.created = response.created;\n }\n });\n }\n\n function updateEvent() {\n eventService.updateById(vm.event)\n .then(function(response) {\n\n if (!response.message) {\n // post success\n $log.debug(\"event.edit.controller-success:\", response);\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Event Successfully Updated!\");\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"event.edit.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to update Event.\")\n );\n }\n });\n }\n\n function deleteEvent() {\n eventService.deleteById(vm.event).then(function(response){\n if(!response.error) {\n panelService.hide();\n Notification.success(\"Event Successfully Deleted!\");\n $timeout(function() {\n $state.reload();\n });\n } else {\n Notification.error(\"Failed to delete Event.\");\n }\n });\n }\n\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.category', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.category')\n .controller('CategoryEditController', CategoryEditController);\n\n function CategoryEditController($log, $scope, $state, $stateParams, $timeout, $filter, $rootScope, categoryService, formsService, panelService, flashService, Notification) {\n var vm = this;\n\n vm.category = {};\n vm.category.id = '';\n vm.category.name = '';\n vm.category.timeCreated = '';\n\n vm.getCategoryById = getCategoryById;\n vm.updateCategory = updateCategory;\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // VIEW / EDIT\n //////////////////////\n\n (function init() {\n getCategoryById();\n })();\n\n function getCategoryById() {\n\n //$log.debug('category.edit-$stateParams.id:', $stateParams.id);\n\n // get category by id\n categoryService.getById($stateParams.id).then(function(response) {\n if (response) {\n $log.debug('category.edit-getById:', response);\n\n vm.category._id = response._id;\n vm.category.name = response.name;\n vm.category.timeCreated = response.timeCreated;\n }\n });\n }\n\n function updateCategory() {\n\n categoryService.updateById(vm.category)\n .then(function(response) {\n\n if (!response.message) {\n\n // post success\n $log.debug(\"category.edit.controller-success:\", response);\n\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Category Successfully Updated!\");\n\n $timeout(function() {\n $state.reload();\n });\n\n\n }\n else {\n\n // post error\n $log.debug(\"category.edit.controller-error:\", response);\n flashService.error(\"You must enter a name.\");\n }\n });\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.category')\n .controller('CategoryAddController', CategoryAddController);\n\n function CategoryAddController($log, $scope, $state, $timeout, $rootScope, $filter, categoryService, formsService, panelService, flashService, Notification) {\n var vm = this;\n vm.addCategory = addCategory;\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // ADD\n //////////////////////\n function addCategory() {\n\n //vm.user.name = $filter('capitalize:true')(vm.user.name);\n\n categoryService.create(vm.category)\n .then(function(response) {\n\n if (!response.message) {\n\n // post success\n $log.debug(\"categoryAdd.controller-success:\", response);\n\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Category Successfully Added!\");\n\n // push new row to table\n //vm.accounts.push(response);\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"categoryAdd.controller-error:\", response);\n flashService.error(\"You must enter a name.\");\n }\n\n });\n }\n\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.blogPost', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.blogPost')\n .controller('BlogPostAddEditController', BlogPostAddEditController);\n\n function BlogPostAddEditController($log, $scope, $state, $timeout, $rootScope, metaTagsHelperService,\n $filter, blogPostService, formsService, utcDateHelperService, errorResponseService, \n panelService, flashService, Notification, $stateParams, Upload, AWS_S3_UPLOAD) {\n\n var vm = this;\n\n vm.blogPost = {};\n vm.categoryIds = [];\n\n vm.saveBlogPost = saveBlogPost;\n vm.addBlogPost = addBlogPost;\n vm.getBlogPostById = getBlogPostById;\n vm.updateBlogPost = updateBlogPost;\n vm.deleteBlogPost = deleteBlogPost;\n vm.trixAttachmentAdd = trixAttachmentAdd;\n vm.getCurrentDate = getCurrentDate;\n vm.isTimeValid = isTimeValid;\n /*\n - if we want to show & validate & use UTC on the admin side instead of local time\n - date stored in the db is always UTC\n vm.minReleaseDate = utcDateHelperService.getCurrentUtcDate();\n */\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = function() {\n return formsService.canSave.apply($scope, arguments) && isTimeValid();\n };\n //////////////////////\n // INIT\n //////////////////////\n (function(){\n vm.editing = !!$stateParams.id;\n if(vm.editing) getBlogPostById();\n })();\n\n //////////////////////\n // ATTACHMENT\n //////////////////////\n function trixAttachmentAdd(e) {\n var attachment;\n attachment = e.attachment;\n if (attachment.file) {\n return uploadAttachment(attachment);\n }\n }\n\n function uploadAttachment(attachment) {\n return uploadFile(attachment.file).then(\n function(response) {\n var url, href;\n url = href = response.config.url + response.config.data.filename;\n return attachment.setAttributes({\n url: url,\n href: href\n });\n },\n function(err) {\n $log.debug('Error status: ' + err.status);\n flashService.error(\"Failed to upload Blog attachment.\");\n },\n function(evt) {\n var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);\n $log.debug('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);\n return attachment.setUploadProgress(progressPercentage);\n });\n }\n\n //////////////////////\n // SAVE\n //////////////////////\n function saveBlogPost() {\n applyCategories();\n // saving a blog post add/edit with a changed or new pdf\n if(!vm.blogPost.headerUrl) {\n uploadFile(vm.headerFile).then(\n function(response) {\n vm.blogPost.headerUrl = response.config.url + response.config.data.filename;\n if(vm.editing) {\n updateBlogPost();\n } else {\n vm.isPostPending = true;\n addBlogPost();\n }\n },\n function(err) {\n $log.debug('Error status: ' + err.status);\n flashService.error(\"Failed to upload image.\");\n },\n function(evt) {\n var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);\n vm.progress = progressPercentage;\n $log.debug('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);\n })\n } else {\n // no pdf added\n if (vm.editing) {\n updateBlogPost();\n } else if(vm.isPostPending) {\n addBlogPost();\n } else {\n flashService.error(\"Failed to save Blog Post.\");\n }\n }\n }\n\n function uploadFile(file) {\n var cleanedFilename = cleanFilename(vm.blogPost.title || 'blog-post-image');\n var fileExtension = file.name.substr((~-file.name.lastIndexOf(\".\") >>> 0) + 2);\n var cleanedFilenameAndExtension = cleanedFilename + \".\" + fileExtension;\n\n return Upload.upload({\n url: AWS_S3_UPLOAD.s3url,\n method: 'POST',\n data: {\n key: cleanedFilename + \".\" + fileExtension, // the key to store the file on S3, could be file name or customized\n AWSAccessKeyId: AWS_S3_UPLOAD.AWSAccessKeyId,\n acl: 'public-read', // sets the access to the uploaded file in the bucket: private, public-read, ...\n policy: AWS_S3_UPLOAD.policy,\n signature: AWS_S3_UPLOAD.signature, // base64-encoded signature based on policy string (see article below)\n \"Content-Type\": file.type != '' ? file.type : 'application/octet-stream', // content type of the file (NotEmpty)\n filename: cleanedFilenameAndExtension,\n file: file\n },\n headers: {\n 'Authorization': undefined // we dont want to send auth: bearer JWT for s3 uploads\n }\n });\n }\n\n function cleanFilename(inputString){\n // get timestamp in milliseconds\n var timestamp = Date.now();\n //filename contains \"~!@#$%^&*()_+=`{}[]|\\:;'<>,./?Some actual text to keep, maybe...\",\n var outputString = inputString.replace(/([~!@#$%^&*()_+=`{}\\[\\]\\|\\\\:;'<>,.\\/? ])+/g, '-').replace(/^(-)+|(-)+$/g,'');\n var outputStringWithTimestamp = outputString+'-'+timestamp;\n $log.debug(\"cleanedFilename-outputStringWithTimestamp\", outputStringWithTimestamp);\n return outputStringWithTimestamp;\n }\n\n //////////////////////\n // ADD\n //////////////////////\n function addBlogPost() {\n blogPostService.create(vm.blogPost)\n .then(function(response) {\n\n if (!response.message) {\n\n // post success\n $log.debug(\"blogPostAdd.controller-success:\", response);\n\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Blog Post Successfully Added!\");\n\n // push new row to table\n //vm.accounts.push(response);\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n // post error\n $log.debug(\"blog-post-add.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to add Blog Post.\")\n );\n }\n\n });\n }\n\n //////////////////////\n // EDIT\n //////////////////////\n function getBlogPostById() {\n blogPostService.getById($stateParams.id).then(function(response) {\n if (response) {\n $log.debug('blogPost.edit-getById:', response);\n\n vm.blogPost._id = response._id;\n vm.blogPost.title = response.title;\n vm.blogPost.categories = response.categories;\n vm.blogPost.author = response.author;\n vm.blogPost.body = response.body;\n vm.blogPost.headerUrl = response.headerUrl;\n vm.blogPost.created = response.created;\n \n angular.extend(vm.blogPost, metaTagsHelperService.getMetaViewModel(response));\n \n var isDatePast = utcDateHelperService.isDatePast(response.releaseDate);\n vm.blogPost.releaseDate = isDatePast ? null : response.releaseDate;\n\n vm.categoryIds = [];\n vm.blogPost.categories.forEach(function(cat){\n vm.categoryIds.push(cat.id);\n });\n }\n });\n }\n\n function updateBlogPost() {\n blogPostService.updateById(vm.blogPost)\n .then(function(response) {\n\n if (!response.message) {\n // post success\n $log.debug(\"blogPost.edit.controller-success:\", response);\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Blog Post Successfully Updated!\");\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n // post error\n $log.debug(\"blogPost.edit.controller-error:\", response);\n flashService.error(\n errorResponseService.getErrorMessage(response, \"Failed to update Blog Post.\")\n );\n }\n });\n }\n\n function deleteBlogPost() {\n blogPostService.deleteById(vm.blogPost).then(function(response){\n if(!response.error) {\n panelService.hide();\n Notification.success(\"Blog Post Successfully Deleted!\");\n $timeout(function() {\n $state.reload();\n });\n } else {\n Notification.error(\"Failed to delete Blog Post.\");\n }\n });\n }\n\n function applyCategories() {\n vm.blogPost.categories = [];\n (vm.categoryIds || []).forEach(function(cat) {\n vm.blogPost.categories.push({ id: cat });\n });\n }\n\n function isTimeValid() {\n var releaseDate = vm.blogPost.releaseDate;\n return !releaseDate || !utcDateHelperService.isDatePast(releaseDate);\n }\n\n function getCurrentDate() {\n return new Date();\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.account', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.account')\n .controller('AccountEditController', AccountEditController);\n\n function AccountEditController($log, $scope, $state, $stateParams, $timeout, $filter, $rootScope, accountService, formsService, panelService, flashService, Notification) {\n var vm = this;\n\n vm.account = {};\n vm.account.id = '';\n vm.account.first = '';\n vm.account.last = '';\n vm.account.timeCreated = '';\n vm.inviteEmail = '';\n vm.inviteSent = false;\n vm.inviteWasClicked = false;\n\n vm.getAccountById = getAccountById;\n vm.updateAccountDetails = updateAccountDetails;\n vm.deleteAccount = deleteAccount;\n vm.inviteClicked = inviteClicked;\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // VIEW / EDIT\n //////////////////////\n\n (function init() {\n getAccountById();\n })();\n\n function getAccountById() {\n\n //$log.debug('account.edit-$stateParams.id:', $stateParams.id);\n\n // get account by id\n accountService.getById($stateParams.id).then(function(response) {\n\n if (response) {\n $log.debug('account.edit-getById:', response);\n\n vm.account.id = response._id;\n vm.account.first = response.name.first;\n vm.account.last = response.name.last;\n vm.account.timeCreated = response.timeCreated;\n }\n });\n }\n\n function updateAccountDetails() {\n\n $log.debug('account.edit-updateAccountDetails:', vm.account);\n\n vm.account.first = $filter('capitalize')(vm.account.first);\n vm.account.last = $filter('capitalize')(vm.account.last);\n\n accountService.updateById(vm.account)\n .then(function(response) {\n\n if (!response.message) {\n\n // post success\n $log.debug(\"account.edit.controller-success:\", response);\n\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Account Successfully Updated.\");\n\n // push new row to table\n //vm.accounts.push(response);\n $timeout(function() {\n $state.reload();\n });\n\n }\n else {\n\n // post error\n $log.debug(\"account.edit.controller-error:\", response);\n flashService.error(\"Failed to update account.\");\n }\n });\n }\n\n function deleteAccount() {\n accountService.deleteById(vm.account).then(function(response) {\n panelService.hide();\n Notification.success(\"Account Successfully Deleted.\");\n\n $timeout(function() {\n $state.reload();\n });\n });\n }\n\n function inviteClicked() {\n if(vm.inviteWasClicked) return;\n\n if(vm.inviteEmail != null && vm.inviteEmail !== \"\") {\n var account = {\n id: vm.account.id,\n email: vm.inviteEmail\n };\n\n vm.isFileTableLoading = true;\n\n accountService.invite(account).then(function(response) {\n vm.isFileTableLoading = false;\n if (response.error) {\n if(response.statusCode === 409) {\n Notification.warning(response.message);\n vm.inviteSent = true;\n } else {\n Notification.error(\"Failed to send invitation.\");\n }\n } else {\n Notification.success(\"Invitation sent!\");\n vm.inviteSent = true;\n }\n });\n }\n }\n\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.account')\n .controller('AccountAddController', AccountAddController);\n\n function AccountAddController($log, $scope, $state, $timeout, $rootScope, $filter, accountService, formsService, panelService, flashService, Notification) {\n var vm = this;\n\n vm.accounts = [];\n vm.addAccount = addAccount;\n vm.user = {};\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // ADD\n //////////////////////\n function addAccount() {\n\n //vm.user.name = $filter('capitalize:true')(vm.user.name);\n\n accountService.create(vm.user)\n .then(function(response) {\n\n if (!response.message) {\n\n // post success\n $log.debug(\"accountAdd.controller-success:\", response);\n\n // close panel and go back to previous screen\n panelService.hide();\n Notification.success(\"Account Successfully Added!\");\n\n // push new row to table\n //vm.accounts.push(response);\n $timeout(function() {\n $state.reload();\n });\n }\n else {\n\n // post error\n $log.debug(\"accountAdd.controller-error:\", response);\n flashService.error(\"You must enter a name.\");\n }\n \n });\n }\n\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.utility', []);\n\n})();\n\n// Based loosely around work by Witold Szczerba - https://github.com/witoldsz/angular-http-auth\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.utility')\n .factory('utcDateHelperService', utcDateHelperService);\n\n function utcDateHelperService() {\n var service = {};\n\n // service.getCurrentUtcDate = getCurrentUtcDate;\n service.isDatePast = isDatePast;\n\n return service;\n\n function getTimezoneMsOffset() {\n return new Date().getTimezoneOffset() * 60000;\n }\n \n function utcToLocalDate(date) {\n return date.getTime() - getTimezoneMsOffset();\n }\n\n function localDateToUtc(date) {\n return date.getTime() + getTimezoneMsOffset();\n }\n\n function isDatePast(date) {\n // if we want to show & validate UTC on the admin side\n // var nowDate = localDateToUtc(new Date());\n var nowDate = Date.now();\n var dateToCompare = new Date(date).getTime();\n return dateToCompare < nowDate;\n }\n\n function getCurrentUtcDate() {\n var nowDate = new Date();\n var month = nowDate.getUTCMonth() + 1;\n var day = nowDate.getUTCDate();\n var year = nowDate.getUTCFullYear();\n return year + '-' + month + '-' + day;\n }\n }\n\n\n})();\n\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.utility')\n .factory('metaTagsHelperService', metaTagsHelperService);\n\n function metaTagsHelperService() {\n return {\n mapToModel: mapToModel,\n getMetaViewModel: getMetaViewModel,\n };\n\n function mapToModel(item) {\n var meta = {\n title: item.metaTitle,\n slug: validateSlug(item.metaSlug),\n description: item.metaDescription,\n };\n var itemCopy = angular.extend({}, item);\n delete itemCopy.metaTitle;\n delete itemCopy.metaSlug;\n delete itemCopy.metaDescription;\n \n return angular.extend({}, itemCopy, { meta: meta });\n }\n\n function getMetaViewModel(item) {\n return item.meta ? {\n metaTitle: item.meta.title,\n metaSlug: item.meta.slug,\n metaDescription: item.meta.description,\n } : {};\n }\n\n function validateSlug(slug) {\n if (!slug) return '';\n var lowercased = slug.trim().toLowerCase();\n return encodeURI(lowercased.replace(' ', '-'));\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.utility')\n .factory('formsService', formsService);\n\n function formsService($log) {\n var form = {};\n\n function isCtrlDefined(callback) {\n return function() {\n var ctrl = arguments[0];\n if (typeof ctrl === 'undefined') {\n return false;\n }\n return callback.apply(callback, arguments);\n }\n }\n\n form.hasError = isCtrlDefined(function(ngModelCtrl) {\n return ngModelCtrl.$dirty && ngModelCtrl.$invalid;\n });\n form.showError = isCtrlDefined(function(ngModelCtrl, err) {\n return ngModelCtrl.$dirty && ngModelCtrl.$error[err];\n });\n form.canSave = isCtrlDefined(function(ngFormCtrl) {\n return ngFormCtrl.$dirty && ngFormCtrl.$valid;\n });\n\n return form;\n }\n\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.utility')\n .factory('flashService', flashService);\n\n function flashService($log, $rootScope) {\n\n var service = {};\n\n service.success = success;\n service.error = error;\n service.info = info;\n service.warning = warning;\n\n initService();\n\n return service;\n\n function initService() {\n \n $rootScope.$on('$stateChangeStart', function () {\n //$log.debug(\"clearFlashMessage\");\n clearFlashMessage();\n });\n\n function clearFlashMessage() {\n var flash = $rootScope.flash;\n if (flash) {\n if (!flash.keepAfterLocationChange) {\n delete $rootScope.flash;\n } else {\n // only keep for a single location change\n flash.keepAfterLocationChange = false;\n }\n }\n }\n }\n\n\n function success(message, keepAfterLocationChange) {\n\n $rootScope.isDataLoading = false;\n\n $rootScope.flash = {\n message: message,\n type: 'success',\n keepAfterLocationChange: keepAfterLocationChange\n };\n }\n\n function error(message, keepAfterLocationChange) {\n\n $rootScope.isDataLoading = false;\n\n $rootScope.flash = {\n message: message,\n type: 'danger',\n keepAfterLocationChange: keepAfterLocationChange\n };\n }\n\n function info(message, keepAfterLocationChange) {\n\n $rootScope.isDataLoading = false;\n\n $rootScope.flash = {\n message: message,\n type: 'info',\n keepAfterLocationChange: keepAfterLocationChange\n };\n }\n\n function warning(message, keepAfterLocationChange) {\n\n $rootScope.isDataLoading = false;\n\n $rootScope.flash = {\n message: message,\n type: 'warning',\n keepAfterLocationChange: keepAfterLocationChange\n };\n }\n }\n\n})();\n\n// This Service is used for Global Event Broadcasting\n(function() {\n 'use strict';\n\n angular\n .module('app.services.utility')\n .factory('errorResponseService', errorResponseService);\n\n function errorResponseService() {\n var service = {};\n\n service.getErrorMessage = getErrorMessage;\n\n return service;\n\n function parseMessage(response) {\n var extracted = /\\[(.*?)\\]/.exec(response.message);\n if (!extracted || !extracted[1]) {\n return response.message;\n }\n var message = extracted[1].replace(/\"/g, '');\n return message.charAt(0).toUpperCase() + message.slice(1);\n }\n\n function prettifyFieldName(message) {\n var spacePos = message.indexOf(' ');\n if (spacePos === -1) {\n return message;\n }\n var fieldName = message.substr(0, spacePos);\n var prettyFieldName = fieldName.match(/[A-Z][a-z]+/g).join(\" \");\n return prettyFieldName + message.substr(spacePos);\n }\n\n function getErrorMessage(response, defaultMessage) {\n if (!response.validation) {\n // unrecognized, no-validation error\n return defaultMessage;\n }\n return prettifyFieldName(parseMessage(response));\n }\n }\n\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.utility')\n .factory('apiHelperService', apiHelperService);\n\n function apiHelperService($log, $http) {\n\n return {\n sendHTTPRequest: sendHTTPRequest\n };\n\n function sendHTTPRequest(req) {\n\n //$log.debug(\"apiHelperService: sendHTTPRequest()\");\n\n return $http(req).then(function(response) {\n // success\n //$log.debug(\"apiHelperService-success\", response);\n return response.data;\n\n }, function(error) {\n // error\n $log.error(\"apiHelperService-error:\", error.status + \": \" + error.statusText);\n return error.data;\n });\n };\n\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.utility')\n .factory('panelService', panelService);\n\n function panelService($aside, $state, $stateParams, $log, $q, REDIRECT) {\n\n return {\n show: show,\n hide: hide\n }\n\n var aside = null;\n\n /////////////////////////\n // SHOW PANEL (ASIDE)\n /////////////////////////\n function show(template, controller) {\n\n //$log.debug(\"panel.service: show\");\n\n aside = $aside({\n templateUrl: template,\n controller: controller,\n controllerAs: 'vm',\n container: 'body',\n placement: 'right',\n keyboard: true,\n animation: 'am-slide-right',\n show: false,\n onHide: function() {\n hide();\n }\n });\n\n return aside.$promise.then(aside.show); \n \n }\n\n /////////////////////////\n // CLOSE PANEL (ASIDE)\n /////////////////////////\n function hide() {\n \n if (aside) {\n //$log.debug(\"panel.service: hide\");\n //aside = null;\n //aside.$promise.then(aside.destroy);\n aside.destroy();\n $state.go($state.current.parent);\n }\n\n \n \n } \n \n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.highlight', []);\n\n})();\n\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.highlight')\n .factory('highlightService', highlightService);\n\n function highlightService($log, API, apiHelperService) {\n return {\n // GET\n getAll: getAll,\n getByIdOrIndex: getByIdOrIndex,\n\n // UPDATE\n updateByIndex: updateByIndex,\n updateById: updateById,\n\n // DELETE\n deleteById: deleteById,\n deleteByIndex: deleteByIndex,\n };\n\n //////////////////////\n // GET\n //////////////////////\n function getAll(limit, page, sort) {\n\n $log.debug(\"highlight-data: getAll()\");\n\n var req = {\n method: 'GET',\n url: API.HIGHLIGHTS,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getByIdOrIndex(idOrIndex) {\n var req = {\n method: 'GET',\n url: API.HIGHLIGHTS + '/' + idOrIndex\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n //////////////////////\n // PUT\n //////////////////////\n\n function updateById(highlight) {\n\n $log.debug('updateById-highlight:', highlight);\n\n var req = {\n method: 'PUT',\n url: API.HIGHLIGHTS +'/'+ highlight._id,\n data: highlight\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function updateByIndex(highlight) {\n\n $log.debug('updateById-highlight:', highlight);\n\n var req = {\n method: 'PUT',\n url: API.HIGHLIGHTS +'/'+ highlight.index,\n data: highlight\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n //////////////////////\n // DELETE\n //////////////////////\n function deleteById(highlight) {\n\n var req = {\n method: 'DELETE',\n url: API.HIGHLIGHTS +'/'+ highlight._id\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function deleteByIndex(highlight) {\n\n var req = {\n method: 'DELETE',\n url: API.HIGHLIGHTS +'/'+ highlight.index\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n }\n\n})();\n\n/*\n ** Factory for CRUDing API.HIGHLIGHTS\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.auth', []);\n\n})();\n\n// Based loosely around work by Witold Szczerba - https://github.com/witoldsz/angular-http-auth\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.auth')\n .factory('authService', authService);\n\n function authService($log, $timeout, $q, $http, $state, localStorageService, Notification, Session, API, REDIRECT, apiHelperService) {\n\n return {\n login: login,\n loginForgot: loginForgot,\n loginReset: loginReset,\n logout: logout,\n signup: signup,\n getSession: getSession,\n isAuthenticated: isAuthenticated,\n isAuthorized: isAuthorized,\n getInvitation: getInvitation,\n isAdmin: isAdmin,\n getRole: getRole\n };\n\n //////////////////////\n // LOGIN\n //////////////////////\n function login(user, callback) {\n\n return $http.post(API.LOGIN, {\n username: user.username,\n password: user.password\n })\n .success(function(response) {\n\n // login successful if there's a token in the response\n if (response.session) {\n // success\n $log.debug('login.service-success:', response);\n\n // create session\n Session.create(response);\n }\n else {\n // failure call back\n $log.error('login.service-error:', response.message);\n }\n });\n\n }\n\n //////////////////////\n // LOGIN FORGOT\n //////////////////////\n function loginForgot(email) {\n\n return $http.post(API.LOGIN_FORGOT, { email: email })\n .then(function(response) {\n $log.debug('auth.service.loginForgot-success:\\n', response);\n return response;\n })\n .catch(function(error) {\n $log.error('auth.service.loginForgot-error:\\n', error);\n throw error;\n });\n }\n\n //////////////////////\n // LOGIN RESET\n //////////////////////\n function loginReset(data) {\n\n return $http.post(API.LOGIN_RESET, data)\n .then(function(response) {\n $log.debug('auth.service.loginReset-success:\\n', response);\n return response;\n })\n .catch(function(error) {\n $log.error('auth.service.loginReset-error:\\n', error);\n throw error;\n });\n }\n\n //////////////////////\n // LOGOUT\n //////////////////////\n function logout() {\n\n // log user out if they exist in localstorage\n if (localStorageService.get('session')) {\n\n //$log.debug(\"localStorageService.get(session)\", localStorageService.get(\"session\"));\n\n return $http.delete(API.LOGOUT)\n .then(function(response) {\n\n // call singleton to wipe session\n Session.destroy();\n // direct call to null token so user is unAuthenticated\n // to pass route resolve on login route\n Session.token=null;\n\n // messaging\n $log.debug('logout.service-success:', response);\n Notification.success(\"You've successfully logged out.\");\n\n // redirect\n $state.go(REDIRECT.LOGIN);\n\n }, function(error) {\n // failure\n $log.error('logout.service-error:', error);\n\n // call singleton to wipe session\n Session.destroy();\n // direct call to null token so user is unAuthenticated\n // to pass route resolve on login route\n Session.token=null;\n\n // redirect\n $state.go(REDIRECT.LOGIN);\n });\n }\n else {\n $log.debug(\"auth.service-logout: No session exists.\");\n // redirect\n $state.go(REDIRECT.LOGIN);\n }\n }\n\n //////////////////////\n // SIGNUP\n //////////////////////\n function signup(data, invitationToken) {\n data.invitationToken = invitationToken;\n\n return $http.post(API.SIGNUP, data)\n .success(function(response) {\n\n if (response.session) {\n // success\n //$log.debug('signup.service-success:', response);\n\n // create session\n Session.create(response);\n\n // go to main page\n $state.go(REDIRECT.ADMIN);\n\n }\n else {\n // failure call back\n $log.error('signup.service-error:', response.message);\n }\n });\n\n }\n\n function getInvitation(token) {\n var req = {\n method: 'GET',\n url: API.SIGNUP_INVITATION + '/' + token,\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n var deferredCurrentUser;\n\n /////////////////////////////\n // GET EXISTING SESSION\n /////////////////////////////\n function getSession() {\n\n //$log.debug(\"auth.service: getSession-check for session\");\n //$log.debug('localStorageService.get(session):', localStorageService.get('session'));\n\n // get user from localstorage\n if (localStorageService.get('session')) {\n\n $log.debug(\"auth.service: getSession-session exists\");\n\n // update session with local storage\n Session.update();\n //$log.debug(\"auth.service: getSession-updated session\");\n }\n else {\n $log.debug(\"auth.service: getSession-NO session exists\");\n // go to main page\n //$state.go(REDIRECT.LOGIN);\n }\n }\n\n //////////////////////\n // isAUTHENTICATED\n //////////////////////\n function isAuthenticated() {\n //$log.debug(\"auth.service-isAuthenticated-Session.token:\", Session.token);\n return !!Session.token;\n }\n\n function isAdmin() {\n return isAuthorized('admin');\n }\n\n //////////////////////\n // isAUTHORIZED\n //////////////////////\n\n // pass role name to check against allowed from backend\n function isAuthorized(authorizedRoles) {\n if (!angular.isArray(authorizedRoles)) {\n // converts if no brackets around role name in the route\n authorizedRoles = [authorizedRoles];\n }\n\n // if user is authed with session, convert roles object to array to be searched\n var userRoles = Session.userRole ? Object.keys(Session.userRole) : ''; // ES6 - works only in modern browsers\n\n // compare the two role sets to see if we allow access to the route\n var foundRole = authorizedRoles.some(function(roles) { return userRoles.indexOf(roles) != -1; });\n\n //$log.debug(\"isAuthorized-Session.userRole:\", Session.userRole);\n //$log.debug(\"isAuthorized-isAuthenticated:\", isAuthenticated());\n //$log.debug(\"isAuthorized-authorizedRoles:\", authorizedRoles);\n //$log.debug(\"isAuthorized-userRoles:\", userRoles);\n //$log.debug(\"isAuthorized-foundRole?\", foundRole);\n\n return (isAuthenticated() && foundRole);\n }\n\n function getRole(roleName) {\n return Session.userRole[roleName];\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.auth')\n .factory('Session', Session);\n\n function Session($log, $http, localStorageService) {\n\n var session = {\n create: create,\n update: update,\n destroy: destroy,\n }\n \n function create(obj) { \n\n\n // add jwt token to auth header for all requests made by the $http service\n $http.defaults.headers.common.Authorization = 'Bearer ' + obj.id_token;\n\n // FUTURE: determine jwt expire time\n // var hoursToExpireTokenIn = 4;\n // var tokenExpiry = new Date(obj.time);\n // tokenExpiry.setHours(tokenExpiry.getHours() + hoursToExpireTokenIn);\n\n // save vars to keep user logged in between page refreshes\n localStorageService.set('session', {\n id: obj.session._id,\n expiresAt: obj.session.time,\n key: obj.session.key,\n userId: obj.session.userId,\n userEmail: obj.user.email,\n userName: obj.user.username,\n userRole: obj.user.roles,\n token: obj.id_token\n });\n\n // set vars for session\n session.id = obj.session._id;\n session.expiresAt = obj.session.time;\n session.key = obj.session.key;\n session.userId = obj.session.userId;\n session.userEmail = obj.user.email;\n session.userName = obj.user.username;\n session.userRole = obj.user.roles;\n session.token = obj.id_token;\n\n //$log.debug(\"Session.$http.defaults.headers.common.Authorization:\", $http.defaults.headers.common.Authorization); \n //$log.debug(\"Session.session:\", session);\n\n };\n\n function update() { \n // add jwt token to auth header for all requests made by the $http service\n $http.defaults.headers.common.Authorization = 'Bearer ' + localStorageService.get('session').token;\n //$log.debug('auth-session-token:', token);\n\n // set vars for session on page refresh\n session.id = localStorageService.get('session').id;\n session.expiresAt = localStorageService.get('session').expiresAt;\n session.key = localStorageService.get('session').key;\n session.userId = localStorageService.get('session').userId;\n session.userEmail = localStorageService.get('session').userEmail;\n session.userName = localStorageService.get('session').userName;\n session.userRole = localStorageService.get('session').userRole;\n session.token = localStorageService.get('session').token;\n\n }\n\n function destroy() {\n\n $log.debug('Session.destroy: clearing localstorage');\n // remove jwt token from header\n $http.defaults.headers.common.Authorization='';\n // remove user from local storage and clear http auth header\n localStorageService.remove('session');\n // unset session vars\n var session={};\n };\n\n return session;\n\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.auth')\n .factory('authSecurityService', authSecurityService);\n\n function authSecurityService($log, $timeout, $state, $q, $rootScope, authService, loginModalService, Notification, REDIRECT) {\n\n return {\n requireAdminUser: requireAdminUser,\n requireAuthenticatedUser: requireAuthenticatedUser,\n requireUnauthenticatedUser: requireUnauthenticatedUser\n //requireVerifiedUser: requireVerifiedUser,\n //requireUnverifiedUser: requireUnverifiedUser\n }\n\n var redirect;\n\n\n /////////////////////////////\n // SECURITY: ADMIN\n /////////////////////////////\n function requireAdminUser() {\n //$log.debug(\"auth.security: requireAdminUser\");\n\n var defer = $q.defer();\n var authorizedRoles = ['admin', 'account'];\n\n // check if user has admin role\n if (authService.isAuthorized(authorizedRoles)) {\n\n // user is authenticated and has the correct role - let them pass\n $log.debug(\"auth.security: requireAdminUser: user has admin role-resolve\");\n // $timeout(function() {\n // $state.go(REDIRECT.ADMIN);\n // });\n\n defer.resolve();\n }\n else if (authService.isAuthenticated()) {\n // user is authenticated and does not have the admin role - redirect home\n $log.debug(\"auth.security: requireAdminUser: user DOES NOT HAVE admin role-reject\");\n Notification.warning({message: \"You don't have permission to access this area.\", title: \"Not Authorized\"});\n\n // must be wrapped with timeout for async or will hang\n $timeout(function() {\n authService.logout();\n $state.go(REDIRECT.LOGIN);\n });\n defer.reject();\n }\n else {\n $log.debug(\"auth.security: requireAdminUser: user is NOT AUTHED and DOES NOT HAVE admin role-reject\");\n // user is not authenticated (therefore doesnt have a role)\n\n // must be wrapped with timeout for async or will hang\n $timeout(function() {\n $log.debug(\"auth.security: ATTEMPTING REDIRECT TO LOGIN\");\n\n $state.go(REDIRECT.LOGIN);\n });\n\n //loginModalService.show();\n defer.reject();\n }\n\n return defer.promise;\n }\n\n //////////////////////////////////\n // SECURITY: AUTHENTICATED\n //////////////////////////////////\n function requireAuthenticatedUser() {\n //$log.debug(\"auth.security: requireAuthenticatedUser\");\n\n var defer = $q.defer();\n\n // check if user is authenticated\n if (authService.isAuthenticated()) {\n\n // user is authenticated and does not have the admin role - redirect home\n $log.debug(\"auth.security: requireAuthenticatedUser: user is authenitcated-resolve\");\n defer.resolve();\n }\n else {\n $log.debug(\"auth.security: requireAuthenticatedUser: user not authenitcated-pop modal\");\n loginModalService.show();\n defer.reject();\n }\n return defer.promise;\n }\n\n //////////////////////////////////\n // SECURITY: UNAUTHENTICATED\n //////////////////////////////////\n function requireUnauthenticatedUser() {\n //$log.debug(\"auth.security: requireUnauthenticatedUser\");\n\n var defer = $q.defer();\n\n if (authService.isAuthenticated()) {\n // user is authenticated - dont let them access the requested page - redirect\n $log.debug(\"auth.security: requireUnauthenticatedUser-redirect\");\n Notification.warning({message: \"You're Authenticated.\", title: \"Access Denied\"});\n\n // must be wrapped with timeout for async or will hang\n $timeout(function() {\n $state.go(REDIRECT.ADMIN);\n });\n defer.reject();\n }\n else {\n $log.debug(\"auth.security: requireUnauthenticatedUser-resolve\", $state);\n\n defer.resolve();\n }\n return defer.promise;\n }\n\n\n /** FUTURE FOR EMAIL / SIGNUP VERIFICATION\n\n /////////////////////////////\n // SECURITY: VERIFIED\n /////////////////////////////\n function requireVerifiedUser() {\n $log.debug(\"auth.security: requireVerifiedUser\");\n return {\n resolve: function() {\n var deferred = $q.defer();\n var unwatch = $rootScope.$watch('currentUser', function(currentUser) {\n if (angular.isDefined(currentUser)) {\n if (currentUser) {\n deferred.resolve(currentUser);\n }\n else {\n deferred.reject();\n $state.go('user-login');\n }\n unwatch();\n }\n });\n return deferred.promise;\n }\n }\n }\n\n /////////////////////////////\n // SECURITY: UNVERIFIED\n /////////////////////////////\n function requireUnverifiedUser() {\n $log.debug(\"auth.security: requireUnverifiedUser\");\n return {\n resolve: function() {\n var deferred = $q.defer();\n var unwatch = $rootScope.$watch('currentUser', function(currentUser) {\n if (angular.isDefined(currentUser)) {\n if (currentUser) {\n deferred.resolve(currentUser);\n }\n else {\n deferred.reject();\n $state.go('user-login');\n }\n unwatch();\n }\n });\n return deferred.promise;\n }\n }\n }\n **/\n\n }\n\n\n\n})();\n\n// This service provides guard methods to support AngularJS routes.\n// You can add them as resolves to routes to require authorization levels before allowing a route change to complete\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services.auth')\n .factory('authInterceptorService', authInterceptorService);\n\n function authInterceptorService($rootScope, $q, $log, $injector) {\n\n return {\n responseError: responseError\n };\n\n function responseError(response) {\n \n // 401 UNAUTHORIZED CAUGHT - No Valid Auth Credentials OR Session expired\n if (response.status === 401) {\n $log.debug(\"authInterceptor.service: 401: response:\", response);\n\n // Open modal for 401s\n // var loginModalService = $injector.get('loginModalService');\n // loginModalService.show();\n\n // We now redirect to login page for 401s\n var stateService = $injector.get('$state');\n var authService = $injector.get('authService');\n \n authService.logout();\n stateService.go(REDIRECT.LOGIN);\n }\n\n /* If not a 401, do nothing with this error.\n * This is necessary to make a `responseError`\n * interceptor a no-op. */\n return $q.reject(response);\n }\n };\n\n})();\n\n// This http interceptor listens for 401 authentication failures\n// Based loosely around work by Witold Szczerba - https://github.com/witoldsz/angular-http-auth\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.user')\n .factory('userService', userService);\n\n function userService($log, API, apiHelperService) {\n\n var users = {};\n\n return {\n\n // GET\n getAll: getAll,\n getAllNotPaged: getAllNotPaged,\n getMy: getMy,\n getById: getById,\n getByUsername: getByUsername,\n searchByUsername: searchByUsername,\n\n // CREATE\n create: create,\n createNotesById: createNotesById,\n createStatusById: createStatusById,\n\n // UPDATE\n updateMy: updateMy,\n updateMyPassword: updateMyPassword,\n updateById: updateById,\n updateUsernameLinkById: updateUsernameLinkById,\n\n // DELETE\n deleteById: deleteById,\n deleteUsernameLinkById: deleteUsernameLinkById,\n\n // CACHE\n updateCache: updateCache,\n getCachedById: getCachedById\n };\n\n\n\n //////////////////////\n // GET\n //////////////////////\n function getAll(limit, page, sort) {\n\n $log.debug(\"user-data: getAll()\");\n\n var req = {\n method: 'GET',\n url: API.USERS,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getAllNotPaged() {\n\n $log.debug(\"user-data: getAllNotPaged()\");\n\n var req = {\n method: 'GET',\n url: API.USERS + '/all'\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getMy() {\n\n var req = {\n method: 'GET',\n url: API.USERS +'/my',\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n function getById(id) {\n\n var req = {\n method: 'GET',\n url: API.USERS + '/'+id,\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n function getByUsername(username) {\n\n var req = {\n method: 'GET',\n url: API.USERS + '/'+username +'/profile',\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n function searchByUsername(username) {\n\n var req = {\n method: 'GET',\n url: API.USERS + '/'+username +'/search',\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n //////////////////////\n // POST\n //////////////////////\n function create(user) {\n\n var req = {\n method: 'POST',\n url: API.USERS,\n data: user\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function createNotesById(user) {\n\n var req = {\n method: 'POST',\n url: API.USERS +'/'+ user.id +'/notes',\n data: user.notes\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function createStatusById(user) {\n\n var req = {\n method: 'POST',\n url: API.USERS +'/'+ user.id +'/status',\n data: user.status\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // PUT\n //////////////////////\n function updateMy(user) {\n\n var req = {\n method: 'PUT',\n url: API.USERS +'/my',\n data: {\n username: user.username,\n email: user.email\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function updateMyPassword(password) {\n\n var req = {\n method: 'PUT',\n url: API.USERS +'/my/password',\n data: {\n password: password\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function updateById(user) {\n\n $log.debug('updateById-user:', user);\n\n var req = {\n method: 'PUT',\n url: API.USERS +'/'+ user.id,\n data: {\n name: {\n first: user.first,\n last: user.last\n }\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function updateUsernameLinkById(user) {\n\n var req = {\n method: 'PUT',\n url: API.USERS +'/'+ user.id +'/user',\n data: user.username\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n //////////////////////\n // DELETE\n //////////////////////\n function deleteById(user) {\n\n var req = {\n method: 'DELETE',\n url: API.USERS +'/'+ user.id\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function deleteUsernameLinkById(user) {\n\n var req = {\n method: 'DELETE',\n url: API.USERS +'/'+ user.id +'/user'\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // CACHE\n //////////////////////\n function updateCache(limit, page, sort) {\n var req = {\n method: 'GET',\n url: API.USERS,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req).then(function(result) {\n\n result.data.forEach(function(u) {\n users[u._id] = u;\n });\n return result;\n });\n }\n\n function getCachedById(id) {\n return users[id];\n }\n }\n\n})();\n\n/*\n ** Factory for CRUDing API.USERS\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.teamMember')\n .factory('teamMemberService', teamMemberService);\n\n function teamMemberService($log, API, apiHelperService) {\n return {\n // GET\n getAll: getAll,\n getById: getById,\n\n // CREATE\n create: create,\n\n // UPDATE\n updateById: updateById,\n\n // DELETE\n deleteById: deleteById,\n };\n\n //////////////////////\n // GET\n //////////////////////\n function getAll(limit, page, sort) {\n\n $log.debug(\"teamMember-data: getAll()\");\n\n var req = {\n method: 'GET',\n url: API.TEAM,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getById(id) {\n var req = {\n method: 'GET',\n url: API.TEAM + '/' + id,\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n //////////////////////\n // POST\n //////////////////////\n function create(teamMember) {\n\n var req = {\n method: 'POST',\n url: API.TEAM,\n data: teamMember\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // PUT\n //////////////////////\n\n function updateById(teamMember) {\n\n $log.debug('updateById-teamMember:', teamMember);\n\n var req = {\n method: 'PUT',\n url: API.TEAM +'/'+ teamMember._id,\n data: teamMember\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n //////////////////////\n // DELETE\n //////////////////////\n function deleteById(teamMember) {\n\n var req = {\n method: 'DELETE',\n url: API.TEAM +'/'+ teamMember._id\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n }\n\n})();\n\n/*\n ** Factory for CRUDing API.TEAM\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.teamMember')\n .config(eventRouteConfig);\n\n function eventRouteConfig($stateProvider, $urlRouterProvider) {\n\n $stateProvider\n\n //////////////////////\n // NEWS\n //////////////////////\n .state('admin.teamMember', {\n parent: 'admin',\n url: \"/team\",\n templateUrl: \"app/admin/sections/team-member/team-member.view.html\",\n controller: 'TeamMemberController',\n controllerAs: 'vm',\n ncyBreadcrumb: {\n label: 'Team Member'\n }\n })\n\n //////////////////////\n // PANELS\n //////////////////////\n\n .state('teamMember-add', {\n parent: 'admin.teamMember',\n url: '/add',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/team-member/team-member-add-edit/team-member-add-edit.view.html',\n 'TeamMemberAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n }\n })\n\n .state('teamMember-edit', {\n parent: 'admin.teamMember',\n url: '/:id',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/team-member/team-member-add-edit/team-member-add-edit.view.html',\n 'TeamMemberAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n },\n })\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.teamMember')\n .controller('TeamMemberController', TeamMemberController);\n\n function TeamMemberController($log, $scope, $state, $timeout, $rootScope, teamMemberService, formsService, panelService, flashService, Notification) {\n var vm = this;\n\n vm.teamMembers = [];\n vm.getTeamMembers = getTeamMembers;\n vm.user = {};\n\n vm.itemsByPage = 10;\n var limit='';\n var page='';\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // GET\n //////////////////////\n function getTeamMembers(tableState) {\n\n vm.isTableLoading = true;\n\n var pagination = tableState.pagination;\n var selectedPage = pagination.start+1;\n //var sort = tableState.sort.predicate;\n var sort = '-startDate'; // sort newest first\n //$log.debug('tableState', tableState);\n //$log.debug('PAGINATION', pagination);\n\n //var sort = \"\";\n limit = vm.itemsByPage; // Number of entries showed per page.\n page = selectedPage || 1; // Current Page\n\n // get all teamMembers\n teamMemberService.getAll(limit, page, sort).then(function(response) {\n if (response.data) {\n //$log.debug('RESPONSE', response);\n\n vm.teamMembers = response.data;\n limit = response.items.limit;\n page = response.pages.total;\n tableState.pagination.numberOfPages = response.pages.total;\n\n vm.isTableLoading = false;\n }\n });\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.statuses', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.pressRelease')\n .factory('pressReleaseService', pressReleaseService);\n\n function pressReleaseService($log, API, apiHelperService, metaTagsHelperService) {\n return {\n // GET\n getAll: getAll,\n getById: getById,\n\n // CREATE\n create: create,\n\n // UPDATE\n updateById: updateById,\n\n // DELETE\n deleteById: deleteById,\n };\n\n //////////////////////\n // GET\n //////////////////////\n function getAll(limit, page, sort) {\n\n $log.debug(\"pressRelease-data: getAll()\");\n\n var req = {\n method: 'GET',\n url: API.PRESS,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getById(id) {\n var req = {\n method: 'GET',\n url: API.PRESS + '/' + id,\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n //////////////////////\n // POST\n //////////////////////\n function create(pressRelease) {\n var press = metaTagsHelperService.mapToModel(pressRelease);\n var req = {\n method: 'POST',\n url: API.PRESS,\n data: press\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // PUT\n //////////////////////\n\n function updateById(pressRelease) {\n\n $log.debug('updateById-pressRelease:', pressRelease);\n var press = metaTagsHelperService.mapToModel(pressRelease);\n var req = {\n method: 'PUT',\n url: API.PRESS +'/'+ pressRelease._id,\n data: {\n title: pressRelease.title,\n body: pressRelease.body,\n date: pressRelease.date,\n contactInfo: pressRelease.contactInfo,\n pdfUrl: pressRelease.pdfUrl,\n releaseDate: pressRelease.releaseDate,\n meta: press.meta,\n //signatureUrl: pressRelease.signatureUrl,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n //////////////////////\n // DELETE\n //////////////////////\n function deleteById(pressRelease) {\n\n var req = {\n method: 'DELETE',\n url: API.PRESS +'/'+ pressRelease._id\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n }\n\n})();\n\n/*\n ** Factory for CRUDing API.PRESS\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.pressRelease')\n .config(pressReleaseRouteConfig);\n\n function pressReleaseRouteConfig($stateProvider, $urlRouterProvider) {\n\n $stateProvider\n\n //////////////////////\n // NEWS\n //////////////////////\n .state('admin.pressRelease', {\n parent: 'admin',\n url: \"/press\",\n templateUrl: \"app/admin/sections/press-release/press-release.view.html\",\n controller: 'PressReleaseController',\n controllerAs: 'vm',\n ncyBreadcrumb: {\n label: 'Press Releases'\n }\n })\n\n //////////////////////\n // PANELS\n //////////////////////\n\n .state('pressRelease-add', {\n parent: 'admin.pressRelease',\n url: '/add',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/press-release/press-release-add-edit/press-release-add-edit.view.html',\n 'PressReleaseAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n }\n })\n\n .state('pressRelease-edit', {\n parent: 'admin.pressRelease',\n url: '/:id',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/press-release/press-release-add-edit/press-release-add-edit.view.html',\n 'PressReleaseAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n },\n })\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.pressRelease')\n .controller('PressReleaseController', PressReleaseController);\n\n function PressReleaseController($log, $scope, $state, $timeout, $rootScope, pressReleaseService, formsService, panelService, flashService, Notification) {\n var vm = this;\n\n vm.pressReleases = [];\n vm.getPressReleases = getPressReleases;\n vm.user = {};\n\n vm.itemsByPage = 10;\n var limit='';\n var page='';\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // GET\n //////////////////////\n function getPressReleases(tableState) {\n\n vm.isTableLoading = true;\n\n var pagination = tableState.pagination;\n var selectedPage = pagination.start+1;\n //var sort = tableState.sort.predicate;\n var sort = '-date'; // sort newest first\n //$log.debug('tableState', tableState);\n //$log.debug('PAGINATION', pagination);\n\n //var sort = \"\";\n limit = vm.itemsByPage; // Number of entries showed per page.\n page = selectedPage || 1; // Current Page\n\n // get all pressReleases\n pressReleaseService.getAll(limit, page, sort).then(function(response) {\n\n if (response.data) {\n //$log.debug('RESPONSE', response);\n\n vm.pressReleases = response.data;\n limit = response.items.limit;\n page = response.pages.total;\n tableState.pagination.numberOfPages = response.pages.total;\n\n vm.isTableLoading = false;\n }\n });\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.newsItem')\n .factory('newsItemService', newsItemService);\n\n function newsItemService($log, API, apiHelperService) {\n return {\n // GET\n getAll: getAll,\n getById: getById,\n\n // CREATE\n create: create,\n\n // UPDATE\n updateById: updateById,\n\n // DELETE\n deleteById: deleteById,\n };\n\n //////////////////////\n // GET\n //////////////////////\n function getAll(limit, page, sort) {\n\n $log.debug(\"newsItem-data: getAll()\");\n\n var req = {\n method: 'GET',\n url: API.NEWS,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getById(id) {\n var req = {\n method: 'GET',\n url: API.NEWS + '/' + id,\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n //////////////////////\n // POST\n //////////////////////\n function create(newsItem) {\n\n var req = {\n method: 'POST',\n url: API.NEWS,\n data: newsItem\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // PUT\n //////////////////////\n\n function updateById(newsItem) {\n\n $log.debug('updateById-newsItem:', newsItem);\n\n var req = {\n method: 'PUT',\n url: API.NEWS +'/'+ newsItem._id,\n data: {\n title: newsItem.title,\n url: newsItem.url,\n date: newsItem.date,\n thumbnailUrl: newsItem.thumbnailUrl,\n releaseDate: newsItem.releaseDate,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n //////////////////////\n // DELETE\n //////////////////////\n function deleteById(newsItem) {\n\n var req = {\n method: 'DELETE',\n url: API.NEWS +'/'+ newsItem._id\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n }\n\n})();\n\n/*\n ** Factory for CRUDing API.NEWS\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.newsItem')\n .config(newsItemRouteConfig);\n\n function newsItemRouteConfig($stateProvider, $urlRouterProvider) {\n\n $stateProvider\n\n //////////////////////\n // NEWS\n //////////////////////\n .state('admin.newsItem', {\n parent: 'admin',\n url: \"/news\",\n templateUrl: \"app/admin/sections/news-item/news-item.view.html\",\n controller: 'NewsItemController',\n controllerAs: 'vm',\n ncyBreadcrumb: {\n label: 'News Items'\n }\n })\n\n //////////////////////\n // PANELS\n //////////////////////\n\n .state('newsItem-add', {\n parent: 'admin.newsItem',\n url: '/add',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/news-item/news-item-add-edit/news-item-add-edit.view.html',\n 'NewsItemAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n }\n })\n\n .state('newsItem-edit', {\n parent: 'admin.newsItem',\n url: '/:id',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/news-item/news-item-add-edit/news-item-add-edit.view.html',\n 'NewsItemAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n },\n })\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.newsItem')\n .controller('NewsItemController', NewsItemController);\n\n function NewsItemController($log, $scope, $state, $timeout, $rootScope, newsItemService, formsService, panelService, flashService, Notification) {\n var vm = this;\n\n vm.newsItems = [];\n vm.getNewsItems = getNewsItems;\n vm.user = {};\n\n vm.itemsByPage = 10;\n var limit='';\n var page='';\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // GET\n //////////////////////\n function getNewsItems(tableState) {\n\n vm.isTableLoading = true;\n\n var pagination = tableState.pagination;\n var selectedPage = pagination.start+1;\n //var sort = tableState.sort.predicate;\n var sort = '-date'; // sort newest first\n //$log.debug('tableState', tableState);\n //$log.debug('PAGINATION', pagination);\n\n //var sort = \"\";\n limit = vm.itemsByPage; // Number of entries showed per page.\n page = selectedPage || 1; // Current Page\n\n // get all newsItems\n newsItemService.getAll(limit, page, sort).then(function(response) {\n\n if (response.data) {\n //$log.debug('RESPONSE', response);\n\n vm.newsItems = response.data;\n limit = response.items.limit;\n page = response.pages.total;\n tableState.pagination.numberOfPages = response.pages.total;\n\n vm.isTableLoading = false;\n }\n });\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.leadership')\n .factory('leadershipService', leadershipService);\n\n function leadershipService($log, API, apiHelperService) {\n return {\n // GET\n getAll: getAll,\n getById: getById,\n\n // CREATE\n create: create,\n\n // UPDATE\n updateById: updateById,\n\n // DELETE\n deleteById: deleteById,\n };\n\n //////////////////////\n // GET\n //////////////////////\n function getAll(limit, page, sort) {\n\n $log.debug(\"leadership-data: getAll()\");\n\n var req = {\n method: 'GET',\n url: API.LEADERSHIP,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getById(id) {\n var req = {\n method: 'GET',\n url: API.LEADERSHIP + '/' + id,\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n //////////////////////\n // POST\n //////////////////////\n function create(leadership) {\n\n var req = {\n method: 'POST',\n url: API.LEADERSHIP,\n data: leadership\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // PUT\n //////////////////////\n\n function updateById(leadership) {\n\n $log.debug('updateById-leadership:', leadership);\n\n var req = {\n method: 'PUT',\n url: API.LEADERSHIP +'/'+ leadership._id,\n data: leadership\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n //////////////////////\n // DELETE\n //////////////////////\n function deleteById(leadership) {\n\n var req = {\n method: 'DELETE',\n url: API.LEADERSHIP +'/'+ leadership._id\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n }\n\n})();\n\n/*\n ** Factory for CRUDing API.LEADERSHIP\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.leadership')\n .config(eventRouteConfig);\n\n function eventRouteConfig($stateProvider, $urlRouterProvider) {\n\n $stateProvider\n\n //////////////////////\n // NEWS\n //////////////////////\n .state('admin.leadership', {\n parent: 'admin',\n url: \"/leadership\",\n templateUrl: \"app/admin/sections/leadership/leadership.view.html\",\n controller: 'LeadershipController',\n controllerAs: 'vm',\n ncyBreadcrumb: {\n label: 'Leadership'\n }\n })\n\n //////////////////////\n // PANELS\n //////////////////////\n\n .state('leadership-add', {\n parent: 'admin.leadership',\n url: '/add',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/leadership/leadership-add-edit/leadership-add-edit.view.html',\n 'LeadershipAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n }\n })\n\n .state('leadership-edit', {\n parent: 'admin.leadership',\n url: '/:id',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/leadership/leadership-add-edit/leadership-add-edit.view.html',\n 'LeadershipAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n },\n })\n }\n\n})();\n(function() {\n 'use strict';\n\n angular\n .module('admin.leadership')\n .controller('LeadershipController', LeadershipController);\n\n function LeadershipController($log, $scope, $state, $timeout, $rootScope, leadershipService, formsService, panelService, flashService, Notification) {\n var vm = this;\n\n vm.leaderships = [];\n vm.getLeaderships = getLeaderships;\n vm.user = {};\n\n vm.itemsByPage = 10;\n var limit='';\n var page='';\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // GET\n //////////////////////\n function getLeaderships(tableState) {\n vm.isTableLoading = true;\n\n var pagination = tableState.pagination;\n var selectedPage = pagination.start+1;\n //var sort = tableState.sort.predicate;\n var sort = '-startDate'; // sort newest first\n //$log.debug('tableState', tableState);\n //$log.debug('PAGINATION', pagination);\n\n //var sort = \"\";\n limit = vm.itemsByPage; // Number of entries showed per page.\n page = selectedPage || 1; // Current Page\n\n // get all leaderships\n leadershipService.getAll(limit, page, sort).then(function(response) {\n $log.debug(response);\n if (response.data) {\n //$log.debug('RESPONSE', response);\n\n vm.leaderships = response.data;\n limit = response.items.limit;\n page = response.pages.total;\n tableState.pagination.numberOfPages = response.pages.total;\n\n vm.isTableLoading = false;\n }\n });\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.event')\n .factory('eventService', eventService);\n\n function eventService($log, API, apiHelperService) {\n return {\n // GET\n getAll: getAll,\n getById: getById,\n\n // CREATE\n create: create,\n\n // UPDATE\n updateById: updateById,\n\n // DELETE\n deleteById: deleteById,\n };\n\n //////////////////////\n // GET\n //////////////////////\n function getAll(limit, page, sort) {\n\n $log.debug(\"event-data: getAll()\");\n\n var req = {\n method: 'GET',\n url: API.EVENTS,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getById(id) {\n var req = {\n method: 'GET',\n url: API.EVENTS + '/' + id,\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n //////////////////////\n // POST\n //////////////////////\n function create(ev) {\n var event = eventDateToUtc(ev);\n var req = {\n method: 'POST',\n url: API.EVENTS,\n data: event\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // PUT\n //////////////////////\n\n function updateById(ev) { \n var event = eventDateToUtc(ev);\n $log.debug('updateById-event:', event);\n\n var req = {\n method: 'PUT',\n url: API.EVENTS +'/'+ event._id,\n data: {\n title: event.title,\n url: event.url,\n startDate: event.startDate,\n endDate: event.endDate,\n thumbnailUrl: event.thumbnailUrl,\n location: event.location,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n //////////////////////\n // DELETE\n //////////////////////\n function deleteById(event) {\n\n var req = {\n method: 'DELETE',\n url: API.EVENTS +'/'+ event._id\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function eventDateToUtc(event) {\n var ev = angular.extend({}, event);\n ev.startDate = moment.utc(ev.startDate).toDate();\n ev.endDate = moment.utc(ev.endDate).toDate();\n return ev;\n }\n }\n\n})();\n\n/*\n ** Factory for CRUDing API.EVENTS\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.event')\n .config(eventRouteConfig);\n\n function eventRouteConfig($stateProvider, $urlRouterProvider) {\n\n $stateProvider\n\n //////////////////////\n // NEWS\n //////////////////////\n .state('admin.event', {\n parent: 'admin',\n url: \"/events\",\n templateUrl: \"app/admin/sections/event/event.view.html\",\n controller: 'EventController',\n controllerAs: 'vm',\n ncyBreadcrumb: {\n label: 'Events'\n }\n })\n\n //////////////////////\n // PANELS\n //////////////////////\n\n .state('event-add', {\n parent: 'admin.event',\n url: '/add',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/event/event-add-edit/event-add-edit.view.html',\n 'EventAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n }\n })\n\n .state('event-edit', {\n parent: 'admin.event',\n url: '/:id',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/event/event-add-edit/event-add-edit.view.html',\n 'EventAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n },\n })\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.event')\n .controller('EventController', EventController);\n\n function EventController($log, $scope, $state, $timeout, $rootScope, eventService, formsService, panelService, flashService, Notification) {\n var vm = this;\n\n vm.events = [];\n vm.getEvents = getEvents;\n vm.user = {};\n\n vm.itemsByPage = 10;\n var limit='';\n var page='';\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // GET\n //////////////////////\n function getEvents(tableState) {\n\n vm.isTableLoading = true;\n\n var pagination = tableState.pagination;\n var selectedPage = pagination.start+1;\n //var sort = tableState.sort.predicate;\n var sort = '-startDate'; // sort newest first\n //$log.debug('tableState', tableState);\n //$log.debug('PAGINATION', pagination);\n\n //var sort = \"\";\n limit = vm.itemsByPage; // Number of entries showed per page.\n page = selectedPage || 1; // Current Page\n\n // get all events\n eventService.getAll(limit, page, sort).then(function(response) {\n if (response.data) {\n //$log.debug('RESPONSE', response);\n\n vm.events = response.data;\n limit = response.items.limit;\n page = response.pages.total;\n tableState.pagination.numberOfPages = response.pages.total;\n\n vm.isTableLoading = false;\n }\n });\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.category')\n .factory('categoryService', categoryService);\n\n function categoryService($log, API, apiHelperService) {\n return {\n // GET\n getAll: getAll,\n getById: getById,\n\n // CREATE\n create: create,\n\n // UPDATE\n updateById: updateById,\n\n // DELETE\n deleteById: deleteById,\n };\n\n //////////////////////\n // GET\n //////////////////////\n function getAll(limit, page, sort) {\n\n $log.debug(\"category-data: getAll()\");\n\n var req = {\n method: 'GET',\n url: API.CATEGORIES,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getById(id) {\n var req = {\n method: 'GET',\n url: API.CATEGORIES + '/' + id,\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n //////////////////////\n // POST\n //////////////////////\n function create(category) {\n\n var req = {\n method: 'POST',\n url: API.CATEGORIES,\n data: category\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // PUT\n //////////////////////\n\n function updateById(category) {\n\n $log.debug('updateById-category:', category);\n\n var req = {\n method: 'PUT',\n url: API.CATEGORIES +'/'+ category._id,\n data: {\n name: category.name\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n //////////////////////\n // DELETE\n //////////////////////\n function deleteById(category) {\n\n var req = {\n method: 'DELETE',\n url: API.CATEGORIES +'/'+ category._id\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n }\n\n})();\n\n/*\n ** Factory for CRUDing API.CATEGORIES\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.category')\n .config(categoryRouteConfig);\n\n function categoryRouteConfig($stateProvider, $urlRouterProvider) {\n\n $stateProvider\n\n //////////////////////\n // ACCOUNTS\n //////////////////////\n .state('admin.category', {\n parent: 'admin',\n url: \"/categories\",\n templateUrl: \"app/admin/sections/category/category.view.html\",\n controller: 'CategoryController',\n controllerAs: 'vm',\n ncyBreadcrumb: {\n label: 'Categories'\n }\n })\n\n //////////////////////\n // PANELS\n //////////////////////\n\n .state('category-add', {\n parent: 'admin.category',\n url: '/add',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/category/category-add/category-add.view.html',\n 'CategoryAddController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n }\n })\n\n .state('category-edit', {\n parent: 'admin.category',\n url: '/:id',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/category/category-edit/category-edit.view.html',\n 'CategoryEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n },\n })\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.category')\n .controller('CategoryController', CategoryController);\n\n function CategoryController($log, $scope, $state, $timeout, $rootScope, categoryService, formsService, panelService, flashService, Notification) {\n var vm = this;\n\n vm.categories = [];\n vm.getCategories = getCategories;\n vm.user = {};\n\n vm.itemsByPage = 10;\n var limit='';\n var page='';\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // GET\n //////////////////////\n function getCategories(tableState) {\n\n vm.isTableLoading = true;\n\n var pagination = tableState.pagination;\n var selectedPage = pagination.start+1;\n //var sort = tableState.sort.predicate;\n var sort = '-timeCreated'; // sort newest first\n //$log.debug('tableState', tableState);\n //$log.debug('PAGINATION', pagination);\n\n //var sort = \"\";\n limit = vm.itemsByPage; // Number of entries showed per page.\n page = selectedPage || 1; // Current Page\n\n // get all categories\n categoryService.getAll(limit, page, sort).then(function(response) {\n\n if (response.data) {\n //$log.debug('RESPONSE', response);\n\n vm.categories = response.data;\n limit = response.items.limit;\n page = response.pages.total;\n tableState.pagination.numberOfPages = response.pages.total;\n\n vm.isTableLoading = false;\n }\n });\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.blogPost')\n .factory('blogPostService', blogPostService);\n\n function blogPostService($log, API, apiHelperService, metaTagsHelperService) {\n return {\n // GET\n getAll: getAll,\n getById: getById,\n\n // CREATE\n create: create,\n\n // UPDATE\n updateById: updateById,\n\n // DELETE\n deleteById: deleteById,\n };\n\n //////////////////////\n // GET\n //////////////////////\n function getAll(limit, page, sort) {\n\n $log.debug(\"blogPost-data: getAll()\");\n\n var req = {\n method: 'GET',\n url: API.BLOG,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getById(id) {\n var req = {\n method: 'GET',\n url: API.BLOG + '/' + id,\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n //////////////////////\n // POST\n //////////////////////\n function create(blogPost) {\n var post = metaTagsHelperService.mapToModel(blogPost);\n var req = {\n method: 'POST',\n url: API.BLOG,\n data: post\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // PUT\n //////////////////////\n\n function updateById(blogPost) {\n\n $log.debug('updateById-blogPost:', blogPost);\n\n var post = metaTagsHelperService.mapToModel(blogPost);\n var req = {\n method: 'PUT',\n url: API.BLOG +'/'+ blogPost._id,\n data: post\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n //////////////////////\n // DELETE\n //////////////////////\n function deleteById(blogPost) {\n\n var req = {\n method: 'DELETE',\n url: API.BLOG +'/'+ blogPost._id\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n }\n\n})();\n\n/*\n ** Factory for CRUDing API.BLOG\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.blogPost')\n .config(blogPostRouteConfig);\n\n function blogPostRouteConfig($stateProvider, $urlRouterProvider) {\n\n $stateProvider\n\n //////////////////////\n // BLOG\n //////////////////////\n .state('admin.blogPost', {\n parent: 'admin',\n url: \"/blog\",\n templateUrl: \"app/admin/sections/blog-post/blog-post.view.html\",\n controller: 'BlogPostController',\n controllerAs: 'vm',\n ncyBreadcrumb: {\n label: 'Blog Posts'\n }\n })\n\n //////////////////////\n // PANELS\n //////////////////////\n\n .state('blogPost-add', {\n parent: 'admin.blogPost',\n url: '/add',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/blog-post/blog-post-add-edit/blog-post-add-edit.view.html',\n 'BlogPostAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n }\n })\n\n .state('blogPost-edit', {\n parent: 'admin.blogPost',\n url: '/:id',\n onEnter: function(panelService) {\n panelService.show(\n 'app/admin/sections/blog-post/blog-post-add-edit/blog-post-add-edit.view.html',\n 'BlogPostAddEditController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n },\n })\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.blogPost')\n .controller('BlogPostController', BlogPostController);\n\n function BlogPostController($log, $scope, $state, $timeout, $rootScope, blogPostService, formsService, panelService, flashService, Notification) {\n var vm = this;\n\n vm.blogPosts = [];\n vm.getBlogPosts = getBlogPosts;\n vm.user = {};\n\n vm.itemsByPage = 10;\n var limit='';\n var page='';\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n //////////////////////\n // GET\n //////////////////////\n function getBlogPosts(tableState) {\n\n vm.isTableLoading = true;\n\n var pagination = tableState.pagination;\n var selectedPage = pagination.start+1;\n //var sort = tableState.sort.predicate;\n var sort = '-created'; // sort newest first\n //$log.debug('tableState', tableState);\n //$log.debug('PAGINATION', pagination);\n\n //var sort = \"\";\n limit = vm.itemsByPage; // Number of entries showed per page.\n page = selectedPage || 1; // Current Page\n\n // get all blogPosts\n blogPostService.getAll(limit, page, sort).then(function(response) {\n\n if (response.data) {\n //$log.debug('RESPONSE', response);\n\n vm.blogPosts = response.data;\n limit = response.items.limit;\n page = response.pages.total;\n tableState.pagination.numberOfPages = response.pages.total;\n\n vm.isTableLoading = false;\n }\n });\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.admins', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.admin-groups', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.account')\n .factory('accountService', accountService);\n\n function accountService($log, API, apiHelperService) {\n\n var accounts = {};\n\n return {\n\n // GET\n getAll: getAll,\n getAllNotPaged: getAllNotPaged,\n getMy: getMy,\n getById: getById,\n getByUsername: getByUsername,\n searchByUsername: searchByUsername,\n\n // CREATE\n create: create,\n createNotesById: createNotesById,\n createStatusById: createStatusById,\n\n // UPDATE\n updateMy: updateMy,\n updateById: updateById,\n updateUsernameLinkById: updateUsernameLinkById,\n\n // DELETE\n deleteById: deleteById,\n deleteUsernameLinkById: deleteUsernameLinkById,\n\n invite: invite,\n\n // CACHE\n updateCache: updateCache,\n getCachedById: getCachedById\n };\n\n\n\n //////////////////////\n // GET\n //////////////////////\n function getAll(limit, page, sort) {\n\n $log.debug(\"account-data: getAll()\");\n\n var req = {\n method: 'GET',\n url: API.ACCOUNTS,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getAllNotPaged() {\n\n $log.debug(\"account-data: getAllNotPaged()\");\n\n var req = {\n method: 'GET',\n url: API.ACCOUNTS + '/all'\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function getMy() {\n\n var req = {\n method: 'GET',\n url: API.ACCOUNTS +'/my',\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n function getById(id) {\n\n var req = {\n method: 'GET',\n url: API.ACCOUNTS + '/'+id,\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n function getByUsername(username) {\n\n var req = {\n method: 'GET',\n url: API.ACCOUNTS + '/'+username +'/profile',\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n function searchByUsername(username) {\n\n var req = {\n method: 'GET',\n url: API.ACCOUNTS + '/'+username +'/search',\n };\n return apiHelperService.sendHTTPRequest(req);\n\n }\n\n //////////////////////\n // POST\n //////////////////////\n function create(account) {\n\n var req = {\n method: 'POST',\n url: API.ACCOUNTS,\n data: account\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function createNotesById(account) {\n\n var req = {\n method: 'POST',\n url: API.ACCOUNTS +'/'+ account.id +'/notes',\n data: account.notes\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function createStatusById(account) {\n\n var req = {\n method: 'POST',\n url: API.ACCOUNTS +'/'+ account.id +'/status',\n data: account.status\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // PUT\n //////////////////////\n function updateMy(account) {\n\n $log.debug('updateMy-account:', account);\n\n var req = {\n method: 'PUT',\n url: API.ACCOUNTS +'/my',\n data: {\n name: {\n first: account.first,\n last: account.last\n },\n profileImage: account.profileImage\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function updateById(account) {\n\n $log.debug('updateById-account:', account);\n\n var req = {\n method: 'PUT',\n url: API.ACCOUNTS +'/'+ account.id,\n data: {\n name: {\n first: account.first,\n last: account.last\n }\n }\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function updateUsernameLinkById(account) {\n\n var req = {\n method: 'PUT',\n url: API.ACCOUNTS +'/'+ account.id +'/user',\n data: account.username\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n\n //////////////////////\n // DELETE\n //////////////////////\n function deleteById(account) {\n\n var req = {\n method: 'DELETE',\n url: API.ACCOUNTS +'/'+ account.id\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n function deleteUsernameLinkById(account) {\n\n var req = {\n method: 'DELETE',\n url: API.ACCOUNTS +'/'+ account.id +'/user'\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // INVITE\n //////////////////////\n function invite(account) {\n var req = {\n method: 'POST',\n url: API.ACCOUNTS + '/' + account.id + '/invite',\n data: account\n };\n return apiHelperService.sendHTTPRequest(req);\n }\n\n //////////////////////\n // CACHE\n //////////////////////\n function updateCache(limit, page, sort) {\n var req = {\n method: 'GET',\n url: API.ACCOUNTS,\n params: {\n //fields: fields,\n sort: sort,\n limit: limit,\n page: page,\n }\n };\n return apiHelperService.sendHTTPRequest(req).then(function(result) {\n\n result.data.forEach(function(a) {\n accounts[a._id] = a;\n });\n return result;\n });\n }\n\n function getCachedById(id) {\n return accounts[id];\n }\n }\n\n})();\n\n/*\n ** Factory for CRUDing API.ACCOUNTS\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.account')\n .config(accountRouteConfig);\n\n function accountRouteConfig($stateProvider, $urlRouterProvider) {\n\n $stateProvider\n\n //////////////////////\n // ACCOUNTS\n //////////////////////\n .state('admin.account', {\n parent: 'admin',\n url: \"/accounts\",\n templateUrl: \"app/admin/sections/account/account.view.html\",\n controller: 'AccountController',\n controllerAs: 'vm',\n ncyBreadcrumb: {\n label: 'Accounts'\n }\n })\n\n //////////////////////\n // PANELS\n //////////////////////\n\n .state('account-add', {\n parent: 'admin.account',\n url: '/add',\n onEnter: function(panelService) {\n onEnter: panelService.show(\n 'app/admin/sections/account/account-add/account-add.view.html',\n 'AccountAddController'\n )\n },\n ncyBreadcrumb: {\n skip: true\n }\n })\n\n .state('account-edit', {\n parent: 'admin.account',\n url: '/:id',\n onEnter: function(panelService) {\n onEnter: panelService.show(\n 'app/admin/sections/account/account-edit/account-edit.view.html',\n 'AccountEditController'\n )\n }, \n ncyBreadcrumb: {\n skip: true\n },\n })\n\n //////////////////////\n // 404\n //////////////////////\n // .state('admin.notfound', {\n // parent: 'admin',\n // url: '*path',\n // templateUrl: 'app/admin/admin-404.view.html',\n // title: 'Page Not Found',\n // ncyBreadcrumb: {\n // skip: true\n // },\n // });\n\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin.account')\n .controller('AccountController', AccountController);\n\n function AccountController($log, $scope, $state, $timeout, $rootScope, accountService, formsService, panelService, flashService, Notification, authService) {\n var vm = this;\n\n vm.accounts = [];\n vm.getAccounts = getAccounts;\n vm.user = {};\n\n vm.itemsByPage = 10;\n var limit='';\n var page='';\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n $scope.isAdmin = authService.isAdmin;\n\n //////////////////////\n // GET\n //////////////////////\n function getAccounts(tableState) {\n\n vm.isTableLoading = true;\n\n var pagination = tableState.pagination;\n var selectedPage = pagination.start+1;\n //var sort = tableState.sort.predicate;\n var sort = '-timeCreated'; // sort newest first\n //$log.debug('tableState', tableState);\n //$log.debug('PAGINATION', pagination);\n\n //var sort = \"\";\n limit = vm.itemsByPage; // Number of entries showed per page.\n page = selectedPage || 1; // Current Page\n\n // get all accounts\n accountService.getAll(limit, page, sort).then(function(response) {\n\n if (response.data) {\n //$log.debug('RESPONSE', response);\n\n vm.accounts = response.data;\n limit = response.items.limit;\n page = response.pages.total;\n tableState.pagination.numberOfPages = response.pages.total;\n\n vm.isTableLoading = false;\n }\n });\n }\n\n\n\n\n }\n\n})();\n\n(function() {\n'use strict';\n\n\tangular\n\t\t.module('login', []);\n\n})();\n\n\n(function() {\n 'use strict';\n\n angular\n .module('login')\n .controller('LoginResetController', LoginResetController);\n\n function LoginResetController($scope, $rootScope, $log, $location, $q, Session,\n authService, flashService, formsService) {\n\n var vm = this;\n\n //region ViewModel Properties\n vm.password = \"\";\n vm.confirmPassword = \"\";\n vm.token = \"\";\n vm.valid = false;\n //endregion\n\n\n //region ViewModel Methods\n vm.resetPassword = resetPassword;\n vm.isPasswordConfirmed = isPasswordConfirmed;\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n //endregion\n\n (function init() {\n // reset login status - ensure user is logged out on controller load\n // user should never get to /activate-account when authenticated - this is precaution\n Session.destroy();\n Session.token=null;\n\n // if the user was directed here via a link with a key, then activate their account\n if ($location.search().token) {\n vm.valid = true;\n vm.token = $location.search().token;\n }\n else {\n $log.error(\"LoginResetController.init-error:\", \"no token\");\n flashService.error(\"The link you used did not contain a token. Please click on the link in your email to \" +\n \"reset your password, or proceed to the login page to request a new email.\");\n }\n })();\n\n\n function resetPassword() {\n $rootScope.isDataLoading = true;\n authService.loginReset({\n token: vm.token,\n password: vm.password\n })\n .then(function(response) {\n $log.debug(\"LoginResetController.resetPassword-success:\", response);\n\n $scope.resetForm.$setPristine();\n vm.user = {};\n vm.success = true;\n flashService.success('Your password has been reset. Please login to confirm.');\n vm.valid = false;\n $rootScope.isDataLoading = false;\n })\n .catch(function(error) {\n\n $log.error(\"LoginResetController.resetPassword-error:\", error);\n\n if (error.data.message === 'Invalid email or key.') {\n flashService.error(\"The token in your email link has expired, \" +\n \"proceed to the login page to request a new email.\");\n }\n else {\n flashService.error(\"There was an error during the activation process, please try again.\");\n }\n vm.valid = false;\n $rootScope.isDataLoading = false;\n });\n }\n\n function isPasswordConfirmed (passwordConfirmation) {\n return $q(function (resolve, reject) {\n if (passwordConfirmation == vm.password) {\n resolve();\n } else {\n reject();\n }\n });\n }\n\n\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('login')\n .factory('loginModalService', loginModalService);\n\n function loginModalService($log, $q, $rootScope, $state, $modal, REDIRECT) {\n\n return {\n show: show,\n hide: hide \n }\n\n var loginModal = null;\n\n /////////////////////////\n // OPEN LOGIN MODAL\n /////////////////////////\n function show() {\n\n $log.debug(\"login.modal.service: show\");\n\n if (loginModal) {\n $log.debug(\"login.modal.service: instance already exists - multiple requests?\");\n return $q.reject();\n }\n\n loginModal = $modal({\n templateUrl: 'app/login/modal/login-modal.view.html',\n controller: 'LoginModalController',\n controllerAs: 'vm',\n backdrop: 'static',\n keyboard: false, // ensure the user cant press escape\n show: false,\n onHide: function() {\n hide();\n }\n });\n\n return loginModal.$promise.then(loginModal.show);\n }\n\n ////////////////////////////////\n // CLOSE / CANCEL LOGIN MODAL\n ////////////////////////////////\n function hide() {\n\n if (loginModal) {\n $log.debug(\"login.modal.service: hide\");\n loginModal.hide();\n loginModal = null;\n }\n }\n\n }\n})();\n\n\n\n\n(function() {\n 'use strict';\n\n angular\n .module('login')\n .controller('LoginModalController', LoginModalController);\n\n function LoginModalController($scope, $rootScope, $state, $timeout, $log, authService, formsService, Session, loginModalService, flashService, REDIRECT) {\n\n var vm = this;\n vm.user = {};\n vm.modalLogin = modalLogin;\n vm.closeLoginModal = closeLoginModal;\n\n\n function modalLogin() {\n\n $rootScope.isDataLoading = true;\n\n authService.login(vm.user)\n .then(function(response) {\n\n $log.debug(\"login.modal.controller-success:\", response);\n\n // broadcast login event\n // set user in main controller global - rootscope so we can set from anywhere\n $rootScope.setUserId(response.data.user._id); \n $rootScope.setUsername(response.data.user.username); \n $rootScope.setFullname(response.data.user.roles.account.name);\n\n // close modal\n loginModalService.hide();\n\n // if (authService.isAuthorized('admin')) {\n // //$log.debug(\"login.modal.controller-isAuthorized: IS Admin\");\n // $state.go(REDIRECT.ADMIN); \n // }\n // else {\n //$log.debug(\"login.modal.controller-isAuthorized: NOT Admin\");\n $state.go(REDIRECT.ADMIN);\n $timeout(function() {\n $state.reload();\n });\n //}\n\n }, function(error) {\n\n //$log.error(\"loginModal.controller-error:\", error.data);\n flashService.error(error.data.message);\n\n }); \n }\n\n function closeLoginModal() {\n // cancel button in modal login was clicked\n //$log.debug(\"login.modal.controller: closeLoginModal\");\n loginModalService.hide();\n $state.go(REDIRECT.LOGIN);\n };\n }\n\n})();\n\n// The LoginModalController provides the behaviour behind a reusable form to allow users to authenticate.\n// This controller and its template (login/modal/login-modal.view.html) are used in a modal dialog box by the auth service.\n(function() {\n 'use strict';\n\n angular\n .module('login')\n .controller('LoginForgotController', LoginForgotController);\n\n function LoginForgotController($scope, $rootScope, $log, authService, flashService, formsService) {\n\n var vm = this;\n vm.forgot = forgot;\n vm.email = \"\";\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n\n function forgot() {\n\n $rootScope.isDataLoading = true;\n\n authService.loginForgot(vm.email)\n .then(function(response) {\n\n $scope.loginForgotForm.$setPristine();\n vm.email = \"\";\n\n $log.debug(\"loginForgot.controller-success:\", response);\n flashService.info('If an account matched that address, an email will be sent with instructions.');\n\n }, function(error) {\n\n $log.error(\"loginForgot.controller-error:\", error.data);\n flashService.error('Error resetting your account, please try again.');\n });\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.services', [\n 'app.services.auth',\n 'app.services.utility',\n 'app.services.highlight'\n ]);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.filters', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.filters')\n .filter('phonenumberFilter', phonenumberFilter);\n\n function phonenumberFilter() {\n\n return function(tel) {\n if (!tel) {\n return '';\n }\n\n var value = tel.toString().trim().replace(/^\\+/, '');\n\n if (value.match(/[^0-9]/)) {\n return tel;\n }\n\n var country, city, number;\n\n switch (value.length) {\n case 10: // +1PPP####### -> C (PPP) ###-####\n country = 1;\n city = value.slice(0, 3);\n number = value.slice(3);\n break;\n\n case 11: // +CPPP####### -> CCC (PP) ###-####\n country = value[0];\n city = value.slice(1, 4);\n number = value.slice(4);\n break;\n\n case 12: // +CCCPP####### -> CCC (PP) ###-####\n country = value.slice(0, 3);\n city = value.slice(3, 5);\n number = value.slice(5);\n break;\n\n default:\n return tel;\n }\n\n if (country == 1) {\n country = \"\";\n }\n\n number = number.slice(0, 3) + '-' + number.slice(3);\n\n return (country + \" (\" + city + \") \" + number).trim();\n }\n }\n\n\n function Ctrl($scope) {\n $scope.phoneNumber = 4085265552;\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.filters')\n .filter('formatTime', formatTime);\n\n function formatTime() {\n\n return function(timestamp, withtime) {\n if (!timestamp)\n return;\n\n if (withtime) {\n return moment(timestamp).format('lll'); // Jan 12, 2017\n }\n\n return moment(timestamp).format('ll'); // Jan 12, 2017\n\n // below returns eg. 5 days ago\n //var res = moment(timestamp).from();\n //return replace ? res.replace('ago', replace) : res;\n }\n }\n\n\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.filters')\n .filter('capitalize', capitalize);\n\n function capitalize() {\n\n return function(input, scope) {\n if (input !=null) {\n if (input.length>=1) {\n input = input.toLowerCase();\n return input.substring(0, 1).toUpperCase() + input.substring(1);\n }\n }\n }\n }\n\n\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.directives', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app.directives')\n // .directive('pageTitle', pageTitle)\n // .directive('sideNavigation', sideNavigation)\n // .directive('iboxTools', iboxTools)\n // .directive('minimalizaSidebar', minimalizaSidebar)\n // .directive('vectorMap', vectorMap)\n // .directive('sparkline', sparkline)\n // .directive('icheck', icheck)\n // .directive('ionRangeSlider', ionRangeSlider)\n // .directive('dropZone', dropZone)\n // .directive('responsiveVideo', responsiveVideo)\n // .directive('chatSlimScroll', chatSlimScroll)\n // .directive('customValid', customValid)\n // .directive('fullScroll', fullScroll)\n // .directive('closeOffCanvas', closeOffCanvas)\n // .directive('clockPicker', clockPicker)\n // .directive('landingScrollspy', landingScrollspy)\n // .directive('fitHeight', fitHeight)\n // .directive('iboxToolsFullScreen', iboxToolsFullScreen)\n // .directive('slimScroll', slimScroll)\n // .directive('truncate', truncate)\n // .directive('touchSpin', touchSpin)\n // .directive('markdownEditor', markdownEditor)\n .directive('categoryName', categoryName)\n .directive('categorySelect', categorySelect)\n .directive('categoryMultiSelect', categoryMultiSelect)\n // .directive('categoryToggle', categoryToggle)\n .directive('highlightSelect', highlightSelect)\n .directive('topnavcollapse', topNavCollapse)\n .directive('userEmail', userEmail);\n\n\n\n /**\n * pageTitle - Directive for set Page title - mata title\n */\n function pageTitle($rootScope, $timeout) {\n return {\n link: function(scope, element) {\n var listener = function(event, toState, toParams, fromState, fromParams) {\n // Default title - load on Dashboard 1\n var title = 'Twist';\n // Create your own title pattern\n if (toState.data && toState.data.pageTitle) title = 'Twist | ' + toState.data.pageTitle;\n $timeout(function() {\n element.text(title);\n });\n };\n $rootScope.$on('$stateChangeStart', listener);\n }\n }\n };\n\n /**\n * sideNavigation - Directive for run metsiMenu on sidebar navigation\n */\n function sideNavigation($timeout) {\n return {\n restrict: 'A',\n link: function(scope, element) {\n // Call the metsiMenu plugin and plug it to sidebar navigation\n $timeout(function() {\n element.metisMenu();\n\n });\n }\n };\n };\n\n /**\n * responsibleVideo - Directive for responsive video\n */\n function responsiveVideo() {\n return {\n restrict: 'A',\n link: function(scope, element) {\n var figure = element;\n var video = element.children();\n video\n .attr('data-aspectRatio', video.height() / video.width())\n .removeAttr('height')\n .removeAttr('width')\n\n //We can use $watch on $window.innerWidth also.\n $(window).resize(function() {\n var newWidth = figure.width();\n video\n .width(newWidth)\n .height(newWidth * video.attr('data-aspectRatio'));\n }).resize();\n }\n }\n }\n\n /**\n * iboxTools - Directive for iBox tools elements in right corner of ibox\n */\n function iboxTools($timeout) {\n return {\n restrict: 'A',\n scope: true,\n templateUrl: 'app/main/main-ibox_tools.view.html',\n controller: function($scope, $element) {\n // Function for collapse ibox\n $scope.showhide = function() {\n var ibox = $element.closest('div.ibox');\n var icon = $element.find('i:first');\n var content = ibox.find('div.ibox-content');\n content.slideToggle(200);\n // Toggle icon from up to down\n icon.toggleClass('fa-chevron-up').toggleClass('fa-chevron-down');\n ibox.toggleClass('').toggleClass('border-bottom');\n $timeout(function() {\n ibox.resize();\n ibox.find('[id^=map-]').resize();\n }, 50);\n };\n // Function for close ibox\n $scope.closebox = function() {\n var ibox = $element.closest('div.ibox');\n ibox.remove();\n }\n }\n };\n }\n\n /**\n * iboxTools with full screen - Directive for iBox tools elements in right corner of ibox with full screen option\n */\n function iboxToolsFullScreen($timeout) {\n return {\n restrict: 'A',\n scope: true,\n templateUrl: 'app/main/main-ibox_tools_full_screen.view.html',\n controller: function($scope, $element) {\n // Function for collapse ibox\n $scope.showhide = function() {\n var ibox = $element.closest('div.ibox');\n var icon = $element.find('i:first');\n var content = ibox.find('div.ibox-content');\n content.slideToggle(200);\n // Toggle icon from up to down\n icon.toggleClass('fa-chevron-up').toggleClass('fa-chevron-down');\n ibox.toggleClass('').toggleClass('border-bottom');\n $timeout(function() {\n ibox.resize();\n ibox.find('[id^=map-]').resize();\n }, 50);\n };\n // Function for close ibox\n $scope.closebox = function() {\n var ibox = $element.closest('div.ibox');\n ibox.remove();\n };\n // Function for full screen\n $scope.fullscreen = function() {\n var ibox = $element.closest('div.ibox');\n var button = $element.find('i.fa-expand');\n $('body').toggleClass('fullscreen-ibox-mode');\n button.toggleClass('fa-expand').toggleClass('fa-compress');\n ibox.toggleClass('fullscreen');\n setTimeout(function() {\n $(window).trigger('resize');\n }, 100);\n }\n }\n };\n }\n\n /**\n * minimalizaSidebar - Directive for minimalize sidebar\n */\n function minimalizaSidebar($timeout) {\n return {\n restrict: 'A',\n //template: '',\n template: '
menu
',\n\n controller: function($scope, $element) {\n $scope.minimalize = function() {\n angular.element('body').toggleClass('mini-navbar');\n if (!angular.element('body').hasClass('mini-navbar') || angular.element('body').hasClass('body-small')) {\n // Hide menu in order to smoothly turn on when maximize menu\n angular.element('#side-menu').hide();\n // For smoothly turn on menu\n $timeout(function() {\n angular.element('#side-menu').fadeIn(500);\n }, 100);\n }\n else {\n // Remove all inline style from jquery fadeIn function to reset menu state\n angular.element('#side-menu').removeAttr('style');\n }\n };\n }\n };\n };\n\n\n function closeOffCanvas() {\n return {\n restrict: 'A',\n template: '',\n controller: function($scope, $element) {\n $scope.closeOffCanvas = function() {\n $(\"body\").toggleClass(\"mini-navbar\");\n }\n }\n };\n }\n\n /**\n * vectorMap - Directive for Vector map plugin\n */\n function vectorMap() {\n return {\n restrict: 'A',\n scope: {\n myMapData: '=',\n },\n link: function(scope, element, attrs) {\n var map = element.vectorMap({\n map: 'world_mill_en',\n backgroundColor: \"transparent\",\n regionStyle: {\n initial: {\n fill: '#e4e4e4',\n \"fill-opacity\": 0.9,\n stroke: 'none',\n \"stroke-width\": 0,\n \"stroke-opacity\": 0\n }\n },\n series: {\n regions: [{\n values: scope.myMapData,\n scale: [\"#1ab394\", \"#22d6b1\"],\n normalizeFunction: 'polynomial'\n }]\n },\n });\n var destroyMap = function() {\n element.remove();\n };\n scope.$on('$destroy', function() {\n destroyMap();\n });\n }\n }\n }\n\n\n /**\n * sparkline - Directive for Sparkline chart\n */\n function sparkline() {\n return {\n restrict: 'A',\n scope: {\n sparkData: '=',\n sparkOptions: '=',\n },\n link: function(scope, element, attrs) {\n scope.$watch(scope.sparkData, function() {\n render();\n });\n scope.$watch(scope.sparkOptions, function() {\n render();\n });\n var render = function() {\n $(element).sparkline(scope.sparkData, scope.sparkOptions);\n };\n }\n }\n };\n\n /**\n * icheck - Directive for custom checkbox icheck\n */\n function icheck($timeout) {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function($scope, element, $attrs, ngModel) {\n return $timeout(function() {\n var value;\n value = $attrs['value'];\n\n $scope.$watch($attrs['ngModel'], function(newValue) {\n $(element).iCheck('update');\n })\n\n return $(element).iCheck({\n checkboxClass: 'icheckbox_square-green',\n radioClass: 'iradio_square-green'\n\n }).on('ifChanged', function(event) {\n if ($(element).attr('type') === 'checkbox' && $attrs['ngModel']) {\n $scope.$apply(function() {\n return ngModel.$setViewValue(event.target.checked);\n });\n }\n if ($(element).attr('type') === 'radio' && $attrs['ngModel']) {\n return $scope.$apply(function() {\n return ngModel.$setViewValue(value);\n });\n }\n });\n });\n }\n };\n }\n\n /**\n * ionRangeSlider - Directive for Ion Range Slider\n */\n function ionRangeSlider() {\n return {\n restrict: 'A',\n scope: {\n rangeOptions: '='\n },\n link: function(scope, elem, attrs) {\n elem.ionRangeSlider(scope.rangeOptions);\n }\n }\n }\n\n /**\n * dropZone - Directive for Drag and drop zone file upload plugin\n */\n function dropZone() {\n return {\n restrict: 'C',\n link: function(scope, element, attrs) {\n\n var config = {\n url: 'http://localhost:8080/upload',\n maxFilesize: 100,\n paramName: \"uploadfile\",\n maxThumbnailFilesize: 10,\n parallelUploads: 1,\n autoProcessQueue: false\n };\n\n var eventHandlers = {\n 'addedfile': function(file) {\n scope.file = file;\n if (this.files[1] != null) {\n this.removeFile(this.files[0]);\n }\n scope.$apply(function() {\n scope.fileAdded = true;\n });\n },\n\n 'success': function(file, response) {}\n\n };\n\n dropzone = new Dropzone(element[0], config);\n\n angular.forEach(eventHandlers, function(handler, event) {\n dropzone.on(event, handler);\n });\n\n scope.processDropzone = function() {\n dropzone.processQueue();\n };\n\n scope.resetDropzone = function() {\n dropzone.removeAllFiles();\n }\n }\n }\n }\n\n /**\n * chatSlimScroll - Directive for slim scroll for small chat\n */\n function chatSlimScroll($timeout) {\n return {\n restrict: 'A',\n link: function(scope, element) {\n $timeout(function() {\n element.slimscroll({\n height: '234px',\n railOpacity: 0.4\n });\n\n });\n }\n };\n }\n\n /**\n * customValid - Directive for custom validation example\n */\n function customValid() {\n return {\n require: 'ngModel',\n link: function(scope, ele, attrs, c) {\n scope.$watch(attrs.ngModel, function() {\n\n // You can call a $http method here\n // Or create custom validation\n\n var validText = \"Twist\";\n\n if (scope.extras == validText) {\n c.$setValidity('cvalid', true);\n }\n else {\n c.$setValidity('cvalid', false);\n }\n\n });\n }\n }\n }\n\n\n /**\n * fullScroll - Directive for slimScroll with 100%\n */\n /**\n function fullScroll($timeout){\n return {\n restrict: 'A',\n link: function(scope, element) {\n $timeout(function(){\n element.slimscroll({\n height: '100%',\n railOpacity: 0.9\n });\n\n });\n }\n };\n }\n **/\n /**\n * slimScroll - Directive for slimScroll with custom height\n */\n /**\n function slimScroll($timeout){\n return {\n restrict: 'A',\n scope: {\n boxHeight: '@'\n },\n link: function(scope, element) {\n $timeout(function(){\n element.slimscroll({\n height: scope.boxHeight,\n railOpacity: 0.9\n });\n\n });\n }\n };\n }\n **/\n /**\n * clockPicker - Directive for clock picker plugin\n */\n function clockPicker() {\n return {\n restrict: 'A',\n link: function(scope, element) {\n element.clockpicker();\n }\n };\n };\n\n\n /**\n * landingScrollspy - Directive for scrollspy in landing page\n */\n function landingScrollspy() {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n element.scrollspy({\n target: '.navbar-fixed-top',\n offset: 80\n });\n }\n }\n }\n\n /**\n * fitHeight - Directive for set height fit to window height\n */\n function fitHeight() {\n return {\n restrict: 'A',\n link: function(scope, element) {\n element.css(\"height\", $(window).height() + \"px\");\n element.css(\"min-height\", $(window).height() + \"px\");\n }\n };\n }\n\n /**\n * truncate - Directive for truncate string\n */\n function truncate($timeout) {\n return {\n restrict: 'A',\n scope: {\n truncateOptions: '='\n },\n link: function(scope, element) {\n $timeout(function() {\n element.dotdotdot(scope.truncateOptions);\n\n });\n }\n };\n }\n\n\n /**\n * touchSpin - Directive for Bootstrap TouchSpin\n */\n function touchSpin() {\n return {\n restrict: 'A',\n scope: {\n spinOptions: '='\n },\n link: function(scope, element, attrs) {\n scope.$watch(scope.spinOptions, function() {\n render();\n });\n var render = function() {\n $(element).TouchSpin(scope.spinOptions);\n };\n }\n }\n };\n\n /**\n * markdownEditor - Directive for Bootstrap Markdown\n */\n function markdownEditor() {\n return {\n restrict: \"A\",\n require: 'ngModel',\n link: function(scope, element, attrs, ngModel) {\n $(element).markdown({\n savable: false,\n onChange: function(e) {\n ngModel.$setViewValue(e.getContent());\n }\n });\n }\n }\n }\n\n function categoryName(categoryService) {\n return {\n restrict: 'AE',\n replace: true,\n scope: {\n id: '@'\n },\n template: '{{category.name}}',\n link: function(scope, elem) {\n categoryService.getById(scope.id).then(function(response){\n scope.category = response;\n });\n }\n }\n }\n\n function categorySelect(categoryService) {\n return {\n replace: true,\n restrict: 'E',\n scope: {\n selectedCategoryId: '='\n },\n template:\n '',\n link: function(scope, elem) {\n categoryService.getAll(1000, 1, '+name').then(function(response) {\n if (response.data) {\n scope.categories = response.data;\n }\n });\n }\n }\n }\n\n function categoryMultiSelect(categoryService) {\n return {\n replace: true,\n restrict: 'E',\n scope: {\n selectedCategoryIds: '='\n },\n template:\n '',\n link: function(scope, elem) {\n categoryService.getAll(1000, 1, '+name').then(function(response) {\n if (response.data) {\n scope.categories = response.data;\n }\n });\n }\n }\n }\n\n\n function categoryToggle(categoryService) {\n return {\n replace: false,\n restrict: 'E',\n scope: {\n categories: '=',\n onChange: '='\n },\n template:\n '' +\n '' +\n '',\n controller: function($scope) {\n categoryService.getAll(1000, 1, '+name').then(function(response) {\n if (response.data) {\n $scope.categories = response.data;\n // fire change handler once with all categories for default state\n $scope.onChange($scope.categories);\n }\n });\n $scope.onClick = function() {\n $scope.onChange($scope.categories.filter(function(c) { return c.selected === true }));\n }\n }\n }\n }\n\n function highlightSelect(highlightService, Notification, $log) {\n return {\n replace: true,\n restrict: 'E',\n scope: {\n highlight: '='\n },\n template:\n '
' +\n ' ' +\n ' ' +\n ' ' +\n '
',\n controller: function($scope) {\n $scope.highlights = [{}, {}, {}];\n $scope.selectionChanged = function(h) {\n $scope.highlight.index = h;\n };\n $scope.saveHighlight = function() {\n $log.debug('$scope.highlight', $scope.highlight);\n highlightService.updateByIndex($scope.highlight).then(function(r) {\n if (!r.message) {\n Notification.success(\"Highlight \" + $scope.highlight.index + \" Successfully Updated.\");\n } else {\n Notification.error(\"Failed to set News Item as Highlight \" + $scope.highlight.index + \".\");\n }\n });\n }\n }\n }\n }\n\n /**\n * topNavCollapse - Directive to collapse and change look of header navbar on scroll\n */\n function topNavCollapse($window) {\n //console.log('topNavCollapse');\n return function(scope, element, attrs) {\n angular.element($window).bind(\"scroll\", function() {\n if (this.pageYOffset >= 100) {\n scope.boolChangeClass = true;\n //console.log('Scrolled below header.');\n } else {\n scope.boolChangeClass = false;\n //console.log('Header is in view.');\n }\n scope.$apply();\n });\n };\n };\n\n function userEmail(userService) {\n return {\n restrict: 'AE',\n replace: true,\n scope: {\n id: '@'\n },\n template: '{{user.email}}',\n link: function(scope, elem) {\n scope.user = userService.getCachedById(scope.id);\n }\n }\n }\n})();\n\n/**\n *\n * Main directives.js file\n * Define directives for used plugin\n *\n *\n * Functions (directives)\n * - sideNavigation\n * - iboxTools\n * - minimalizaSidebar\n * - vectorMap\n * - sparkline\n * - icheck\n * - ionRangeSlider\n * - dropZone\n * - responsiveVideo\n * - chatSlimScroll\n * - customValid\n * - fullScroll\n * - closeOffCanvas\n * - clockPicker\n * - landingScrollspy\n * - fitHeight\n * - iboxToolsFullScreen\n * - slimScroll\n * - truncate\n * - touchSpin\n * - markdownEditor\n * - resizeable\n *\n */\n\n(function() {\n'use strict';\n\n\tangular\n\t\t.module('signup', []);\n\n})();\n\n\n(function() {\n 'use strict';\n\n angular\n .module('signup')\n .config(routeConfig);\n\n function routeConfig($stateProvider) {\n\n $stateProvider\n\n .state('signup', {\n url: \"/signup?invitationToken\",\n templateUrl: 'app/signup/signup.view.html',\n controller: 'SignupController',\n controllerAs: 'vm',\n title: 'Sign Up',\n resolve: {\n signup: function(authSecurityService) {\n return authSecurityService.requireUnauthenticatedUser();\n }\n }\n })\n\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('signup')\n .controller('SignupController', SignupController);\n\n function SignupController($scope, $rootScope, $stateParams, $log, authService, Session, formsService, flashService) {\n\n var vm = this;\n vm.signup = signup;\n vm.user = {};\n vm.invitationToken = $stateParams.invitationToken;\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n\n (function init() {\n // reset login status - ensure user is logged out on controller load\n // user should never get to /signup when authenticaed - this is precaution\n Session.destroy();\n Session.token=null;\n if(vm.invitationToken) {\n authService.getInvitation(vm.invitationToken).then(\n function(invitation) {\n if(invitation) {\n vm.user.email = invitation.to;\n } else {\n vm.invitationToken = null;\n }\n }\n );\n }\n })();\n\n\n function signup() {\n\n $rootScope.isDataLoading = true;\n\n authService.signup(vm.user, vm.invitationToken)\n .then(function(response) {\n\n $log.debug(\"signup.controller-success:\", response);\n flashService.success('Signup Success');\n\n // set user in main controller global - rootscope so we can set from anywhere\n $rootScope.setUserId(response.data.user._id);\n $rootScope.setUsername(response.data.user.username);\n $rootScope.setFullname(response.data.user.roles.account.name);\n\n }, function(error) {\n\n $log.error(\"signup.controller-error:\", error.data);\n flashService.error(error.data.message);\n\n });\n }\n };\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('login')\n .config(routeConfig);\n\n function routeConfig($stateProvider) {\n\n $stateProvider\n\n .state('login', {\n url: \"/login\",\n templateUrl: 'app/login/login.view.html',\n controller: 'LoginController',\n controllerAs: 'vm',\n title: 'Login',\n resolve: {\n login: function(authSecurityService) {\n return authSecurityService.requireUnauthenticatedUser()\n }\n }\n })\n\n .state('forgotpw', {\n url: \"/login/forgot\",\n templateUrl: 'app/login/forgot/login-forgot.view.html',\n controller: 'LoginForgotController',\n controllerAs: 'vm',\n title: 'Forgot Password',\n resolve: {\n forgotpw: function(authSecurityService) {\n return authSecurityService.requireUnauthenticatedUser()\n }\n }\n })\n\n .state('resetpw', {\n url: '/login/reset',\n templateUrl: 'app/login/reset/login-reset.view.html',\n controller: 'LoginResetController',\n controllerAs: 'vm',\n title: 'Reset Password',\n resolve: {\n resetpw: function(authSecurityService) {\n return authSecurityService.requireUnauthenticatedUser()\n }\n }\n })\n\n .state('resetpwtoken', {\n url: '/login/reset/?token',\n templateUrl: 'app/login/reset/login-reset.view.html',\n controller: 'LoginResetController',\n controllerAs: 'vm'\n })\n\n // 404\n // .state('notfoundlogin', {\n // url: '/*path',\n // templateUrl: 'app/404.view.html',\n // title: 'Page Not Found',\n // ncyBreadcrumb: {\n // skip: true\n // },\n // });\n\n }\n\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('login')\n .controller('LoginController', LoginController);\n\n function LoginController($scope, $rootScope, $state, $log, authService, Session, formsService, flashService, REDIRECT, userService) {\n\n var vm = this;\n vm.login = login;\n vm.user = {};\n\n // error handling utility\n $scope.hasError = formsService.hasError;\n $scope.showError = formsService.showError;\n $scope.canSave = formsService.canSave;\n\n (function init() {\n // reset login status - ensure user is logged out on controller load\n // user should never get to /login when authenticaed - this is precaution\n //Session.destroy();\n //Session.token=null;\n })();\n\n function login() {\n\n $rootScope.isDataLoading = true;\n\n authService.login(vm.user)\n .then(function(response) {\n\n $log.debug(\"login.controller-success:\", response);\n flashService.success('Login Success!');\n\n // set user in main controller global - rootscope so we can set from anywhere\n $rootScope.setUserId(response.data.user._id);\n $rootScope.setUsername(response.data.user.username);\n //$rootScope.setFullname(response.data.user.roles.account.name);\n\n // go to main page\n var go = function() {\n $state.go(REDIRECT.ADMIN);\n };\n\n if(authService.isAdmin()) {\n userService.updateCache().then(go);\n } else {\n go();\n }\n }, function(error) {\n\n $log.error(\"login.controller-error:\", error.data);\n flashService.error(error.data.message);\n\n });\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular.module('admin', []);\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('admin')\n .controller('AdminController', AdminController);\n\n function AdminController($log, $scope, $state, $stateParams, $rootScope, authService, Session, ENV_VARS, REDIRECT) {\n var vm = this;\n\n // init globals for app wide inheritance\n vm.currentUser = Session.userName;\n \n vm.login = login;\n vm.logout = logout;\n\n\n\n //////////////////////\n // LOGIN / LOGOUT\n //////////////////////\n function login() {\n $log.debug(\"admin.controller-login()\");\n authService.login();\n };\n\n function logout() {\n $log.debug(\"admin.controller-logout()\");\n authService.logout();\n };\n\n\n //////////////////////\n // GLOBAL ENV VARS\n //////////////////////\n\n // app name from gulp file json\n $rootScope.appName = ENV_VARS.appName;\n\n // app name from gulp file json\n $rootScope.appDesc = ENV_VARS.appDesc;\n\n //////////////////////\n // GLOBAL MAIN VARS\n //////////////////////\n\n // we set these for login/signup\n $rootScope.setUserId = function(userId) {\n $rootScope.userId = userId;\n };\n $rootScope.setUsername = function(username) {\n $rootScope.username = username;\n };\n $rootScope.setFullname = function(fullname) {\n $rootScope.fullname = fullname;\n };\n\n //$log.debug(\"Session\", Session);\n\n $rootScope.username='';\n $rootScope.fullname='';\n\n // we set these for page refresh\n if (authService.isAuthenticated()) {\n if (Session.userId) {\n $rootScope.userId = Session.userId;\n }\n if (Session.userName) {\n $rootScope.username = Session.userName;\n }\n if (Session.userRole.account) {\n $rootScope.fullname = Session.userRole.account.name;\n }\n }\n\n\n $scope.isAuthenticated = function() {\n return authService.isAuthenticated();\n };\n\n $scope.isAuthorized = function(role) {\n return authService.isAuthorized(role);\n };\n\n $scope.isActive = function(stateLocation) {\n //$log.debug(\"main.controller-state:\", $state.current.name);\n return $state.current.name === stateLocation;\n };\n\n\n\n\n ///////////////////////////////\n // BODY ID - CSS IDENTIFIER\n ///////////////////////////////\n vm.bodyId = '';\n // set unique id on body tag for any state we specify in routes files\n $scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {\n if (toState.data && toState.data.bodyId) {\n //$log.debug(\"main.controller: toState.data.bodyId\",toState.data.bodyId);\n var bid = toState.data.bodyId;\n if (bid) {\n vm.bodyId = toState.data.bodyId;\n return;\n }\n }\n else {\n vm.bodyId = '';\n }\n });\n\n\n\n\n\n };\n\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('app', [\n 'ngAnimate',\n 'ngTouch',\n 'ngSanitize',\n 'ngMessages',\n 'ui.router',\n 'ngMask',\n 'uiSwitch',\n 'ui.slimscroll',\n 'ngAutocomplete',\n 'ui-notification',\n 'LocalStorageModule',\n 'ngFileUpload',\n 'angularTrix',\n 'ncy-angular-breadcrumb',\n 'mgcrea.ngStrap',\n 'ui.bootstrap',\n 'smart-table',\n 'angular-flot',\n // setup\n 'app.env',\n 'app.directives',\n 'app.filters',\n 'app.services',\n // login\n 'login',\n 'signup',\n // admin\n 'admin',\n 'admin.user',\n 'admin.account',\n 'admin.category',\n 'admin.event',\n 'admin.blogPost',\n 'admin.newsItem',\n 'admin.pressRelease',\n 'admin.teamMember',\n 'admin.leadership'\n ]);\n }\n)();\n\n(function() {\n 'use strict';\n\n angular\n .module('app')\n .run(runBlock);\n\n function runBlock($log, $http, $rootScope, $state, $stateParams, Notification, authService, userService, accountService) {\n\n // GET EXISTING SESSION\n // persist user session data on page refresh\n authService.getSession();\n\n if(authService.isAuthenticated() && authService.isAdmin()) {\n userService.updateCache();\n accountService.updateCache();\n }\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('app')\n .config(routeConfig);\n\n function routeConfig($stateProvider, $urlRouterProvider) {\n\n $stateProvider\n\n //////////////////////\n // ADMIN\n //////////////////////\n .state('admin', {\n url: \"\",\n templateUrl: \"app/admin/admin.view.html\",\n ncyBreadcrumb: {\n skip: true\n },\n data: {\n bodyId: 'admin'\n }\n })\n\n .state('admin-home', {\n url: \"/\",\n templateUrl: \"app/admin/admin.view.html\",\n ncyBreadcrumb: {\n skip: true\n },\n data: {\n bodyId: 'admin-home'\n },\n resolve: {\n admin: function(authSecurityService) {\n return authSecurityService.requireAdminUser();\n }\n }\n })\n\n // .state('admin.dashboard', {\n // parent: 'admin',\n // url: \"/dashboard\",\n // templateUrl: \"app/admin/sections/dashboard/dashboard.view.html\",\n // controller: 'DashboardController',\n // controllerAs: 'vm',\n // data: {\n // bodyId: 'dashboard'\n // },\n // ncyBreadcrumb: {\n // label: 'Dashboard'\n // }\n // });\n\n\n // 404\n .state('notfound', {\n parent: 'admin',\n url: '/*path',\n templateUrl: 'app/admin/admin-404.view.html',\n title: 'Page Not Found',\n ncyBreadcrumb: {\n skip: true\n },\n resolve: {\n admin: function(authSecurityService) {\n return authSecurityService.requireAdminUser();\n }\n }\n });\n\n }\n\n})();\n\nangular.module(\"app.env\", [])\n.constant(\"ENV_VARS\", {\n \"appName\": \"Twist\",\n \"appDesc\": \"\",\n \"apiUrl\": \"https://twist-api.scaliolabs.com/\",\n \"version\": \"1.0.0\"\n})\n.constant(\"AWS_S3_UPLOAD\", {\n \"AWSAccessKeyId\": \"AKIAIZBC4YX6KJZPPXVA\",\n \"policy\": \"ewogICJleHBpcmF0aW9uIjogIjIwMjAtMDEtMDFUMDA6MDA6MDBaIiwKICAiY29uZGl0aW9ucyI6IFsKICAgIHsiYnVja2V0IjogImNkbi10d2lzdGJpbyJ9LAogICAgWyJzdGFydHMtd2l0aCIsICIka2V5IiwgIiJdLAogICAgeyJhY2wiOiAicHVibGljLXJlYWQifSwKICAgIFsic3RhcnRzLXdpdGgiLCAiJENvbnRlbnQtVHlwZSIsICIiXSwKICAgIFsic3RhcnRzLXdpdGgiLCAiJGZpbGVuYW1lIiwgIiJdLAogICAgWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsIDAsIDUyNDI4ODAwMF0KICBdCn0=\",\n \"signature\": \"6RYLgD/Hj7dDFPWU7ETOuI2IgqE=\",\n \"s3url\": \"https://cdn-twistbio.s3.amazonaws.com/\"\n});\n\n(function() {\n 'use strict';\n\n angular\n .module('app')\n .constant('REDIRECT', {\n LOGIN: 'login',\n SIGNUP: 'signup',\n ADMIN: 'admin-home',\n })\n .factory('API', (function(ENV_VARS) {\n\n // controlled from /config/app.env-vars.json file\n var base = ENV_VARS.apiUrl;\n\n return {\n ACCOUNTS: base + 'api/accounts',\n ADMIN_GROUPS: base + 'api/admin-groups',\n ADMINS: base + 'api/admins',\n AUTH_ATTEMPTS: base + 'api/auth-attempts',\n CATEGORIES: base + 'api/categories',\n CONTACT: base + 'api/contact',\n BLOG: base + 'api/blog',\n EVENTS: base + 'api/events',\n HIGHLIGHTS: base + 'api/highlights',\n LOGIN: base + 'api/login',\n LOGIN_FORGOT: base + 'api/login/forgot',\n LOGIN_RESET: base + 'api/login/reset',\n LOGOUT: base + 'api/logout',\n NEWS: base + 'api/news',\n PRESS: base + 'api/press',\n SESSIONS: base + 'api/sessions',\n SIGNUP: base + 'api/signup',\n SIGNUP_INVITATION: base + 'api/signup/invitation',\n LEADERSHIP: base + 'api/leadership',\n TEAM: base + 'api/team',\n USERS: base + 'api/users',\n USERS_MY: base + 'api/users/my',\n USERS_MY_PASSWORD: base + 'api/users/my/password',\n\n }\n }))\n\n})();\n\n/**\n * Twist - Custom scripts\n */\n\nangular.element(document).ready(function($timeout) {\n\n // Full height of sidebar\n function fix_height() {\n var heightWithoutNavbar = angular.element(\"body > #wrapper\").height() - 61;\n angular.element(\".sidebard-panel\").css(\"min-height\", heightWithoutNavbar + \"px\");\n\n var navbarHeigh = angular.element('nav.navbar-default').height();\n var wrapperHeigh = angular.element('#page-wrapper').height();\n\n if (navbarHeigh > wrapperHeigh) {\n angular.element('#page-wrapper').css(\"min-height\", navbarHeigh + \"px\");\n }\n\n if (navbarHeigh < wrapperHeigh) {\n angular.element('#page-wrapper').css(\"min-height\", angular.element(window).height() + \"px\");\n }\n\n if (angular.element('body').hasClass('fixed-nav')) {\n if (navbarHeigh > wrapperHeigh) {\n angular.element('#page-wrapper').css(\"min-height\", navbarHeigh - 60 + \"px\");\n }\n else {\n angular.element('#page-wrapper').css(\"min-height\", angular.element(window).height() - 60 + \"px\");\n }\n }\n\n }\n\n angular.element(window).bind(\"load resize scroll\", function() {\n if (!angular.element(\"body\").hasClass('body-small')) {\n fix_height();\n }\n });\n\n // Move right sidebar top after scroll\n angular.element(window).scroll(function() {\n if (angular.element(window).scrollTop() > 0 && !angular.element('body').hasClass('fixed-nav')) {\n angular.element('#right-sidebar').addClass('sidebar-top');\n }\n else {\n angular.element('#right-sidebar').removeClass('sidebar-top');\n }\n });\n\n $timeout(function() {\n fix_height();\n });\n\n\n // Minimalize menu when screen is less than 768px\n angular.element(window).bind(\"load resize\", function() {\n if (angular.element(document).width() < 769) {\n angular.element('body').addClass('body-small')\n }\n else {\n angular.element('body').removeClass('body-small')\n }\n })\n\n});\n\n(function() {\n 'use strict';\n\n angular\n .module('app')\n .config(config);\n\n function config($logProvider, $locationProvider, $httpProvider, NotificationProvider, $modalProvider, $provide, ENV_VARS) {\n\n // LOGGING (turn on/off globally)\n if (ENV_VARS.debug==\"true\") {\n $logProvider.debugEnabled(true);\n }\n else {\n $logProvider.debugEnabled(false);\n }\n\n // CLEAN URLS\n $locationProvider.hashPrefix('!');\n $locationProvider.html5Mode({ enabled: true, requireBase: false });\n\n // AUTH INTERCEPTOR SERVICE (SNIFF FOR 401s)\n $httpProvider.interceptors.push('authInterceptorService');\n\n // UI-NOTIFICATION\n NotificationProvider.setOptions({\n startTop: 15,\n startRight: 20\n });\n\n // ANGULAR STRAP MODAL DEFAULTS\n angular.extend($modalProvider.defaults, {\n html: true\n });\n\n }\n\n})();\n\nangular.module(\"app\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"app/404.view.html\",\"

Page Not Found

The resource you requested doesn\\'t exist.

\");\n$templateCache.put(\"app/admin/admin-404.view.html\",\"

Page Not Found

The resource you requested doesn\\'t exist.

\");\n$templateCache.put(\"app/admin/admin-breadcrumb.view.html\",\"
\");\n$templateCache.put(\"app/admin/admin-footer.view.html\",\"
Copyright Twist © 2016
\");\n$templateCache.put(\"app/admin/admin-header.view.html\",\"
\");\n$templateCache.put(\"app/admin/admin-home.view.html\",\"

Hello

Welcome to Twist Admin.

\");\n$templateCache.put(\"app/admin/admin-sidebar.view.html\",\"\");\n$templateCache.put(\"app/admin/admin.view.html\",\"
\");\n$templateCache.put(\"app/login/login.view.html\",\"
\\\"\\\"
This field is required
This field is required
\");\n$templateCache.put(\"app/signup/signup.view.html\",\"

Sign Up

A valid invitation is required to join Ella.
This field is required
This field is required Please enter a valid email
This field is required
\");\n$templateCache.put(\"app/login/forgot/login-forgot.view.html\",\"
\\\"\\\"
This field is required Please enter a valid email
\");\n$templateCache.put(\"app/login/modal/login-modal.view.html\",\"

Log In

This field is required
This field is required
 
\");\n$templateCache.put(\"app/login/reset/login-reset.view.html\",\"

Reset Your Password?

Please input your password The password needs to be at least 5 characters
Please comfirm your password Password and confirmation do not match
\");\n$templateCache.put(\"app/admin/sections/account/account.view.html\",\"
Accounts
Loading...
Full NameUsernameEmailCreated
{{account.name.first}} {{account.name.last}}{{account.user.name}}{{ account.timeCreated | formatTime:true }}
\");\n$templateCache.put(\"app/admin/sections/blog-post/blog-post.view.html\",\"
Blog Posts
Loading...
Header ImageTitleCreated
{{blogPost.title}}{{ blogPost.created | formatTime:true }}
\");\n$templateCache.put(\"app/admin/sections/category/category.view.html\",\"
Blog Categories
Loading...
NameCreated
{{category.name}}{{ category.timeCreated | formatTime:true }}
\");\n$templateCache.put(\"app/admin/sections/event/event.view.html\",\"
Events
Loading...
ImageTitleURLStart DateEnd DateLocation
{{event.title}}{{event.url}}{{ event.startDate | formatTime:true }}{{ event.endDate | formatTime:true }}{{ event.location }}
\");\n$templateCache.put(\"app/admin/sections/leadership/leadership.view.html\",\"
Leadership
Loading...
ImageNamePositionCreated
{{leadership.name}}{{ leadership.position }}{{ leadership.created | formatTime:true }}
\");\n$templateCache.put(\"app/admin/sections/news-item/news-item.view.html\",\"
News Items
Loading...
ImageTitleURLDate
{{newsItem.title}}{{newsItem.url}}{{ newsItem.date | formatTime:true }}
\");\n$templateCache.put(\"app/admin/sections/press-release/press-release.view.html\",\"
Press Releases
Loading...
TitleDate
{{pressRelease.title}}{{ pressRelease.date | formatTime:true }}
\");\n$templateCache.put(\"app/admin/sections/team-member/team-member.view.html\",\"
Team Member
Loading...
ImageNameCreated
{{teamMember.name}}{{ teamMember.created | formatTime:true }}
\");\n$templateCache.put(\"app/admin/sections/account/account-add/account-add.view.html\",\"

Add Account

Complete the fields provided to add the account. All fields are required.

This field is required
\");\n$templateCache.put(\"app/admin/sections/account/account-edit/account-edit.view.html\",\"

Account:  {{vm.account.first | capitalize}} {{vm.account.last | capitalize}}

Details
This field is required
This field is required
Account Created: {{ vm.account.timeCreated | formatTime:true }}
\");\n$templateCache.put(\"app/admin/sections/blog-post/blog-post-add-edit/blog-post-add-edit.view.html\",\"

{{vm.editing == true ? \\'Edit\\' : \\'Add\\'}} Blog Post

Details
This field is required
Please select a category
A header image is required - Max file upload size is 3MB
0\\\">
This field is required
The Release Date is invalid (must be at least {{ vm.getCurrentDate() | formatTime: true }})
SEO Settings
This field is required
This field is required
\");\n$templateCache.put(\"app/admin/sections/category/category-add/category-add.view.html\",\"

Add Blog Category

Complete the fields provided to add the category. All fields are required.

This field is required
\");\n$templateCache.put(\"app/admin/sections/category/category-edit/category-edit.view.html\",\"

Blog Category:  {{vm.category.name | capitalize}}

This field is required
Category Created: {{ vm.category.timeCreated | formatTime:true }}
\");\n$templateCache.put(\"app/admin/sections/event/event-add-edit/event-add-edit.view.html\",\"

{{vm.editing == true ? \\'Edit\\' : \\'Add\\'}} Event

This field is required
This field is required
This field is required
This field is required
This field is required
A thumbnail is required
0\\\">
\");\n$templateCache.put(\"app/admin/sections/leadership/leadership-add-edit/leadership-add-edit.view.html\",\"

{{vm.editing == true ? \\'Edit\\' : \\'Add\\'}} Leadership

This field is required
This field is required
The minimum order is \\\"1\\\"
A image is required
0\\\">
\");\n$templateCache.put(\"app/admin/sections/news-item/news-item-add-edit/news-item-add-edit.view.html\",\"

{{vm.editing == true ? \\'Edit\\' : \\'Add\\'}} News Item

This field is required
This field is required
This field is required
A thumbnail is required
0\\\">
The Release Date is invalid (must be at least {{ vm.getCurrentDate() | formatTime: true }})
\");\n$templateCache.put(\"app/admin/sections/press-release/press-release-add-edit/press-release-add-edit.view.html\",\"

{{vm.editing == true ? \\'Edit\\' : \\'Add\\'}} Press Release

Details
This field is required
This field is required
A PDF is required
0\\\">
The Release Date is invalid (must be at least {{ vm.getCurrentDate() | formatTime: true }})
SEO Settings
This field is required
This field is required
\");\n$templateCache.put(\"app/admin/sections/team-member/team-member-add-edit/team-member-add-edit.view.html\",\"

{{vm.editing == true ? \\'Edit\\' : \\'Add\\'}} Team Member

This field is required
A image is required
0\\\">
\");\n$templateCache.put(\"app/admin/sections/user/user-add/user-add.view.html\",\"

Add User

Complete the fields provided to add the User. All fields are required.

This field is required
This field is required
This field is required Please enter a valid email
This field is required
\");}]);"],"sourceRoot":"/source/"}