{"version":3,"sources":["scripts/app-ca127ba875.js"],"names":["config","$stateProvider","state","url","views","content@app","templateUrl","controller","bodyClass","$inject","angular","module","CustomThemeDialogController","fuseTheming","$mdDialog","fuseGenerator","$cookies","$window","setTheme","putObject","vm","theme","put","location","reload","closeDialog","hide","this","palettes","getRegisteredPalettes","themes","getRegisteredThemes","grey","rgba","custom","colors","copy","$translatePartialLoaderProvider","msNavigationServiceProvider","params","screener","sport","home","newScreener","resolve","ResearchData","apiResolver","page","limit","ScreenerData","ConstantsData","authenticate","inactiveUserAccessible","addPart","saveItem","title","weight","icon","stateParams","ScreenerDialogController","$mdToast","$rootScope","$scope","$cacheFactory","researchSettings","update","event","api","saveScreener","name","screenerForm","description","partialScreener","op","path","value","partial","id","response","$httpDefaultCache","get","remove","apiURL","show","simple","textContent","position","hideDelay","console","log","constants","errors","PaperTradeData","PaperTradesList","range","stateOpts","PaperTradeDialogController","$analytics","betTypes","spreadTeams","spreadWagerTypes","totalsWagerTypes","moneylineWagerTypes","marketGroupings","tradingBehaviors","wlUtil","papertrade","changeBetType","betType","formBetClass","toLowerCase","form","wagerType","savePaperTrade","newPapertrade","oddsType","wagerAmount","matchID","match","userID","user","marketGrouping","tradingBehavior","betTypeKey","oddsID","spreadOdds","totalsOdds","moneylineOdds","opKey","merge","lookupEnumObjectByID","eventTrack","category","label","errorMessage","status","paperTradeDenied","i","length","push","main@","content@app.pages_errors_error-500","Error500Controller","content@app.pages_errors_error-404","Error404Controller","$httpProvider","content@app.pages_auth_login","runBlock","$injector","$timeout","$state","$location","$on","toState","toParams","fromState","fromParams","sessionStorage","JSON","parse","subscriptionStatus","moment","isAfter","subscriptionExpirationDate","loadingProgress","run","LoginController","$httpParamSerializer","grant_type","userName","email","password","isSubmitting","login","save","token","access_token","firstName","lastName","username","phonenumber","phoneNumber","timezone","oddsFormat","alertFrequency","defaultCreditCardID","productSubscriptionID","paypalSubscriptionID","debugMode","stringify","paypalSubscriptionDetails","isActive","profileInfo","SubscriptionStatus","SubscriptionExpirationDate","billing_info","next_billing_time","editSubscriptionInfo","go","isBefore","alert","clickOutsideToClose","parent","element","document","body","ariaLabel","ok","checkLocalStorage","result","uid","Date","localStorage","setItem","getItem","removeItem","exception","removeAll","screenerSummary","content@app.pages_auth_reset-password","ResetPasswordController","resetPassword","data","userId","reset_password","search","modelState","serverErrorMessage","content@app.pages_auth_forgot-password","ForgotPasswordController","forgotPassword","baseUrl","protocol","host","port","forgot_password","resetUrl","CreditCardDialogController","creditCards","creditCard","saveCreditCard","submitting","creditCardForm","company","billingAddress","streetAddress","address1","streetAddress2","address2","city","province","postalCode","countryID","country","cardType","expirationMonth","cardExpirationMonth","expirationYear","cardExpirationYear","cardNumber","cardCvv","default","defaultCard","authorizeNetCIMToken","billingAddressID","credit_card","edit","creditCardError","add","countries","appData","cardTypes","creditCardTypes","cardStatuses","creditCardStatuses","date","ThemeColorsController","$document","createTheme","ev","controllerAs","targetEvent","MsWidgetController","$element","flip","isFlippable","flipped","toggleClass","isDefined","flippable","msWidgetDirective","restrict","scope","transclude","compile","tElement","addClass","iElement","iAttrs","MsWidgetCtrl","transcludeFn","clone","empty","append","msWidgetFrontDirective","require","flipWidget","msWidgetBackDirective","directive","MsTimelineController","setScrollEl","scrollEl","getScrollEl","undefined","msTimelineDirective","loadMore","MsTimelineCtrl","onScroll","scrollTop","height","threshold","loadMoreEl","top","unregisterOnScroll","then","removeClass","registerOnScroll","on","off","msTimelineItemDirective","$q","init","find","args","cardEl","testForImage","itemLoaded","testForVisibility","deferred","defer","imgEl","promise","itemInViewport","itemReadyWatcher","$watch","current","old","equals","matchDirective","link","elm","attrs","ctrl","$validators","modelValue","marketvalueDirective","marketvalue","team","msSplashScreenDirective","$animate","splashScreenRemoveEvent","leave","msSidenavHelperDirective","MdSidenavCtrl","isOpen","isLockedOpen","isUndefined","msSearchBarDirective","expanderEl","collapserEl","expand","collapse","escKeyEvent","e","keyCode","msScrollConfigProvider","configuration","defaultConfiguration","extend","wheelSpeed","wheelPropagation","swipePropagation","minScrollbarLength","maxScrollbarLength","useBothWheelAxes","useKeyboard","suppressScrollX","suppressScrollY","scrollXMarginOffset","scrollYMarginOffset","stopPropagationOnClick","$get","getConfig","service","msScrollDirective","msScrollConfig","msUtils","fuseConfig","isMobile","updateScrollbar","PerfectScrollbar","options","msScroll","$eval","initialize","prop","destroy","provider","msResponsiveTableDirective","wrapper","after","msRandomClassDirective","msRandomClass","randomClass","Math","floor","random","saveLink","item","parts","split","_findOrCreateParent","updateItem","_id","href","children","isNumber","_path","isString","$log","error","uisref","_getUiSref","uisrefopts","_getUiSrefOpts","deleteItem","navigation","p","splice","sortByWeight","sort","_byWeight","pop","createParent","join","x","y","parseInt","isObject","injector","setActiveItem","node","activeItem","getActiveItem","getNavigationObject","root","setNavigationScope","navigationScope","setFolded","folded","getFolded","setFoldedOpen","foldedOpen","getFoldedOpen","toggleFolded","MsNavigationController","msNavigationService","toggleHorizontalMobileMenu","msNavigationDirective","$mdSidenav","$broadcast","bodyEl","setFoldExpander","$emit","removeFoldCollapser","foldExpanderEl","onFoldExpanderHover","setFoldCollapser","foldCollapserEl","onFoldCollapserHover","preventDefault","sidenav","close","MsNavigationNodeController","hasChildren","group","collapsable","collapsed","includes","$evalAsync","givenPathParts","activePathParts","indexOf","toggleCollapsed","collapseEl","offsetHeight","animate","display","animateHeightClass","css","expandEl","visibility","getClass","hideVerticalMobileMenu","toggle","msNavigationNodeDirective","bindToController","MsNavigationNodeCtrl","msNavigationItemDirective","msNavigationHorizontalDirective","MsNavigationHorizontalNodeController","msNavigationHorizontalNodeDirective","MsNavigationHorizontalNodeCtrl","msNavigationHorizontalItemDirective","$mdMedia","onClick","msNavFoldService","setFoldable","foldable","isNavFoldedOpen","toggleFold","openFolded","closeFolded","msNavIsFoldedDirective","isFoldedOpen","isFolded","fold","unfold","sidenavEl","openOverlay","closeOverlay","msNavIsFolded","MsNavController","isDisabled","disabled","disable","enable","setToggleItem","toggleItems","getLockedItems","lockedItems","setLockedItem","clearLockedItems","msNavDirective","$mdComponentRegistry","stateChangeSuccessEvent","when","msNavTitleDirective","msNavButtonDirective","msNavToggleDirective","tAttrs","attr","MsNavCtrl","isCollapsed","isExpanded","reject","elementToExpand","classes","expandAnimation","expanded","success","elementToCollapse","collapseAnimation","links","states","regExp","forEach","replace","locked","lockedItem","currentState","shouldExpand","factory","MsFormWizardController","registerForm","forms","previousStep","selectedIndex","nextStep","goToStep","index","isFirstStep","isLastStep","currentStepInvalid","$invalid","formsIncomplete","resetForm","$setPristine","$setUntouched","msFormWizardDirective","msFormWizardFormDirective","ctrls","formCtrl","MsFormWizardCtrl","msCardDirective","templatePath","card","template","cardTemplateLoaded","content@app.pages_maintenance","MaintenanceController","ScreenerController","deleteScreener","confirm","cancel","screeners","screenerID","j","screenerModels","matchCount","CreditCardData","SubscriptionData","ProfileController","checkout","getProductByFilter","saveProfile","profileForm","zoneId","oldPassword","newPassword","addCreditCard","locals","editCreditCard","deleteCreditCard","cancelAccount","setCreditCardAsDefault","userProductInfo","filteredProduct","productName","timezones","alertFrequencies","ResearchController","$stateParams","$interval","$anchorScroll","setIsScreenLTESm","isScreenLTESm","loadMatch","loadNewMatch","selectedMatch","loadMatchChart","selectedMarketGrouping","values","matchesBack","upcomingMatches","rows","chartData","prepareMatchChartData","selectedTradingBehavior","matchChartOptions","categoryField","addClassNames","valueAxes","axisAlpha","inside","graphs","dataProvider","listeners","method","graphItemClick","startEffect","allLabels","text","bold","align","serialChartOptionDefaults","balloonFunction","formatTotalsChartBalloon","formatAtsMoneylineChartBalloon","showHandOnHover","showBalloon","viewMatchDetail","noGroupingVisible","$","hash","closeMatchDetail","resetChartLines","AmCharts","charts","selectMatchBetType","activeRow","target","parents","hasClass","loadNextMatch","isLastMatch","criteria","refresh","nextSelectedIndex","loadMatchByIndex","loadPreviousMatch","isFirstMatch","pageCount","selectChartDataPoint","$event","stopPropagation","selectedMatchDataPoint","highlightChartCursor","rowElement","getAmChartByID","getSelectedMarketGroupingMatchLength","unhighlightChartCursor","graphDataItem","graph","divergence","homeVolatility","dataContext","awayVolatility","abs","wolflineValue","getAlertLevelByWolfline","formatWolflineNumber","volatility","enableLineDrawing","type","chartLine","enabled","disableLineDrawing","trendline","clearTrendLines","chartID","chart","trendLines","validateNow","clearGuideLines","guides","finalCategory","finalValue","addTrendLine","initialCategory","initialValue","lineColor","lineThickness","offsetX","layerX","offsetY","layerY","bullet","bulletGraphics","setAttribute","guide","Guide","lineAlpha","addGuide","chartMouseMove","changeResultsMarketGrouping","grouping","changeResultsTradingBehavior","behavior","pageMatchResults","toggleNoGroupingRow","parentRow","currentTarget","prev","noGroupingContainer","next","horizPadding","width","html","noGroupingContent","eq","noMarketGrouping","slideUp","slideDown","toggleNoGrouping","parentContainer","table","className","overflow-x","openPaperTradeDialog","queryOddsTypes","wagerTypes","findById","openScreenerDialog","openHelpDialog","key","htmlContent","help","openDialog","content","setDefaultResearchSettings","markets","advancedSettingsVisible","conditions","alerts","startNewScreenerWizard","tournament","wizard","editMode","matchResults","showResultsPanel","alertMarketGroupings","editScreener","selectScreenerMarket","row","s","multiple","tournamentGroups","unshift","allTournaments","loadScreener","marketQueries","query","tournamentGroup","sports","condition","operator","mathOperators","alertQueries","numberOfAlerts","queryRange","ranges","conditionOperator","queryOperators","alertLevel","alertLevels","saveAndRunScreener","prepareScreenerFromResearchSettings","marketQuery","sportID","tournamentGroupID","marketQueryConditionValue","convertAmericanPriceToDecimal","marketQueryCondition","alertQuery","showLoading","defaultMatchResultsTitle","preview","matches","hideLoading","setUpcomingMatches","searching","previewScreener","previewTitle","changeScreenerTradingBehavior","toggleScreenerAdvancedMarketSettings","addScreenerMarketQuery","deleteScreenerMarketQuery","addScreenerMarketQueryCondition","deleteScreenerMarketQueryCondition","addScreenerAlert","deleteScreenerAlert","screenerAlertOperatorSelected","nextIndex","numOfItems","changeScreenerMarketGrouping","exitScreenerWizard","callback","allCharts","div","togglePanelContent","panel","goHome","goToScreeners","resetHomeState","shift","matchDetailColumns","rangeGroupLength","alertQueryRanges","startingIndex","endingIndex","rangeGroup","slice","alertRange","columns","getMarketQueryColumns","getAlertQueryColumns","research","lastSearch","rowCount","refreshPaginator","setLimit","clearSearch","selectedMatchIndex","_this","allChartData","startingRow","endingRow","ceil","paginator","Array","active","columnIntervals","concat","activeTournamentGroups","createNewScreenerName","getById","originalResearchSettings","invalidateCache","matchStatus","matchDateTimeUtc","utc","matchDate","hasOdds","inProgress","drawTrendLine","getAlertLevel","getTradingBehaviorIndicator","getTotalsTradingBehaviorIndicator","gotoScreeners","bind","PapertradeController","editPaperTrade","oddsTypes","changeCriteriaLimit","getPaperTrades","loadingPaperTrades","paperTradesList","papertrades","paperTrades","setPaperTradesOddsType","setPaperTradesSpreadInfo","setPaginator","tradeTotals","volume","totalVolume","earned","totalEarned","getPaperTradesByRange","paperTradeCount","paperTradeData","togglePaperTradeWolfline","wolflineVisible","getPaperTradeSpreadInfo","juice","homeCompetitor","odds","homeJuicePrice","favorite","awayCompetitor","awayJuicePrice","trade","refreshPaperTrades","reportRanges","getMatchStatusById","matchStatuses","pagePaperTradeResults","OrderData","OrderHistoryController","orders","hidden","FaqController","CheckoutController","step","test","selectedSubscription","selectedSubscriptionID","existingCreditCard","subscriptions","reviewCheckout","cart","items","useNewCreditCard","creditCardID","lastFour","substr","productIds","subscriptionID","transaction","affiliation","revenue","totalAmount","tax","shipping","currency","ga","transactionItem","sku","price","quantity","earlyBirdSubscription","montlySubscription","yearlySubscription","total","setTax","accountPastExpiration","checkoutRedirect","editSubscriptionPlan","DashboardData","DashboardController","dashboardData","widget1","widget2","widget3","widget4","widget7","MsThemeOptionsController","setActiveTheme","themeName","updateLayoutMode","layoutMode","updateLayoutStyle","layoutStyle","msThemeOptions","panelOpen","toggleOptionsPanel","closeOptionsPanel","openOptionsPanel","backdropEl","fuseThemingProvider","setRegisteredPalettes","_registeredPalettes","registeredPalettes","setRegisteredThemes","_registeredThemes","registeredThemes","invoke","_$cookies","list","warn","setThemesList","themeList","$mdThemingProvider","fusePalettes","fuseThemes","customTheme","getObject","alwaysWatchTheme","palette","definePalette","primaryPalette","primary","hues","accentPalette","accent","warnPalette","backgroundPalette","background","_PALETTES","_THEMES","hue-1","hue-2","hue-3","pink","teal","constant","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","contrastDefaultColor","contrastDarkColors","contrastStrongLightColors","fuseGeneratorService","generate","registeredTheme","colorType","colorTypeName","levels","color","contrast1","contrast","contrast2","contrast3","contrast4","hue1","hue2","hue3","processAndStoreThemes","styleVars","colorTypes","colorLevelName","colorName","ucfirst","render","_themes","selectedTheme","cssTemplate","regex","RegExp","Object","keys","matched","headEl","styleEl","_contrastLevel","contrastLevel","applyContrast","contrastLevels","white","1","2","3","4","black","string","charAt","toUpperCase","defaultOptions","pathToImages","legend","chartScrollbar","chartCursor","cursorAlpha","zoomable","categoryAxis","gridPosition","parseDates","balloon","textAlign","numberOfGames","totalsTitle","ats","valueField","totals","moneyline","matchVolatilityData","getMatchVolatilityData","lastAtsRecord","atsLineColors","getChartLineColors","away","lastMoneylineRecord","moneylineLineColors","lastTotalsRecord","greenLineColor","redLineColor","homeCompetitorResults","awayCompetitorResults","homeData","reverse","awayData","atsHomeVolatility","sumPropertyOfObjectArray","atsAwayVolatility","totalsHomeVolatility","totalsAwayVolatility","moneylineHomeVolatility","moneylineAwayVolatility","homeValue","awayValue","lineColors","a","property","sum","parseFloat","n","objects","decimal","toFixed","o","findBy","indicator","volatilityData","typeVolatilityData","lastVolatilityRecord","increment","lastSuffix","newSuffix","trim","convertDecimalPriceToAmerican","round","exists","detectBrowser","searchString","dataString","dataProp","versionSearchString","versionSearch","identity","subString","searchVersion","substring","browserInfo","browserData","navigator","userAgent","vendor","opera","osData","platform","browser","version","appVersion","os","guidGenerator","S4","toString","mobileDetect","mobile","toggleInArray","array","MobileDetect","apiResolverService","action","parameters","actionParts","resource","apiObject","getApiObject","resourceParts","l","toWolflineNumberFilter","wolflineNumberAlertFilter","formatOddsFilter","filter","filterByTags","tags","filtered","every","tag","tagExists","itemTag","filterSingleByTags","itemTags","toTrustedFilter","$sce","trustAsHtml","htmlToPlainTextFilter","String","nospaceFilter","humanizeDocFilter","doc","$1","reverseArrayFilter","formatDateFilter","dateString","format","tz","logFilter","obj","isEmptyObjectFilter","emptyToTextFilter","val","emptyText","toMoneyFilter","truncate","textAfter","oddsDirective","$formatters","hljsDirective","$interpolate","code","contents","codeElement","lines","line","firstLineWhitespace","startingWhitespaceRegex","map","highlightedCode","hljs","highlight","language","lang","shouldInterpolate","contentParent","amchartDirective","$el","guid","s4","renderChart","amChartOptions","baseHref","makeChart","clear","fuseConfigProvider","fuseConfiguration","disableCustomScrollbars","disableMdInkRippleOnMobile","disableCustomScrollbarsOnMobile","configName","setConfig","configValue","QuickPanelController","ToolbarController","$translate","oddsFormats","selectedOddsFormat","selectedLanguage","languages","preferredLanguage","toggleSidenav","sidenavId","logout","changeLanguage","message","use","changeOddsFormat","set_odds_format","en","translation","flag","NavigationController","toggleMsNavigationFolded","msScrollOptions","interceptors","MainController","AppData","Constants","checkoutMenu","visible","checkoutMenuSettings","badge","hideAllOthers","summary","totalMatchCount","targetScope","$id","htmlClass","$ariaProvider","$logProvider","uiGmapGoogleMapApiProvider","$translateProvider","$provide","tabindex","debugEnabled","toastr","timeOut","positionClass","preventDuplicates","progressBar","configure","v","libraries","useLoader","urlTemplate","useSanitizeValueStrategy","decorator","taOptions","toolbar","focussed","toolbarGroup","toolbarButton","toolbarButtonActive","textEditor","htmlEditor","taTools","iconclass","italics","underline","ul","ol","quote","Idle","watch","stateChangeStartEvent","routeConfig","$urlRouterProvider","$locationProvider","html5Mode","otherwise","layouts","verticalNavigation","main","horizontalNavigation","contentOnly","contentWithToolbar","abstract","toolbar@app","navigation@app","quickPanel@app","IndexController","docTitle","events","countdown","IdleProvider","KeepaliveProvider","idle","timeout","apiInterceptor","request","headers","Authorization","responseError","apiService","$resource","basePath","app","cache","subscription","isArray","Content-Type","profile","set_alert_frequency","delete","$templateCache"],"mappings":"CAAA,WAEI,YAOA,SAASA,GAAOC,GAEZA,EAAeC,MAAM,uBACjBC,IAAW,mBACXC,OACIC,eACIC,YAAa,6CACbC,WAAa,gCAGrBC,UAAW,iBAfnBR,EAAOS,SAAW,kBAAlBC,QACKC,OAAO,0BACPX,OAAOA,MAkBhB,WAEI,YAOA,SAASY,GAA4BC,EAAaC,EAAWC,EAAeC,EAAUC,GA+BlF,QAASC,KAELF,EAASG,UAAU,cAAeC,EAAGC,OACrCL,EAASM,IAAI,gBAAiB,UAC9BL,EAAQM,SAASC,SAMrB,QAASC,KAELX,EAAUY,OAxCd,GAAIN,GAAKO,IACTP,GAAGQ,SAAWf,EAAYgB,wBAC1BT,EAAGU,OAASjB,EAAYkB,4BAGjBX,GAAGQ,SAASI,KAAK,KAGxBZ,EAAGa,KAAOlB,EAAckB,KACxBb,EAAGF,SAAWA,EACdE,EAAGK,YAAcA,EAKXL,EAAGU,OAAOI,OAMZd,EAAGC,MAAQD,EAAGU,OAAOI,OAAOC,OAJ5Bf,EAAGC,MAAQX,QAAQ0B,KAAKhB,EAAGU,OAAO,WAAWK,QAxBrDvB,EAA4BH,SAAW,cAAe,YAAa,gBAAiB,WAAY,WADhGC,QACKC,OAAO,uBACPJ,WAAW,8BAA+BK,MAkDnD,WAEE,YAOA,SAASZ,GAAOC,EAAgBoC,EAAiCC,GAG/DrC,EAAeC,MAAM,gBACnBC,IAAW,YACXoC,QACEC,SAAU,KACVC,MAAO,KACPC,MAAM,EACNC,aAAa,GAEfvC,OACEC,eACEC,YAAa,kCACbC,WAAa,6BAGjBqC,SACEC,cAAA,cAAc,SAAUC,GAEtB,MAAOA,GAAYF,QAAQ,qBAAuBG,KAAM,EAAGC,MAAO,OAEpEC,cAAA,cAAc,SAAUH,GAEtB,MAAOA,GAAYF,QAAQ,yBAE7BM,eAAA,cAAe,SAAUJ,GAEvB,MAAOA,GAAYF,QAAQ,6BAG/BpC,UAAW,WACX2C,cAAc,EACdC,wBAAwB,IAI1Bf,EAAgCgB,QAAQ,qBAGxCf,EAA4BgB,SAAS,QACnCC,MAAQ,OACRC,OAAQ,EACRC,KAAM,YACNvD,MAAO,eACPwD,aAAehB,MAAM,KAhDzB1C,EAAOS,SAAW,iBAAkB,kCAAmC,+BAFvEC,QACGC,OAAO,mBACPX,OAAOA,MAsDZ,WAEE,YAOA,SAAS2D,GAAyB7C,EAAW8C,EAAUC,EAAYC,EAAQC,EAAeC,EAAkBC,EAAQC,EAAOC,GAkBzH,QAASC,KAKP,GAHAhD,EAAG4C,iBAAiBK,KAAOjD,EAAGkD,aAAaD,KAC3CjD,EAAG4C,iBAAiBO,YAAcnD,EAAGkD,aAAaC,YAE/CN,EAAQ,CAET,GAAIO,KACAC,GAAI,UAAWC,KAAM,OAAQC,MAAOvD,EAAGkD,aAAaD,OACpDI,GAAI,UAAWC,KAAM,cAAeC,MAAOvD,EAAGkD,aAAaC,aAG/DJ,GAAI3B,SAASoC,QAAQX,QAASY,GAAIzD,EAAG4C,iBAAiBa,IAAML,EAC1D,SAAUM,GACR,GAAIC,GAAoBhB,EAAciB,IAAI,QAC1CD,GAAkBE,OAAOpB,EAAWqB,OAAS,iBAE7CpE,EAAUY,KAAKoD,GAEflB,EAASuB,KACPvB,EAASwB,SACNC,YAAY,mBACZC,SAAS,aACTC,UAAU,OAIjB,SAAUT,GACRU,QAAQC,IAAIX,GACZlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAArB9B,YACZyB,SAAS,aACTC,UAAU,QAMrB9D,IAGF,QAASA,KAEPX,EAAUY,OA5DZ,GAAIN,GAAKO,IAGTP,GAAGmC,MAAQ,gBACXnC,EAAG4C,iBAAmBA,EACtB5C,EAAGkD,gBAEHlD,EAAGkD,aAAaD,KAAOL,EAAiBK,KACxCjD,EAAGkD,aAAaC,YAAcP,EAAiBO,YAE/CT,EAAO4B,UAAY7B,EAAW6B,UAG9BtE,EAAGgD,aAAeA,EAClBhD,EAAGK,YAAcA,EAlBnBkC,EAAyBlD,SAAW,YAAa,WAAY,aAAc,SAAU,gBAAiB,mBAAoB,SAAU,QAAS,OAH7IC,QACGC,OAAO,gBACPJ,WAAW,2BAA4BoD,MAsE5C,WAEE,YAOA,SAAS3D,GAAOC,EAAgBoC,EAAiCC,GAG/DrC,EAAeC,MAAM,kBACnBC,IAAW,cACXC,OACEC,eACEC,YAAa,uCACbC,WAAa,+BAGjBqC,SACEgD,gBAAA,cAAgB,SAAU9C,GAExB,MAAOA,GAAYF,QAAQ,yBAE7BiD,iBAAA,cAAiB,SAAU/C,GAEzB,MAAOA,GAAYF,QAAQ,wBAA0BkD,MAAO,MAAO/C,KAAM,EAAGC,MAAO,OAErFE,eAAA,cAAe,SAAUJ,GAEvB,MAAOA,GAAYF,QAAQ,6BAG/BpC,UAAW,aACX2C,cAAc,EACdC,wBAAwB,IAK1Bd,EAA4BgB,SAAS,cACnCC,MAAQ,eACRC,OAAQ,EACRC,KAAM,YACNvD,MAAO,iBACP6F,WACEvE,QAAQ,KAvCdxB,EAAOS,SAAW,iBAAkB,kCAAmC,+BAJvEC,QACGC,OAAO,qBACPX,OAAOA,MAgDZ,WAEE,YAOA,SAASgG,GAA2BnC,EAAYC,EAAQhD,EAAW8C,EAAUqC,EAAYlC,EAAemC,EAAUC,EAAaC,EAAkBC,EAAkBC,EAAqBC,EAAiBC,EAAkBC,EAAQvC,EAAOC,EAAKuC,EAAYhB,GAoDzP,QAASiB,GAAcC,GAErBxF,EAAGyF,aAAeD,EAAQvC,KAAKyC,cAC/B1F,EAAG2F,KAAKC,UAAY,KAGtB,QAASvF,KAEPX,EAAUY,OAGZ,QAASuF,KAEP,GAAIC,IACFC,SAAU/F,EAAG2F,KAAKH,QAAQ/B,GAC1BmC,UAAW5F,EAAG2F,KAAKC,UAAUnC,GAC7BuC,YAAahG,EAAG2F,KAAKK,YACrBC,QAASjG,EAAGkG,MAAMzC,GAClB0C,OAAQ1D,EAAW2D,KAAK3C,GACxB4C,eAAgBf,EAAWe,eAAe5C,GAC1C6C,gBAAiBhB,EAAWgB,gBAAgB7C,GAG3C6B,GAAW7B,KACZqC,EAAcrC,GAAK6B,EAAW7B,GAIhC,IAAI8C,EACqB,IAAtBvG,EAAG2F,KAAKH,QAAQ/B,IACjB8C,EAAa,MACbT,EAAcU,OAASxG,EAAGkG,MAAMO,WAAWhD,IACb,GAAtBzD,EAAG2F,KAAKH,QAAQ/B,IACxB8C,EAAa,SACbT,EAAcU,OAASxG,EAAGkG,MAAMQ,WAAWjD,KAE3C8C,EAAa,YACbT,EAAcU,OAASxG,EAAGkG,MAAMS,cAAclD,GAKhD,IAAIJ,GAAK,OACLuD,EAAQ,KACTtB,GAAW7B,KACZJ,EAAK,SACLuD,EAAQ,QAIVlH,EAAUY,MAEV,IAAIqD,GAAoBhB,EAAciB,IAAI,QAE1Cb,GAAIuC,WAAWiB,GAAYK,GAAOvD,GAAIyC,EACpC,SAAUpC,GACRC,EAAkBE,OAAOpB,EAAWqB,OAAS,mBAC7CH,EAAkBE,OAAOpB,EAAWqB,OAAS,0BAE7CxE,QAAQuH,MAAMvB,EAAYQ,GAG1BR,EAAWS,SAAWV,EAAOyB,qBAAqBxB,EAAWS,SAAU/F,EAAG8E,UAC7C,GAA1BQ,EAAWS,SAAStC,GACrB6B,EAAWM,UAAYP,EAAOyB,qBAAqBxB,EAAWM,UAAW5F,EAAGgF,kBAC1C,GAA1BM,EAAWS,SAAStC,GAC5B6B,EAAWM,UAAYP,EAAOyB,qBAAqBxB,EAAWM,UAAW5F,EAAGiF,kBAE5EK,EAAWM,UAAYP,EAAOyB,qBAAqBxB,EAAWM,UAAW5F,EAAGkF,qBAG9EI,EAAWe,eAAiBhB,EAAOyB,qBAAqBxB,EAAWe,eAAgBrG,EAAGmF,iBACtFG,EAAWgB,gBAAkBjB,EAAOyB,qBAAqBxB,EAAWgB,gBAAiBtG,EAAGoF,kBAG5E,OAATwB,IACD/B,EAAWkC,WAAW,WAAcC,SAAU,aAAcC,MAAO3B,EAAWS,SAAS9C,KAAKyC,cAAenC,MAAO+B,EAAWU,cAC7HnB,EAAWkC,WAAW,SAAYC,SAAU,aAAcC,MAAO3B,EAAWY,MAAM7E,MAAM4B,KAAKyC,iBAG/FlD,EAASuB,KACPvB,EAASwB,SACNC,YAAY,sBACZC,SAAS,aACTC,UAAU,OAGjB,SAAUT,GACR,GAAIwD,GAAezE,EAAW6B,UAAUC,OAArB9B,UACG,MAAnBiB,EAASyD,SACVD,EAAezE,EAAW6B,UAAUC,OAAO6C,kBAG7C5E,EAASuB,KACPvB,EAASwB,SACNC,YAAYiD,GACZhD,SAAS,aACTC,UAAU,MAEfC,QAAQC,IAAIX,KArJlB,GAAI1D,GAAKO,IAGTP,GAAGmC,MAAQ,cACXnC,EAAGkG,MAAQZ,EAAWY,MACtBlG,EAAGsE,UAAYA,EAEftE,EAAG8E,WAGH,KAAI,GAAIuC,GAAE,EAAEA,EAAEvC,EAASwC,OAAOD,KAEN,GAAlBvC,EAASuC,GAAG5D,IAAWzD,EAAGkG,MAAMO,YAA4C,GAA9BzG,EAAGkG,MAAMO,WAAWU,QAAmC,GAAlBrC,EAASuC,GAAG5D,IAAWzD,EAAGkG,MAAMQ,YAA4C,GAA9B1G,EAAGkG,MAAMQ,WAAWS,QAAmC,GAAlBrC,EAASuC,GAAG5D,IAAWzD,EAAGkG,MAAMS,eAAkD,GAAjC3G,EAAGkG,MAAMS,cAAcQ,SAChPnH,EAAG8E,SAASyC,KAAKzC,EAASuC,GAI9BrH,GAAG+E,YAAcA,EACjB/E,EAAGgF,iBAAmBA,EACtBhF,EAAGiF,iBAAmBA,EACtBjF,EAAGkF,oBAAsBA,EACzBlF,EAAGmF,gBAAkBA,EACrBnF,EAAGoF,iBAAmBA,EACtBpF,EAAGoG,KAAO3D,EAAW2D,KACrBpG,EAAGsF,WAAaA,EAEhB5C,EAAO4B,UAAY7B,EAAW6B,UAC9BtE,EAAG2F,MACDO,MAAOlG,EAAGkG,MACVV,QAASF,EAAWS,SACpBC,YAAa,KACbJ,UAAW,MAGb5F,EAAGyF,aAAe,GAEfH,EAAW7B,KACZzD,EAAG2F,KAAKK,YAAcV,EAAWU,YACjChG,EAAG2F,KAAKC,UAAYN,EAAWM,WAIjC5F,EAAGyF,aAAezF,EAAG2F,KAAKH,QAAQvC,KAAKyC,cAGvC1F,EAAGuF,cAAgBA,EACnBvF,EAAGK,YAAcA,EACjBL,EAAG6F,eAAiBA,EAjDtBjB,EAA2BvF,SAAW,aAAc,SAAU,YAAa,WAAY,aAAc,gBAAiB,WAAY,cAAe,mBAAoB,mBAAoB,sBAAuB,kBAAmB,mBAAoB,SAAU,QAAS,MAAO,aAAc,aAL/RC,QACGC,OAAO,kBACPJ,WAAW,6BAA8ByF,MAiK9C,WAEI,YAOA,SAAShG,GAAOC,EAAgBoC,EAAiCC,GAG7DrC,EAAeC,MAAM,8BACjBC,IAAW,0BACXC,OACIwI,SACItI,YAAa,qCACbC,WAAa,wBAEjBsI,sCACIvI,YAAa,sCACbC,WAAa,6BAGrBC,UAAW,YACX4C,wBAAwB,IAI5Bf,EAAgCgB,QAAQ,wBAnB5CrD,EAAOS,SAAW,iBAAkB,kCAAmC,+BANvEC,QACKC,OAAO,0BACPX,OAAOA,MA6BhB,WAEI,YAOA,SAAS8I,MALTpI,QACKC,OAAO,uBACPJ,WAAW,qBAAsBuI,MAY1C,WAEI,YAOA,SAAS9I,GAAOC,EAAgBoC,EAAiCC,GAG7DrC,EAAeC,MAAM,8BACjBC,IAAW,0BACXC,OACIwI,SACItI,YAAa,qCACbC,WAAa,wBAEjBwI,sCACIzI,YAAa,sCACbC,WAAa,6BAGrBC,UAAW,YACX4C,wBAAwB,IAI5Bf,EAAgCgB,QAAQ,wBAlB5CrD,EAAOS,SAAW,iBAAkB,kCAAmC,+BAPvEC,QACKC,OAAO,0BACPX,OAAOA,MA4BhB,WAEI,YAOA,SAASgJ,MALTtI,QACKC,OAAO,uBACPJ,WAAW,qBAAsByI,MAY1C,WAEI,YAOA,SAAShJ,GAAOC,EAAgBoC,EAAiCC,EAA6B2G,GAG1FhJ,EAAeC,MAAM,wBACjBC,IAAW,SACXC,OACIwI,SACItI,YAAa,qCACbC,WAAa,wBAEjB2I,gCACI5I,YAAa,kCACbC,WAAa,0BAGrBC,UAAW,QACX4C,wBAAwB,IAI5Bf,EAAgCgB,QAAQ,wBAjB5CrD,EAAOS,SAAW,iBAAkB,kCAAmC,8BAA+B,iBARtGC,QACKC,OAAO,2BACPX,OAAOA,MA8BhB,WAEE,YAOA,SAASmJ,GAAStF,EAAYuF,EAAWC,EAAUC,EAAQrI,EAASsI,EAAWpF,GAG7EN,EAAW2F,IAAI,oBAAqB,SAAStF,EAAOuF,EAASC,EAAUC,EAAWC,GAIlD,mBAApB/F,GAAW2D,MAAwBvG,EAAQ4I,eAAerC,OAClE3D,EAAW2D,KAAOsC,KAAKC,MAAM9I,EAAQ4I,eAAerC,OAGlDiC,EAAQtG,cAA2C,mBAApBU,GAAW2D,MAE5C+B,EAAU7E,KAAK,UAEdb,EAAW2D,MAA8C,GAAtC3D,EAAW2D,KAAKwC,oBAAiE,GAAtCnG,EAAW2D,KAAKwC,oBAA2BC,SAASC,QAAQrG,EAAW2D,KAAK2C,8BAAgCV,EAAQrG,yBACnLiG,EAAS,WAEPxF,EAAWuG,iBAAkB,IAI/Bb,EAAU7E,KAAK,gBAlBrByE,EAAS1I,SAAW,aAAc,YAAa,WAAY,SAAU,UAAW,YAAa,OAT7FC,QACGC,OAAO,wBACP0J,IAAIlB,MAiCT,WAEI,YAOA,SAASmB,GAAgBxG,EAAQD,EAAY0G,EAAsBjB,EAAQrI,EAAS8C,EAAeI,EAAKrD,GAqBtG,QAASqC,KAEP,GAAIZ,IAAWiI,WAAY,WAAYC,SAAUrJ,EAAG2F,KAAK2D,MAAOC,SAAUvJ,EAAG2F,KAAK4D,SAElFvJ,GAAGwJ,cAAe,EAElBzG,EAAIqD,KAAKqD,MAAMC,KAAKP,EAAqBhI,GAEvC,SAAUuC,GAGR7D,EAAQ4I,eAAekB,MAAQjG,EAASkG,YACxC,IAAIxD,IACF3C,GAAIC,EAASD,GACboG,UAAWnG,EAASmG,UACpBC,SAAUpG,EAASoG,SACnBC,SAAUrG,EAASqG,SACnBT,MAAO5F,EAASqG,SAChBC,YAAatG,EAASuG,YACtBC,SAAUxG,EAASwG,SACnBC,WAAYzG,EAASyG,WACrBC,eAAgB1G,EAAS0G,eACzBC,oBAAqB3G,EAAS2G,oBAC9BC,sBAAuB5G,EAAS4G,sBAChC1B,mBAAoBlF,EAASkF,mBAC7BG,2BAA4BrF,EAASqF,2BACrCwB,qBAAsB7G,EAAS6G,qBAI9B9H,GAAW6B,UAAUkG,YACtB3K,EAAQ4I,eAAerC,KAAOsC,KAAK+B,UAAUrE,IAEd,IAA7BA,EAAKmE,qBACPxH,EAAIqD,KAAKsE,0BAA0B9G,KAAMH,GAAI2C,EAAKmE,sBAChD,SAAS7G,GAKP,GAAIiH,IAAW,CACQ,WAAnBjH,EAASyD,SACXwD,GAAW,GAITA,EAEFvE,EAAKwC,mBAAqB,EAI1BxC,EAAKwC,mBAAqB,EAE5BxC,EAAKuE,SAAWA,CAChB,IAAIC,IACFC,mBAAoBzE,EAAKwC,mBACzBU,MAAOlD,EAAKkD,MACZY,SAAU9D,EAAK8D,SACfY,2BAA4BpH,EAASqH,aAAaC,kBAGhDL,IACFC,EAAYE,2BAA6BpH,EAASqH,aAAaC,kBAC/D5E,EAAK2C,2BAA6BrF,EAASqH,aAAaC,mBAGxDJ,EAAYE,2BAA6B1E,EAAK2C,2BAMhDhG,EAAIqD,KAAK6E,qBAAqBpI,OAAO+H,EACnC,SAASlH,KAIT,SAASA,MAKXjB,EAAW2D,KAAOA,EAOwB,GAAtC3D,EAAW2D,KAAKwC,mBAClBV,EAAOgD,GAAG,gBAENrC,SAASsC,SAAS1I,EAAW2D,KAAK2C,4BACpCb,EAAOgD,GAAG,gBAGVhD,EAAOgD,GAAG,iBAMhB,SAAUxH,GAERjB,EAAW2D,KAAOA,EAGwB,GAAtC3D,EAAW2D,KAAKwC,mBAClBV,EAAOgD,GAAG,gBAENrC,SAASsC,SAAS1I,EAAW2D,KAAK2C,4BACpCb,EAAOgD,GAAG,gBAGVhD,EAAOgD,GAAG,mBAOlBzI,EAAW2D,KAAOA,EAQlB8B,EAAOgD,GAAG,kBAgBd,SAAUxH,SAED7D,GAAQ4I,eAAekB,MAE9BjK,EAAUqE,KACRrE,EAAU0L,QACPC,qBAAoB,GACpBC,OAAOhM,QAAQiM,QAAQC,SAASC,OAChCtJ,MAAM,gBACN8B,YAAY,qBACZyH,UAAU,gBACVC,GAAG,OAGR3L,EAAGwJ,cAAe,IAKxB,QAASoC,KAEP,GACIC,GADAC,EAAM,GAAIC,KAEd,KAIE,MAHAC,cAAaC,QAAQH,EAAKA,GAC1BD,EAASG,aAAaE,QAAQJ,IAAQA,EACtCE,aAAaG,WAAWL,GACjBD,GAAUG,aACjB,MAAOI,KAjMkB,mBAAnB3J,GAAW2D,MACnB8B,EAAOgD,GAAG,sBAILrL,GAAQ4I,eAAekB,YACvB9J,GAAQ4I,eAAerC,IAC9B,IAAIzC,GAAoBhB,EAAciB,IAAI,QAC1CD,GAAkB0I,YAClB5J,EAAW6J,gBAAkB,KAC7B7J,EAAW2D,KAAO,IAElB,IAAIpG,GAAKO,IAETP,GAAG+B,aAAeA,EAClB/B,EAAGwJ,cAAe,EAClBxJ,EAAGgM,aAAeJ,IAClBnJ,EAAW6J,gBAAkB,KAd/BpD,EAAgB7J,SAAW,SAAU,aAAc,uBAAwB,SAAU,UAAW,gBAAiB,MAAO,aAVxHC,QACKC,OAAO,wBACPJ,WAAW,kBAAmB+J,MA6MvC,WAEI,YAOA,SAAStK,GAAOC,EAAgBoC,EAAiCC,GAG7DrC,EAAeC,MAAM,iCACjBC,IAAW,kBACXC,OACIwI,SACItI,YAAa,qCACbC,WAAa,wBAEjBoN,yCACIrN,YAAa,oDACbC,WAAa,kCAGrBC,UAAW,iBACX4C,wBAAwB,IAI5Bf,EAAgCgB,QAAQ,iCAd5CrD,EAAOS,SAAW,iBAAkB,kCAAmC,+BAXvEC,QACKC,OAAO,oCACPX,OAAOA,MA6BhB,WAEI,YAOA,SAAS4N,GAAwB/J,EAAY0F,EAAW3F,EAAUO,GAUhE,QAAS0J,KAEP,GAAIC,IAASC,OAAQ3M,EAAGmB,OAAOwL,OAAQhD,MAAO3J,EAAGmB,OAAOwI,MAAOJ,SAAUvJ,EAAG2F,KAAK4D,SAEjFxG,GAAIqD,KAAKwG,eAAelD,KAAKgD,EAC3B,SAAShJ,GAEPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAY,iCACZC,SAAS,aACTC,UAAU,MAEfgE,EAAU0E,WACV1E,EAAU7E,KAAK,WAEjB,SAASI,GAEP,GAAIwD,GAAezE,EAAW6B,UAAUC,OAArB9B,UAEnB,IAAGiB,EAASgJ,MAAQhJ,EAASgJ,KAAKI,WAAY,CAC5C,GAAIvI,GAASb,EAASgJ,KAAKI,WAAW,GACtC5F,GAAe,EACf,KAAI,GAAIG,GAAE,EAAEA,EAAE9C,EAAO+C,OAAOD,IAC1BH,GAAgB3C,EAAO8C,GAI3BrH,EAAG+M,mBAAqB7F,IApC9B,GAAIlH,GAAKO,IACTP,GAAGmB,OAASgH,EAAU0E,SACtB7M,EAAG+M,mBAAqB,KAIxB/M,EAAGyM,cAAgBA,EADrBD,EAAwBnN,SAAW,aAAc,YAAa,WAAY,OAZ1EC,QACKC,OAAO,iCACPJ,WAAW,0BAA2BqN,MAgD/C,WAEI,YAOA,SAAS5N,GAAOC,EAAgBoC,EAAiCC,GAG7DrC,EAAeC,MAAM,kCACjBC,IAAW,mBACXC,OACIwI,SACItI,YAAa,qCACbC,WAAa,wBAEjB6N,0CACI9N,YAAa,sDACbC,WAAa,mCAGrBC,UAAW,oBAIf6B,EAAgCgB,QAAQ,kCAX5CrD,EAAOS,SAAW,iBAAkB,kCAAmC,+BAbvEC,QACKC,OAAO,qCACPX,OAAOA,MA2BhB,WAEI,YAOA,SAASqO,GAAyBxK,EAAYD,EAAU2F,EAAWpF,GAU/D,QAASmK,KAEP,GAAIC,GAAUhF,EAAUiF,WAAa,MAAQjF,EAAUkF,MAChC,KAApBlF,EAAUmF,QAAoC,KAApBnF,EAAUmF,SACrCH,GAAW,IAAMhF,EAAUmF,QAG7BtN,EAAGwJ,cAAe,EAElBzG,EAAIqD,KAAKmH,gBAAgB7D,MAAOJ,MAAOtJ,EAAG2F,KAAK2D,MAAOkE,SAAUL,EAAU,mBACxE,SAASzJ,GAEP1D,EAAGwJ,cAAe,EAClBhH,EAASuB,KACPvB,EAASwB,SACNC,YAAY,qDACZC,SAAS,aACTC,UAAU,OAGjB,SAAST,GAEPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAArB9B,YACZyB,SAAS,aACTC,UAAU,MAEfnE,EAAGwJ,cAAe,IApCxB,GAAIxJ,GAAKO,IAGTP,GAAGwJ,cAAe,EAGlBxJ,EAAGkN,eAAiBA,EACxBD,EAAyB5N,SAAW,aAAc,WAAY,YAAa,OAd3EC,QACKC,OAAO,kCACPJ,WAAW,2BAA4B8N,MAiDhD,WAEE,YAOA,SAASQ,GAA2BhL,EAAYC,EAAQhD,EAAW8C,EAAU3C,EAAS8C,EAAe+K,EAAaC,EAAYtI,EAAQtC,GA2CpI,QAAS6K,KAEP5N,EAAG6N,YAAa,CAEhB,IAAIF,IACFxK,YAAanD,EAAG8N,eAAe3K,YAC/B0G,UAAW7J,EAAG8N,eAAejE,UAC7BC,SAAU9J,EAAG8N,eAAehE,SAC5BiE,QAAS/N,EAAG8N,eAAeC,QAC3BC,gBACEC,cAAejO,EAAG8N,eAAeI,SACjCC,eAAgBnO,EAAG8N,eAAeM,SAClCC,KAAMrO,EAAG8N,eAAeO,KACxBC,SAAUtO,EAAG8N,eAAeQ,SAC5BC,WAAYvO,EAAG8N,eAAeS,WAC9BC,UAAWxO,EAAG8N,eAAeW,QAAQhL,IAEvCiL,SAAU1O,EAAG8N,eAAeY,SAASjL,GACrCkL,gBAAiB3O,EAAG8N,eAAec,oBACnCC,eAAgB7O,EAAG8N,eAAegB,mBAClCC,WAAY/O,EAAG8N,eAAeiB,WAC9BC,QAAShP,EAAG8N,eAAekB,QAC3B7I,OAAQ1D,EAAW2D,KAAK3C,GACxBwL,UAASjP,EAAG8N,eAAeoB,YAGT,OAAjBlP,EAAG2N,aAEJA,EAAWlK,GAAKzD,EAAG2N,WAAWlK,GAC9BkK,EAAWwB,qBAAuBnP,EAAG2N,WAAWwB,qBAChDxB,EAAWyB,iBAAmBpP,EAAG2N,WAAWyB,iBAC5CzB,EAAWK,eAAevK,GAAKzD,EAAG2N,WAAWK,eAAevK,GAG9D,IAAIE,GAAoBhB,EAAciB,IAAI,QAEvC+J,GAAWlK,GACZV,EAAIqD,KAAKiJ,YAAYC,KAAKzM,QAASY,GAAIkK,EAAWlK,IAAMkK,EACtD,SAAUjK,GAELjB,EAAW2D,KAAKiE,qBAAuBsD,EAAWlK,IAAOkK,EAAAA,aAC1DlL,EAAW2D,KAAKiE,oBAAsB,KAEnC5H,EAAW6B,UAAUkG,YACtB3K,EAAQ4I,eAAerC,KAAOsC,KAAK+B,UAAUhI,EAAW2D,QAI5DzC,EAAkBE,OAAOpB,EAAWqB,OAAS,mBAE7CzD,IAEAf,QAAQuH,MAAM7G,EAAG2N,WAAYjK,GAE1BiK,EAAAA,aACDlL,EAAW2D,KAAKiE,oBAAsBrK,EAAG2N,WAAWlK,GACjDhB,EAAW6B,UAAUkG,YACtB3K,EAAQ4I,eAAerC,KAAOsC,KAAK+B,UAAUhI,EAAW2D,QAI5D1G,EAAUY,OAEVkC,EAASuB,KACPvB,EAASwB,SACNC,YAAY,sBACZC,SAAS,aACTC,UAAU,MAGfnE,EAAG6N,YAAa,GAElB,SAAUnK,GACRU,QAAQC,IAAIX,GACZlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAAOgL,iBACxCrL,SAAS,aACTC,UAAU,MAGfnE,EAAG6N,YAAa,IAIpB9K,EAAIqD,KAAKiJ,YAAYG,IAAI9F,KAAKiE,EAC5B,SAAUjK,GAERC,EAAkBE,OAAOpB,EAAWqB,OAAS,mBAE7CzD,IAEAL,EAAG0N,YAAYnG,KAAK7D,GAEjBiK,EAAAA,YAAsBjK,IACvBjB,EAAW2D,KAAKiE,oBAAsB3G,EAASD,GAC5ChB,EAAW6B,UAAUkG,YACtB3K,EAAQ4I,eAAerC,KAAOsC,KAAK+B,UAAUhI,EAAW2D,QAI5D5D,EAASuB,KACPvB,EAASwB,SACNC,YAAY,sBACZC,SAAS,aACTC,UAAU,OAGjB,SAAUT,GACRU,QAAQC,IAAIX,GACZlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAAOgL,iBACxCrL,SAAS,aACTC,UAAU,MAEfnE,EAAG6N,YAAa,IAOxB,QAASxN,KAEPX,EAAUY,OAtKZ,GAAIN,GAAKO,IAGTP,GAAGmC,MAAQ,cACXnC,EAAGyP,UAAYhN,EAAWiN,QAAQD,UAClCzP,EAAG2P,UAAYlN,EAAWiN,QAAQE,gBAClC5P,EAAG6P,aAAepN,EAAWiN,QAAQI,mBACrC9P,EAAG0N,YAAcA,EACjB1N,EAAG2N,WAAaA,EAChB3N,EAAG6N,YAAa,EAChB7N,EAAG+P,KAAO,GAAIhE,MAEd/L,EAAG8N,gBACDoB,aAAa,GAG2B,GAAvCzM,EAAWiN,QAAQD,UAAUnI,SAC9BtH,EAAG8N,eAAeW,QAAUhM,EAAWiN,QAAQD,UAAU,IAIxDzP,EAAG2N,aACJ3N,EAAG8N,eAAe3K,YAAcwK,EAAWxK,YAC3CnD,EAAG8N,eAAejE,UAAY8D,EAAW9D,UACzC7J,EAAG8N,eAAehE,SAAW6D,EAAW7D,SACxC9J,EAAG8N,eAAeC,QAAUJ,EAAWI,QACvC/N,EAAG8N,eAAeI,SAAWP,EAAWK,eAAeC,cACvDjO,EAAG8N,eAAeM,SAAWT,EAAWK,eAAeG,eACvDnO,EAAG8N,eAAeO,KAAOV,EAAWK,eAAeK,KACnDrO,EAAG8N,eAAeQ,SAAWX,EAAWK,eAAeM,SACvDtO,EAAG8N,eAAeS,WAAaZ,EAAWK,eAAeO,WACzDvO,EAAG8N,eAAeW,QAAUd,EAAWK,eAAeS,QACtDzO,EAAG8N,eAAeY,SAAWf,EAAWe,SACxC1O,EAAG8N,eAAec,oBAAsBjB,EAAWgB,gBACnD3O,EAAG8N,eAAegB,mBAAqBnB,EAAWkB,gBAGpDnM,EAAO4B,UAAY7B,EAAW6B,UAC9BtE,EAAG4N,eAAiBA,EACpB5N,EAAGK,YAAcA,EA/BnBoN,EAA2BpO,SAAW,aAAc,SAAU,YAAa,WAAY,UAAW,gBAAiB,cAAe,aAAc,SAAU,OAf1JC,QACGC,OAAO,kBACPJ,WAAW,6BAA8BsO,MAgL9C,WAEI,YAOA,SAASuC,GAAsBvQ,EAAaC,EAAWuQ,GAUnD,QAASC,GAAYC,GAEjBzQ,EAAUqE,MACN5E,WAAqB,8BACrBiR,aAAqB,KACrBlR,YAAqB,yEACrBoM,OAAqBhM,QAAQiM,QAAQ0E,EAAUxE,MAC/C4E,YAAqBF,EACrB9E,qBAAqB,IAhB7B,GAAIrL,GAAKO,IAETP,GAAGU,OAASjB,EAAYiB,OAGxBV,EAAGkQ,YAAcA,EAIrBF,EAAsB3Q,SAAW,cAAe,YAAa,aAhB7DC,QACKC,OAAO,uBACPJ,WAAW,wBAAyB6Q,MA8B7C,WAEI,YAEA1Q,SACKC,OAAO,YAEA,YACA,SACA,YACA,aACA,aACA,aACA,aAGA,aACA,uBACA,OACA,yBACA,QACA,YACA,oBACA,cACA,cACA,cACA,YACA,qBAIhB,WAEI,YAUA,SAAS+Q,GAAmB5N,EAAQ6N,GAehC,QAASC,KAECC,MAMNzQ,EAAG0Q,SAAW1Q,EAAG0Q,QAGjBH,EAASI,YAAY,UAAW3Q,EAAG0Q,UAQvC,QAASD,KAEL,MAAQnR,SAAQsR,UAAUlO,EAAOmO,YAAcnO,EAAOmO,aAAc,EAlCxE,GAAI7Q,GAAKO,IAGTP,GAAG0Q,SAAU,EAGb1Q,EAAGwQ,KAAOA,EAiCd,QAASM,KAEL,OACIC,SAAY,IACZC,OACIH,UAAW,MAEf1R,WAAY,qBACZ8R,YAAY,EACZC,QAAY,SAAUC,GAIlB,MAFAA,GAASC,SAAS,aAEX,SAAkBJ,EAAOK,EAAUC,EAAQC,EAAcC,GAG5DA,EAAa,SAAUC,GAEnBJ,EAASK,QACTL,EAASM,OAAOF,QAUpC,QAASG,KAEL,OACIb,SAAY,IACZc,QAAY,YACZZ,YAAY,EACZC,QAAY,SAAUC,GAIlB,MAFAA,GAASC,SAAS,mBAEX,SAAkBJ,EAAOK,EAAUC,EAAQC,EAAcC,GAG5DA,EAAa,SAAUC,GAEnBJ,EAASK,QACTL,EAASM,OAAOF,KAIpBT,EAAMc,WAAaP,EAAaf,QAOhD,QAASuB,KAEL,OACIhB,SAAY,IACZc,QAAY,YACZZ,YAAY,EACZC,QAAY,SAAUC,GAIlB,MAFAA,GAASC,SAAS,kBAEX,SAAkBJ,EAAOK,EAAUC,EAAQC,EAAcC,GAG5DA,EAAa,SAAUC,GAEnBJ,EAASK,QACTL,EAASM,OAAOF,KAIpBT,EAAMc,WAAaP,EAAaf,QA5GhDF,EAAmBjR,SAAW,SAAU,YAjBxCC,QACKC,OAAO,YACPJ,WAAW,qBAAsBmR,GACjC0B,UAAU,WAAYlB,GACtBkB,UAAU,gBAAiBJ,GAC3BI,UAAU,eAAgBD,MA+HnC,WAEI,YASA,SAASE,KAkBL,QAASC,GAAYC,GAEjBnS,EAAGmS,SAAWA,EAQlB,QAASC,KAEL,MAAOpS,GAAGmS,SA5Bd,GAAInS,GAAKO,IAGTP,GAAGmS,SAAWE,OAGdrS,EAAGkS,YAAcA,EACjBlS,EAAGoS,YAAcA,EA0BrB,QAASE,KAEL,OACItB,OACIuB,SAAU,wBAEdpT,WAAY,uBACZ+R,QAAY,SAAUC,GAIlB,MAFAA,GAASC,SAAS,eAEX,SAAkBJ,EAAOK,EAAUC,EAAQkB,GAmB9C,QAASC,KAEAN,EAASO,YAAcP,EAASQ,SAAWC,EAAYC,EAAW3O,WAAW4O,MAG9ED,EAAWzB,SAAS,QAGpB2B,IAGA/B,EAAMuB,WAAWS,KAEb,WAGIH,EAAWI,YAAY,QAGvBC,KAIJ,WAGIL,EAAWhP,YAS3B,QAASqP,KAELf,EAASgB,GAAG,SAAUV,GAM1B,QAASM,KAELZ,EAASiB,IAAI,SAAUX,GA7D3B,GAAII,GAAavT,QAAQiM,QAAQ,oHACjC8F,GAASM,OAAOkB,EAGhB,IAAIV,GAAW7S,QAAQiM,QAAQ,WAC/BiH,GAAeN,YAAYC,EAG3B,IAAIS,GAAY,GAGhBM,KAsDAlC,EAAM5I,IAAI,WAAY,WAElB2K,SAQpB,QAASM,GAAwBpL,EAAUqL,GAEvC,OACItC,OAAS,EACTa,QAAS,cACTX,QAAS,SAAUC,GAIf,MAFAA,GAASC,SAAS,oBAAoBA,SAAS,UAExC,SAAkBJ,EAAOK,EAAUC,EAAQkB,GAc9C,QAASe,KAGAlC,EAASmC,KAAK,WAGfxC,EAAM5I,IAAI,6BAA8B,SAAUtF,EAAO2Q,GAErD,GAAIC,GAASpU,QAAQiM,QAAQkI,EAAK,GAGlCE,GAAaD,GAAQV,KAAK,WAEtB/K,EAAS,WAEL2L,GAAa,QAQzBD,EAAatC,GAAU2B,KAAK,WAExB/K,EAAS,WAEL2L,GAAa,MAMzBzB,EAASgB,GAAG,SAAUU,GAGtBA,IA+BJ,QAASF,GAAapI,GAElB,GAAIuI,GAAWR,EAAGS,QACdC,EAAQzI,EAAQiI,KAAK,MAczB,OAZKQ,GAAM1M,OAAS,EAEhB0M,EAAMb,GAAG,OAAQ,WAEbW,EAAStS,QAAQ,qBAKrBsS,EAAStS,QAAQ,aAGdsS,EAASG,QAMpB,QAASJ,KAEA1B,EAASO,YAAcP,EAASQ,SAAWtB,EAASnN,WAAW4O,IAAMF,IAEtE3K,EAAS,WAELiM,GAAiB,IAIrB/B,EAASiB,IAAI,SAAUS,IAhH/B,GAAIjB,GAAY,GACZgB,GAAa,EACbM,GAAiB,EACjB/B,EAAWK,EAAeJ,aAI9BmB,IA6CA,IAAIY,GAAmBnD,EAAMoD,OACzB,WAEI,MAAOR,IAAcM,GAEzB,SAAUG,EAASC,GAEVhV,QAAQiV,OAAOF,EAASC,IAKxBD,IAEDhD,EAAS4B,YAAY,UAAU7B,SAAS,WAGxC+C,OAEL,MAnMvBd,EAAwBhU,SAAW,WAAY,MAlB/CC,QACKC,OAAO,YACPJ,WAAW,uBAAwB8S,GACnCD,UAAU,aAAcM,GACxBN,UAAU,iBAAkBqB,MAkQrC,WAEI,YAQA,SAASmB,KAEL,OACEzD,SAAW,IACXc,QAAS,UACT4C,KAAM,SAASzD,EAAO0D,EAAKC,EAAOC,GAChCA,EAAKC,YAAY3O,MAAQ,SAAS4O,GAIhC,MAHkBzC,UAAfyC,IACDA,EAAa,IAERH,EAAMzO,QAAU4O,KAQnC,QAASC,KAEP,OACEhE,SAAW,IACXc,QAAS,UACT4C,KAAM,SAASzD,EAAO0D,EAAKC,EAAOC,GAChCA,EAAKC,YAAYG,YAAc,SAASF,GACtC,MAAwB,IAApBH,EAAMxK,WAEJ2K,GAAc,GAAmB,GAAdH,EAAMM,MACpB,EAEc,GAAdH,GAAiC,GAAdH,EAAMM,MACzB,GAGA,EAKS,GAAdH,GACK,GAGA,KAjDjBxV,QACKC,OAAO,YACPyS,UAAU,QAASwC,GACrBxC,UAAU,cAAe+C,MAyDhC,WAEI,YAOA,SAASG,GAAwBC,GAE7B,OACIpE,SAAU,IACV0D,KAAU,SAAUzD,EAAOK,GAEvB,GAAI+D,GAA0BpE,EAAM5I,IAAI,yBAA0B,WAE9D+M,EAASE,MAAMhE,GAAU2B,KAAK,WAG1BoC,IAGApE,EAAQK,EAAW,WAAvC6D,EAAwB7V,SAAW,YAnBnCC,QACKC,OAAO,YACPyS,UAAU,iBAAkBkD,MAwBrC,WAEI,YAOA,SAASI,KAEL,OACIvE,SAAU,IACVc,QAAU,aACV4C,KAAU,SAAUzD,EAAOK,EAAUC,EAAQiE,GAKzCvE,EAAMoD,OAAO,WAET,MAAOmB,GAAcC,WAAaD,EAAcE,gBACjD,SAAUpB,GAEJ/U,QAAQoW,YAAYrB,KAKzBhD,EAAS/F,SAASqF,YAAY,cAAe0D,GAC7C/U,QAAQiM,QAAQ,QAAQoF,YAAY,eAAgB0D,QA1BpE/U,QACKC,OAAO,YACPyS,UAAU,kBAAmBsD,MA8BtC,WAEI,YAOA,SAASK,GAAqB1F,GAE1B,OACIc,SAAa,IACbC,OAAa,EACb9R,YAAa,uDACbgS,QAAa,SAAUC,GAKnB,MAFAA,GAASC,SAAS,iBAEX,SAAkBJ,EAAOK,GAQ5B,QAASkC,KAELqC,EAAavE,EAASmC,KAAK,2BAC3BqC,EAAcxE,EAASmC,KAAK,4BAE5BoC,EAAWzC,GAAG,QAAS2C,GACvBD,EAAY1C,GAAG,QAAS4C,GAM5B,QAASD,KAELzE,EAASD,SAAS,YAGlBnB,EAAUkD,GAAG,QAAS6C,GAM1B,QAASD,KAEL1E,EAAS4B,YAAY,YAQzB,QAAS+C,GAAYC,GAEE,KAAdA,EAAEC,UAEHH,IACA9F,EAAUmD,IAAI,QAAS4C,IA5C/B,GAAIJ,GACAC,CAGJtC,QAFhBoC,EAAqBtW,SAAW,aApBhCC,QACKC,OAAO,YACPyS,UAAU,cAAe2D,MAoElC,WAEI,YAQA,SAASQ,KA4BL,QAASvX,GAAOwX,GAEZC,EAAuB/W,QAAQgX,UAAWD,EAAsBD,GA3BpE,GAAIC,IACAE,WAAwB,EACxBC,kBAAwB,EACxBC,kBAAwB,EACxBC,mBAAwB,KACxBC,mBAAwB,KACxBC,kBAAwB,EACxBC,aAAwB,EACxBC,iBAAwB,EACxBC,iBAAwB,EACxBC,oBAAwB,EACxBC,oBAAwB,EACxBC,wBAAwB,EAI5B3W,MAAK3B,OAASA,EAiBd2B,KAAK4W,KAAO,WAaR,QAASC,KAEL,MAAOf,GAbX,GAAIgB,IACAD,UAAWA,EAGf,OAAOC,IAef,QAASC,GAAkBrP,EAAUsP,EAAgBC,EAASC,GAE1D,OACI1G,SAAU,KACVG,QAAU,SAAUC,GAIhB,MAAKsG,GAAWL,UAAU,4BAOrBK,EAAWL,UAAU,oCAAsCI,EAAQE,WAPxE,QAaAvG,EAASC,SAAS,aAEX,SAAkBJ,EAAOK,EAAUC,GA6DtC,QAASqG,KAELC,iBAAiB/U,OAAOwO,EAAS,IA7DrC,GAAIwG,KASCvG,GAAOwG,WAERD,EAAU7G,EAAM+G,MAAMzG,EAAOwG,WAIjCD,EAAUvY,QAAQgX,UAAWiB,EAAeH,YAAaS,GAGzD5P,EAAS,WAEL2P,iBAAiBI,WAAW3G,EAAS,GAAIwG,IAC1C,GAGHxG,EAAS8B,GAAG,aAAcwE,GAI1B3G,EAAMoD,OAAO,WAET,MAAO/C,GAAS4G,KAAK,iBACtB,SAAU5D,EAASC,GAEbhV,QAAQoW,YAAYrB,IAAY/U,QAAQiV,OAAOF,EAASC,IAK7DqD,MAKJ3G,EAAMoD,OAAO,WAET,MAAO/C,GAAS4G,KAAK,gBACtB,SAAU5D,EAASC,GAEbhV,QAAQoW,YAAYrB,IAAY/U,QAAQiV,OAAOF,EAASC,IAK7DqD,MAYJ3G,EAAM5I,IAAI,WAAY,WAElBiJ,EAAS+B,IAAI,cACbwE,iBAAiBM,QAAQ7G,EAAS,UAvItDiG,EAAkBjY,SAAW,WAAY,iBAAkB,UAAW,cArBtEC,QACKC,OAAO,YACP4Y,SAAS,iBAAkBhC,GAC3BnE,UAAU,WAAYsF,MAgK/B,WAEI,YAOA,SAASc,KAEL,OACIrH,SAAU,IACV0D,KAAU,SAAUzD,EAAOK,GAGvB,GAAIgH,GAAU/Y,QAAQiM,QAAQ,kDAC9B8F,GAASiH,MAAMD,GACfA,EAAQ1G,OAAON,KAd3B/R,QACKC,OAAO,YACPyS,UAAU,oBAAqBoG,MAmBxC,WAEI,YAOA,SAASG,KAEL,OACIxH,SAAU,IACVC,OACIwH,cAAe,KAEnB/D,KAAU,SAAUzD,EAAOK,GAEvB,GAAIoH,GAAczH,EAAMwH,cAAcE,KAAKC,MAAMD,KAAKE,SAAY5H,EAAMwH,cAAc,QACtFnH,GAASD,SAASqH,KAf9BnZ,QACKC,OAAO,YACPyS,UAAU,gBAAiBuG,MAkBpC,WAEI,YAkBA,SAASrX,KAkBL,QAAS2X,GAASvV,EAAMwV,EAAMrE,GAW1B,IAAM,GAVFsE,GAAQzV,EAAK0V,MAAM,KAEnBvV,EAAKsV,EAAMA,EAAMzR,OAAS,GAG1BgE,EAAS2N,EAAoBF,GAG7BG,GAAa,EAEP7R,EAAI,EAAGA,EAAIiE,EAAOhE,OAAQD,IAEhC,GAAKiE,EAAOjE,GAAG8R,MAAQ1V,EACvB,CACIyV,EAAa5N,EAAOjE,EAEpB,OAKH6R,GAED5Z,QAAQgX,OAAO4C,EAAYJ,GAG3BI,EAAWE,KAAO3E,IAMlBqE,EAAKO,aAGA/Z,QAAQoW,YAAYoD,EAAK1W,UAAY9C,QAAQga,SAASR,EAAK1W,WAE5D0W,EAAK1W,OAAS,GAIlB0W,EAAKK,IAAM1V,EAGXqV,EAAKS,MAAQjW,EAGbwV,EAAKM,KAAO3E,EAGZnJ,EAAO/D,KAAKuR,IAUpB,QAAS5W,GAASoB,EAAMwV,GAEpB,IAAMxZ,QAAQka,SAASlW,GAGnB,WADAmW,GAAKC,MAAM,kDAef,KAAM,GAXFX,GAAQzV,EAAK0V,MAAM,KAGnBvV,EAAKsV,EAAMA,EAAMzR,OAAS,GAG1BgE,EAAS2N,EAAoBF,GAG7BG,GAAa,EAEP7R,EAAI,EAAGA,EAAIiE,EAAOhE,OAAQD,IAEhC,GAAKiE,EAAOjE,GAAG8R,MAAQ1V,EACvB,CACIyV,EAAa5N,EAAOjE,EAEpB,OAKH6R,GAED5Z,QAAQgX,OAAO4C,EAAYJ,GAG3BI,EAAWS,OAASC,EAAWV,GAE/BA,EAAWW,WAAaC,EAAeZ,KAMvCJ,EAAKO,aAGA/Z,QAAQoW,YAAYoD,EAAK1W,UAAY9C,QAAQga,SAASR,EAAK1W,WAE5D0W,EAAK1W,OAAS,GAIlB0W,EAAKK,IAAM1V,EAGXqV,EAAKS,MAAQjW,EAGbwV,EAAKa,OAASC,EAAWd,GAEzBA,EAAKe,WAAaC,EAAehB,GAGjCxN,EAAO/D,KAAKuR,IASpB,QAASiB,GAAWzW,GAEhB,IAAMhE,QAAQka,SAASlW,GAGnB,WADAmW,GAAKC,MAAM,kDAQf,KAAM,GAHFZ,GAAOkB,EACPjB,EAAQzV,EAAK0V,MAAM,KAEbiB,EAAI,EAAGA,EAAIlB,EAAMzR,OAAQ2S,IAI/B,IAAM,GAFFxW,GAAKsV,EAAMkB,GAEL5S,EAAI,EAAGA,EAAIyR,EAAKxR,OAAQD,IAE9B,GAAKyR,EAAKzR,GAAG8R,MAAQ1V,EACrB,CAII,GAAKqV,EAAKzR,GAAGkS,QAAUjW,EAGnB,MADAwV,GAAKoB,OAAO7S,EAAG,IACR,CAKXyR,GAAOA,EAAKzR,GAAGgS,QACf,OAKZ,OAAO,EAQX,QAASc,GAAa7O,GAGZA,IAEFA,EAAS0O,EACT1O,EAAO8O,KAAKC,GAIhB,KAAM,GAAIhT,GAAI,EAAGA,EAAIiE,EAAOhE,OAAQD,IACpC,CACI,GAAIgS,GAAW/N,EAAOjE,GAAGgS,QAEpBA,GAAS/R,OAAS,GAEnB+R,EAASe,KAAKC,GAGbhB,EAAS/R,OAAS,GAEnB6S,EAAad,IAgBzB,QAASJ,GAAoBF,GAGzB,GAAIzN,GAAS0O,CAIb,IAAsB,IAAjBjB,EAAMzR,OAEP,MAAOgE,EAKXyN,GAAMuB,KAGN,KAAM,GAAIjT,GAAI,EAAGA,EAAI0R,EAAMzR,OAAQD,IACnC,CAII,IAAM,GAHF8R,GAAMJ,EAAM1R,GACZkT,GAAe,EAETN,EAAI,EAAGA,EAAI3O,EAAOhE,OAAQ2S,IAEhC,GAAK3O,EAAO2O,GAAGd,MAAQA,EACvB,CACI7N,EAASA,EAAO2O,GAAGZ,SACnBkB,GAAe,CAEf,OAOR,GAAKA,EACL,CACI,GAAIzB,IACAK,IAAUA,EACVI,MAAUR,EAAMyB,KAAK,KACrBrY,MAAUgX,EACV/W,OAAU,EACViX,YAGJ/N,GAAO/D,KAAKuR,GACZxN,EAASwN,EAAKO,UAItB,MAAO/N,GAWX,QAAS+O,GAAUI,EAAGC,GAElB,MAAOC,UAASF,EAAErY,QAAUuY,SAASD,EAAEtY,QAU3C,QAASwX,GAAWd,GAEhB,GAAIa,GAAS,EAYb,OAVKra,SAAQsR,UAAUkI,EAAKha,SAExB6a,EAASb,EAAKha,MAETQ,QAAQsR,UAAUkI,EAAKxW,cAAgBhD,QAAQsb,SAAS9B,EAAKxW,eAE9DqX,EAASA,EAAS,IAAMjR,KAAK+B,UAAUqO,EAAKxW,aAAe,MAI5DqX,EAGX,QAASG,GAAehB,GAEtB,GAAIe,GAAa,EAYjB,OAVKva,SAAQsR,UAAUkI,EAAKha,SAE1B+a,EAAaf,EAAKha,MAEbQ,QAAQsR,UAAUkI,EAAKnU,YAAcrF,QAAQsb,SAAS9B,EAAKnU,aAE9DkV,EAAanR,KAAK+B,UAAUqO,EAAKnU,aAI9BkV,EA/UT,GAAIJ,GAAOna,QAAQub,UAAU,OAAOjX,IAAI,QAGpCoW,KAEA3C,EAAU9W,IAGd8W,GAAQnV,SAAWA,EACnBmV,EAAQwB,SAAWA,EACnBxB,EAAQ0C,WAAaA,EACrB1C,EAAQ8C,aAAeA,EA2UvB5Z,KAAK4W,KAAO,WAiCR,QAAS2D,GAAcC,EAAM/J,GAEzBgK,GACID,KAAOA,EACP/J,MAAOA,GAOf,QAASiK,KAEL,MAAOD,GASX,QAASE,GAAoBC,GAEzB,GAAKA,EAED,IAAM,GAAI9T,GAAI,EAAGA,EAAI2S,EAAW1S,OAAQD,IAEpC,GAAK2S,EAAW3S,GAAG8R,MAAQgC,EAEvB,OAAQnB,EAAW3S,GAK/B,OAAO2S,GAQX,QAASoB,GAAmBpK,GAExBqK,EAAkBrK,EAQtB,QAASsK,GAAUnU,GAEfoU,EAASpU,EAQb,QAASqU,KAEL,MAAOD,GAQX,QAASE,GAActU,GAEnBuU,EAAavU,EAQjB,QAASwU,KAEL,MAAOD,GAOX,QAASE,KAELP,EAAgBO,eA7HpB,GAAIZ,GAAa,KACbK,EAAkB,KAClBE,EAAS,KACTG,EAAa,KAEbrE,GACAnV,SAAqBA,EACrB2W,SAAqBA,EACrBkB,WAAqBA,EACrBK,KAAqBD,EACrBW,cAAqBA,EACrBG,cAAqBA,EACrBC,oBAAqBA,EACrBE,mBAAqBA,EACrBE,UAAqBA,EACrBE,UAAqBA,EACrBC,cAAqBA,EACrBE,cAAqBA,EACrBC,aAAqBA,EAGzB,OAAOvE,IA8Gf,QAASwE,GAAuBnZ,EAAQoZ,GAwBpC,QAASvI,KAGLuI,EAAoB1B,OAMxB,QAAS2B,KAELzc,QAAQiM,QAAQ,QAAQoF,YAAY,+CAjCxC,GAAI3Q,GAAKO,IAGJmC,GAAOyY,KAERnb,EAAGga,WAAa8B,EAAoBZ,oBAAoBxY,EAAOyY,MAI/Dnb,EAAGga,WAAa8B,EAAoBZ,sBAIxClb,EAAG+b,2BAA6BA,EAIhCxI,IAqBJ,QAASyI,GAAsBvZ,EAAYwF,EAAUgU,EAAYH,GAE7D,OACI/K,SAAa,IACbC,OACIuK,OAAQ,IACRJ,KAAQ,KAEZhc,WAAa,+BACbD,YAAa,4DACb+R,YAAa,EACbC,QAAa,SAAUC,GAInB,MAFAA,GAASC,SAAS,iBAEX,SAAkBJ,EAAOK,GAgB5B,QAASkC,KAeoC,OAApCuI,EAAoBN,aAErBM,EAAoBR,UAAUtK,EAAMuK,QAGnCO,EAAoBN,cAQrBvT,EAAS,WAELxF,EAAWyZ,WAAW,4BAI1BC,EAAO/K,SAAS,wBAGhBgL,KAoDR,QAASd,GAAUC,GAKf,GAFAO,EAAoBR,UAAUC,GAEzBA,EAGD9Y,EAAWyZ,WAAW,0BAGtBC,EAAO/K,SAAS,wBAGhBgL,QAGJ,CAEI,GAAIpB,GAAac,EAAoBb,eAChCD,IAEDA,EAAWhK,MAAMqL,MAAM,8BAI3BF,EAAOlJ,YAAY,kDAGnBqJ,KAOR,QAASF,KAEL/K,EAAS/F,SAASqG,OAAO4K,GAIzBtU,EAAS,WAELsU,EAAepJ,GAAG,wBAAyBqJ,KAOnD,QAASC,KAELN,EAAO3I,KAAK,SAAS7B,OAAO+K,GAC5BA,EAAgBvJ,GAAG,wBAAyBwJ,GAMhD,QAASL,KAELI,EAAgB7Y,SAMpB,QAAS2Y,GAAoB1Z,GAEpBA,GAEDA,EAAM8Z,iBAIVd,EAAoBL,eAAc,EAGlC,IAAIT,GAAac,EAAoBb,eAChCD,IAEDA,EAAWhK,MAAMqL,MAAM,8BAI3BF,EAAO/K,SAAS,6BAGhBmL,EAAe1Y,SAGf4Y,IAMJ,QAASE,GAAqB7Z,GAErBA,GAEDA,EAAM8Z,iBAIVd,EAAoBL,eAAc,GAGlChZ,EAAWyZ,WAAW,0BAGtBC,EAAOlJ,YAAY,6BAGnByJ,EAAgB7Y,SAGhBuY,IA7NJ,GAAID,GAAS7c,QAAQiM,QAAQ,QACzBgR,EAAiBjd,QAAQiM,QAAQ,gDACjCmR,EAAkBpd,QAAQiM,QAAQ,iDAClCsR,EAAUZ,EAAW,aAGzBH,GAAoBV,mBAAmBpK,GAGvCuC,IA+CAvC,EAAMoD,OAAO,WAET,MAAOyI,GAAQpH,gBAChB,SAAUpB,EAASC,GAElB,IAAKhV,QAAQoW,YAAYrB,KAAY/U,QAAQiV,OAAOF,EAASC,GAA7D,CAKA,GAAIiH,GAASO,EAAoBN,WAEjC,IAAKD,EAED,GAAKlH,EAGD5R,EAAWyZ,WAAW,8BAG1B,CAEI,GAAIlB,GAAac,EAAoBb,eAChCD,IAEDA,EAAWhK,MAAMqL,MAAM,kCAOvCrL,EAAMoD,OAAO,SAAU,SAAUC,EAASC,GAEjChV,QAAQoW,YAAYrB,IAAY/U,QAAQiV,OAAOF,EAASC,IAK7DgH,EAAUjH,KAoIdrD,EAAM4K,aAAe,WAEjB,GAAIL,GAASO,EAAoBN,WAEjCF,IAAWC,IAMfvK,EAAM5I,IAAI,oBAAqB,WAG3ByU,EAAQC,QAGHhB,EAAoBN,aAErBmB,MAKR3L,EAAM5I,IAAI,WAAY,WAElBsU,EAAgBtJ,IAAI,yBACpBmJ,EAAenJ,IAAI,8BAQvC,QAAS2J,GAA2Bra,EAAQ6N,EAAU9N,EAAY0S,EAAUjN,EAAQ+T,EAAYH,GAkC5F,QAASvI,KAgCL,GA3BAvT,EAAGgd,YAAchd,EAAG+a,KAAK1B,SAAS/R,OAAS,EAG3CtH,EAAGid,SAAW3d,QAAQsR,UAAU5Q,EAAG+a,KAAKkC,QAAUjd,EAAG+a,KAAKkC,SAAU,IAG9Djd,EAAGgd,aAAehd,EAAGid,MAEvBjd,EAAGkd,aAAc,EAIjBld,EAAGkd,eAAiB5d,QAAQoW,YAAY1V,EAAG+a,KAAKmC,cAA+C,iBAAxBld,GAAG+a,KAAKmC,aAA6Bld,EAAG+a,KAAKmC,eAAgB,GAIlIld,EAAGkd,YAMLld,EAAGmd,aAAe7d,QAAQoW,YAAY1V,EAAG+a,KAAKoC,YAA2C,iBAAtBnd,GAAG+a,KAAKoC,WAA2Bnd,EAAG+a,KAAKoC,aAAc,GAJ5Hnd,EAAGmd,WAAY,EASdnd,EAAG+a,KAAKjc,QAAUoJ,EAAOmM,QAAQpR,MAAQiF,EAAOkV,SAASpd,EAAG+a,KAAKjc,OACtE,CAGI,GAAKQ,QAAQsR,UAAU5Q,EAAG+a,KAAKzY,cAAgBhD,QAAQsR,UAAU1I,EAAO/G,UAAY7B,QAAQiV,OAAOvU,EAAG+a,KAAKzY,YAAa4F,EAAO/G,QAE3H,MAGJuB,GAAO2Z,MAAM,8BAGbP,EAAoBhB,cAAc9a,EAAG+a,KAAMrY,GAG/CA,EAAO0F,IAAI,6BAA8B,WAGhCpI,EAAGkd,aAAeld,EAAGmd,WAEtBza,EAAO2a,WAAW,WAEdrd,EAAGmd,WAAY,MAM3Bza,EAAO0F,IAAI,yBAA0B,SAAUtF,EAAOQ,GAElD,IAAKtD,EAAGmd,WAAcnd,EAAGkd,YAMzB,GAAK5d,QAAQoW,YAAYpS,GAErBtD,EAAG+V,eAMP,CACI,GAAIuH,GAAiBha,EAAK0V,MAAM,KAC5BuE,KAEAvC,EAAac,EAAoBb,eAOrC,IANKD,IAEDuC,EAAkBvC,EAAWD,KAAKxB,MAAMP,MAAM,MAI7CsE,EAAeE,QAAQxd,EAAG+a,KAAK5B,KAAO,GAEvC,MAIJ,IAAKoE,EAAgBC,QAAQxd,EAAG+a,KAAK5B,KAAO,GAExC,MAGJnZ,GAAG+V,cAKXrT,EAAO0F,IAAI,sBAAuB,WAE9B,GAAKpI,EAAG+a,KAAKjc,QAAUoJ,EAAOmM,QAAQpR,KACtC,CAGI,GAAK3D,QAAQsR,UAAU5Q,EAAG+a,KAAKzY,cAAgBhD,QAAQsR,UAAU1I,EAAO/G,UAAY7B,QAAQiV,OAAOvU,EAAG+a,KAAKzY,YAAa4F,EAAO/G,QAE3H,MAIJ2a,GAAoBhB,cAAc9a,EAAG+a,KAAMrY,GAG3CD,EAAWyZ,WAAW,yBAA0Blc,EAAG+a,KAAKxB,UAQpE,QAASkE,KAEAzd,EAAGmd,UAEJnd,EAAG8V,SAIH9V,EAAG+V,WAOX,QAASA,KAGL,GAAI2H,GAAa1d,EAAGuL,QAAQ8N,SAAS,MAGjC1G,EAAS+K,EAAW,GAAGC,YAE3Bjb,GAAO2a,WAAW,WAGdrd,EAAGmd,WAAY,EAGfnd,EAAGuL,QAAQ6F,SAAS,cAGpB+D,EAASyI,QAAQF,GAETG,QAAW,QACXlL,OAAWA,EAAS,OAGpBA,OAAU,OAEd3S,EAAG8d,oBACL9K,KACE,WAGI0K,EAAWK,KACPF,QAAW,GACXlL,OAAW,KAIf3S,EAAGuL,QAAQ0H,YAAY,gBAK/BvQ,EAAOwZ,WAAW,4BAO1B,QAASpG,KAGL,GAAIkI,GAAWhe,EAAGuL,QAAQ8N,SAAS,KAInC2E,GAASD,KACL7Z,SAAc,WACd+Z,WAAc,SACdJ,QAAc,QACdlL,OAAc,QAIlB,IAAIA,GAASqL,EAAS,GAAGL,aAAe,CAGxCK,GAASD,KACL7Z,SAAc,GACd+Z,WAAc,GACdJ,QAAc,GACdlL,OAAc,KAIlBjQ,EAAO2a,WAAW,WAGdrd,EAAGmd,WAAY,EAGfnd,EAAGuL,QAAQ6F,SAAS,aAGpB+D,EAASyI,QAAQI,GAETH,QAAW,QACXlL,OAAW,QAGXA,OAAUA,EAAS,MAEvB3S,EAAG8d,oBACL9K,KACE,WAGIgL,EAASD,KACLpL,OAAU,KAId3S,EAAGuL,QAAQ0H,YAAY,eAM/BxQ,EAAWyZ,WAAW,yBAA0Blc,EAAG+a,KAAKxB,SAShE,QAAS2E,KAEL,MAAOle,GAAG+a,KAAH/a,SAnSX,GAAIA,GAAKO,IAGTP,GAAGmc,OAAS7c,QAAQiM,QAAQ,QAC5BvL,EAAGuL,QAAUgF,EACbvQ,EAAG+a,KAAOrY,EAAOqY,KACjB/a,EAAGgd,YAAc3K,OACjBrS,EAAGmd,UAAY9K,OACfrS,EAAGkd,YAAc7K,OACjBrS,EAAGid,MAAQ5K,OACXrS,EAAG8d,mBAAqB,iBAGxB9d,EAAGyd,gBAAkBA,EACrBzd,EAAG+V,SAAWA,EACd/V,EAAG8V,OAASA,EACZ9V,EAAGke,SAAWA,EAKdle,EAAGme,uBAAyB,WAC1BlC,EAAW,cAAcmC,UAK3B7K,IA6QJ,QAAS8K,KAEL,OACItN,SAAkB,IAClBuN,kBACIvD,KAAM,qBAEV5b,WAAkB,mCAClB+R,QAAkB,SAAUC,GAIxB,MAFAA,GAASC,SAAS,sBAEX,SAAkBJ,EAAOK,EAAUC,EAAQiN,GAG9ClN,EAASD,SAASmN,EAAqBL,YAGlCK,EAAqBtB,OAEtB5L,EAASD,SAAS,YAQtC,QAASoN,KAEL,OACIzN,SAAU,IACVc,QAAU,oBACVX,QAAU,SAAUC,GAIhB,MAFAA,GAASC,SAAS;AAEX,SAAkBJ,EAAOK,EAAUC,EAAQiN,GAGzCA,EAAqBrB,aAEtB7L,EAAS8B,GAAG,QAASoL,EAAqBd,iBAI9CzM,EAAM5I,IAAI,WAAY,WAElBiJ,EAAS+B,IAAI,cAQjC,QAASqL,GAAgC3C,GAErC,OACI/K,SAAa,IACbC,OACImK,KAAM,KAEVhc,WAAa,+BACbD,YAAa,8DACb+R,YAAa,EACbC,QAAa,SAAUC,GAInB,MAFAA,GAASC,SAAS,4BAEX,SAAkBJ,GAGrB8K,EAAoBV,mBAAmBpK,MAOvD,QAAS0N,GAAqChc,EAAQ6N,EAAU9N,EAAYyF,EAAQ4T,GAoBhF,QAASvI,KAeL,GAVAvT,EAAG2K,UAAW,EAGd3K,EAAGgd,YAAchd,EAAG+a,KAAK1B,SAAS/R,OAAS,EAG3CtH,EAAGid,SAAW3d,QAAQsR,UAAU5Q,EAAG+a,KAAKkC,QAAUjd,EAAG+a,KAAKkC,SAAU,GAI/Djd,EAAG+a,KAAKjc,QAAUoJ,EAAOmM,QAAQpR,MAAQiF,EAAOkV,SAASpd,EAAG+a,KAAKjc,OACtE,CAGI,GAAKQ,QAAQsR,UAAU5Q,EAAG+a,KAAKzY,cAAgBhD,QAAQsR,UAAU1I,EAAO/G,UAAY7B,QAAQiV,OAAOvU,EAAG+a,KAAKzY,YAAa4F,EAAO/G,QAE3H,MAGJuB,GAAO2Z,MAAM,8BAGbP,EAAoBhB,cAAc9a,EAAG+a,KAAMrY,GAG/CA,EAAO0F,IAAI,6BAA8B,WAGhCpI,EAAGgd,aAEJta,EAAO2a,WAAW,WAEdrd,EAAG2K,UAAW,MAM1BjI,EAAO0F,IAAI,4BAA6B,WAEpC,GAAMpI,EAAGgd,YAAT,CAKA,GAAIO,MAEAvC,EAAac,EAAoBb,eAChCD,KAEDuC,EAAkBvC,EAAWD,KAAKxB,MAAMP,MAAM,MAI7CuE,EAAgBC,QAAQxd,EAAG+a,KAAK5B,KAAO,GAExCzW,EAAO2a,WAAW,WAEdrd,EAAG2K,UAAW,IAKlBjI,EAAO2a,WAAW,WAEdrd,EAAG2K,UAAW,OAO1BjI,EAAO0F,IAAI,sBAAuB,WAE9B,GAAKpI,EAAG+a,KAAKjc,QAAUoJ,EAAOmM,QAAQpR,KACtC,CAGI,GAAK3D,QAAQsR,UAAU5Q,EAAG+a,KAAKzY,cAAgBhD,QAAQsR,UAAU1I,EAAO/G,UAAY7B,QAAQiV,OAAOvU,EAAG+a,KAAKzY,YAAa4F,EAAO/G,QAE3H,MAIJ2a,GAAoBhB,cAAc9a,EAAG+a,KAAMrY,GAG3CD,EAAWyZ,WAAW,gCAUlC,QAASgC,KAEL,MAAOle,GAAG+a,KAAH/a,SA1HX,GAAIA,GAAKO,IAGTP,GAAGuL,QAAUgF,EACbvQ,EAAG+a,KAAOrY,EAAOqY,KACjB/a,EAAGgd,YAAc3K,OACjBrS,EAAGid,MAAQ5K,OAGXrS,EAAGke,SAAWA,EAId3K,IAkHJ,QAASoL,KAEL,OACI5N,SAAkB,IAClBuN,kBACIvD,KAAM,+BAEV5b,WAAkB,6CAClB+R,QAAkB,SAAUC,GAIxB,MAFAA,GAASC,SAAS,iCAEX,SAAkBJ,EAAOK,EAAUC,EAAQsN,GAG9CvN,EAASD,SAASwN,EAA+BV,YAG5CU,EAA+B3B,OAEhC5L,EAASD,SAAS,YAQtC,QAASyN,GAAoCC,GAEzC,OACI/N,SAAU,IACVc,QAAU,8BACVX,QAAU,SAAUC,GAIhB,MAFAA,GAASC,SAAS,iCAEX,SAAkBJ,EAAOK,EAAUC,EAAQsN,GAI9C,QAASG,KAECH,EAA+B5B,cAAe8B,EAAS,UAK7DzN,EAASV,YAAY,YATzBU,EAAS8B,GAAG,QAAS4L,GAarB/N,EAAM5I,IAAI,WAAY,WAElBiJ,EAAS+B,IAAI,cAv0CjCyI,EAAuBxc,SAAW,SAAU,uBAC5C2c,EAAsB3c,SAAW,aAAc,WAAY,aAAc,uBACzE0d,EAA2B1d,SAAW,SAAU,WAAY,aAAc,WAAY,SAAU,aAAc,uBAC9Gof,EAAgCpf,SAAW,uBAC3Cqf,EAAqCrf,SAAW,SAAU,WAAY,aAAc,SAAU,uBAC9Fwf,EAAoCxf,SAAW,YA3B/CC,QACKC,OAAO,YACP4Y,SAAS,sBAAuBjX,GAChC/B,WAAW,yBAA0B0c,GAErC7J,UAAU,eAAgBgK,GAC1B7c,WAAW,6BAA8B4d,GACzC/K,UAAU,mBAAoBqM,GAC9BrM,UAAU,mBAAoBwM,GAE9BxM,UAAU,yBAA0ByM,GACpCtf,WAAW,uCAAwCuf,GACnD1M,UAAU,6BAA8B2M,GACxC3M,UAAU,6BAA8B6M,MAy1CjD,WAEI,YAaA,SAASG,KAsBL,QAASC,GAAYjO,EAAOzF,GAExB2T,GACIlO,MAAWA,EACXzF,QAAWA,GAOnB,QAAS4T,KAEL,MAAOD,GAASlO,MAAMmO,kBAM1B,QAASC,KAELF,EAASlO,MAAMoO,aAMnB,QAASC,KAELH,EAASlO,MAAMqO,aAMnB,QAASC,KAELJ,EAASlO,MAAMsO,cAzDnB,GAAIJ,MAEA7H,GACA4H,YAAiBA,EACjBE,gBAAiBA,EACjBC,WAAiBA,EACjBC,WAAiBA,EACjBC,YAAiBA,EAGrB,OAAOjI,GAoDX,QAASkI,GAAuBtP,EAAWxN,EAAYuc,GAEnD,OACIjO,SAAU,IACV0D,KAAU,SAAUzD,EAAOK,EAAUC,GAyBjC,QAAS6N,KAEL,MAAOK,GAMX,QAASJ,KAELK,GAAYA,EAEPA,EAEDC,IAIAC,IAOR,QAASD,KAGLjU,EAAK2F,SAAS,iBAGd3O,EAAWyZ,WAAW,wBACtB7K,EAASqB,UAAU,GAGnBkN,EAAUjO,OAAOkO,GAGjBA,EAAY1M,GAAG,wBAAyB,SAAUrQ,GAE9Cuc,EAAWvc,GACX0c,GAAe,IAOvB,QAASH,GAAWvc,GAEXxD,QAAQsR,UAAU9N,IAEnBA,EAAM8Z,iBAGVnR,EAAK2F,SAAS,sBAGd3O,EAAWyZ,WAAW,gCAGtB0D,EAAUpM,KAAKqM,GAAahc,SAG5B+b,EAAUtU,SAASqG,OAAOmO,GAC1BA,EAAa3M,GAAG,wBAAyB,SAAUrQ,GAE/Cwc,EAAYxc,GACZ0c,GAAe,IAOvB,QAASF,GAAYxc,GAEZxD,QAAQsR,UAAU9N,IAEnBA,EAAM8Z,iBAIVna,EAAWyZ,WAAW,wBACtB7K,EAASqB,UAAU,GAEnBjH,EAAKwH,YAAY,sBAGjB2M,EAAUtU,SAASkI,KAAKsM,GAAcjc,SAGtC+b,EAAUjO,OAAOkO,GACjBA,EAAY1M,GAAG,wBAAyB,SAAUrQ,GAE9Cuc,EAAWvc,GACX0c,GAAe,IAOvB,QAASG,KAELlU,EAAKwH,YAAY,oCAGjBxQ,EAAWyZ,WAAW,gCAEtB7K,EAAS+B,IAAI,yBArIjB,GAAIqM,GAAqC,SAAzBnO,EAAOyO,cACnBP,GAAe,EACf/T,EAAOnM,QAAQiM,QAAQ0E,EAAU,GAAGxE,MACpCoU,EAAcvgB,QAAQiM,QAAQ,6CAC9BuU,EAAexgB,QAAQiM,QAAQ,8CAC/BqU,EAAYvO,EAAS/F,QAGzB0T,GAAiBC,YAAYjO,EAAOK,EAAUoO,GAGzCA,EAEDC,IAIAC,IAwHJ3O,EAAMoO,WAAaA,EACnBpO,EAAMqO,WAAaA,EACnBrO,EAAMsO,YAAcA,EACpBtO,EAAMmO,gBAAkBA,EAGxBnO,EAAM5I,IAAI,WAAY,WAElByX,EAAYzM,IAAI,yBAChB0M,EAAa1M,IAAI,yBACjB/B,EAAS+B,IAAI,6BAQ7B,QAAS4M,KAyBL,QAASC,KAEL,MAAOC,GAMX,QAASC,KAELD,GAAW,EAMf,QAASE,KAELF,GAAW,EASf,QAASG,GAAc9U,EAASyF,GAE5BsP,EAAY/Y,MACRgE,QAAWA,EACXyF,MAAWA,IASnB,QAASuP,KAEL,MAAOC,GASX,QAASC,GAAclV,EAASyF,GAE5BwP,EAAYjZ,MACRgE,QAAWA,EACXyF,MAAWA,IAOnB,QAAS0P,KAELF,KAvFJ,GAAIxgB,GAAKO,KACL2f,GAAW,EACXI,KACAE,IAKJxgB,GAAGigB,WAAaA,EAChBjgB,EAAGogB,OAASA,EACZpgB,EAAGmgB,QAAUA,EACbngB,EAAGqgB,cAAgBA,EACnBrgB,EAAGugB,eAAiBA,EACpBvgB,EAAGygB,cAAgBA,EACnBzgB,EAAG0gB,iBAAmBA,EA8E1B,QAASC,GAAele,EAAYme,EAAsB5B,GAEtD,OACIjO,SAAY,IACZC,SACA7R,WAAY,kBACZ+R,QAAY,SAAUC,GAIlB,MAFAA,GAASC,SAAS,UAEX,SAAkBJ,GAGrBvO,EAAWyZ,WAAW,+BAGtB,IAAI2E,GAA0Bpe,EAAW2F,IAAI,sBAAuB,WAEhE3F,EAAWyZ,WAAW,gCAGtB0E,EAAqBE,KAAK,cAAc9N,KAAK,SAAUgH,GAEnDA,EAAW8C,QAENkC,EAAiBG,mBAElBH,EAAiBM,iBAM7BtO,GAAM5I,IAAI,WAAY,WAElByY,SAQpB,QAASE,KAEL,OACIhQ,SAAU,IACVG,QAAU,SAAUC,GAIhB,MAFAA,GAASC,SAAS,gBAEX,eASnB,QAAS4P,KAEL,OACIjQ,SAAU,KACVG,QAAU,SAAUC,GAIhB,MAFAA,GAASC,SAAS,iBAEX,eASnB,QAAS6P,GAAqBxe,EAAY6Q,EAAI6B,EAAUjN,GAEpD,OACI6I,SAAU,IACVc,QAAU,SACVb,OAAU,EACVE,QAAU,SAAUC,EAAU+P,GAY1B,MAVA/P,GAASC,SAAS,iBAGb9R,QAAQoW,YAAYwL,EAAO/D,aAE5B+D,EAAO/D,WAAY,GAGvBhM,EAASgQ,KAAK,YAAaD,EAAO/D,WAE3B,SAAkBnM,EAAOK,EAAUC,EAAQ8P,GAmC9C,QAAShD,KAGAgD,EAAUnB,eAMfmB,EAAUjB,UAELkB,KAGDD,EAAUV,mBAGV1P,EAAMqL,MAAM,2BAGZ5Z,EAAWyZ,WAAW,mBAGtBpG,IAAS9C,KAAK,WAGVoO,EAAUhB,YAMdpP,EAAMkL,WAAW,yBAqGzB,QAASmF,KAEL,MAAsC,SAA/BhQ,EAAS8P,KAAK,aAQzB,QAASG,KAEL,OAAQD,IAQZ,QAASvL,KAGL,GAAIhC,GAAWR,EAAGS,OAGlB,IAAKuN,IAMD,MAHAxN,GAASyN,QAAQ7H,OAAS,IAGnB5F,EAASG,OAIpB5C,GAAS8P,KAAK,aAAa,EAG3B,IAAIK,GAAkBliB,QAAQiM,QAAQ8F,EAASmC,KAAK,uBAAuB,GAI3EgO,GAAgBzD,KACZ7Z,SAAc,WACd+Z,WAAc,SACdJ,QAAc,QACdlL,OAAc,QAIlB,IAAIA,GAAS6O,EAAgB,GAAG7D,YAsChC,OAnCA6D,GAAgBzD,KACZ7Z,SAAc,GACd+Z,WAAc,GACdJ,QAAc,GACdlL,OAAc,KAIlB3B,EAAMqM,WAAW,WAEblI,EAASyI,QAAQ4D,GAET3D,QAAW,QACXlL,OAAW,QAGXA,OAAUA,EAAS,MAEvB8O,EAAQC,iBACV1O,KACE,WAGIwO,EAAgBpQ,SAASqQ,EAAQE,UAGjCH,EAAgBzD,KAAKpL,OAAU,KAG/BmB,EAAStS,SAASogB,SAAW,QAMlC9N,EAASG,QAQpB,QAAS8B,KAGL,GAAIjC,GAAWR,EAAGS,OAGlB,IAAKsN,IAMD,MAHAvN,GAASyN,QAAQ7H,OAAS,IAGnB5F,EAASG,OAIpB5C,GAAS8P,KAAK,aAAa,EAG3B,IAAIU,GAAoBviB,QAAQiM,QAAQ8F,EAASmC,KAAK,uBAAuB,IAGzEb,EAASkP,EAAkB,GAAGlE,YAgClC,OA7BA3M,GAAMqM,WAAW,WAEblI,EAASyI,QAAQiE,GAETlP,OAAUA,EAAS,OAGnBA,OAAU,OAEd8O,EAAQK,mBACV9O,KACE,WAGI6O,EAAkB5O,YAAYwO,EAAQE,UAGtCE,EAAkB9D,KACdF,QAAW,GACXlL,OAAW,KAIfmB,EAAStS,SAASogB,SAAW,QAMlC9N,EAASG,QA7TpB,GAAIwN,IACAE,SAAmB,WACnBD,gBAAmB,mBACnBI,kBAAmB,sBAInBC,EAAQ1Q,EAASmC,KAAK,KACtBwO,KACAC,EAAS,SAEb3iB,SAAQ4iB,QAAQH,EAAO,SAAUtN,GAE7B,GAAI3V,GAAQQ,QAAQiM,QAAQkJ,GAAM0M,KAAK,UAElC7hB,SAAQoW,YAAY5W,KAMzBA,EAAQA,EAAMqjB,QAAQF,EAAQ,IAE9BD,EAAOza,KAAKzI,MAIhBsiB,EAAUf,cAAchP,EAAUL,GAGlCK,EAASgI,SAAS,kBAAkBlG,GAAG,QAASiL,GAwChDpN,EAAM5I,IAAI,WAAY,WAElBiJ,EAASgI,SAAS,kBAAkBjG,IAAI,WAU5CpC,EAAM5I,IAAI,kBAAmB,WAGzB,GAAIoY,GAAcY,EAAUb,iBACxB6B,GAAS,CAEb9iB,SAAQ4iB,QAAQ1B,EAAa,SAAU6B,GAE9B/iB,QAAQiV,OAAO8N,EAAWrR,MAAOA,KAElCoR,GAAS,KAIZA,GAMLrM,IAAW/C,KAAK,WAGZoO,EAAUhB,aAOlBpP,EAAM5I,IAAI,uBAAwB,WAG9B2N,IAAW/C,KAAK,WAGZoO,EAAUhB,aAOlBpP,EAAM5I,IAAI,+BAAgC,WAEtC,GAAIka,GAAepa,EAAOmM,QAAQpR,KAC9Bsf,GAAe,CAEnBjjB,SAAQ4iB,QAAQF,EAAQ,SAAUljB,GAEzBwjB,IAAiBxjB,IAElByjB,GAAe,KAIlBA,EAEDzM,IAIAC,MAOR/E,EAAM5I,IAAI,0BAA2B,WAGjCgZ,EAAUX,cAAcpP,EAAUL,QAziBtDuO,EAAuBlgB,SAAW,YAAa,aAAc,oBAC7DshB,EAAethB,SAAW,aAAc,uBAAwB,oBAChE4hB,EAAqB5hB,SAAW,aAAc,KAAM,WAAY,UA9BhEC,QACKC,OAAO,YACPijB,QAAQ,mBAAoBxD,GAC5BhN,UAAU,gBAAiBuN,GAC3BpgB,WAAW,kBAAmB6gB,GAC9BhO,UAAU,QAAS2O,GACnB3O,UAAU,aAAc+O,GACxB/O,UAAU,cAAegP,GACzBhP,UAAU,cAAeiP,MAuuBlC,WAEI,YASA,SAASwB,KA4BL,QAASC,GAAa/c,GAElB3F,EAAG2iB,MAAMpb,KAAK5B,GAMlB,QAASid,KAEL5iB,EAAG6iB,gBAMP,QAASC,KAEL9iB,EAAG6iB,gBAGP,QAASE,GAASC,GAEbA,EAAQhjB,EAAG2iB,MAAMrb,OAAS,GAC3BlD,QAAQC,IAAI,SAAW2e,EAAQ,qBAEjChjB,EAAG6iB,cAAgBG,EAQrB,QAASC,KAEL,MAA4B,KAArBjjB,EAAG6iB,cAQd,QAASK,KAEL,MAAOljB,GAAG6iB,gBAAkB7iB,EAAG2iB,MAAMrb,OAAS,EASlD,QAAS6b,KAEL,MAAO7jB,SAAQsR,UAAU5Q,EAAG2iB,MAAM3iB,EAAG6iB,iBAAmB7iB,EAAG2iB,MAAM3iB,EAAG6iB,eAAeO,SAQvF,QAASC,KAEL,IAAM,GAAI5I,GAAI,EAAGA,EAAIza,EAAG2iB,MAAMrb,OAAQmT,IAElC,GAAKza,EAAG2iB,MAAMlI,GAAG2I,SAEb,OAAO,CAIf,QAAO,EAMX,QAASE,KAGLtjB,EAAG6iB,cAAgB,CAGnB,KAAM,GAAIpI,GAAI,EAAGA,EAAIza,EAAG2iB,MAAMrb,OAAQmT,IAElCza,EAAG2iB,MAAMlI,GAAG8I,eACZvjB,EAAG2iB,MAAMlI,GAAG+I,gBApHpB,GAAIxjB,GAAKO,IAGTP,GAAG2iB,SACH3iB,EAAG6iB,cAAgB,EAGnB7iB,EAAG0iB,aAAeA,EAElB1iB,EAAG4iB,aAAeA,EAClB5iB,EAAG8iB,SAAWA,EACd9iB,EAAGijB,YAAcA,EACjBjjB,EAAGkjB,WAAaA,EAEhBljB,EAAGmjB,mBAAqBA,EACxBnjB,EAAGqjB,gBAAkBA,EACrBrjB,EAAGsjB,UAAYA,EAEftjB,EAAG+iB,SAAWA,EAwGlB,QAASU,KAEL,OACI1S,SAAY,IACZC,OAAY,EACZ7R,WAAY,qCACZ+R,QAAY,SAAUC,GAIlB,MAFAA,GAASC,SAAS,kBAEX,eAUnB,QAASsS,KAEL,OACI3S,SAAU,IACVc,SAAW,OAAQ,iBACnBX,QAAU,SAAUC,GAIhB,MAFAA,GAASC,SAAS,uBAEX,SAAkBJ,EAAOK,EAAUC,EAAQqS,GAE9C,GAAIC,GAAWD,EAAM,GACjBE,EAAmBF,EAAM,EAE7BE,GAAiBnB,aAAakB,MArK9CtkB,QACKC,OAAO,YACPJ,WAAW,yBAA0BsjB,GACrCzQ,UAAU,eAAgByR,GAC1BzR,UAAU,mBAAoB0R,MAyKvC,WAEI,YAOA,SAASI,KAEL,OACI/S,SAAU,IACVC,OACI+S,aAAc,YACdC,KAAc,YAElBC,SAAU,sGACV/S,QAAU,SAAUC,GAKhB,MAFAA,GAASC,SAAS,WAEX,SAAkBJ,EAAOK,GAU5B,QAAS6S,KAELlT,EAAMqL,MAAM,6BAA8BhL,GAT9CL,EAAMkT,mBAAqBA,KAtB3C5kB,QACKC,OAAO,YACPyS,UAAU,SAAU8R,MAoC7B,WAEI,YAOA,SAASllB,GAAOC,EAAgBoC,EAAiCC,GAG7DrC,EAAeC,MAAM,yBACjBC,IAAW,qBACXC,OACIwI,SACItI,YAAa,qCACbC,WAAa,wBAEjBglB,iCACIjlB,YAAa,yCACbC,WAAa,gCAGrBC,UAAW,cACX4C,wBAAwB,IAI5Bf,EAAgCgB,QAAQ,yBAM5CrD,EAAOS,SAAW,iBAAkB,kCAAmC,+BA/BvEC,QACKC,OAAO,4BACPX,OAAOA,MA6BhB,WAEI,YAOA,SAASwlB,MALT9kB,QACKC,OAAO,yBACPJ,WAAW,wBAAyBilB,MAY7C,WAEE,YAOA,SAASxlB,GAAOC,EAAgBoC,EAAiCC,GAG/DrC,EAAeC,MAAM,gBACnBC,IAAW,YACXC,OACEC,eACEC,YAAa,mCACbC,WAAa,6BAGjBqC,SACEK,cAAA,cAAc,SAAUH,GAEtB,MAAOA,GAAYF,QAAQ,0BAG/BpC,UAAW,WACX2C,cAAc,EACdC,wBAAwB,IAK1Bd,EAA4BgB,SAAS,aACnCC,MAAQ,eACRC,OAAQ,EACRC,KAAM,kBACNvD,MAAO,iBADXF,EAAOS,SAAW,iBAAkB,kCAAmC,+BAhCvEC,QACGC,OAAO,mBACPX,OAAOA,MAqCZ,WAEE,YAOA,SAASylB,GAAmB5hB,EAAYZ,EAAcsG,EAAWzI,EAAW8C,EAAUqC,EAAYlC,EAAe0C,EAAQtC,GAwBvH,QAASuhB,GAAenU,EAAI/O,GAE1B,GAAImjB,GAAU7kB,EAAU6kB,UACrBpiB,MAAM,mBACN8B,YAAY,kDACZyH,UAAU,mBACV2E,YAAYF,GACZ9E,qBAAoB,GACpBC,OAAOhM,QAAQiM,QAAQC,SAASC,OAChCE,GAAG,OACH6Y,OAAO,KAEV9kB,GAAUqE,KAAKwgB,GAASvR,KAAK,WAC3BjQ,EAAI3B,SAAJ2B,UAAoBc,QAASJ,GAAIrC,EAASqC,IACxC,SAASC,GAEP,GAAIC,GAAoBhB,EAAciB,IAAI,QAC1CD,GAAkBE,OAAOpB,EAAWqB,OAAS,iBAE7Ce,EAAWkC,WAAW,WAAcC,SAAU,aAE9CxE,EAASuB,KACPvB,EAASwB,SACNC,YAAY,qBACZC,SAAS,aACTC,UAAU,KAGf,KAAI,GAAIkD,GAAE,EAAEA,EAAErH,EAAGykB,UAAUnd,OAAOD,IAChC,GAAGjG,EAASqC,IAAMzD,EAAGykB,UAAUpd,GAAG5D,GAAI,CACpCzD,EAAGykB,UAAUvK,OAAO7S,EAAE,EACtB,OAIJ5E,EAAW6J,gBAAkB,MAE/B,SAAS5I,GAEPU,QAAQC,IAAIX,GACZlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAArB9B,YACZyB,SAAS,aACTC,UAAU,SAIlB,cArEL,GAAInE,GAAKO,IACTP,GAAGmC,MAAQ,YACXnC,EAAGykB,UAAY5iB,EAEfY,EAAW2R,OAAO,kBAAmB,WACnC,GAAI3R,EAAW6J,gBACb,IAAK,GAAIjF,GAAI,EAAGA,EAAIrH,EAAGykB,UAAUnd,OAAQD,IAEvC,IAAK,GADDqd,GAAa1kB,EAAGykB,UAAUpd,GAAG5D,GACxBkhB,EAAI,EAAGA,EAAIliB,EAAW6J,gBAAgBsY,eAAetd,OAAQqd,IACpE,GAAIliB,EAAW6J,gBAAgBsY,eAAeD,GAAGvjB,SAASqC,IAAMihB,EAAY,CAC1E1kB,EAAGykB,UAAUpd,GAAGwd,WAAapiB,EAAW6J,gBAAgBsY,eAAeD,GAAGE,UAC1E,UAQV7kB,EAAGskB,eAAiBA,EAMtBD,EAAmBhlB,SAAW,aAAc,eAAgB,YAAa,YAAa,WAAY,aAAc,gBAAiB,SAAU,OAjC3IC,QACGC,OAAO,gBACPJ,WAAW,qBAAsBklB,MAoFtC,WAEI,YAOA,SAASzlB,GAAOC,EAAgBoC,EAAiCC,GAG7DrC,EAAeC,MAAM,eACjBC,IAAW,WACXC,OACIC,eACIC,YAAa,gCACbC,WAAa,4BAGrBqC,SACEsjB,gBAAA,cAAgB,SAAUpjB,GAExB,MAAOA,GAAYF,QAAQ,iCAE7BujB,kBAAA,cAAkB,SAAUrjB,GAE1B,MAAOA,GAAYF,QAAQ,yBAG/BpC,UAAW,kBACX2C,cAAc,EACdC,wBAAwB,IAMhCpD,EAAOS,SAAW,iBAAkB,kCAAmC,+BAlCvEC,QACKC,OAAO,kBACPX,OAAOA,MAoChB,WAEI,YAOA,SAASomB,GAAkBviB,EAAY/C,EAAW8C,EAAU0F,EAAQrI,EAASoQ,EAAWtN,EAAemiB,EAAeC,EAAkB1f,EAAQtC,GAyD9I,QAASkiB,KAEP/c,EAAOgD,GAAG,gBAGZ,QAASga,GAAmBzhB,GAE1B,IAAK,GAAI4D,GAAE,EAAGA,EAAI0d,EAAiBzd,OAAQD,IACzC,GAAI0d,EAAiB1d,GAAG5D,IAAMA,EAC1B,MAAOshB,GAAiB1d,GAKhC,QAAS8d,KAEP,GAAIva,IACFf,UAAW7J,EAAGolB,YAAYvb,UAC1BC,SAAW9J,EAAGolB,YAAYtb,SAC1BR,MAAO7G,EAAW2D,KAAKkD,MACvBW,YAAajK,EAAGolB,YAAYpb,YAC5BE,SAAUlK,EAAGolB,YAAYlb,SAASmb,OAClCC,YAAatlB,EAAGolB,YAAYE,YAC5B/b,SAAUvJ,EAAGolB,YAAYG,YACzBnb,eAAgBpK,EAAGolB,YAAYhb,eAAe3G,GAC9C0G,WAAY1H,EAAW2D,KAAK+D,WAG9BpH,GAAIqD,KAAKkJ,KAAKzM,OAAO+H,EACnB,SAASlH,GAEPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAY,kBACZC,SAAS,aACTC,UAAU,MAGf1B,EAAW2D,KAAKyD,UAAYe,EAAYf,UACxCpH,EAAW2D,KAAK0D,SAAWc,EAAYd,SACvCrH,EAAW2D,KAAK4D,YAAcY,EAAYX,YAC1CxH,EAAW2D,KAAK8D,SAAWU,EAAYV,SACvCzH,EAAW2D,KAAKgE,eAAiBQ,EAAYR,eAE1C3H,EAAW6B,UAAUkG,YACtB3K,EAAQ4I,eAAerC,KAAOsC,KAAK+B,UAAUhI,EAAW2D,QAG5D,SAAS1C,GAEPU,QAAQC,IAAIX,GACU,KAAnBA,EAASyD,QAaV3E,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAArB9B,YACZyB,SAAS,aACTC,UAAU,QAUvB,QAASqhB,GAAcrV,GAErBzQ,EAAUqE,MACR5E,WAAqB,6BACrBiR,aAAqB,KACrBlR,YAAqB,kDACrBoM,OAAqBhM,QAAQiM,QAAQ0E,EAAUxE,MAC/C4E,YAAqBF,EACrB9E,qBAAqB,EACrBoa,QACE3iB,MAAOqN,EACPxC,WAAY,KACZD,YAAa1N,EAAG0N,eAKtB,QAASgY,GAAevV,EAAIxC,GAE1BjO,EAAUqE,MACR5E,WAAqB,6BACrBiR,aAAqB,KACrBlR,YAAqB,kDACrBoM,OAAqBhM,QAAQiM,QAAQ0E,EAAUxE,MAC/C4E,YAAqBF,EACrB9E,qBAAqB,EACrBoa,QACE3iB,MAAOqN,EACPxC,WAAYA,EACZD,YAAa1N,EAAG0N,eAKtB,QAASiY,GAAiBxV,EAAI1M,GAE5B,GAAI8gB,GAAU7kB,EAAU6kB,UACrBpiB,MAAM,sBACN8B,YAAY,qDACZyH,UAAU,sBACV2E,YAAYF,GACZ9E,qBAAoB,GACpBC,OAAOhM,QAAQiM,QAAQC,SAASC,OAChCE,GAAG,OACH6Y,OAAO,KAEV9kB,GAAUqE,KAAKwgB,GAASvR,KAAK,WAC3BjQ,EAAIqD,KAAKiJ,YAATtM,UAA4Bc,QAASJ,GAAIA,GACvC,SAASC,GAEP,GAAIC,GAAoBhB,EAAciB,IAAI,QAC1CD,GAAkBE,OAAOpB,EAAWqB,OAAS,kBAE7C,KAAI,GAAIuD,GAAE,EAAEA,EAAErH,EAAG0N,YAAYpG,OAAOD,IAClC,GAAG5D,GAAMzD,EAAG0N,YAAYrG,GAAG5D,GAAI,CAC7BzD,EAAG0N,YAAYwM,OAAO7S,EAAE,EACxB,OAIDrH,EAAGoG,KAAKiE,qBAAuB5G,IAChChB,EAAW2D,KAAKiE,oBAAsB,KAEnC5H,EAAW6B,UAAUkG,YACtB3K,EAAQ4I,eAAerC,KAAOsC,KAAK+B,UAAUhI,EAAW2D,QAI5D5D,EAASuB,KACPvB,EAASwB,SACNC,YAAY,wBACZC,SAAS,aACTC,UAAU,OAIjB,SAAST,GAEPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAArB9B,YACZyB,SAAS,aACTC,UAAU,SAKlB,cAML,QAASyhB,GAAczV,GACrB,GAAIoU,GAAU7kB,EAAU6kB,UACrBpiB,MAAM,kBACN8B,YAAY,iDACZyH,UAAU,kBACV2E,YAAYF,GACZ9E,qBAAoB,GACpBC,OAAOhM,QAAQiM,QAAQC,SAASC,OAChCE,GAAG,OACH6Y,OAAO,KAEV9kB,GAAUqE,KAAKwgB,GAASvR,KAAK,WAC3BjQ,EAAIqD,KAAKoe,OAAO5gB,OACd,SAASF,GAEPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAY,yDAA2DxB,EAAW2D,KAAK2C,4BACvF7E,SAAS,aACTC,UAAU,MAGf1B,EAAW2D,KAAKwC,mBAAqBlF,EAASkF,mBAE3CnG,EAAW6B,UAAUkG,YACtB3K,EAAQ4I,eAAerC,KAAOsC,KAAK+B,UAAUhI,EAAW2D,QAI5D,SAAS1C,GAEPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAArB9B,YACZyB,SAAS,aACTC,UAAU,SAIlB,cAKL,QAAS0hB,GAAuBlY,GAC9B5K,EAAIqD,KAAKiJ,YAATtM,WAA6BF,QAASY,GAAIkK,EAAWlK,IACnD,SAASC,GAEPjB,EAAW2D,KAAKiE,oBAAsB3G,EAAS2G,oBAE5C5H,EAAW6B,UAAUkG,YACtB3K,EAAQ4I,eAAerC,KAAOsC,KAAK+B,UAAUhI,EAAW2D,QAG5D,SAAS1C,GAEPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAArB9B,YACZyB,SAAS,aACTC,UAAU,QA9RrB,GAAInE,GAAKO,IAETP,GAAGmC,MAAQ,aACXnC,EAAGolB,aACDvb,UAAWpH,EAAW2D,KAAKyD,UAC3BC,SAAWrH,EAAW2D,KAAK0D,SAC3BR,MAAO7G,EAAW2D,KAAKkD,MACvBU,YAAavH,EAAW2D,KAAK4D,YAC7BI,eAAgB3H,EAAW2D,KAAKgE,eAChCD,WAAY1H,EAAW2D,KAAK+D,YAE9BnK,EAAG8lB,iBACDjc,UAAWpH,EAAW2D,KAAKyD,UAC3BC,SAAWrH,EAAW2D,KAAK0D,SAC3BQ,sBAAuB7H,EAAW2D,KAAKmE,qBACvCxB,2BAA4BtG,EAAW2D,KAAK2C,4BAG9C/I,EAAG+lB,gBAAkBb,EAAmBziB,EAAW2D,KAAKkE,uBACxDtK,EAAG8lB,gBAAgBE,YAAchmB,EAAG+lB,gBAAgB9iB,KAEpDjD,EAAGimB,UAAYxjB,EAAWiN,QAAQuW,SAElC,KAAI,GAAI5e,GAAE,EAAEA,EAAErH,EAAGimB,UAAU3e,OAAOD,IAChC,GAAG5E,EAAW2D,KAAK8D,UAAYlK,EAAGimB,UAAU5e,GAAGge,OAAQ,CACrDrlB,EAAGolB,YAAYlb,SAAWlK,EAAGimB,UAAU5e,EACvC,OAGJrH,EAAGoG,KAAO3D,EAAW2D,KAErBpG,EAAG0N,YAAcoX,CAEjB,KAAI,GAAIzd,GAAE,EAAEA,EAAErH,EAAG0N,YAAYpG,OAAOD,IAClCrH,EAAG0N,YAAYrG,GAAGqH,SAAWrJ,EAAOyB,qBAAqB9G,EAAG0N,YAAYrG,GAAGqH,SAAUjM,EAAWiN,QAAQE,iBACxG5P,EAAG0N,YAAYrG,GAAGF,OAAS9B,EAAOyB,qBAAqB9G,EAAG0N,YAAYrG,GAAGF,OAAQ1E,EAAWiN,QAAQI,mBAGtG9P,GAAGoK,eAAiB,IACpB,KAAI,GAAI/C,GAAE,EAAEA,EAAE5E,EAAWiN,QAAQwW,iBAAiB5e,OAAOD,IACvD,GAAGrH,EAAGolB,YAAYhb,gBAAkB3H,EAAWiN,QAAQwW,iBAAiB7e,GAAG5D,GAAI,CAC7EzD,EAAGolB,YAAYhb,eAAiB3H,EAAWiN,QAAQwW,iBAAiB7e,EACpE,OAKJrH,EAAGmlB,YAAcA,EACjBnlB,EAAGwlB,cAAgBA,EACnBxlB,EAAG0lB,eAAiBA,EACpB1lB,EAAG2lB,iBAAmBA,EACtB3lB,EAAG4lB,cAAgBA,EACnB5lB,EAAG6lB,uBAAyBA,EAC5B7lB,EAAGilB,SAAWA,EAzBhBD,EAAkB3lB,SAAW,aAAc,YAAa,WAAY,SAAU,UAAW,YAAa,gBAAiB,iBAAkB,mBAAoB,SAAU,OAnCvKC,QACKC,OAAO,eACPJ,WAAW,oBAAqB6lB,MA6SzC,WAEI,YAOA,SAASmB,GAAmB1jB,EAAYC,EAAQ0jB,EAAcnW,EAAWvQ,EAAWof,EAAUtc,EAAUyF,EAAUoe,EAAWne,EAAQC,EAAWme,EAAezhB,EAAYlC,EAAe9C,EAASkD,EAAKtB,EAAcI,EAAcC,EAAeuD,GAofjP,QAASkhB,KACJzH,EAAS,OAASA,EAAS,MAC5B9e,GAAGwmB,eAAgB,EAEnBxmB,GAAGwmB,eAAgB,EAIvB,QAASC,GAAUvgB,EAAOV,EAASkhB,GAGZrU,SAAjBqU,IACFA,GAAe,EACZhkB,EAAOikB,eACLjkB,EAAOikB,cAAcljB,IAAMyC,EAAMzC,KAClCijB,GAAe,IAKlBA,IACDhkB,EAAOikB,cAAgBzgB,EACvBxD,EAAOikB,cAAcnhB,QAAUA,EAE/BohB,EAAephB,EAAS9C,EAAOmkB,uBAAuBC,OAAOpkB,EAAOmkB,uBAAuBC,OAAOxf,OAAS,KAK/G,QAASsf,GAAephB,EAASuhB,GAE/BrkB,EAAOikB,cAAcI,YAAcA,CAMnC,KAAK,GAAI1f,GAAI,EAAGA,EAAI3E,EAAOskB,gBAAgBC,KAAK3f,OAAQD,IACtD3E,EAAOskB,gBAAgBC,KAAK5f,GAAG6f,UAAY7hB,EAAO8hB,sBAAsBzkB,EAAOskB,gBAAgBC,KAAK5f,GAAI0f,EAAarkB,EAAO0kB,wBAK9H1kB,GAAO2kB,mBACLC,cAAe,cACfC,eAAe,EACfC,YACErlB,MAAOO,EAAOikB,cAAcO,UAAU1hB,GAASrD,MAC/CslB,UAAW,EACXC,QAAQ,IAEVC,UACAC,aAAcllB,EAAOikB,cAAcO,UAAU1hB,GAASkH,KACtDmb,YACE/kB,MAAO,iBACPglB,OAAQC,IAEVC,YAAa,cACbC,YACEC,KAAM,eACNC,MAAM,EACNzN,EAAG,IACH0N,MAAO,YAMX9oB,QAAQ0B,KAAK0B,EAAOikB,cAAcO,UAAU1hB,GAASmiB,OAAQjlB,EAAO2kB,kBAAkBM,QAEtFjlB,EAAO2kB,kBAAoBhiB,EAAOgjB,0BAA0B3lB,EAAO2kB,kBAEnE,KAAI,GAAIhgB,GAAE,EAAEA,EAAE3E,EAAO2kB,kBAAkBM,OAAOrgB,OAAOD,IACrC,UAAX7B,EACD9C,EAAO2kB,kBAAkBM,OAAOtgB,GAAGihB,gBAAkBC,EAErD7lB,EAAO2kB,kBAAkBM,OAAOtgB,GAAGihB,gBAAkBE,EAEvD9lB,EAAO2kB,kBAAkBM,OAAOtgB,GAAGohB,iBAAkB,EAGlDzoB,GAAGwmB,gBAEJ9jB,EAAO2kB,kBAAkBM,OAAOtgB,GAAGqhB,aAAc,GAOvD,QAASC,GAAgBziB,EAAOV,EAASwd,GAEvC9c,EAAM0iB,mBAAoB,EAC1BnC,EAAUvgB,EAAOV,GACjB9C,EAAOikB,cAAc9D,cAAgBG,EAGrC6F,EAAE,mBAAmBzX,SAAS,WAE9BjJ,EAAU2gB,KAAK,gBACfxC,IAIF,QAASyC,KAEPrmB,EAAOikB,cAAgB,KACvBkC,EAAE,mBAAmB5V,YAAY,WACjC+V,EAAgB,eAChBC,SAASC,UAGX,QAASC,GAAmBrmB,EAAO0C,GAEjC,GAAI4jB,GAAY9pB,QAAQiM,QAAQzI,EAAMumB,QAAQC,QAAQ,KAElDF,GAAUG,SAAS,YACrBV,EAAE,2CAA2C5V,YAAY,UACzDmW,EAAUhY,SAAS,UACnB1O,EAAOikB,cAAcnhB,QAAUA,EAC/BohB,EAAephB,EAAS9C,EAAOmkB,uBAAuBC,OAAOpkB,EAAOmkB,uBAAuBC,OAAOxf,OAAS,KAI/G,QAASkiB,KAEP,GAAIC,GAAczpB,GAAGypB,aACrB,KAAIA,EAEF,GAAG/mB,EAAOikB,cAAc9D,eAAiBngB,EAAOskB,gBAAgBC,KAAK3f,OAAS,EAE5E5E,EAAOskB,gBAAgB0C,SAAS/nB,OAChCe,EAAOskB,gBAAgB2C,QAAQ,OAC1B,CACL,GAAIC,GAAoBlnB,EAAOikB,cAAc9D,cAAgB,CAC7DgH,GAAiBD,GAIrBZ,EAAgB,eAGlB,QAASc,KAEP,GAAIC,GAAe/pB,GAAG+pB,cACtB,KAAIA,EACF,GAAyC,GAAtCrnB,EAAOikB,cAAc9D,cAEtBngB,EAAOskB,gBAAgB0C,SAAS/nB,OAChCe,EAAOskB,gBAAgB2C,QAAQjnB,EAAOskB,gBAAgBC,KAAK3f,OAAS,OAC/D,CACL,GAAIsiB,GAAoBlnB,EAAOikB,cAAc9D,cAAgB,CAC7DgH,GAAiBD,GAGrBZ,EAAgB,eAGlB,QAASa,GAAiB7G,GAGxByD,EAAU/jB,EAAOskB,gBAAgBC,KAAKjE,GAAQtgB,EAAOikB,cAAcnhB,SACnE9C,EAAOikB,cAAc9D,cAAgBG,EACrCgG,EAAgB,eAGlB,QAASe,KAEP,MAAGrnB,GAAOikB,eAAiBjkB,EAAOskB,gBAAgBC,KAAK3f,OAAS,GACnB,GAAxC5E,EAAOskB,gBAAgB0C,SAAS/nB,MAAae,EAAOikB,cAAcljB,IAAMf,EAAOskB,gBAAgBC,KAAK,GAAGxjB,IACjG,GAGJ,EAGT,QAASgmB,KAEP,MAAG/mB,GAAOikB,eAAiBjkB,EAAOskB,gBAAgBC,KAAK3f,OAAS,GAC3D5E,EAAOskB,gBAAgB0C,SAAS/nB,MAAQe,EAAOskB,gBAAgBgD,WAAatnB,EAAOikB,cAAcljB,IAAMf,EAAOskB,gBAAgBC,KAAKvkB,EAAOskB,gBAAgBC,KAAK3f,OAAS,GAAG7D,IACrK,GAGJ,EAIT,QAASwmB,GAAqBC,EAAQ1kB,EAASuhB,GAE7CmD,EAAOC,iBACP,IAAIf,GAAY9pB,QAAQiM,QAAQ2e,EAAOb,QAAQC,QAAQ,KAEnDF,GAAUG,SAAS,YACrBV,EAAE,2CAA2C5V,YAAY,UACzDmW,EAAUhY,SAAS,WAGlB1O,EAAO0nB,wBACR1nB,EAAO0nB,uBAAuBnX,YAAY,UAG5CvQ,EAAO0nB,uBAAyB9qB,QAAQiM,QAAQ2e,EAAOb,QACvD3mB,EAAO0nB,uBAAuBhZ,SAAS,UACvCwV,EAAephB,EAASuhB,GAG1B,QAASsD,GAAqBvnB,EAAOkE,GAEnC,GAAIsjB,GAAahrB,QAAQiM,QAAQzI,EAAMumB,QAAQC,QAAQ,KACvD,IAAGgB,EAAWf,SAAS,UAAW,CACpBgB,GAAe,aAC3BvjB,GAAWwjB,MAA0CxjB,EAAW,IAOpE,QAASyjB,GAAuB3nB,GAE9B,GAAIwnB,GAAahrB,QAAQiM,QAAQzI,EAAMumB,QAAQC,QAAQ,KACvD,IAAGgB,EAAWf,SAAS,UACrB,CAAYgB,GAAe,eAO/B,QAAS/B,GAA+BkC,EAAeC,GAErD,GAOIC,KANFrnB,MAAOmnB,EAAc5D,OAAOvjB,MAC5BsnB,eAAgBH,EAAcI,YAAYD,eAC1CE,eAAgBL,EAAcI,YAAYC,eAC1ChE,YAAa2D,EAAcI,YAAY/D,aAGvBrO,KAAKsS,IAAIN,EAAcI,YAAYD,eAAiBH,EAAcI,YAAYC,iBAC5FE,EAAgBL,GAAcD,EAAMje,KAAKpF,QAAUojB,EAAcI,YAAY/D,YAAc,IAE3FxjB,EAAQ,iBAAmBmnB,EAAc5D,OAAOvjB,MAAQ,MAI5D,OAHAA,IAAS,sBAAwBqnB,EAAa,OAC9CrnB,GAAS,mDAAqD8B,EAAO6lB,wBAAwBD,GAAgB,KAAO5lB,EAAO8lB,qBAAqBF,GAAiB,UAKnK,QAAS1C,GAAyBmC,EAAeC,GAE/C,GAAIC,GAAclS,KAAKsS,IAAIN,EAAcI,YAAYM,WAAa,GAC9DH,EAAgBP,EAAc5D,OAAOvjB,OAASonB,EAAMje,KAAKpF,QAAUojB,EAAcI,YAAY/D,YAAc,IAE3GxjB,EAAQ,sBAAwBmnB,EAAc5D,OAAOvjB,MAAQ,MAIjE,OAHAA,IAAS,sBAAwBqnB,EAAa,OAC9CrnB,GAAS,mDAAqD8B,EAAO6lB,wBAAwBD,GAAgB,KAAO5lB,EAAO8lB,qBAAqBF,GAAiB,UAKnK,QAASI,GAAkBC,GACzBtrB,GAAGurB,UAAUC,SAAU,EACvBxrB,GAAGurB,UAAUD,KAAOA,EAItB,QAASG,KACPzrB,GAAGurB,UAAUC,SAAU,EACvBxrB,GAAGurB,UAAUG,UAAY,KAG3B,QAASC,GAAgBC,GACvB,GAAIC,GAAQtB,GAAeqB,EACxBC,KACDA,EAAMC,cACND,EAAME,eAMV,QAASC,GAAgBJ,GAEvB,GAAIC,GAAQtB,GAAeqB,EAC3BxnB,SAAQC,IAAIwnB,EAAMrE,UAAU,GAAGyE,QAC5BJ,IACDA,EAAMrE,UAAU,GAAGyE,UACnBJ,EAAME,eAIV,QAAS/C,GAAgB4C,GAEvB,GAAIC,GAAQtB,GAAeqB,EACxBC,KACDA,EAAMC,cACND,EAAMrE,UAAU,GAAGyE,UACnBJ,EAAME,cAEN/rB,GAAGurB,UAAUC,SAAU,EACvBxrB,GAAGurB,UAAUD,KAAO,KACpBtrB,GAAGurB,UAAUG,UAAY,MAI7B,QAAS3D,GAAejlB,GAGtB,GAAG9C,GAAGurB,UAAUC,QACd,GAAwB,aAArBxrB,GAAGurB,UAAUD,KACd,GAAGtrB,GAAGurB,UAAUG,UACd1rB,GAAGurB,UAAUG,UAAUQ,cAAgBppB,EAAMgW,KAAK9R,SAClDhH,GAAGurB,UAAUG,UAAUS,WAAarpB,EAAMgW,KAAKgO,OAAOvjB,MAEtDT,EAAM+oB,MAAMO,aAAapsB,GAAGurB,UAAUG,WACtC5oB,EAAM+oB,MAAME,cACZ/rB,GAAGurB,UAAUG,UAAY,SACpB,CACL1rB,GAAGurB,UAAUG,WACXW,gBAAiBvpB,EAAMgW,KAAK9R,SAC5BslB,aAAcxpB,EAAMgW,KAAKgO,OAAOvjB,MAChCgpB,UAAW,UACXC,cAAe,EACfC,QAAS3pB,EAAMA,MAAM4pB,OACrBC,QAAS7pB,EAAMA,MAAM8pB,OAIvB,IAAIC,GAAS/pB,EAAMgW,KAAKgU,eAAe/R,IAEvC8R,GAAOE,aAAa,SAAS,WAC7BF,EAAOE,aAAa,OAAO,eAExB,IAAwB,SAArB/sB,GAAGurB,UAAUD,KAAiB,CACtC,GAAI0B,GAAQ,GAAI/D,UAASgE,KACzBD,GAAME,UAAY,EAClBF,EAAMzpB,MAAQT,EAAMgW,KAAKgO,OAAOvjB,MAChCypB,EAAMT,UAAY,UAClBS,EAAMR,cAAgB,EACtB1pB,EAAM+oB,MAAMrE,UAAU,GAAG2F,SAASH,GAClClqB,EAAM+oB,MAAME,eAKlB,QAASqB,GAAetqB,IAgBxB,QAASuqB,GAA4BC,GAEhCA,EAAS7pB,IAAMf,EAAOmkB,uBAAuBpjB,KAC9Cf,EAAOmkB,uBAAyByG,EAE7B5qB,EAAOikB,eAERC,EAAe,MAAOlkB,EAAOmkB,uBAAuBC,OAAOpkB,EAAOmkB,uBAAuBC,OAAOxf,OAAS,KAK/G,QAASimB,GAA6BC,GAEjC9qB,EAAO0kB,wBAAwB3jB,IAAM+pB,EAAS/pB,KAC/Cf,EAAO0kB,wBAA0BoG,EAE9B9qB,EAAOikB,eACRC,EAAelkB,EAAOikB,cAAcnhB,QAAS9C,EAAOikB,cAAcI,cAKxE,QAAS0G,GAAiB9rB,GAExBe,EAAOskB,gBAAgB0C,SAAS/nB,KAAOA,EACvCe,EAAOskB,gBAAgB2C,UAEvBxhB,EAAU2gB,KAAK,kBACfxC,IAGF,QAASoH,GAAoBvd,EAAIjK,GAE/BiK,EAAGga,iBAEH,IAAIwD,GAAY9E,EAAE1Y,EAAGyd,eAAetE,QAAQ,MAAMuE,OAC9CC,EAAsBjF,EAAE,4BAA6B8E,EAAUI,KAAK,qBAEpEC,EAAerT,SAASkO,EAAE,WAAY8E,GAAW5P,IAAI,gBAAgBoE,QAAQ,KAAM,KAAOxH,SAASkO,EAAE,UAAW8E,GAAW5P,IAAI,iBAAiBoE,QAAQ,KAAM,IAIlK,IAHA2L,EAAoB/P,KAAKkQ,MAASN,EAAUM,QAAUD,IAGrB,IAA9BF,EAAoBI,OAAc,CAGnC,IAAI,GAFAC,GAAoBtF,EAAE,uFAAwFA,EAAE,KAAM8E,GAAWS,GAAG,GAAGF,OAAS,8BAE5I7mB,EAAE,EAAEA,EAAErH,GAAGquB,iBAAiBvH,OAAOxf,OAAS,EAAED,IAClDwhB,EAAE,iBAAkBsF,GAAmBxc,OAAO,OAAStK,EAAI,SAC3DwhB,EAAE,iBAAkBsF,GAAmBxc,OAAO,OAASkX,EAAE,KAAM8E,GAAWS,GAAG/mB,EAAE,GAAG6mB,OAAS,QAG7FJ,GAAoBI,KAAKC,GAGc,SAAtCL,EAAoB/P,IAAI,YACzB7X,EAAM0iB,mBAAoB,EAC1BkF,EAAoBQ,YAGpBR,EAAoBS,YACpBroB,EAAM0iB,mBAAoB,GAI9B,QAAS4F,GAAiBre,EAAIjK,GAE5BiK,EAAGga,iBAEH,IAAIsE,GAAkB5F,EAAE1Y,EAAGyd,eAAetE,QAAQ,6BAC9CoF,EAAQ7F,EAAE,mBAAoB4F,GAC9BE,EAAYjsB,EAAOmkB,uBAAuB5jB,KAAKyC,aAEhDgpB,GAAMnF,SAASoF,IAChBF,EAAgB1Q,KACdkQ,MAASQ,EAAgBR,QACzBW,aAAc,WAGhBF,EAAMzb,YAAY0b,GAClBzoB,EAAM0iB,mBAAoB,IAE1B8F,EAAMtd,SAASud,GACfF,EAAgB1Q,KACdkQ,MAAS,GACTW,aAAc,KAGhB1oB,EAAM0iB,mBAAoB,GAO9B,QAASiG,GAAqB1e,EAAIjK,EAAOV,GAEvC2K,EAAGga,kBAEHzqB,EAAUqE,MACR5E,WAAqB,6BACrBiR,aAAqB,KACrBlR,YAAqB,gEACrBoM,OAAqBhM,QAAQiM,QAAQ0E,EAAUxE,MAC/C4E,YAAqBF,EACrB9E,qBAAqB,EACrBoa,QACE3iB,MAAOqN,EACPrL,SAAUrD,EAAaqtB,eACvB/pB,YAAatD,EAAasD,YAC1BC,iBAAkBvD,EAAastB,WAC/B9pB,iBAAkBxD,EAAawD,iBAC/BC,oBAAqBzD,EAAastB,WAClC5pB,gBAAiBnF,GAAGmF,gBACpBC,iBAAkB3D,EAAa2D,iBAC/BE,YACEY,MAAOA,EACPG,eAAgB3D,EAAOmkB,uBACvB9gB,SAAUV,EAAO2pB,SAASvtB,EAAaqtB,eAAgBtpB,GACvDc,gBAAiB5D,EAAO0kB,yBAE1B9iB,UAAWtE,GAAGsE,aAKpB,QAAS2qB,GAAmB9e,GAE1B/L,QAAQC,IAAI,gBACZ,IAAIxB,IAAS,CACVH,GAAOskB,gBAAgB5lB,UAAYsB,EAAOskB,gBAAgB5lB,SAASqC,KACpEZ,GAAS,GAEXnD,EAAUqE,MACR5E,WAAqB,2BACrBiR,aAAqB,KACrBlR,YAAqB,0DACrBoM,OAAqBhM,QAAQiM,QAAQ0E,EAAUxE,MAC/C4E,YAAqBF,EACrB9E,qBAAqB,EACrBoa,QACE3iB,MAAOqN,EACPvN,iBAAkBF,EAAOE,iBACzBC,OAAQA,KAKd,QAASqsB,GAAe/e,EAAIgf,GAE1BzvB,EAAUqE,KACRrE,EAAU0L,QACPgkB,YAAYpvB,GAAGqvB,KAAKF,IACpBzjB,UAAU,QACV2E,YAAYF,GACZ9E,qBAAoB,GACpBM,GAAG,UAIV,QAAS2jB,GAAWnf,EAAIhO,EAAOotB,GAG7B7vB,EAAUqE,KACRrE,EAAU0L,QACPgkB,YAAYG,GACZptB,MAAMA,GACNuJ,UAAU,UACV2E,YAAYF,GACZ9E,qBAAoB,GACpBM,GAAG,UAMV,QAAS6jB,GAA2BnuB,GAElC+C,QAAQC,IAAI,8BACEgO,SAAVhR,IACFA,EAAQ,MAGVqB,EAAOE,iBAAiB6sB,QAAQxI,QAChCvkB,EAAOE,iBAAiB6sB,QAAQxI,KAAK1f,MACnClG,MAAOA,EACPquB,yBAAyB,EACzBC,gBAGFjtB,EAAOE,iBAAiBgtB,OAAO3I,QAYjC,QAAS4I,IAAuB1f,GAE9B/L,QAAQC,IAAI,0BAEZ3B,EAAOE,iBAAiBK,KAAO,KAC/BP,EAAOE,iBAAiBO,YAAc,KACtCT,EAAOE,iBAAiBvB,MAAQ,KAChCqB,EAAOE,iBAAiBktB,WAAa,KACrCptB,EAAOE,iBAAiBmtB,OAAOvE,SAAU,EACzC9oB,EAAOE,iBAAiBmtB,OAAOC,UAAW,EAC1CttB,EAAOE,iBAAiBqtB,aAAaC,kBAAmB,EACxDxtB,EAAOE,iBAAiB0D,gBAAkB7E,EAAa2D,iBAAiB,GACxE1C,EAAOE,iBAAiByD,eAAiB3D,EAAOytB,qBAAqB,GACrEztB,EAAOE,iBAAiBgtB,OAAO3I,QAC/BvkB,EAAOE,iBAAiB6sB,QAAQxI,OAC9B5lB,MAAO,KACPquB,yBAAyB,EACzBC,gBAKJ,QAASS,IAAajgB,GAEpB/L,QAAQC,IAAI,gBACZ3B,EAAOE,iBAAiBmtB,OAAOvE,SAAU,EACzC9oB,EAAOE,iBAAiBmtB,OAAOC,UAAW,EAC1CttB,EAAOE,iBAAiBqtB,aAAaC,kBAAmB,EAG1D,QAASG,IAAqBlgB,EAAImgB,EAAKC,GAErCnsB,QAAQC,IAAI,wBACD,MAARksB,EAAE9sB,IACHf,EAAOE,iBAAiB6sB,QAAQe,UAAW,EAExC9tB,EAAOE,iBAAiB6sB,QAAQxI,KAAK3f,OAAS,GAC/C5H,EAAUqE,KACRrE,EAAU0L,QACPE,OAAOhM,QAAQiM,QAAQC,SAASC,OAChCJ,qBAAoB,GACpBlJ,MAAM,WACN8B,YAAY,4GACZyH,UAAU,WACVC,GAAG,MACH0E,YAAYF,MAKnBmgB,EAAIjvB,MAAQkvB,EACZ7tB,EAAOE,iBAAiB6sB,QAAQe,UAAW,EAGxCF,EAAIjvB,MAAMovB,iBAAiBnpB,OAAS,EACE,GAApCgpB,EAAIjvB,MAAMovB,iBAAiB,GAAGhtB,IAC/B6sB,EAAIjvB,MAAMovB,iBAAiBC,QAAQ1wB,GAAG2wB,gBAGxCL,EAAIjvB,MAAMovB,iBAAiBC,QAAQ1wB,GAAG2wB,iBAK5C,QAASC,IAAaxvB,EAAUwB,GAE9BwB,QAAQC,IAAI,gBAEZzB,EAAiBa,GAAKrC,EAASqC,GAC/Bb,EAAiBK,KAAO7B,EAAS6B,KACjCL,EAAiBO,YAAc/B,EAAS+B,YACxCP,EAAiB0D,gBAAkBjB,EAAOyB,qBAAqB1F,EAASkF,gBAAiB7E,EAAa2D,kBACtGxC,EAAiByD,eAAiBhB,EAAOyB,qBAAqB1F,EAASiF,eAAgB3D,EAAOytB,sBAC9FztB,EAAO0kB,wBAA0BxkB,EAAiB0D,gBAGlD5D,EAAOmkB,uBAAyBjkB,EAAiByD,cAEjD,KAAI,GAAIgB,GAAE,EAAEA,EAAEjG,EAASyvB,cAAcvpB,OAAQD,IAAK,CAChD,GAAIypB,GAAQ1vB,EAASyvB,cAAcxpB,GAE/BipB,GACFjvB,MAAOyvB,EAAMzvB,MACbyuB,WAAYgB,EAAMC,gBAClBpB,cAGc,OAAbW,EAAIjvB,QAELivB,EAAIjvB,MAAQrB,GAAGgxB,OAAO,IAKxBV,EAAIjvB,MAAMovB,iBAAiBC,QAAQ1wB,GAAG2wB,eAEtC,KAAI,GAAIhM,GAAE,EAAEA,EAAEmM,EAAMnB,WAAWroB,OAAQqd,IAAK,CAE1C,GAAIsM,IACFxtB,GAAIqtB,EAAMnB,WAAWhL,GAAGlhB,GACxB+B,QAASH,EAAOyB,qBAAqBgqB,EAAMnB,WAAWhL,GAAG5e,SAAUtE,EAAaqtB,gBAChFoC,SAAU7rB,EAAOyB,qBAAqBgqB,EAAMnB,WAAWhL,GAAGuM,SAAUzvB,EAAa0vB,eACjF5tB,MAAOutB,EAAMnB,WAAWhL,GAAGphB,MAG7B+sB,GAAIX,WAAWpoB,KAAK0pB,GAEY5e,SAA7Bye,EAAMnB,WAAWhL,GAAG1P,OACrBgc,EAAUhc,KAAO5P,EAAOyB,qBAAqBgqB,EAAMnB,WAAWhL,GAAG1P,KAAMxT,EAAauD,mBAIxFpC,EAAiB6sB,QAAQxI,KAAK1f,KAAK+oB,GAGrC,GAAGlvB,EAASgwB,aAAa9pB,OAAS,EAChC,IAAI,GAAID,GAAE,EAAEA,EAAEjG,EAASgwB,aAAa9pB,OAAQD,IAAK,CAC/C,GAAIypB,GAAQ1vB,EAASgwB,aAAa/pB,GAC9BipB,GACF7sB,GAAIqtB,EAAMrtB,GACV+B,QAASH,EAAOyB,qBAAqBgqB,EAAM/qB,SAAUtE,EAAaqtB,gBAClEuC,eAAgBP,EAAMO,eACtB3sB,MAAOW,EAAOyB,qBAAqBgqB,EAAMQ,WAAY5uB,EAAOE,iBAAiByD,eAAekrB,QAC5FC,kBAAmBnsB,EAAOyB,qBAAqBgqB,EAAMU,kBAAmB/vB,EAAagwB,gBACrFC,WAAYrsB,EAAOyB,qBAAqBgqB,EAAMY,WAAYjwB,EAAakwB,aAGzE/uB,GAAiBgtB,OAAO3I,KAAK1f,KAAK+oB,OAGpClvB,GAASgwB,aAAa7pB,MACpB/B,QAAS,KACT6rB,eAAgB,KAChB3sB,MAAO,KACP8sB,kBAAmB,KACnBE,WAAY,OAKlB,QAASE,IAAmBzhB,GAES,MAAhCzN,EAAOE,iBAAiBK,KACzBvD,EAAUqE,MACR5E,WAAY,2BACZiR,aAAc,KACdlR,YAAa,0DACboM,OAAQhM,QAAQiM,QAAQ0E,EAAUxE,MAClC4E,YAAaF,EACb9E,qBAAqB,EACrBoa,QACE3iB,MAAOqN,EACPvN,iBAAkBF,EAAOE,iBACzBC,QAAQ,KAETmQ,KAAK,WACHtQ,EAAOE,iBAAiBK,OACzBD,KACA6B,EAAWkC,WAAW,WAAcC,SAAU,aAC9CnC,EAAWkC,WAAW,OAAUC,SAAU,iBAI9ChE,KACA6B,EAAWkC,WAAW,WAAcC,SAAU,aAC9CnC,EAAWkC,WAAW,OAAUC,SAAU,cAK9C,QAAS6qB,MAEP,GAAIzwB,IACF+E,OAAQ1D,EAAW2D,KAAK3C,GACxBR,KAAMP,EAAOE,iBAAiBK,KAC9BE,YAAaT,EAAOE,iBAAiBO,YACrCmD,gBAAiB5D,EAAOE,iBAAiB0D,gBAAgB7C,GACzD4C,eAAgB3D,EAAOE,iBAAiByD,eAAe5C,GAIzD,IADArC,EAASyvB,iBACNnuB,EAAOE,iBAAiB6sB,QAAQxI,KAAK3f,OAAS,EAE/C,IAAI,GAAID,GAAE,EAAEA,EAAE3E,EAAOE,iBAAiB6sB,QAAQxI,KAAK3f,OAAQD,IAAK,CAC9D,GAAIipB,GAAM5tB,EAAOE,iBAAiB6sB,QAAQxI,KAAK5f,GAC3CyqB,GACFnC,cAaF,IAVGW,EAAIjvB,QACLywB,EAAYC,QAAUzB,EAAIjvB,MAAMoC,IAG/B6sB,EAAIR,YAAcQ,EAAIR,WAAWrsB,GAAK,EACvCquB,EAAYE,kBAAoB1B,EAAIR,WAAWrsB,GAE/CquB,EAAYE,kBAAoB,KAG/B1B,EAAIX,WAAWroB,OAAS,EACzB,IAAI,GAAIqd,GAAE,EAAEA,EAAE2L,EAAIX,WAAWroB,OAAOqd,IAAK,CACvC,GAAIsN,GAA4B3B,EAAIX,WAAWhL,GAAGphB,KAGjB,IAA9Bd,EAAW2D,KAAK+D,YAAmD,GAAhCmmB,EAAIX,WAAWhL,GAAGnf,QAAQ/B,KAC9DwuB,EAA4B5sB,EAAO6sB,8BAA8BD,GAGnE,IAAIE,IACF1uB,GAAI6sB,EAAIX,WAAWhL,GAAGlhB,GACtBsC,SAAUuqB,EAAIX,WAAWhL,GAAGnf,QAAQ/B,GACpCytB,SAAUZ,EAAIX,WAAWhL,GAAGuM,SAASztB,GACrCF,MAAO0uB,EAG0B,IAAhC3B,EAAIX,WAAWhL,GAAGnf,QAAQ/B,KAC3B0uB,EAAqBld,KAAOqb,EAAIX,WAAWhL,GAAG1P,KAAKxR,IAGrDquB,EAAYnC,WAAWpoB,KAAK4qB,GAIhC/wB,EAASyvB,cAActpB,KAAKuqB,GAKhC,GADA1wB,EAASgwB,gBACN1uB,EAAOE,iBAAiBgtB,OAAO3I,KAAK3f,OAAS,EAE9C,IAAK,GAAID,GAAI,EAAGA,EAAI3E,EAAOE,iBAAiBgtB,OAAO3I,KAAK3f,OAAQD,IAAK,CACnE,GAAIipB,GAAM5tB,EAAOE,iBAAiBgtB,OAAO3I,KAAK5f,GAC1C+qB,GACF3uB,GAAI6sB,EAAI7sB,GACRsC,SAAUuqB,EAAI9qB,QAAQ/B,GACtB4tB,eAAgBf,EAAIe,eACpBK,WAAYpB,EAAIoB,WAAWjuB,GAC3B6tB,WAAYhB,EAAI5rB,MAAMjB,GAGpB6sB,GAAIkB,oBACNY,EAAWZ,kBAAoBlB,EAAIkB,kBAAkB/tB,IAGvDrC,EAASgwB,aAAa7pB,KAAK6qB,GAM/B,MAAOhxB,GAGT,QAAS4B,OAEJ8b,EAAS,OAASA,EAAS,SAC5B3W,EAAU2gB,KAAK,kBACfxC,KAGF5jB,EAAOskB,gBAAgBqL,cACvB3vB,EAAOE,iBAAiBqtB,aAAa9tB,MAAQnC,GAAGsyB,yBAChD5vB,EAAOskB,gBAAgB0C,SAAS6I,SAAU,EAC1C7vB,EAAOE,iBAAiBqtB,aAAaC,kBAAmB,EACxDxtB,EAAOE,iBAAiBmtB,OAAOC,UAAW,EAC1CttB,EAAOmkB,uBAAyBnkB,EAAOE,iBAAiByD,eACxD3D,EAAO0kB,wBAA0B1kB,EAAOE,iBAAiB0D,gBACzD5D,EAAOskB,gBAAgB0C,SAAS/nB,KAAO,CAEvC,IAAIP,GAAWywB,KAEXluB,EAAoBhB,EAAciB,IAAI,QAEvClB,GAAOskB,gBAAgB5lB,SAASqC,IAEjCrC,EAASqC,GAAKf,EAAOskB,gBAAgB5lB,SAASqC,GAE9CE,EAAkBE,OAAOpB,EAAWqB,OAAS,iBAC7CH,EAAkBE,OAAOpB,EAAWqB,OAAS,iBAAmB1C,EAASqC,IAEzEV,EAAI3B,SAASoxB,QAAQljB,KAAKzM,QAASY,GAAIrC,EAASqC,IAAMrC,EACpD,SAASsC,GAEPhB,EAAOskB,gBAAgByL,cACvB/vB,EAAOskB,gBAAgB0L,mBAAmBhvB,EAAS8uB,QAAS9uB,EAASmhB,YACrEniB,EAAOE,iBAAiBmtB,OAAOvE,SAAU,EACzC9oB,EAAOE,iBAAiBmtB,OAAOC,UAAW,EAC1CvtB,EAAW6J,gBAAkB,MAE1BwS,EAAS,OAASA,EAAS,SAC5B3W,EAAU2gB,KAAK;AACfxC,MAIJ,SAAS5iB,GAEPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAArB9B,YACZyB,SAAS,aACTC,UAAU,MAGf1B,EAAWuG,iBAAkB,EAC7BtG,EAAOE,iBAAiBmtB,OAAO4C,WAAY,KAK/C5vB,EAAI3B,SAASoxB,QAAQhjB,IAAI9F,KAAKtI,EAC5B,SAAUsC,GAERC,EAAkBE,OAAOpB,EAAWqB,OAAS,iBAE7CpB,EAAOskB,gBAAgB5lB,SAASqC,GAAKC,EAAStC,SAASqC,GAEvD/D,EAAUY,KAAKoD,EAAStC,UAExBsB,EAAOskB,gBAAgByL,cACvB/vB,EAAOskB,gBAAgB0L,mBAAmBhvB,EAAS8uB,QAAS9uB,EAASmhB,YAErEpiB,EAAW6J,gBAAkB,MAE1BwS,EAAS,OAASA,EAAS,SAC5B3W,EAAU2gB,KAAK,kBACfxC,MAIJ,SAAU5iB,GAERjB,EAAWuG,iBAAkB,EAC7BtG,EAAOE,iBAAiBmtB,OAAO4C,WAAY,IAMnD,QAASC,MAEPlwB,EAAOE,iBAAiBqtB,aAAa9tB,MAAQnC,GAAGsE,UAAU2rB,aAAa4C,aACvEnwB,EAAOskB,gBAAgB0C,SAAS6I,SAAU,EAC1C7vB,EAAOskB,gBAAgBjkB,IAAMA,EAAI3B,SAASoxB,QAAQD,QAClD7vB,EAAOE,iBAAiBmtB,OAAO4C,WAAY,EAC3CjwB,EAAOE,iBAAiBqtB,aAAaC,kBAAmB,EACxDxtB,EAAOskB,gBAAgB0C,SAAS/nB,KAAO,CAEvC,IAAIP,GAAWywB,IACZzwB,GAAS6B,KACV7B,EAAS6B,MAAQ,aAEjB7B,EAAS6B,KAAO,UAGlBP,EAAOmkB,uBAAyBnkB,EAAOE,iBAAiByD,eACxD3D,EAAO0kB,wBAA0B1kB,EAAOE,iBAAiB0D,gBAEzD5D,EAAOskB,gBAAgB2C,UAEvB9kB,EAAWkC,WAAW,aAAgBC,SAAU,aAGlD,QAAS8rB,IAA8BtF,GAElC9qB,EAAOE,iBAAiB0D,gBAAgB7C,IAAM+pB,EAAS/pB,KACxDf,EAAOE,iBAAiB0D,gBAAkBknB,GAI9C,QAASuF,IAAqCzC,GAEzCA,EAAIZ,yBACLY,EAAIZ,yBAA0B,EAC9BY,EAAIX,gBAEJW,EAAIZ,yBAA0B,EACF,GAAzBY,EAAIX,WAAWroB,QAChBgpB,EAAIX,WAAWpoB,MACb/B,QAAS,KACT0rB,SAAU,KACV3tB,MAAO,KACPqC,UAAW,QAMnB,QAASotB,MAEPtwB,EAAOE,iBAAiB6sB,QAAQxI,KAAK1f,MACnClG,MAAO,KACPquB,yBAAyB,EACzBC,gBAIJ,QAASsD,IAA0BjQ,GAEjCtgB,EAAOE,iBAAiB6sB,QAAQxI,KAAK/M,OAAO8I,EAAO,GAGrD,QAASkQ,IAAgC5C,GAEvCA,EAAIX,WAAWpoB,MACb/B,QAAS,KACT0rB,SAAU,KACV3tB,MAAO,KACPqC,UAAW,OAUf,QAASutB,IAAmC7C,EAAKtN,GAE/CsN,EAAIX,WAAWzV,OAAO8I,EAAO,GACD,GAAzBsN,EAAIX,WAAWroB,SAChBgpB,EAAIZ,yBAA0B,GAIlC,QAAS0D,MAEP1wB,EAAOE,iBAAiBgtB,OAAO3I,KAAK1f,MAClC/B,QAAS,KACTksB,WAAY,KACZL,eAAgB,KAChBH,SAAU,KACVxsB,MAAO,KACP8sB,kBAAmB,OAIvB,QAAS6B,IAAoBrQ,GAE3BtgB,EAAOE,iBAAiBgtB,OAAO3I,KAAK/M,OAAO8I,EAAO,GAC/CtgB,EAAOE,iBAAiBgtB,OAAO3I,KAAK3f,OAAS,IAC9C5E,EAAOE,iBAAiBgtB,OAAO3I,KAAKvkB,EAAOE,iBAAiBgtB,OAAO3I,KAAK3f,OAAS,GAAGkqB,kBAAoB,MAI5G,QAAS8B,IAA8BtQ,EAAOkO,EAAUK,GAGtD,GAAGvO,GAAUtgB,EAAOE,iBAAiBgtB,OAAO3I,KAAK3f,OAAS,EACtC,MAAf4pB,EAASztB,IAEVf,EAAOE,iBAAiBgtB,OAAO3I,KAAK1f,MAClC/B,QAAS,KACTksB,WAAY,KACZL,eAAgB,KAChBH,SAAU,KACVxsB,MAAO,KACP8sB,kBAAmB,WAGlB,IAAGxO,EAAUtgB,EAAOE,iBAAiBgtB,OAAO3I,KAAK3f,OAAS,GAAqB,MAAf4pB,EAASztB,GAAY,CAE1F,GAAI8vB,GAAavQ,EAAQ,EACrBwQ,EAAe9wB,EAAOE,iBAAiBgtB,OAAO3I,KAAK3f,OAAS,EAAK0b,CACrEtgB,GAAOE,iBAAiBgtB,OAAO3I,KAAK/M,OAAOqZ,EAAWC,IAI1D,QAASC,IAA6BnG,GAEjCA,EAAS7pB,IAAMf,EAAOE,iBAAiByD,eAAe5C,KACvDf,EAAOE,iBAAiByD,eAAiBinB,EAEzC5qB,EAAOE,iBAAiBgtB,OAAO3I,SAInC,QAASgM,IAA0B9iB,EAAI6S,GAGrC,GAAIuB,GAAU7kB,EAAU6kB,UACrBpiB,MAAM,iBACN8B,YAAY,gDACZyH,UAAU,iBACV2E,YAAYF,GACZ9E,qBAAoB,GACpBC,OAAOhM,QAAQiM,QAAQC,SAASC,OAChCE,GAAG,OACH6Y,OAAO,KAEV9kB,GAAUqE,KAAKwgB,GAASvR,KAAK,WAC3BtQ,EAAOE,iBAAiB6sB,QAAQxI,KAAK/M,OAAO8I,EAAO,IAClD,cAIL,QAAS0Q,IAAmBvjB,EAAIwjB,GAE9B,GAAIpP,GAAU7kB,EAAU6kB,UACrBpiB,MAAM,iBACN8B,YAAY,yDACZyH,UAAU,iBACV2E,YAAYF,GACZ9E,qBAAoB,GACpBC,OAAOhM,QAAQiM,QAAQC,SAASC,OAChCE,GAAG,OACH6Y,OAAO,KAEV9kB,GAAUqE,KAAKwgB,GAASvR,KAAK,WAC3B2gB,EAASxjB,IACR,cA0CL,QAASoa,IAAe9mB,GAGtB,IAAK,GADDmwB,GAAY3K,SAASC,OAChB7hB,EAAI,EAAGA,EAAIusB,EAAUtsB,OAAQD,IACpC,GAAGusB,EAAUvsB,GAAGwsB,KACVpwB,GAAMmwB,EAAUvsB,GAAGwsB,IAAIpwB,GACzB,MAAOmwB,GAAUvsB,GAMzB,QAASysB,IAAmBhxB,GAE1B,GAAIumB,GAAS/pB,QAAQiM,QAAQzI,EAAMumB,QAC/B0K,EAAQlL,EAAEQ,GAAQC,QAAQ,YAC9ByK,GAAMpjB,YAAY,aAIpB,QAAS6Z,MAEP,MAAO9nB,GAAOmkB,uBAAuBC,OAAOpkB,EAAOmkB,uBAAuBC,OAAOxf,OAAS,GAG5F,QAAS0sB,MAEP9rB,EAAOgD,GAAG,gBAAkB5J,MAAM,EAAMC,aAAa,EAAOH,SAAU,OAGxE,QAAS6yB,MAEP/rB,EAAOgD,GAAG,gBAGZ,QAASgpB,MAEP1E,IACI/tB,EAAa+wB,QAAQlrB,OAAS,GAChC5E,EAAOskB,gBAAgBzT,KAAK9R,EAAa+wB,QAAS/wB,EAAaojB,YAnnDnE,GAAI7kB,IAAKO,IAEiC,IAAtCkC,EAAW2D,KAAKwC,oBACdC,SAASC,QAAQrG,EAAW2D,KAAK2C,6BACnCb,EAAOgD,GAAG,gBAKdlL,GAAGgxB,OAAS1xB,QAAQ0B,KAAKyB,EAAWiN,QAAQshB,QAG5ChxB,GAAGqvB,KAAOvtB,EAAcutB,KACxBrvB,GAAGsE,UAAYxC,EACfY,EAAO4B,UAAY7B,EAAW6B,UAC9BtE,GAAGwmB,eAAgB,GAChB1H,EAAS,OAASA,EAAS,SAC5B9e,GAAGwmB,eAAgB,GAGrBxmB,GAAGsyB,yBAA2BtyB,GAAGsE,UAAU2rB,aAAa9tB,MAExDnC,GAAGoF,iBAAmB3D,EAAa2D,iBAEnCpF,GAAGurB,WACDC,SAAS,EACTF,KAAM,MAGRtrB,GAAG2wB,gBACDltB,GAAI,EACJR,KAAM,MACNgE,MAAO,OAGTjH,GAAG2xB,YAAclwB,EAAakwB,YAC9B3xB,GAAG2xB,YAAYwC,QAEfn0B,GAAG8E,SAAWrD,EAAaqtB,eAC3B9uB,GAAGyxB,eAAiBhwB,EAAagwB,eACjCzxB,GAAGmxB,cAAgB1vB,EAAa0vB,cAChCnxB,GAAG+uB,WAAattB,EAAastB,WAC7B/uB,GAAGgF,iBAAmBvD,EAAauD,iBACnChF,GAAGykB,UAAY5iB,EAEfa,EAAO0kB,wBAA0BpnB,GAAGoF,iBAAiB,GACrD3D,EAAagwB,eAAef,SAAUjtB,GAAI,KAAMR,KAAM,aAEtDjD,GAAGmF,gBAAkB1D,EAAa0D,gBAClCnF,GAAGquB,iBAAmBruB,GAAGmF,gBAAgB,GACzCnF,GAAGmF,gBAAgBgvB,QACnBzxB,EAAOmkB,uBAAyB7mB,GAAGmF,gBAAgB,EAMnD,IAAIgrB,IAAuB7wB,QAAQ0B,KAAKhB,GAAGmF,gBAC3CzC,GAAOytB,qBAAuBA,GAE9BztB,EAAOikB,cAAgB,KACvBjkB,EAAO0nB,uBAAyB,KAChC1nB,EAAO0xB,oBAAsB,SAG7B,KAAI,GAAI/sB,IAAE,EAAEA,GAAE3E,EAAOytB,qBAAqB7oB,OAAOD,KAAK,CACpD,GAAIgtB,IAAmB3xB,EAAOytB,qBAAqB9oB,IAAGyf,OAAOxf,OAAS7F,EAAa6yB,iBAAiBhtB,MACpG5E,GAAOytB,qBAAqB9oB,IAAGkqB,SAE/B,KAAI,GAAI5M,IAAE,EAAEA,GAAEljB,EAAa6yB,iBAAiBhtB,OAAOqd,KAAK,CACtD,GAAI4P,IAAgB5P,GAAI0P,GACpBG,GAAcD,GAAgBF,GAC9BI,GAAa/xB,EAAOytB,qBAAqB9oB,IAAGyf,OAAO4N,MAAMH,GAAeC,IACxEG,IACFlxB,GAAIhC,EAAa6yB,iBAAiB3P,IAAGlhB,GACrCR,KAAMxB,EAAa6yB,iBAAiB3P,IAAG1hB,KACvCgE,MAAOxF,EAAa6yB,iBAAiB3P,IAAG1hB,KAAO,KAAOwxB,GAAWja,KAAK,KAAO,IAG/E9X,GAAOytB,qBAAqB9oB,IAAGkqB,OAAOhqB,KAAKotB,IAG7CjyB,EAAOytB,qBAAqB9oB,IAAGkqB,OAAOb,SACpCjtB,GAAI,EACJR,KAAM,MACNgE,MAAO,QAKXvE,EAAOE,kBACLK,KAAM,KACNE,YAAa,KACb9B,MAAO,KACP0uB,QACEvE,SAAS,EACTwE,UAAU,EACV2C,WAAW,GAEbrsB,gBAAiB7E,EAAa2D,iBAAiB,GAC/CiB,eAAgB3D,EAAOytB,qBAAqB,GAC5CV,SACEttB,MAAO,4BACPyyB,QAASvvB,EAAOwvB,wBAChB5N,QACAuJ,UAAU,GAEZZ,QACEztB,MAAO,kBACPyyB,QAASvvB,EAAOyvB,uBAChB7N,SAEFgJ,cACE9tB,MAAOnC,GAAGsyB,yBACVpC,kBAAkB,IAKtBxtB,EAAOskB,iBACL7kB,MAAO,UACPyyB,UAEIzyB,MAAS,UAGTA,MAAS,SAGTA,MAAS,UAGTA,MAAS,gBAGTA,MAAS,WAGbf,YACA2B,IAAKA,EAAIgyB,SAASroB,KAClBgd,UACE/nB,KAAM,EACNC,MAAO,GACPiL,OAAQ,KACRmoB,WAAY,KACZzC,SAAS,GAEX0C,SAAU,EACV1hB,KAAM,SAASif,EAAS3N,GACtBtkB,KAAKmyB,mBAAmBF,EAAS3N,GACjCtkB,KAAK20B,oBAEPC,SAAU,SAASvzB,GACdA,GAASrB,KAAKmpB,SAAS9nB,QACxBrB,KAAKmpB,SAAS/nB,KAAO,EACrBpB,KAAKmpB,SAAS9nB,MAAQA,EACtBrB,KAAKopB,YAGT9c,OAAQ,WACNtM,KAAKmpB,SAASsL,WAAaz0B,KAAKmpB,SAAS7c,OACzCtM,KAAKmpB,SAAS/nB,KAAO,EACrBpB,KAAKopB,WAEPyL,YAAa,WACR70B,KAAKmpB,SAAS7c,QAAUtM,KAAKmpB,SAASsL,YACvCz0B,KAAKmpB,SAAS7c,OAAS,KACvBtM,KAAKmpB,SAAS/nB,KAAO,EACrBpB,KAAKopB,WAELppB,KAAKmpB,SAAS7c,OAAS,MAI3B8c,QAAS,SAAS0L,GAChB90B,KAAK8xB,eACFvT,EAAS,OAASA,EAAS,SAC5B3W,EAAU2gB,KAAK,kBACfxC,IAGF,IAAIoD,IACF/nB,KAAMpB,KAAKmpB,SAAS/nB,KACpBC,MAAOrB,KAAKmpB,SAAS9nB,MACrBiL,OAAQtM,KAAKmpB,SAAS7c,QAGpByoB,EAAQ/0B,IAEZ,IAAGA,KAAKmpB,SAAS6I,QAAS,CACxB,GAAInxB,GAAWywB,IACftxB,MAAKwC,IAAI2G,KAAKggB,EAAUtoB,EACtB,SAASsC,GAEP4xB,EAAM5C,mBAAmBhvB,EAAS8uB,QAAS9uB,EAASmhB,YAC1BxS,SAAvBgjB,GACDxL,EAAiBwL,GAEnBC,EAAM7C,cACN/vB,EAAOE,iBAAiBmtB,OAAOvE,SAAU,EACzC9oB,EAAOE,iBAAiBmtB,OAAOC,UAAW,GAEvClR,EAAS,OAASA,EAAS,SAC5B3W,EAAU2gB,KAAK,kBACfxC,MAGJ,SAAS5iB,GAEPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAArB9B,YACZyB,SAAS,aACTC,UAAU,MAEf1B,EAAWuG,iBAAkB,EAC7BtG,EAAOE,iBAAiBmtB,OAAO4C,WAAY,QAK5CpyB,MAAKa,WACNsoB,EAASjmB,GAAKlD,KAAKa,SAASqC,IAG9BlD,KAAKwC,IAAIa,IAAI8lB,EACX,SAAShmB,GAEP4xB,EAAM5C,mBAAmBhvB,EAAS8uB,QAAS9uB,EAASmhB,YAC1BxS,SAAvBgjB,GACDxL,EAAiBwL,GAGhBC,EAAMl0B,SAASqC,KAChBf,EAAOE,iBAAiBmtB,OAAOvE,SAAU,EACzC9oB,EAAOE,iBAAiBmtB,OAAOC,UAAW,GAE5CsF,EAAM7C,eAEH3T,EAAS,OAASA,EAAS,SAC5B3W,EAAU2gB,KAAK,kBACfxC,MAGJ,SAAS5iB,GAEPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAArB9B,YACZyB,SAAS,aACTC,UAAU,MAGf1B,EAAWuG,iBAAkB,EAC7BtG,EAAOE,iBAAiBmtB,OAAO4C,WAAY,KAMnDD,mBAAoB,SAASF,EAAS3N,GAIpC,GAFAtkB,KAAK00B,SAAWpQ,EAChBtkB,KAAK0mB,KAAOuL,EACTA,EAAQlrB,OAAS,EAClB,IAAI,GAAID,GAAE,EAAGA,EAAE9G,KAAK0mB,KAAK3f,OAAQD,IAC/B9G,KAAK0mB,KAAK5f,GAAGkuB,aAAelwB,EAAO8hB,sBAAsB5mB,KAAK0mB,KAAK5f,GAAIrH,GAAGquB,iBAAiBvH,OAAO9mB,GAAGquB,iBAAiBvH,OAAOxf,OAAS,GAAI5E,EAAO0kB,yBACjJ7mB,KAAK0mB,KAAK5f,GAAG6f,UAAY7hB,EAAO8hB,sBAAsB5mB,KAAK0mB,KAAK5f,GAAI3E,EAAOmkB,uBAAuBC,OAAOpkB,EAAOmkB,uBAAuBC,OAAOxf,OAAS,GAAI5E,EAAO0kB,6BAGpK7mB,MAAK0mB,OAGP1mB,MAAK20B,oBAEPA,iBAAkB,WAYhB,GAXA30B,KAAKi1B,aAAgBj1B,KAAKmpB,SAAS/nB,KAAO,GAAKpB,KAAKmpB,SAAS9nB,MAAS,EACnErB,KAAK00B,UAAY10B,KAAKmpB,SAAS9nB,OAChCrB,KAAKk1B,WAAcl1B,KAAKmpB,SAAS/nB,KAAO,GAAKpB,KAAKmpB,SAAS9nB,MAASrB,KAAKmpB,SAAS9nB,MAC/ErB,KAAKk1B,UAAYl1B,KAAK00B,WACvB10B,KAAKk1B,UAAYl1B,KAAK00B,WAGxB10B,KAAKk1B,UAAYl1B,KAAK00B,SAExB10B,KAAKypB,UAAYtR,KAAKgd,KAAKn1B,KAAK00B,SAAW10B,KAAKmpB,SAAS9nB,OACzDrB,KAAKo1B,UAAY,GAAIC,OAClBr1B,KAAK00B,SAAW10B,KAAKmpB,SAAS9nB,MAC/B,IAAI,GAAIyF,GAAE,EAAEA,EAAE9G,KAAKypB,UAAU3iB,IAC3B9G,KAAKo1B,UAAUpuB,MAAOsuB,QAAQ,EAAOl0B,KAAO0F,EAAI,KAKtDgrB,YAAa,WAEX3vB,EAAOE,iBAAiBmtB,OAAO4C,WAAY,GAE7CF,YAAa,WAEXxqB,EAAS,WACPvF,EAAOE,iBAAiBmtB,OAAO4C,WAAY,GAC1C,MAGL6C,YAAa,EACbC,UAAW,EACXE,UAAW,KACX3L,UAAW,EACX/C,QAIF,KAAI,GADA6O,IAAkB,GAAIF,OAClBvuB,GAAE,EAAGA,GAAErH,GAAGquB,iBAAiBvH,OAAOxf,OAAQD,KAChDyuB,GAAgBvuB,MAAOpF,MAASnC,GAAGquB,iBAAiBvH,OAAOzf,IAAK,QAChE3E,EAAO0xB,mBAAmB7sB,KAAKvH,GAAGquB,iBAAiBvH,OAAOzf,IAAK,MAEjE3E,GAAOskB,gBAAgB4N,QAAUlyB,EAAOskB,gBAAgB4N,QAAQmB,OAAOD,GAGvE,KAAK,GAAIzuB,IAAI,EAAGA,GAAIrH,GAAGgxB,OAAO1pB,OAAQD,KAAK,CACzC,GAAI2uB,IAAyB,GAAIJ,MACjC,IAAG51B,GAAGgxB,OAAO3pB,IAAGopB,iBAAkB,CAChC,IAAI,GAAI9L,IAAE,EAAEA,GAAE3kB,GAAGgxB,OAAO3pB,IAAGopB,iBAAiBnpB,OAAOqd,KAC9C3kB,GAAGgxB,OAAO3pB,IAAGopB,iBAAiB9L,IAAGkR,QAClCG,GAAuBzuB,KAAKvH,GAAGgxB,OAAO3pB,IAAGopB,iBAAiB9L,IAG9D3kB,IAAGgxB,OAAO3pB,IAAGopB,iBAAmBuF,IAKpC,GAAI5P,EAAa9kB,KAsDftB,GAAGsB,MAAO,EACV4yB,SArDA,IADAl0B,GAAGsB,MAAO,EACN8kB,EAAa/kB,MAAO,CAKtB,IAAK,GADDA,IAAQ,KACHgG,GAAI,EAAGA,GAAIrH,GAAGgxB,OAAO1pB,OAAQD,KACpC,GAAI+e,EAAa/kB,MAAMoC,IAAMzD,GAAGgxB,OAAO3pB,IAAG5D,GAAI,CAC5CpC,GAAQrB,GAAGgxB,OAAO3pB,IAClBhG,GAAMovB,iBAAiBC,QAAQ1wB,GAAG2wB,eAClC,OAIAtvB,IAEFmuB,EAA2BnuB,IAC3BqB,EAAOE,iBAAiBK,KAAOoC,EAAO4wB,sBAAsBj2B,GAAGykB,UAAWpjB,GAAM4B,KAAO,aACvFmjB,EAAahlB,SAAW,KACxBsB,EAAOE,iBAAiBmtB,OAAOvE,SAAU,EACzC9oB,EAAOE,iBAAiBmtB,OAAOC,UAAW,EAE1C4C,MAEApwB,EAASuB,KACPvB,EAASwB,SACNC,YAAY,sCACZC,SAAS,aACTC,UAAU,UAKjB,IAAIiiB,EAAahlB,SAAU,CACzB9B,QAAQ0B,KAAKolB,EAAahlB,SAAUsB,EAAOskB,gBAAgB5lB,UAC3DwvB,GAAaluB,EAAOskB,gBAAgB5lB,SAAUsB,EAAOE,kBACrDF,EAAOE,iBAAiBmtB,OAAOvE,SAAU,EACzC9oB,EAAOE,iBAAiBmtB,OAAOC,UAAW,CAE1C,KAAK,GAAI3oB,IAAI,EAAGA,GAAI3E,EAAOE,iBAAiB6sB,QAAQxI,KAAK3f,OAAQD,KAC3D3E,EAAOE,iBAAiB6sB,QAAQxI,KAAK5f,IAAGsoB,WAAWroB,OAAS,IAC9D5E,EAAOE,iBAAiB6sB,QAAQxI,KAAK5f,IAAGqoB,yBAA0B,EAItEhtB,GAAOskB,gBAAgB0C,SAAS6I,SAAU,EAC1C7vB,EAAOskB,gBAAgBjkB,IAAMA,EAAI3B,SAASoxB,QAAQ0D,QAClDxzB,EAAOskB,gBAAgB2C,cAEvBuK,KAQNl0B,IAAGm2B,4BACH72B,QAAQ0B,KAAK0B,EAAOE,iBAAkB5C,GAAGm2B,0BAEtC/P,EAAa7kB,aACdsuB,KAIFxJ,EAAU,WAER,IAAI,GADA+P,IAAkB,EACd/uB,EAAE,EAAEA,EAAE3E,EAAOskB,gBAAgBC,KAAK3f,OAAOD,IAE/C,GAAiD,GAA9C3E,EAAOskB,gBAAgBC,KAAK5f,GAAGgvB,YAAkB,CAClD,GAAIC,GAAmBztB,OAAO0tB,IAAI7zB,EAAOskB,gBAAgBC,KAAK5f,GAAGmvB,UAI9D3tB,QAAO0tB,MAAMztB,QAAQwtB,KACtB5zB,EAAOskB,gBAAgBC,KAAK5f,GAAGovB,SAAU,EACzC/zB,EAAOskB,gBAAgBC,KAAK5f,GAAGqvB,YAAa,EAC5CN,GAAkB,GAKxB,GAAGA,EAAiB,CAClB,GAAIzyB,GAAoBhB,EAAciB,IAAI,QAC1CD,GAAkBE,OAAOpB,EAAWqB,OAAS,uBAC7C,KAAI,GAAIuD,GAAE,EAAEA,EAAErH,GAAGykB,UAAUnd,OAAOD,IAChC1D,EAAkBE,OAAOpB,EAAWqB,OAAS,yBAA2B9D,GAAGykB,UAAUpd,GAAG5D,MAI3F,KAMHzD,GAAG2oB,gBAAkBA,EACrB3oB,GAAG+oB,iBAAmBA,EACtB/oB,GAAGmpB,mBAAqBA,EACxBnpB,GAAG22B,cAAgB5O,EACnB/nB,GAAGiqB,qBAAuBA,EAC1BjqB,GAAGqrB,kBAAoBA,EACvBrrB,GAAGyrB,mBAAqBA,EACxBzrB,GAAG2rB,gBAAkBA,EACrB3rB,GAAGgsB,gBAAkBA,EACrBhsB,GAAGqqB,qBAAuBA,EAC1BrqB,GAAGyqB,uBAAyBA,EAC5BzqB,GAAGotB,eAAiBA,EACpBptB,GAAGwpB,cAAgBA,EACnBxpB,GAAG8pB,kBAAoBA,EACvB9pB,GAAG+pB,aAAeA,EAClB/pB,GAAGypB,YAAcA,EAGjBzpB,GAAGgD,aAAeA,GAClBhD,GAAG4xB,mBAAqBA,GACxB5xB,GAAG6vB,uBAAyBA,GAC5B7vB,GAAGowB,aAAeA,GAClBpwB,GAAGqwB,qBAAuBA,GAC1BrwB,GAAG4yB,gBAAkBA,GACrB5yB,GAAG+yB,qCAAuCA,GAC1C/yB,GAAGgzB,uBAAyBA,GAC5BhzB,GAAGizB,0BAA4BA,GAC/BjzB,GAAGkzB,gCAAkCA,GACrClzB,GAAGmzB,mCAAqCA,GACxCnzB,GAAGozB,iBAAmBA,GACtBpzB,GAAGqzB,oBAAsBA,GACzBrzB,GAAGszB,8BAAgCA,GACnCtzB,GAAGyzB,6BAA+BA,GAClCzzB,GAAG0zB,mBAAqBA,GACxB1zB,GAAG8yB,8BAAgCA,GAGnC9yB,GAAGutB,6BAA+BA,EAClCvtB,GAAGqtB,4BAA8BA,EACjCrtB,GAAG42B,cAAgBvxB,EAAOuxB,cAC1B52B,GAAG62B,4BAA8BxxB,EAAOwxB,4BACxC72B,GAAG82B,kCAAoCzxB,EAAOyxB,kCAC9C92B,GAAGytB,iBAAmBA,EACtBztB,GAAGwuB,iBAAmBA,EACtBxuB,GAAG0tB,oBAAsBA,EAGzB1tB,GAAG6uB,qBAAuBA,EAC1B7uB,GAAGivB,mBAAqBA,EACxBjvB,GAAGkvB,eAAiBA,EACpBlvB,GAAGsvB,WAAaA,EAGhBtvB,GAAG8zB,mBAAqBA,GACxB9zB,GAAGg0B,OAASA,GACZh0B,GAAG+2B,cAAgB9C,GAInB30B,QAAQiM,QAAQ1L,GAASm3B,KAAK,oBAAqB,WACjDzQ,MAGFjnB,QAAQiM,QAAQ1L,GAASm3B,KAAK,SAAU,WACtCzQ,MAldJJ,EAAmB9mB,SAAW,aAAc,SAAU,eAAgB,YAAa,YAAa,WAAY,WAAY,WAAY,YAAa,SAAU,YAAa,gBAAiB,aAAc,gBAAiB,UAAW,MAAO,eAAgB,eAAgB,gBAAiB,UApC3RC,QACKC,OAAO,gBACPJ,WAAW,qBAAsBgnB,MAioD1C,WAEE,YAOA,SAAS8Q,GAAqBx0B,EAAYC,EAAQK,EAAKrD,EAAWof,EAAUtc,EAAUyN,EAAWpL,EAAYlC,EAAe0C,EAAQb,EAAgBC,EAAiB3C,GA4EnK,QAASo1B,GAAe/mB,EAAI7K,GAE1B5F,EAAUqE,MACR5E,WAAqB,6BACrBiR,aAAqB,KACrBlR,YAAqB,gEACrBoM,OAAqBhM,QAAQiM,QAAQ0E,EAAUxE,MAC/C4E,YAAqBF,EACrB9E,qBAAqB,EACrBoa,QACE3iB,MAAOqN,EACPrL,SAAUN,EAAe2yB,UACzBpyB,YAAaP,EAAeO,YAC5BC,iBAAkBR,EAAeQ,iBACjCC,iBAAkBT,EAAeS,iBACjCC,oBAAqBV,EAAeuqB,WACpC5pB,gBAAiBX,EAAeW,gBAChCC,iBAAkBZ,EAAeY,iBACjCE,WAAYA,EACZhB,UAAWxC,KAKjB,QAASs1B,GAAoBx1B,GAC3B5B,EAAG0pB,SAAS/nB,KAAO,EACnB3B,EAAG0pB,SAAS9nB,MAAQA,EACpBy1B,IAGF,QAASA,KAGPr3B,EAAGs3B,oBAAqB,EACxBv0B,EAAIuC,WAAWZ,MAAMd,KAAMc,MAAO1E,EAAG0pB,SAAShlB,MAAMyqB,IAAKxtB,KAAM3B,EAAG0pB,SAAS/nB,KAAMC,MAAO5B,EAAG0pB,SAAS9nB,OAClG,SAAS8B,GAGP1D,EAAGu3B,gBAAkB7zB,EACrB1D,EAAGw3B,YAAc9zB,EAAS+zB,YAC1BC,IACAC,IACAC,IACA53B,EAAG63B,YAAYC,OAASp0B,EAASq0B,YACjC/3B,EAAG63B,YAAYG,OAASt0B,EAASu0B,YACjCj4B,EAAGs3B,oBAAqB,GAE1B,SAAS5zB,GAEPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAArB9B,YACZyB,SAAS,aACTC,UAAU,MAEfnE,EAAGs3B,oBAAqB,IAM9B,QAASY,GAAsBxzB,GAE7B1E,EAAG0pB,SAAS/nB,KAAO,EACnB3B,EAAG0pB,SAAShlB,MAAQA,EACpB1E,EAAG63B,YAAYC,OAAS,KACxB93B,EAAG63B,YAAYG,OAAS,KACxBX,IAGF,QAASO,KAIP,GADA53B,EAAG21B,UAAY,GAAIC,OAChB51B,EAAGu3B,gBAAgBY,gBAAkBn4B,EAAG0pB,SAAS9nB,MAGlD,IAAI,GADAooB,GAAYtR,KAAKgd,KAAK11B,EAAGu3B,gBAAgBY,gBAAkBn4B,EAAG0pB,SAAS9nB,OACnEyF,EAAE,EAAK2iB,EAAH3iB,EAAaA,IACvBrH,EAAG21B,UAAUpuB,MAAOsuB,QAAQ,EAAOl0B,KAAO0F,EAAI,IAMpD,QAASqwB,KAGP,IAAI,GAAIrwB,GAAE,EAAEA,EAAErH,EAAGw3B,YAAYlwB,OAAOD,IAClCrH,EAAGw3B,YAAYnwB,GAAGtB,SAAWV,EAAOyB,qBAAqB9G,EAAGw3B,YAAYnwB,GAAGtB,SAAU/F,EAAGo4B,eAAejB,WAEvGn3B,EAAGw3B,YAAYnwB,GAAGzB,UAAYP,EAAOyB,qBAAqB9G,EAAGw3B,YAAYnwB,GAAGzB,UAAW5F,EAAGo4B,eAAerJ,YAOzG/uB,EAAGw3B,YAAYnwB,GAAGhB,eAAiBhB,EAAOyB,qBAAqB9G,EAAGw3B,YAAYnwB,GAAGhB,eAAgBrG,EAAGo4B,eAAejzB,iBACnHnF,EAAGw3B,YAAYnwB,GAAGf,gBAAkBjB,EAAOyB,qBAAqB9G,EAAGw3B,YAAYnwB,GAAGf,gBAAiBtG,EAAGo4B,eAAehzB,kBAIzH,QAASizB,GAAyB/yB,GAEE+M,SAA/B/M,EAAWgzB,gBACZhzB,EAAWgzB,iBAAkB,EACrBhzB,EAAWgzB,gBACnBhzB,EAAWgzB,iBAAkB,EAE7BhzB,EAAWgzB,iBAAkB,EAKjC,QAASC,GAAwBjzB,GAE/B,GAAIoH,IACFuI,KAAM,KACNujB,MAAO,KAqBT,OAlB4B,IAAzBlzB,EAAWM,UAAUnC,IACtBiJ,EAAKuI,KAAO3P,EAAWY,MAAMuyB,eAC7B/rB,EAAK8rB,MAAQlzB,EAAWozB,KAAKC,eACE,GAA5BrzB,EAAWozB,KAAKE,SACjBlsB,EAAKuI,KAAK2jB,UAAW,EAErBlsB,EAAKuI,KAAK2jB,UAAW,IAGvBlsB,EAAKuI,KAAO3P,EAAWY,MAAM2yB,eAC7BnsB,EAAK8rB,MAAQlzB,EAAWozB,KAAKI,eACE,GAA5BxzB,EAAWozB,KAAKE,SACjBlsB,EAAKuI,KAAK2jB,UAAW,EAErBlsB,EAAKuI,KAAK2jB,UAAW,GAIlBlsB,EAGT,QAASirB,KAEP,IAAI,GAAItwB,GAAE,EAAEA,EAAErH,EAAGw3B,YAAYlwB,OAAOD,IACE,GAAjCrH,EAAGw3B,YAAYnwB,GAAGtB,SAAStC,KAC5BzD,EAAGw3B,YAAYnwB,GAAG0xB,MAAQR,EAAwBv4B,EAAGw3B,YAAYnwB,KAKvE,QAAS2xB,KAEP,GAAIr1B,GAAoBhB,EAAciB,IAAI,QAC1CD,GAAkBE,OAAOpB,EAAWqB,OAAS,mBAC7CH,EAAkBE,OAAOpB,EAAWqB,OAAS,yBAC7C,KAAI,GAAIuD,GAAE,EAAEA,EAAErH,EAAGi5B,aAAa3xB,OAAOD,IACnC1D,EAAkBE,OAAOpB,EAAWqB,OAAS,yBAA2B9D,EAAGi5B,aAAa5xB,GAAG8nB,IAG7FkI,KAGF,QAAS6B,GAAmBz1B,GAC1B,IAAI,GAAI4D,GAAE,EAAEA,EAAE5E,EAAWiN,QAAQypB,cAAc7xB,OAAOD,IACpD,GAAG5D,GAAMhB,EAAWiN,QAAQypB,cAAc9xB,GAAG5D,GAC3C,MAAOhB,GAAWiN,QAAQypB,cAAc9xB,GAK9C,QAAS+xB,GAAsBz3B,GAC9B3B,EAAG0pB,SAAS/nB,KAAOA,EACnB01B,IAtPD,GAAIr3B,GAAKO,IACTP,GAAGmC,MAAQ,eACXnC,EAAGu3B,gBAAkB9yB,EACrBzE,EAAGw3B,YAAc/yB,EAAgBgzB,YACjCz3B,EAAGo4B,eAAiB5zB,EACpBxE,EAAGsE,UAAYxC,EACf9B,EAAGwmB,eAAgB,EACnBxmB,EAAGs3B,oBAAqB,EAExBt3B,EAAGi5B,eAEC9J,IAAK,MACLlsB,KAAM,QAGNksB,IAAK,QACLlsB,KAAM,UAGNksB,IAAK,OACLlsB,KAAM,cAGNksB,IAAK,QACLlsB,KAAM,eAGNksB,IAAK,OACLlsB,KAAM,cAIVjD,EAAG0pB,UACD9nB,MAAO,GACPD,KAAM,EACN+C,MAAO1E,EAAGi5B,aAAa,IAIzBj5B,EAAG21B,UAAY,GAAIC,OACnBgC,KAEG9Y,EAAS,OAASA,EAAS,SAC5B9e,EAAGwmB,eAAgB,GAGrBkR,IACAC,IAKA33B,EAAG63B,aACDC,OAAQ,EACRE,OAAQ,GAGVh4B,EAAG63B,YAAYC,OAAS93B,EAAGu3B,gBAAgBQ,YAC3C/3B,EAAG63B,YAAYG,OAASh4B,EAAGu3B,gBAAgBU,YAG3Cj4B,EAAGk5B,mBAAqBA,EACxBl5B,EAAGk3B,eAAiBA,EACpBl3B,EAAG42B,cAAgBvxB,EAAOuxB,cAC1B52B,EAAGq3B,eAAiBA,EACpBr3B,EAAGk4B,sBAAwBA,EAC3Bl4B,EAAGq4B,yBAA2BA,EAC9Br4B,EAAGg5B,mBAAqBA,EACxBh5B,EAAGo5B,sBAAwBA,EAC3Bp5B,EAAGo3B,oBAAsBA,EACzBp3B,EAAG62B,4BAA8BxxB,EAAOwxB,4BACxC72B,EAAG82B,kCAAoCzxB,EAAOyxB,kCA1ChDG,EAAqB53B,SAAW,aAAc,SAAU,MAAO,YAAa,WAAY,WAAY,YAAa,aAAc,gBAAiB,SAAU,iBAAkB,kBAAmB,iBArC/LC,QACGC,OAAO,kBACPJ,WAAW,uBAAwB83B,MAiQxC,WAEE,YAOA,SAASr4B,GAAOC,EAAgBoC,GAG9BpC,EAAeC,MAAM,oBACnBC,IAAW,gBACXC,OACEC,eACEC,YAAa,0CACbC,WAAa,iCAGjBqC,SACE63B,WAAA,cAAW,SAAU33B,GAEnB,MAAOA,GAAYF,QAAQ,wBAG/BpC,UAAW,gBACX2C,cAAc,EACdC,wBAAwB,IAc5BpD,EAAOS,SAAW,iBAAkB,mCAtCpCC,QACGC,OAAO,uBACPX,OAAOA,MA4BZ,WAEE,YAOA,SAAS06B,GAAuB72B,EAAY42B,EAAWlxB,EAAWzI,EAAW8C,EAAUqC,EAAY9B,GAGjG,GAAI/C,GAAKO,IACTP,GAAGmC,MAAQ,gBACXnC,EAAGu5B,OAASF,EA6BdC,EAAuBj6B,SAAW,aAAc,YAAa,YAAa,YAAa,WAAY,aAAc,OAvCjHC,QACGC,OAAO,oBACPJ,WAAW,yBAA0Bm6B,MAc1C,WAEE,YAOA,SAAS16B,GAAOC,EAAgBoC,EAAiCC,GAG/DrC,EAAeC,MAAM,gBACnBC,IAAW,YACXC,OACEC,eACEC,YAAa,kCACbC,WAAa,6BAGjBqC,SACEujB,kBAAA,cAAkB,SAAUrjB,GAE1B,MAAOA,GAAYF,QAAQ,wBAE7BsjB,gBAAA,cAAgB,SAAUpjB,GAExB,MAAOA,GAAYF,QAAQ,+BAAiC2F,OAAQ,OAGxE/H,UAAW,WACX2C,cAAc,EACdC,wBAAwB,IAMxBd,EAA4BgB,SAAS,YACnCC,MAAQ,WACRC,OAAQ,EACRC,KAAM,oBACNvD,MAAO,eACP06B,QAAQ,IACd56B,EAAOS,SAAW,iBAAkB,kCAAmC,+BAxCvEC,QACGC,OAAO,mBACPX,OAAOA,MA4CZ,WAEE,YAOA,SAAS66B,GAAch3B,EAAYC,EAAQF,EAAUqC,EAAYlC,EAAe9C,EAASic,EAAqB/Y,EAAKmF,GAGjH,GAAIlI,GAAKO,IACTP,GAAGmC,MAAQ,MAgCbs3B,EAAcp6B,SAAW,aAAc,SAAU,WAAY,aAAc,gBAAiB,UAAW,sBAAuB,MAAO,UAzCrIC,QACGC,OAAO,gBACPJ,WAAW,gBAAiBs6B,MAWjC,WAEE,YAOA,SAASC,GAAmBj3B,EAAYC,EAAQF,EAAUqC,EAAYlC,EAAe9C,EAASic,EAAqBiJ,EAAkBD,EAAgB/hB,EAAKmF,GAoExJ,QAAS0a,KAEJ5iB,EAAG25B,KAAO,GACX35B,EAAG25B,OAIP,QAAS7W,KAEP9iB,EAAG25B,OAGL,QAASC,KAKP,MAHAx1B,SAAQC,IAAIrE,EAAG65B,sBACfz1B,QAAQC,IAAIrE,EAAG85B,wBAEa,MAAzB95B,EAAG+5B,oBAA2D,MAA7B/5B,EAAG85B,wBAErC11B,QAAQC,IAAIrE,EAAGg6B,eAEf51B,QAAQC,IAAIrE,EAAG65B,uBAER,IAGA,EAIX,QAASI,KAIPj6B,EAAGk6B,KAAKC,SAGRn6B,EAAG65B,qBAAuB75B,EAAGg6B,cAAcxmB,KAAK,SAASiH,GACvD,MAAOA,GAAEhX,IAAMzD,EAAG85B,yBAGpB95B,EAAGk6B,KAAKC,MAAM5yB,KAAKvH,EAAG65B,sBACtB75B,EAAGk6B,KAAKr3B,SAER4F,eAAeoxB,qBAAuBnxB,KAAK+B,UAAUzK,EAAG65B,sBAExD/W,IAqCF,QAASsX,KAEPp6B,EAAG65B,qBAAuB75B,EAAGg6B,cAAcxmB,KAAK,SAASiH,GACvD,MAAOA,GAAEhX,IAAMzD,EAAG85B,yBAEpB95B,EAAGk6B,KAAKC,SACRn6B,EAAGk6B,KAAKC,MAAM5yB,KAAKvH,EAAG65B,sBACtB75B,EAAGk6B,KAAKr3B,SAER7C,EAAGk6B,KAAKG,aAAe,KACvBr6B,EAAGk6B,KAAKvsB,YACNxK,YAAanD,EAAG8N,eAAe3K,YAC/B0G,UAAW7J,EAAG8N,eAAejE,UAC7BC,SAAU9J,EAAG8N,eAAehE,SAC5BiE,QAAS/N,EAAG8N,eAAeC,QAC3BC,gBACEC,cAAejO,EAAG8N,eAAeI,SACjCC,eAAgBnO,EAAG8N,eAAeM,SAClCC,KAAMrO,EAAG8N,eAAeO,KACxBC,SAAUtO,EAAG8N,eAAeQ,SAC5BC,WAAYvO,EAAG8N,eAAeS,WAC9BC,UAAWxO,EAAG8N,eAAeW,QAAQhL,IAEvCiL,SAAU1O,EAAG8N,eAAeY,SAASjL,GACrCkL,gBAAiB3O,EAAG8N,eAAec,oBACnCC,eAAgB7O,EAAG8N,eAAegB,mBAClCC,WAAY/O,EAAG8N,eAAeiB,WAC9BC,QAAShP,EAAG8N,eAAekB,QAC3B7I,OAAQ1D,EAAW2D,KAAK3C,GACxBwL,UAASjP,EAAG8N,eAAeoB,YAC3BorB,SAAUt6B,EAAG8N,eAAeiB,WAAWwrB,OAAOv6B,EAAG8N,eAAeiB,WAAWzH,OAAS,EAAG,IAGzFwb,IAGF,QAASmC,KAIP,IAAI,GAFAuV,MAEInzB,EAAE,EAAEA,EAAErH,EAAGk6B,KAAKC,MAAM7yB,OAAOD,IACjCmzB,EAAWjzB,KAAKvH,EAAGk6B,KAAKC,MAAM9yB,GAAG5D,GAGnCzD,GAAGk6B,KAAKM,WAAaA,EACrBx6B,EAAGk6B,KAAKO,eAAiBz6B,EAAG65B,qBAAqBp2B,GAEjDzD,EAAG6N,YAAa,EAChBpL,EAAWuG,iBAAkB,EAE7BjG,EAAIm3B,KAAKjV,SAASvb,KAAK1J,EAAGk6B,KACxB,SAASx2B,GAEP,GAAIC,GAAoBhB,EAAciB,IAAI,QAC1CD,GAAkBE,OAAOpB,EAAWqB,OAAS,2BAC7CH,EAAkBE,OAAOpB,EAAWqB,OAAS,mBAC7Cgf,IACA9iB,EAAG6N,YAAa,EAChBpL,EAAWuG,iBAAkB,EAE7B8S,EAAoB5Z,SAAS,YAAcs3B,QAAQ,IACnD1d,EAAoB5Z,SAAS,QAAUs3B,QAAQ,IAC/C1d,EAAoB5Z,SAAS,YAAcs3B,QAAQ,IACnD1d,EAAoB5Z,SAAS,aAAes3B,QAAQ,IACpD1d,EAAoB5Z,SAAS,cAAgBs3B,QAAQ,IACrD1d,EAAoB5Z,SAAS,OAASs3B,QAAQ,IAE9C/2B,EAAW2D,KAAKwC,mBAAqB,EAElCnG,EAAW6B,UAAUkG,YACtB3K,EAAQ4I,eAAerC,KAAOsC,KAAK+B,UAAUhI,EAAW2D,MAG1D,IAAIs0B,IACFj3B,GAAIC,EAASD,GACbk3B,YAAa,kBACbC,QAASl3B,EAASm3B,YAClBC,IAAKp3B,EAASo3B,IACdC,SAAU,EACVC,SAAU,MAIZC,IAAG,UAAW,aACdA,GAAG,2BAA4BP,EAE/B,KAAK,GAAIrzB,GAAI,EAAGA,EAAIrH,EAAGk6B,KAAKC,MAAM7yB,OAAQD,IAAK,CAC7C,GAAIyR,GAAO9Y,EAAGk6B,KAAKC,MAAM9yB,GAErB6zB,GACFz3B,GAAIi3B,EAAYj3B,GAChBR,KAAM6V,EAAK7V,KACXk4B,IAAKriB,EAAKqiB,IACVn0B,SAAU,eACVo0B,MAAOtiB,EAAKsiB,MACZC,SAAU,EACVL,SAAU,MAKZC,IAAG,oBAAqBC,GAG1BD,GAAG,mBAKL,SAASv3B,GAGPlB,EAASuB,KACPvB,EAASwB,SACNC,YAAYxB,EAAW6B,UAAUC,OAAOgL,iBACxCrL,SAAS,aACTC,UAAU,MAEfnE,EAAG6N,YAAa,EAChBpL,EAAWuG,iBAAkB,IA3QnC,GAAIhJ,GAAKO,IACTP,GAAGmC,MAAQ,WACXnC,EAAGg6B,cAAgBjV,EAKnB/kB,EAAGs7B,sBAAwBt7B,EAAGg6B,cAAc,GAC5Ch6B,EAAGu7B,mBAAqBv7B,EAAGg6B,cAAc,GACzCh6B,EAAGw7B,mBAAqBx7B,EAAGg6B,cAAc,GAEzCh6B,EAAG0N,YAAcoX,EACjB9kB,EAAG+5B,mBAAqB,KACxB/5B,EAAG85B,uBAAyB,KAC5B95B,EAAG65B,qBAAuB,KAC1B75B,EAAG25B,KAAO,EACV35B,EAAGyP,UAAYhN,EAAWiN,QAAQD,UAClCzP,EAAG2P,UAAYlN,EAAWiN,QAAQE,gBAClC5P,EAAG6N,YAAa,EAChB7N,EAAG+P,KAAO,GAAIhE,MACd/L,EAAGoG,KAAO3D,EAAW2D,KAGrBpG,EAAGk6B,MACDC,SACAW,IAAK,EACLW,MAAO,EACP54B,OAAQ,WACNtC,KAAKk7B,MAAQ,CAEb,KAAI,GAAIp0B,GAAE,EAAEA,EAAE9G,KAAK45B,MAAM7yB,OAAOD,IAC9B9G,KAAKk7B,OAASl7B,KAAK45B,MAAM9yB,GAAG+zB,KAS9B76B,MAAKk7B,OAASl7B,KAAKu6B,KAErBY,OAAQ,SAAUptB,IACa,cAA1BA,EAAS5I,eAA2D,MAA1B4I,EAAS5I,eAAmD,aAA1B4I,EAAS5I,iBACtFnF,KAAKu6B,IAAsC,IAAhC96B,EAAG65B,qBAAqBuB,SAKzCp7B,EAAG8N,kBACH9N,EAAG8N,eAAeoB,aAAc,EAChClP,EAAG27B,uBAAwB,EACxB9yB,SAASsC,SAAS1I,EAAW2D,KAAK2C,8BACnC/I,EAAG27B,uBAAwB,GAG7Bj5B,EAAO4B,UAAY7B,EAAW6B,UAE9BtE,EAAG8iB,SAAWA,EACd9iB,EAAG4iB,aAAeA,EAClB5iB,EAAGilB,SAAWA,EACdjlB,EAAGo6B,iBAAmBA,EACtBp6B,EAAGi6B,eAAiBA,EACpBj6B,EAAG45B,KAAOA,EAmDVl3B,EAAOk5B,iBAAmB,SAASrxB,GAEjC,GAAIK,IACFtB,MAAO7G,EAAW2D,KAAKkD,MACvBY,SAAUzH,EAAW2D,KAAK8D,SAC1BK,qBAAsBA,EACtB3B,mBAAoB,EAGtB7F,GAAIqD,KAAKy1B,qBAAqBh5B,OAAO+H,EACnC,SAASlH,SAMA7D,GAAQ4I,eAAekB,YACvB9J,GAAQ4I,eAAerC,IAC9B,IAAIzC,GAAoBhB,EAAciB,IAAI,QAC1CD,GAAkB0I,YAClB5J,EAAW6J,gBAAkB,KAC7B7J,EAAW2D,KAAO,KAElB8B,EAAOgD,GAAG,yBAEZ,SAASxH,OAzGfg2B,EAAmBr6B,SAAW,aAAc,SAAU,WAAY,aAAc,gBAAiB,UAAW,sBAAuB,mBAAoB,iBAAkB,MAAO,UA1ChLC,QACGC,OAAO,gBACPJ,WAAW,qBAAsBu6B,MAwRtC,WAEE,YAOA,SAAS96B,GAAOC,EAAgBoC,EAAiCC,GAG/DrC,EAAeC,MAAM,iBACnBC,IAAW,aACXC,OACEC,eACEC,YAAa,oCACbC,WAAa,8BAGjBqC,SACEs6B,eAAA,cAAe,SAAUp6B,GAEvB,MAAOA,GAAYF,QAAQ,oBAG/BpC,UAAW,YACX2C,cAAc,IAIhBd,EAAgCgB,QAAQ,sBAgB1CrD,EAAOS,SAAW,iBAAkB,kCAAmC,+BA3CvEC,QACGC,OAAO,oBACPX,OAAOA,MAuCZ,WAEI,YAOA,SAASm9B,GAAoB9f,EAAY6f,GAErC,GAAI97B,GAAKO,IAETP,GAAGg8B,cAAgBF,EAEnB97B,EAAGi8B,QAAUj8B,EAAGg8B,cAAcC,QAG9Bj8B,EAAGk8B,QAAUl8B,EAAGg8B,cAAcE,QAG9Bl8B,EAAGm8B,QAAUn8B,EAAGg8B,cAAcG,QAG9Bn8B,EAAGo8B,QAAUp8B,EAAGg8B,cAAcI,QAE9Bp8B,EAAGq8B,QAAUr8B,EAAGg8B,cAAcK,QAsBlCN,EAAoB18B,SAAW,aAAc,iBA5C7CC,QACKC,OAAO,iBACPJ,WAAW,sBAAuB48B,MAmC3C,WAEI,YAQA,SAASO,GAAyB18B,EAAUH,GAqBxC,QAAS88B,GAAeC,GAGpB/8B,EAAY88B,eAAeC,GAM/B,QAASC,KAEL,GAAItgB,GAAS7c,QAAQiM,QAAQ,OAG7B4Q,GAAOxL,YAAY,QAA4B,UAAlB3Q,EAAG08B,YAMpC,QAASC,KAGL/8B,EAASM,IAAI,cAAeF,EAAG48B,aAG/Bz8B,SAASC,SA7Cb,GAAIJ,GAAKO,IAGTP,GAAGU,OAASjB,EAAYiB,OACxBV,EAAG08B,WAAa,OAChB18B,EAAG48B,YAAch9B,EAASgE,IAAI,gBAAkB,qBAGhD5D,EAAGu8B,eAAiBA,EACpBv8B,EAAGy8B,iBAAmBA,EACtBz8B,EAAG28B,kBAAoBA,EAwC3B,QAASE,KAEL,OACI9rB,SAAa,IACbC,OACI8rB,UAAW,KAEf39B,WAAa,iCACbD,YAAa,4CACbgS,QAAa,SAAUC,GAInB,MAFAA,GAASC,SAAS,oBAEX,SAAkBJ,EAAOK,GAW5B,QAAS0rB,KAEA/rB,EAAM8rB,UAEPE,IAIAC,IAIR,QAASA,KAGLjsB,EAAM8rB,WAAY,EAGlBzrB,EAASD,SAAS,QAGlB+K,EAAOxK,OAAOurB,GAGdA,EAAW/pB,GAAG,cAAe6pB,GAMjC,QAASA,KAGLhsB,EAAM8rB,WAAY,EAGlBzrB,EAAS4B,YAAY,QAGrBiqB,EAAW9pB,IAAI,cAAe4pB,GAG9BE,EAAWr5B,SAnDf,GAAIsY,GAAS7c,QAAQiM,QAAQ,QACzB2xB,EAAa59B,QAAQiM,QAAQ,gDAGjCyF,GAAM8rB,UAAY9rB,EAAM8rB,YAAa,EAmDrC9rB,EAAM+rB,mBAAqBA,KAnF3CT,EAAyBj9B,SAAW,WAAY,eA7ChDC,QACKC,OAAO,YACPJ,WAAW,2BAA4Bm9B,GACvCtqB,UAAU,iBAAkB6qB,MAmIrC,WAEI,YAOA,SAASM,KA6BL,QAASC,GAAsBC,GAE3BC,EAAqBD,EAQzB,QAASE,GAAoBC,GAEzBC,EAAmBD,EAtCvB,GAAI59B,EAEJN,SAAQub,UAAU,cAAc6iB,QAC5B,WAAY,SAAUC,GAElB/9B,EAAW+9B,IAKnB,IAEIL,GACAG,EAHAhkB,EAAOna,QAAQub,UAAU,OAAOjX,IAAI,OAMxCrD,MAAK68B,sBAAwBA,EAC7B78B,KAAKg9B,oBAAsBA,EA2B3Bh9B,KAAK4W,KAAO,WAyBR,QAAS1W,KAEL,MAAO68B,GAQX,QAAS38B,KAEL,MAAO88B,GAQX,QAASlB,GAAeC,GAGpB,MAAKl9B,SAAQoW,YAAY2B,EAAQ3W,OAAOk9B,KAAKpB,IAGpCl9B,QAAQoW,YAAY2B,EAAQ3W,OAAOk9B,KAAfvmB,gBAErBoC,GAAKC,MAAM,qDAIfD,EAAKokB,KAAK,cAAgBrB,EAAY,0DAGtCnlB,EAAQ3W,OAAOm1B,OAAO5yB,KAAO,UAC7BoU,EAAQ3W,OAAOm1B,OAAO51B,MAAQoX,EAAQ3W,OAAOk9B,KAAfvmB,eAC9BzX,GAASM,IAAI,gBAAiBmX,EAAQ3W,OAAOm1B,OAAO5yB,QAKxDoU,EAAQ3W,OAAOm1B,OAAO5yB,KAAOu5B,EAC7BnlB,EAAQ3W,OAAOm1B,OAAO51B,MAAQoX,EAAQ3W,OAAOk9B,KAAKpB,OAClD58B,GAASM,IAAI,gBAAiBs8B,IAQlC,QAASsB,GAAcC,GAEnB1mB,EAAQ3W,OAAOk9B,KAAOG,EA7E1B,GAAI1mB,IACA5W,sBAAuBA,EACvBE,oBAAuBA,EACvB47B,eAAuBA,EACvBuB,cAAuBA,EACvBp9B,QACIk9B,QACA/H,QACI5yB,KAAS,GACThD,WAKZ,OAAOoX,IApEf/X,QACKC,OAAO,YACP4Y,SAAS,cAAeglB,MAuIjC,WAEI,YAOA,SAASv+B,GAAOo/B,EAAoBC,EAAcC,EAAYf,GAG1D,GAAIv9B,EACJN,SAAQub,UAAU,cAAc6iB,QAC5B,WAAY,SAAUC,GAElB/9B,EAAW+9B,IAKnB,IAAIQ,GAAcv+B,EAASw+B,UAAU,cAChCD,KAEDD,EAAW,OAAYC,GAG3BH,EAAmBK,kBAAiB,GAGpC/+B,QAAQ4iB,QAAQ+b,EAAc,SAAUK,GAEpCN,EAAmBO,cAAcD,EAAQr7B,KAAMq7B,EAAQzmB,WAI3DvY,QAAQ4iB,QAAQgc,EAAY,SAAUj+B,EAAOu8B,GAEzCwB,EAAmB/9B,MAAMu8B,GACpBgC,eAAev+B,EAAMw+B,QAAQx7B,KAAMhD,EAAMw+B,QAAQC,MACjDC,cAAc1+B,EAAM2+B,OAAO37B,KAAMhD,EAAM2+B,OAAOF,MAC9CG,YAAY5+B,EAAM49B,KAAK56B,KAAMhD,EAAM49B,KAAKa,MACxCI,kBAAkB7+B,EAAM8+B,WAAW97B,KAAMhD,EAAM8+B,WAAWL,QAKnEvB,EAAoBC,sBAAsBY,EAAmBgB,WAC7D7B,EAAoBI,oBAAoBS,EAAmBiB,SAE/DrgC,EAAOS,SAAW,qBAAsB,eAAgB,aAAc,uBA9CtEC,QACKC,OAAO,YACPX,OAAOA,MA+ChB,WAEI,YAEA,IAAIs/B,IACAjvB,WAAgBwvB,SAAWx7B,KAAO,iBAAiBy7B,MAAQzvB,UAAU,MAAMiwB,QAAQ,MAAMC,QAAQ,MAAMC,QAAQ,QAAQR,QAAU37B,KAAO,SAASy7B,MAAQzvB,UAAU,MAAMiwB,QAAQ,MAAMC,QAAQ,MAAMC,QAAQ,SAASvB,MAAQ56B,KAAO,MAAMy7B,MAAQzvB,UAAU,MAAMiwB,QAAQ,MAAMC,QAAQ,MAAMC,QAAQ,SAASL,YAAc97B,KAAO,OAAOy7B,MAAQzvB,UAAU,OAAOiwB,QAAQ,MAAMC,QAAQ,KAAKC,QAAQ,SACxYC,MACIZ,SACIx7B,KAAM,YACNy7B,MACIzvB,UAAW,MACXiwB,QAAW,MACXC,QAAW,MACXC,QAAW,SAGnBR,QACI37B,KAAM,OACNy7B,MACIzvB,UAAW,MACXiwB,QAAW,MACXC,QAAW,MACXC,QAAW,SAGnBvB,MAAa56B,KAAM,QACnB87B,YACI97B,KAAM,OACNy7B,MACIzvB,UAAW,OACXiwB,QAAW,MACXC,QAAW,KACXC,QAAW,SAIvBE,MACIb,SACIx7B,KAAM,YACNy7B,MACIzvB,UAAW,MACXiwB,QAAW,MACXC,QAAW,MACXC,QAAW,SAGnBR,QACI37B,KAAM,OACNy7B,MACIzvB,UAAW,MACXiwB,QAAW,MACXC,QAAW,MACXC,QAAW,SAGnBvB,MAAa56B,KAAM,eACnB87B,YACI97B,KAAM,OACNy7B,MACIzvB,UAAW,OACXiwB,QAAW,MACXC,QAAW,KACXC,QAAW,SAM3B9/B,SACKC,OAAO,YACPggC,SAAS,aAAcrB,MAGhC,WACI,YAEA,IAAID,KAEIh7B,KAAM,YACN4U,SACI2nB,GAAM,UACNC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,KAAQ,UACRC,KAAQ,UACRC,KAAQ,UACRC,KAAQ,UACRC,qBAAwB,QACxBC,mBAAsB,kBACtBC,0BAA6B,aAIjCv9B,KAAM,iBACN4U,SACI2nB,GAAM,UACNC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,KAAQ,UACRC,KAAQ,UACRC,KAAQ,UACRC,KAAQ,UACRC,qBAAwB,QACxBC,mBAAsB,kBACtBC,0BAA6B,YAKzClhC,SACKC,OAAO,YACPggC,SAAS,eAAgBtB,MAElC,WAEI,YAOA,SAASwC,GAAqB7gC,EAAU6Z,EAAMha,GAkB1C,QAASihC,KAEL,GAAIjD,GAAmBh+B,EAAYkB,sBAC/B28B,EAAqB79B,EAAYgB,uBAMrCnB,SAAQ4iB,QAAQub,EAAkB,SAAUkD,GAExCjgC,EAAOigC,EAAgB19B,SAGvB3D,QAAQ4iB,QAAQye,EAAgB5/B,OAAQ,SAAU6/B,EAAWC,GAEzDngC,EAAOigC,EAAgB19B,MAAM49B,IACzB59B,KAAU29B,EAAU39B,KACpB69B,QACI7xB,WACI8xB,MAAalgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAVkC,YAAwBr9B,OAC7Ey9B,UAAangC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAVkC,YAAwBK,SAAU,GACvFC,UAAargC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAVkC,YAAwBK,SAAU,GACvFE,UAAatgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAVkC,YAAwBK,SAAU,GACvFG,UAAavgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAVkC,YAAwBK,SAAU,IAE3FI,MACIN,MAAalgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUn7B,OAC9Ey9B,UAAangC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,GACxFC,UAAargC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,GACxFE,UAAatgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,GACxFG,UAAavgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,IAE5FK,MACIP,MAAalgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUn7B,OAC9Ey9B,UAAangC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,GACxFC,UAAargC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,GACxFE,UAAatgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,GACxFG,UAAavgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,IAE5FM,MACIR,MAAalgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUn7B,OAC9Ey9B,UAAangC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,GACxFC,UAAargC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,GACxFE,UAAatgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,GACxFG,UAAavgC,EAAKy8B,EAAmBsD,EAAU39B,MAAM29B,EAAUlC,KAAK,UAAUuC,SAAU,UAQ5GO,EAAsB9gC,EAItB,IAAI+gC,KAGJniC,SAAQ4iB,QAAQxhB,EAAQ,SAAUT,EAAOu8B,GAErCiF,KACAA,EAAU,cAAgBjF,EAG1Bl9B,QAAQ4iB,QAAQjiB,EAAO,SAAUyhC,EAAYb,GAGzCvhC,QAAQ4iB,QAAQwf,EAAWZ,OAAQ,SAAU//B,EAAQ4gC,GAGjDriC,QAAQ4iB,QAAQnhB,EAAQ,SAAUggC,EAAOa,GAErCH,EAAU,IAAMZ,EAAgBgB,EAAQF,GAAkBE,EAAQD,IAAcb,QAM5Fe,EAAOL,KAaf,QAASD,GAAsBO,GAK3B,GAAIrhC,GAASpB,QAAQ0B,KAAK+gC,EAG1BziC,SAAQ4iB,QAAQxhB,EAAQ,SAAUT,GAG9BX,QAAQ4iB,QAAQjiB,EAAO,SAAU2gC,EAAWC,GAExC5gC,EAAM4gC,GAAiBD,EAAUE,OACjC7gC,EAAM4gC,GAAeE,MAAQH,EAAUE,OAAVF,WAAyBG,MACtD9gC,EAAM4gC,GAAeG,UAAYJ,EAAUE,OAAVF,WAAyBI,UAC1D/gC,EAAM4gC,GAAeK,UAAYN,EAAUE,OAAVF,WAAyBM,UAC1DjhC,EAAM4gC,GAAeM,UAAYP,EAAUE,OAAVF,WAAyBO,UAC1DlhC,EAAM4gC,GAAeO,UAAYR,EAAUE,OAAVF,WAAyBQ,gBACnDnhC,GAAM4gC,GAAN5gC,eAKfR,EAAYq+B,cAAcp9B,EAG1B,IAAIshC,GAAgBpiC,EAASgE,IAAI,gBAE5Bo+B,GAEDviC,EAAY88B,eAAeyF,GAI3BviC,EAAY88B,eAAe,WAUnC,QAASuF,GAAOL,GAEZ,GAAIQ,GAAc,u1YAEdC,EAAQ,GAAIC,QAAOC,OAAOC,KAAKZ,GAAWjnB,KAAK,KAAM,MACrDuD,EAAMkkB,EAAY9f,QAAQ+f,EAAO,SAAUI;AAE3C,MAAOb,GAAUa,KAGjBC,EAASjjC,QAAQiM,QAAQ,QACzBi3B,EAAUljC,QAAQiM,QAAQ,kCAC9Bi3B,GAAQtU,KAAKnQ,GACbwkB,EAAO5wB,OAAO6wB,GAWlB,QAAS3hC,GAAKkgC,EAAO0B,GAEjB,GAAIC,GAAgBD,IAAkB,CAkBtC,OAZsB,KAAjB1B,EAAMz5B,QAA6B,MAAby5B,EAAM,IAA2B,MAAbA,EAAM,IAA2B,MAAbA,EAAM,IAErEA,EAAM7mB,OAAO,EAAG,GAIfwoB,IAED3B,EAAQ4B,EAAc5B,EAAO2B,IAIX,IAAjB3B,EAAMz5B,OAEA,OAASy5B,EAAMvmB,KAAK,KAAO,IAEX,IAAjBumB,EAAMz5B,OAEL,QAAUy5B,EAAMvmB,KAAK,KAAO,QAInCf,GAAKC,MAAM,4DAA8DqnB,EAAMz5B,OAAS,wCAUhG,QAASq7B,GAAc5B,EAAO2B,GAE1B,GAAIE,IACAC,OACIC,EAAK,IACLC,EAAK,MACLC,EAAK,MACLC,EAAK,QAETC,OACIJ,EAAK,OACLC,EAAK,OACLC,EAAK,OACLC,EAAK,QAeb,OAVkB,OAAblC,EAAM,IAA2B,MAAbA,EAAM,IAA2B,MAAbA,EAAM,GAE/CA,EAAM,GAAK6B,EAAeC,MAAMH,IAGb,IAAb3B,EAAM,IAAyB,IAAbA,EAAM,GAAuB,IAAbA,EAAM,KAE9CA,EAAM,GAAK6B,EAAeM,MAAMR,KAG7B3B,EAMX,QAASc,GAAQsB,GAEb,MAAOA,GAAOC,OAAO,GAAGC,cAAgBF,EAAOzO,MAAM,GA7PzD,GAAIh0B,MAEA2W,GACAqpB,SAAUA,EACV7/B,KAAUA,EAGd,OAAOwW,GAgCXopB,EAAqBphC,SAAW,WAAY,OAAQ,eA/CpDC,QACKC,OAAO,YACPijB,QAAQ,gBAAiBie,MAyQjC,WAEG,YAOA,SAASp7B,GAAOxF,EAASif,GA0BrB,QAASuJ,GAA0BxQ,GA0BjC,IAAI,GAxBAyrB,IACFhY,KAAM,SACNiY,aAAc,mDACdC,QACEhY,SAAS,GAEXiY,gBACEjY,SAAS,GAEXkY,aACEC,YAAa,EACbC,UAAU,GAEZC,cACEC,aAAc,QACdC,YAAY,EACZtc,UAAW,GAEbuc,SACEC,UAAW,SAKP58B,EAAE,EAAGA,EAAEwQ,EAAQ8P,OAAOrgB,OAAQD,IAChCwQ,EAAQ8P,OAAOtgB,GAAGmlB,gBACpB3U,EAAQ8P,OAAOtgB,GAAGmlB,cAAgB,GAIhC3U,EAAQ8P,OAAOtgB,GAAGwlB,SACpBhV,EAAQ8P,OAAOtgB,GAAGwlB,OAAS,QAK/B,OAAOvtB,SAAQgX,OAAOuB,EAASyrB,GAGjC,QAASnc,GAAsBjhB,EAAOg+B,EAAe59B,GAEnD,GAAI69B,GAAc,mBAEhBA,IADCrlB,EAAS,MACK,eAEA,KAAO5Y,EAAM2yB,eAAe51B,KAAO,IAAMiD,EAAMuyB,eAAex1B,KAAO,GAEtF,IAAIikB,IACFkd,KACEjiC,MAAO,iCACPwlB,SAEIlkB,GAAI,KACJtB,MAAO,MAAQ+D,EAAM2yB,eAAe51B,KAAO,kBAC3CohC,WAAY,iBACZ7X,cAAe,EACfK,OAAQ,UAGRppB,GAAI,KACJtB,MAAO,MAAQ+D,EAAMuyB,eAAex1B,KAAO,kBAC3CohC,WAAY,iBACZ7X,cAAe,EACfK,OAAQ,UAGZngB,SAEF43B,QACEniC,MAAO,oBACPwlB,SAEIlkB,GAAI,KACJtB,MAAOgiC,EACPE,WAAY,aACZ7X,cAAe,EACfK,OAAQ,UAGZngB,SAEF63B,WACEpiC,MAAO,gCACPwlB,SAEIlkB,GAAI,KACJtB,MAAO,MAAQ+D,EAAM2yB,eAAe51B,KACpCohC,WAAY,iBACZ7X,cAAe,EACfK,OAAQ,UAGRppB,GAAI,KACJtB,MAAO,MAAQ+D,EAAMuyB,eAAex1B,KACpCohC,WAAY,iBACZ7X,cAAe,EACfK,OAAQ,UAGZngB,UAIA83B,EAAsBC,EAAuBv+B,EAAOg+B,EACxDhd,GAAUkd,IAAI13B,KAAO83B,EAAoBJ,IACzCld,EAAUod,OAAO53B,KAAO83B,EAAoBF,OAC5Cpd,EAAUqd,UAAU73B,KAAO83B,EAAoBD,SAG/C,IAAIG,GAAgBxd,EAAUkd,IAAI13B,KAAKwa,EAAUkd,IAAI13B,KAAKpF,OAAS,GAC/Dq9B,EAAgBC,EAAmBt+B,EAAiBo+B,EAAc7Z,eAAgB6Z,EAAc3Z,eACpG7D,GAAUkd,IAAIzc,OAAO,GAAG4E,UAAYoY,EAAcE,KAClD3d,EAAUkd,IAAIzc,OAAO,GAAG4E,UAAYoY,EAAcrjC,IAElD,IAAIwjC,GAAsB5d,EAAUqd,UAAU73B,KAAKwa,EAAUqd,UAAU73B,KAAKpF,OAAS,GACjFy9B,EAAsBH,EAAmBt+B,EAAiBw+B,EAAoBja,eAAgBia,EAAoB/Z,eACtH7D,GAAUqd,UAAU5c,OAAO,GAAG4E,UAAYwY,EAAoBF,KAC9D3d,EAAUqd,UAAU5c,OAAO,GAAG4E,UAAYwY,EAAoBzjC,IAE9D,IAAI0jC,GAAmB9d,EAAUod,OAAO53B,KAAKwa,EAAUod,OAAO53B,KAAKpF,OAAS,EAU5E,OATG09B,GAAiB5Z,YAAc,EAChClE,EAAUod,OAAO3c,OAAO,GAAG4E,UAAY0Y,EAEvC/d,EAAUod,OAAO3c,OAAO,GAAG4E,UAAY2Y,EAMlChe,EAGT,QAASud,GAAuBv+B,EAAOg+B,GAErC,GAAIx3B,IACF03B,OACAE,UACAC,aAGF,IAAGr+B,EAAMi/B,sBAAsB79B,OAAS,GAAKpB,EAAMk/B,sBAAsB99B,OAAS,EAKhF,IAAI,GADAyf,GAHAse,EAAWn/B,EAAMi/B,sBAAsBzQ,MAAM,EAAGwP,GAAeoB,UAC/DC,EAAWr/B,EAAMk/B,sBAAsB1Q,MAAM,EAAGwP,GAAeoB,UAG3Dj+B,EAAE,EAAGA,EAAEg+B,EAAS/9B,OAAQD,IAG9B,GADA0f,EAAese,EAAS/9B,OAASD,EACf68B,GAAfnd,EAA8B,CAU/B,GAAIye,GAAoBC,EAAyBJ,EAAS3Q,MAAM,EAAIrtB,EAAI,GAAK,iBACzEq+B,EAAoBD,EAAyBF,EAAS7Q,MAAM,EAAIrtB,EAAI,GAAK,gBAE7EqF,GAAK03B,IAAI78B,MAEPwf,YAAaA,EACb8D,eAAgB2a,EAChBza,eAAgB2a,GAIlB,IAAIC,GAAuBF,EAAyBJ,EAAS3Q,MAAM,EAAIrtB,EAAI,GAAK,iBAC5Eu+B,EAAuBH,EAAyBF,EAAS7Q,MAAM,EAAIrtB,EAAI,GAAK,gBAEhFqF,GAAK43B,OAAO/8B,MAEVwf,YAAaA,EACbqE,WAAYua,EAAuBC,EACnC/a,eAAgB8a,EAChB5a,eAAgB6a,GAIlB,IAAIC,GAA0BJ,EAAyBJ,EAAS3Q,MAAM,EAAIrtB,EAAI,GAAK,gBAC/Ey+B,EAA0BL,EAAyBF,EAAS7Q,MAAM,EAAIrtB,EAAI,GAAK,eAEnFqF,GAAK63B,UAAUh9B,MAEbwf,YAAaA,EACb8D,eAAgBgb,EAChB9a,eAAgB+a,IAMxB,MAAOp5B,GAGT,QAASk4B,GAAmBt+B,EAAiBy/B,EAAWC,GAEtD,GAAIC,KAuBJ,OAtByB,IAAtB3/B,EAAgB7C,GAEDuiC,EAAZD,GAEFE,EAAW3kC,KAAO4jC,EAClBe,EAAWpB,KAAOI,IAElBgB,EAAW3kC,KAAO2jC,EAClBgB,EAAWpB,KAAOK,GAIJc,EAAZD,GAEFE,EAAW3kC,KAAO4jC,EAClBe,EAAWpB,KAAOI,IAElBgB,EAAW3kC,KAAO2jC,EAClBgB,EAAWpB,KAAOK,GAIfe,EAGT,QAASR,GAAyBS,EAAGC,GAEnC,IAAI,GADAC,GAAM,EACF/+B,EAAE,EAAGA,EAAI6+B,EAAE5+B,OAAQD,IAEzB++B,GAAOC,WAAWH,EAAE7+B,GAAG8+B,GAGzB,OAAOC,GAGT,QAASxP,GAAc0P,GACrB,GAAIl7B,GAAQ,EAEZ,QADAk7B,EAAI3rB,SAAS2rB,IAEX,IAAK,GACHl7B,EAAQ,KACR,MACF,KAAK,GACHA,EAAQ,QACR,MACF,KAAK,GACHA,EAAQ,OAIZ,MAAOA,GAGT,QAAS8f,GAAwBob,GAC/B,GAAIl7B,GAAQ,QAWZ,OAVAk7B,GAAID,WAAWC,GAEZA,GAAK,IAAY,MAALA,IAAmB,IAANA,GAAaA,GAAK,MAC5Cl7B,EAAQ,MACAk7B,EAAI,MAAa,MAALA,GAAiB,MAAJA,GAAaA,GAAK,MACnDl7B,EAAQ,UACAk7B,EAAI,MAAa,GAALA,GAAc,MAAJA,GAAaA,GAAK,MAChDl7B,EAAQ,QAGHA,EAGT,QAASypB,KAEP,GAAID,KACAzyB,MAAO,UACPA,MAAO,WACPA,MAAO,QAGX,OAAOyyB,GAGT,QAASE,KAEP,GAAIF,KACDzyB,MAAO,SACPA,MAAO,UACPA,MAAO,UACPA,MAAO,YAGV,OAAOyyB,GAGT,QAAS9tB,GAAqBrD,EAAI8iC,GAEhC,IAAI,GAAIl/B,GAAE,EAAEA,EAAEk/B,EAAQj/B,OAAOD,IAC3B,GAAGk/B,EAAQl/B,GAAG5D,IAAMA,EAClB,MAAO8iC,GAAQl/B,GAKrB,QAAS8jB,GAAqBqb,GAI5B,MAFAA,GAAUH,WAAWG,GAELn0B,SAAZm0B,GAAqC,OAAZA,GACZ,GAAXA,IACFA,EAAUA,EAAQC,QAAQ,GACD,KAArBD,EAAQpD,OAAO,KACjBoD,EAAUA,EAAQjM,OAAO,EAAGiM,EAAQl/B,OAAS,KAI1Ck/B,GART,OAYF,QAASxX,GAASkX,EAAGziC,GAGnB,IAAI,GADAijC,GAAI,KACAr/B,EAAE,EAAGA,EAAE6+B,EAAE5+B,OAAQD,IACvB,GAAG6+B,EAAE7+B,GAAG5D,IAAMA,EAAI,CAChBijC,EAAIR,EAAE7+B,EACN,OAGJ,MAAOq/B,GAGT,QAASC,GAAOT,EAAG/kC,GAGjB,IAAI,GADAulC,GAAI,KACAr/B,EAAE,EAAGA,EAAE6+B,EAAE5+B,OAAQD,IACvB,GAAG6+B,EAAE7+B,GAAGlG,EAAO8W,OAAS9W,EAAOoC,MAAO,CACpCmjC,EAAIR,EAAE7+B,EACN,OAGJ,MAAOq/B,GAGT,QAAS7P,GAA4B3wB,EAAOg+B,EAAe59B,EAAiBglB,GAE1E,GAAIsb,GAAY,GACZC,EAAiBpC,EAAuBv+B,EAAOg+B,GAC/C4C,EAAqBD,EAAevb,GACpCyb,EAAuBD,EAAmBA,EAAmBx/B,OAAS,EAoB1E,OAjBIs/B,GAFqB,GAAtBtgC,EAAgB7C,GACdsjC,EAAqBlc,eAAiBkc,EAAqBhc,eAChD,IACJgc,EAAqBlc,gBAAkBkc,EAAqBhc,eACxD,IAEA,IAGXgc,EAAqBlc,eAAiBkc,EAAqBhc,eAChD,IACJgc,EAAqBlc,gBAAkBkc,EAAqBhc,eACtD,IAEF,IAQlB,QAAS+L,GAAkCvzB,EAAO+C,GAEhD,GAAIsgC,GAAY,EAuBhB,OAtBArjC,GAAQ8iC,WAAW9iC,GAKfqjC,EAHqB,GAAtBtgC,EAAgB7C,GAEbF,EAAQ,EACE,IACM,IAAVA,EACI,IAEA,IAGVA,EAAQ,EACE,IACM,IAAVA,EACI,IAEA,IAQlB,QAAS0yB,GAAsBxR,EAAWxhB,EAAM+jC,GAM9C,IAJkB30B,SAAd20B,GAAyC,OAAdA,KAC7BA,EAAY,GAGXA,EAAY,EAAG,CAChB,GAAIC,GAAa,MAAQD,EAAY,GAAK,IACtCE,EAAY,KAAOF,EAAY,GAChC/jC,GAAKua,QAAQypB,IAAe,EAC7BhkC,EAAKkf,QAAQ8kB,EAAYC,GAEzBjkC,GAAQikC,EAGZ,IAAI,GAAI7/B,GAAE,EAAEA,EAAEod,EAAUnd,OAAOD,IAE7B,GAAGod,EAAUpd,GAAGpE,KAAKkkC,QAAUlkC,EAE7B,MADA+jC,IAAa,EACN/Q,EAAsBxR,EAAWxhB,EAAM+jC,EAGlD,OAAO/jC,GAGT,QAASivB,GAA8BkJ,GAErC,GAAGA,EAAO,CAGR,GAFAA,EAAQiL,WAAWjL,GAEhBA,EAAQ,EACTA,EAASA,EAAQ,IAAO,MACnB,CAAA,KAAW,EAARA,GAGR,MAAOA,EAFPA,GAAS,IAAM1iB,KAAKsS,IAAIoQ,GAAU,EAKpC,MAAOA,GAAMqL,QAAQ,IAIzB,QAASW,GAA8BhM,GAErC,MAAGA,IACDA,EAAQiL,WAAWjL,GAEjBA,EADCA,GAAS,EACY,KAAbA,EAAQ,GAET,MAAMA,EAAQ,GAGjB1iB,KAAK2uB,MAAMjM,IARpB,OAldF,GAAI/jB,IACFgR,0BAA2BA,EAC3BlB,sBAAuBA,EACvByP,cAAeA,EACf1L,wBAAyBA,EACzB2J,sBAAuBA,EACvBC,qBAAsBA,EACtBhuB,qBAAsBA,EACtBqkB,qBAAsBA,EACtBsa,yBAA0BA,EAC1BzW,SAAUA,EACV2X,OAAQA,EACR9P,4BAA6BA,EAC7BC,kCAAmCA,EACnCb,sBAAuBA,EACvB/D,8BAA+BA,EAC/BkV,8BAA+BA,GAG7BnC,EAAiB,UACjBC,EAAe,SAEnB,OAAO7tB,GAmBXhS,EAAOhG,SAAW,UAAW,YAhD7BC,QACKC,OAAO,YACPijB,QAAQ,SAAUnd,MAse1B,WAEG,YAOA,SAASmS,GAAQ3X,GAyBb,QAASynC,GAAOxuB,EAAM8kB,GAElB,MAAOA,GAAKpgB,QAAQ1E,GAAQ,GAUhC,QAASyuB,KA+HL,QAASC,GAAa96B,GAElB,IAAM,GAAIrF,GAAI,EAAGA,EAAIqF,EAAKpF,OAAQD,IAClC,CACI,GAAIogC,GAAa/6B,EAAKrF,GAAG87B,OACrBuE,EAAWh7B,EAAKrF,GAAG4Q,IAIvB,IAFA0vB,EAAsBj7B,EAAKrF,GAAGugC,eAAiBl7B,EAAKrF,GAAGwgC,SAElDJ,GAED,GAA8C,IAAzCA,EAAWjqB,QAAQ9Q,EAAKrF,GAAGygC,WAE5B,MAAOp7B,GAAKrF,GAAGwgC,aAIlB,IAAKH,EAEN,MAAOh7B,GAAKrF,GAAGwgC,UAK3B,QAASE,GAAcN,GAEnB,GAAIzkB,GAAQykB,EAAWjqB,QAAQmqB,EAE/B,IAAc,IAAT3kB,EAKL,MAAOrI,UAAS8sB,EAAWO,UAAUhlB,EAAQ2kB,EAAoBrgC,OAAS,IA7J9E,GAAK2gC,EAED,MAAOA,EAGX,IAAIC,KAEI/E,OAAetjC,EAAQsoC,UAAUC,UACjCN,UAAe,OACfF,cAAe,OACfC,SAAe,SAGf1E,OAAWtjC,EAAQsoC,UAAUC,UAC7BN,UAAW,SACXD,SAAW,WAGX1E,OAAetjC,EAAQsoC,UAAUC,UACjCN,UAAe,UACfF,cAAe,WACfC,SAAe,YAGf1E,OAAetjC,EAAQsoC,UAAUE,OACjCP,UAAe,QACfF,cAAe,UACfC,SAAe,WAGf5vB,KAAUpY,EAAQyoC,MAClBT,SAAU,UAGV1E,OAAWtjC,EAAQsoC,UAAUE,OAC7BP,UAAW,OACXD,SAAW,SAGX1E,OAAWtjC,EAAQsoC,UAAUE,OAC7BP,UAAW,MACXD,SAAW,cAGX1E,OAAWtjC,EAAQsoC,UAAUC,UAC7BN,UAAW,UACXD,SAAW,YAGX1E,OAAWtjC,EAAQsoC,UAAUE,OAC7BP,UAAW,SACXD,SAAW,WAGX1E,OAAWtjC,EAAQsoC,UAAUC,UAC7BN,UAAW,WACXD,SAAW,aAGX1E,OAAetjC,EAAQsoC,UAAUC,UACjCN,UAAe,OACfD,SAAe,WACfD,cAAe,SAGfzE,OAAetjC,EAAQsoC,UAAUC,UACjCN,UAAe,YACfD,SAAe,WACfD,cAAe,OAGfzE,OAAetjC,EAAQsoC,UAAUC,UACjCN,UAAe,QACfD,SAAe,UACfD,cAAe,OAGfzE,OAAetjC,EAAQsoC,UAAUC,UACjCN,UAAe,UACfD,SAAe,WACfD,cAAe,YAInBW,IAEIpF,OAAWtjC,EAAQsoC,UAAUK,SAC7BV,UAAW,MACXD,SAAW,YAGX1E,OAAWtjC,EAAQsoC,UAAUK,SAC7BV,UAAW,MACXD,SAAW,QAGX1E,OAAWtjC,EAAQsoC,UAAUK,SAC7BV,UAAW,QACXD,SAAW,UAGX1E,OAAWtjC,EAAQsoC,UAAUK,SAC7BV,UAAW,SACXD,SAAW,WAGX1E,OAAWtjC,EAAQsoC,UAAUK,SAC7BV,UAAW,OACXD,SAAW,SAGX1E,OAAWtjC,EAAQsoC,UAAUK,SAC7BV,UAAW,OACXD,SAAW,SAGX1E,OAAWtjC,EAAQsoC,UAAUK,SAC7BV,UAAW,UACXD,SAAW,YAIfF,EAAsB,GAsCtBc,EAAUjB,EAAaU,IAAgB,kBACvCQ,EAAUX,EAAcloC,EAAQsoC,UAAUC,YAAcL,EAAcloC,EAAQsoC,UAAUQ,aAAe,kBACvGC,EAAKpB,EAAae,IAAW,YAajC,OAVAE,GAAUA,EAAQ/iC,cAClBgjC,EAAUD,EAAU,IAAMC,EAC1BE,EAAKA,EAAGljC,cAERuiC,GACIQ,QAASA,EACTC,QAASA,EACTE,GAASA,GAWjB,QAASC,KAEL,GAAIC,GAAK,WAEL,OAA+B,OAArB,EAAIpwB,KAAKE,UAAuB,GAAGmwB,SAAS,IAAIf,UAAU,GAExE,OAAQc,KAAOA,IAAOA,IAAOA,IAAOA,IAAOA,IAO/C,QAASpxB,KAEL,MAAOsxB,GAAaC,SASxB,QAASC,GAAcpwB,EAAMqwB,GAEG,IAAvBA,EAAM3rB,QAAQ1E,GAEfqwB,EAAM5hC,KAAKuR,GAIXqwB,EAAMjvB,OAAOivB,EAAM3rB,QAAQ1E,GAAO,GA5P1C,GAAIkwB,GAAe,GAAII,cAAavpC,EAAQsoC,UAAUC,WAClDH,EAAc,KAEd5wB,GACAiwB,OAAeA,EACfC,cAAeA,EACfsB,cAAeA,EACfnxB,SAAeA,EACfwxB,cAAeA,EAGnB,OAAO7xB,GA8BXG,EAAQnY,SAAW,WAjDnBC,QACKC,OAAO,YACPijB,QAAQ,UAAWhL,MAuQ5B,WAEI,YAOA,SAAS6xB,GAAmB/1B,EAAImG,EAAM1W,GAclC,QAASvB,GAAQ8nC,EAAQC,GAErB,GAAIC,GAAcF,EAAOtwB,MAAM,KAC3BywB,EAAWD,EAAY,GACvB1hB,EAAS0hB,EAAY,GACrBroC,EAASooC,KAEb,KAAME,IAAa3hB,EAGf,MADArO,GAAKC,MAAM,oFACJ,CAIX,IAAI5F,GAAWR,EAAGS,QAGd21B,EAAYC,EAAaF,EA0B7B,OAxBMC,GAOFA,EAAU5hB,GAAQ3mB,EAGd,SAAUuC,GAENoQ,EAAStS,QAAQkC,IAIrB,SAAUA,GAENoQ,EAASyN,OAAO7d,MAhBxB+V,EAAKC,MAAM,aAAe+vB,EAAW,wCACrC31B,EAASyN,OAAO,aAAekoB,EAAW,yCAqBvC31B,EAASG,QASpB,QAAS01B,GAAaF,GAQlB,IAAM,GALFG,GAAgBH,EAASzwB,MAAM,KAC/B0wB,EAAY3mC,EAIN8mC,EAAI,EAAGA,EAAID,EAActiC,OAAQuiC,IAC3C,CACI,GAAKvqC,QAAQoW,YAAYg0B,EAAUE,EAAcC,KACjD,CACIpwB,EAAKC,MAAM,kBAAoBkwB,EAAcC,GAAK,qBAClDH,GAAY,CACZ,OAGJA,EAAYA,EAAUE,EAAcC,IAGxC,MAAMH,GAKCA,GAHI,EAtFf,GAAIryB,IACA7V,QAASA,EAGb,OAAO6V,GAuCXgyB,EAAmBhqC,SAAW,KAAM,OAAQ,OAlD5CC,QACKC,OAAO,YACPijB,QAAQ,cAAe6mB,MAmGhC,WAEI,YAQA,SAASS,KAEP,MAAO,UAAStD,GAEd,MAAgBn0B,UAAZm0B,GAAqC,OAAZA,GACZ,GAAXA,IACFA,EAAUA,EAAQC,QAAQ,GACD,KAArBD,EAAQpD,OAAO,KACjBoD,EAAUA,EAAQjM,OAAO,EAAGiM,EAAQl/B,OAAS,KAI1Ck/B,GART,QAcJ,QAASuD,KAEP,MAAO,UAASzD,GAEd,GAAIl7B,GAAQ,EACZ,QAAOk7B,GACL,IAAK,GACHl7B,EAAQ,KACJ,MACN,KAAK,GACHA,EAAQ,QACJ,MACN,KAAK,GACHA,EAAQ,OAGZ,MAAOA,IAIX,QAAS4+B,KAIP,MAAO,UAAS5O,EAAO9P,GAErB,GAAG8P,EAED,GADAA,EAAQiL,WAAWjL,GAChBA,EAAQ,EAAG,CACZ,GAAY,GAAR9P,EAYF,MAVE8P,GADEA,GAAS,EACW,KAAbA,EAAQ,GAET,MAAQA,EAAQ,GAG1BA,EAAQ1iB,KAAK2uB,MAAMjM,GACfA,EAAQ,IACVA,EAAQ,IAAMA,GAGTA,CAEPA,GAAQA,EAAMqL,QAAQ,OAIxBrL,GAAQ,IAIZ,OAAOA,IA3EX97B,QACKC,OAAO,YACP0qC,OAAO,sBAAuBF,GAC9BE,OAAO,mBAAoBH,GAC3BG,OAAO,aAAcD,MA6E9B,WAEI,YAQA,SAASE,KAEL,MAAO,UAAU/P,EAAOgQ,GAEpB,GAAsB,IAAjBhQ,EAAM7yB,QAAgC,IAAhB6iC,EAAK7iC,OAE5B,MAAO6yB,EAGX,IAAIiQ,KA0BJ,OAxBAjQ,GAAMjY,QAAQ,SAAUpJ,GAEpB,GAAI5S,GAAQikC,EAAKE,MAAM,SAAUC,GAE7B,GAAIC,IAAY,CAWhB,OATAzxB,GAAKqxB,KAAKjoB,QAAQ,SAAUsoB,GAExB,MAAKA,GAAQvnC,OAASqnC,EAAIrnC,UAEtBsnC,GAAY,GAFhB,SAOGA,GAGNrkC,IAEDkkC,EAAS7iC,KAAKuR,KAIfsxB,GAKf,QAASK,KAEL,MAAO,UAAUC,EAAUP,GAEvB,GAAyB,IAApBO,EAASpjC,QAAgC,IAAhB6iC,EAAK7iC,OAAnC,CAKA,GAAKojC,EAASpjC,OAAS6iC,EAAK7iC,OAExB,QAGJ,IAAI8iC,MAEAlkC,EAAQikC,EAAKE,MAAM,SAAUC,GAE7B,GAAIC,IAAY,CAWhB,OATAG,GAASxoB,QAAQ,SAAUsoB,GAEvB,MAAKA,GAAQvnC,OAASqnC,EAAIrnC,UAEtBsnC,GAAY,GAFhB,SAOGA,GAQX,OALKrkC,IAEDkkC,EAAS7iC,KAAKmjC,GAGXN,IAnFf9qC,QACKC,OAAO,YACP0qC,OAAO,eAAgBC,GACvBD,OAAO,qBAAsBQ,MAqFtC,WAEI,YAiBA,SAASE,GAAgBC,GAErB,MAAO,UAAUrnC,GAEb,MAAOqnC,GAAKC,YAAYtnC,IAKhC,QAASunC,KAEL,MAAO,UAAU5iB,GAEb,MAAO6iB,QAAO7iB,GAAM/F,QAAQ,YAAa,KAKjD,QAAS6oB,KAEL,MAAO,UAAUznC,GAEb,MAASA,GAAcA,EAAM4e,QAAQ,KAAM,IAAzB,IAK1B,QAAS8oB,KAEL,MAAO,UAAUC,GAEb,MAAMA,GAIY,cAAbA,EAAI5f,KAEE4f,EAAIjoC,KAAKkf,QAAQ,WAAY,SAAUgpB,GAE1C,MAAO,IAAMA,EAAGzlC,gBAGjBwlC,EAAIjkC,OAASikC,EAAIjoC,KAXxB,QAeR,QAASmoC,KAEP,MAAO,UAASlF,GAEd,MAAGA,GACEA,EAAE5+B,OAAS,EACL4+B,EAAExR,QAAQ4Q,UAEVY,EAJX,QAUJ,QAASmF,KAEP,MAAO,UAASC,EAAYphC,EAAUqhC,GAKpC,OAHcl5B,SAAXk5B,GAAmC,OAAXA,KACzBA,EAAS,qBAERD,GAAcphC,EACRrB,OAAO0tB,IAAI+U,GAAYE,GAAGthC,GAAUqhC,OAAOA,GADpD,QAOJ,QAASE,KAEP,MAAO,UAASC,GAEdtnC,QAAQC,IAAIqnC,IAIhB,QAASC,KACP,MAAO,UAASD,GACd,MAAGtJ,QAAOC,KAAKqJ,GAAKpkC,OAAS,GACpB,GAEA,GAMb,QAASskC,KAEP,MAAO,UAASC,EAAKC,GAEnB,MAAWz5B,UAARw5B,GAA6B,OAARA,GAAuB,IAAPA,EAC/BC,EAGFD,GAIX,QAASE,KAEP,MAAO,UAASF,GAMd,MAJU,OAAPA,IACDA,EAAMA,EAAIpF,QAAQ,GAAGtkB,QAAQ,sBAAuB,QAG/C0pB,GAIX,QAASG,KAEP,MAAO,UAASH,EAAKvkC,EAAQ2kC,GAO3B,MALAJ,GAAMA,EAAI7D,UAAU,EAAG1gC,GACN+K,SAAd45B,GAAyC,OAAdA,IAC5BJ,GAAOI,GAGFJ,GA1FXlB,EAAgBtrC,SAAW,QAnD3BC,QACKC,OAAO,YACP0qC,OAAO,YAAaU,GACpBV,OAAO,kBAAmBa,GAC1Bb,OAAO,UAAWe,GAClBf,OAAO,cAAegB,GACtBhB,OAAO,eAAgBmB,GACvBnB,OAAO,aAAcoB,GACrBpB,OAAO,MAAOwB,GACdxB,OAAO,gBAAiB0B,GACxB1B,OAAO,cAAe2B,GACtB3B,OAAO,UAAW8B,GAClB9B,OAAO,WAAY+B,MAsI5B,WAEE,YAOA,SAASE,KAEP,OACEr6B,QAAQ,UACR4C,KAAK,SAAUzD,EAAO0D,EAAKC,EAAOC,GAEhC,GAAIzK,GAAawQ,SAAShG,EAAM,aAAkB,EAC9CnP,EAAUmV,SAAShG,EAAM,UAAe,CAK5CC,GAAKu3B,YAAYzb,QAAQ,SAAU0K,GACjC,GAAGA,GAAoB,GAAX51B,EAGV,GADA41B,EAAQiL,WAAWjL,GAChBA,EAAQ,EAAG,CACZ,GAAkB,GAAdjxB,EAYF,MAVEixB,GADEA,GAAS,EACW,KAAbA,EAAQ,GAET,MAAQA,EAAQ,GAG1BA,EAAQ1iB,KAAK2uB,MAAMjM,GACfA,EAAQ,IACVA,EAAQA,GAGHA,CAIPA,GAAQA,EAAMqL,QAAQ,OAGxBrL,GAAQ,IAGZ,OAAOA,OA5Cf97B,QACGC,OAAO,YACPyS,UAAU,OAAQk6B,MAiDvB,WAEI,YAOA,SAASE,GAAcnkC,EAAUqL,EAAI+4B,GAEjC,OACIt7B,SAAU,KACVG,QAAU,SAAUC,EAAU+P,GAE1B,GAAIorB,EAQJ,OANMprB,GAAOorB,OAETA,EAAOn7B,EAAS+c,OAChB/c,EAASO,SAGN,SAAUV,EAAOK,EAAUC,GAgC9B,QAASwwB,GAAOyK,EAAUjhC,GAEtB,GAAIkhC,GAAclhC,EAAOkI,KAAK,QAC1Bi5B,EAAQF,EAASvzB,MAAM,KAG3ByzB,GAAQA,EAAMxC,OAAO,SAAUyC,GAE3B,MAAOA,GAAKvF,OAAO7/B,QAIvB,IAAIqlC,GAAsBF,EAAM,GAAGvmC,MAAM,QAAQ,GAC7C0mC,EAA0B,GAAIzK,QAAO,IAAMwK,EAE/CF,GAAQA,EAAMI,IAAI,SAAUH,GAExB,MAAOA,GACFvqB,QAAQyqB,EAAyB,IACjCzqB,QAAQ,OAAQ,KAGzB,IAAI2qB,GAAkBC,KAAKC,UAAU17B,EAAO27B,UAAY37B,EAAO47B,KAAMT,EAAMjyB,KAAK,OAAO,EACvFsyB,GAAgBvpC,MAAQupC,EAAgBvpC,MACnC4e,QAAQ,yCAA0C,IAClDA,QAAQ,SAAU,IAClBA,QAAQ,UAAW,IACxBqqB,EAAY76B,OAAOm7B,EAAgBvpC,OAAO6N,SAAS,aAzDlDE,EAAOg7B,OAGRA,EAAOt7B,EAAM+G,MAAMzG,EAAOg7B,MAE9B,IAAIa,GAAoBn8B,EAAM+G,MAAMzG,EAAO67B,kBAE3C75B,GAAGwN,KAAKwrB,GAAMt5B,KAAK,SAAUs5B,GAEzB,GAAKA,EACL,CACSa,IAEDb,EAAOD,EAAaC,GAAMt7B,GAG9B,IAAIo8B,GAAgB9tC,QAAQiM,QACxB,6DAGJ8F,GAASM,OAAOy7B,GAGhBnlC,EAAS,WAEL65B,EAAOwK,EAAMc,IACd,IAAI,SAK/BhB,EAAc/sC,SAAW,WAAY,KAAM,gBApD3CC,QACKC,OAAO,YACPyS,UAAU,OAAQo6B,MAmF3B,WAEI,YAOA,SAASiB,GAAiB/5B,GAEtB,OACIvC,SAAU,IACVC,OACE6G,QAAS,IACTlF,OAAQ,IACRsb,MAAO,KAEThK,SAAU,8BACVxP,KAAM,SAAU/R,EAAQ4qC,GACtB,GAAI7pC,GAAK6pC,EAAI,GAAG7pC,EAEhB,KAAKA,EAAG,CACN,GAAI8pC,GAAO,WACT,QAASC,KACP,MAAO90B,MAAKC,MAA4B,OAArB,EAAID,KAAKE,WACzBmwB,SAAS,IACTf,UAAU,GAGf,MAAOwF,KAAOA,IAAO,IAAMA,IAAO,IAAMA,IAAO,IAC7CA,IAAO,IAAMA,IAAOA,IAAOA,IAE/B/pC,GAAK8pC,IAGPD,EAAInsB,KAAK,KAAM1d,EAGf6P,GAAGwN,KAAKpe,EAAOmV,SAAS7E,KAAK,SAAS6E,GAEpC,GAAIgU,EACJ,IAAIhU,EAAQ+P,aAAc,CACxB,GAAI6lB,GAAc,SAAUC,GAC1B,GAAIhH,GAAIgH,GAAkB71B,EAGtBlF,EAASjQ,EAAOiQ,QAAU,OAC1Bsb,EAAQvrB,EAAOurB,OAAS,MAE5Bqf,GAAIvvB,KACFpL,OAAUA,EACVsb,MAASA,IAGXhF,SAAS0kB,UAAW,EACpB9hB,EAAQ5C,SAAS2kB,UAAUnqC,EAAIijC,GAIjC+G,KAEA/qC,EAAO0R,OAAO,UAAW,WAEvByX,EAAMgiB,QACNJ,EAAY/qC,EAAOmV,gBARnCw1B,EAAiBhuC,SAAW,MArD5BC,QACKC,OAAO,YACPyS,UAAU,UAAWq7B,MAsE9B,WAEI,YAOA,SAASS,KAmBL,QAASlvC,GAAOwX,GAEZ23B,EAAoBzuC,QAAQgX,UAAWy3B,EAAmB33B,GAlB9D,GAAI23B,IACAC,yBAAmC,EACnCC,4BAAmC,EACnCC,iCAAmC,EAIvC3tC,MAAK3B,OAASA,EAiBd2B,KAAK4W,KAAO,WAcR,QAASC,GAAU+2B,GAEf,MAAK7uC,SAAQoW,YAAYq4B,EAAkBI,KAEhC,EAGJJ,EAAkBI,GAS7B,QAASC,GAAUD,EAAYE,GAE3BN,EAAkBI,GAAcE,EA9BpC,GAAIh3B,IACAD,UAAWA,EACXg3B,UAAWA,EAGf,OAAO/2B,IAvCf/X,QACKC,OAAO,YACP4Y,SAAS,aAAc21B,MAoEhC,WAEI,YAOA,SAASlvC,GAAOqC,GAEZA,EAAgCgB,QAAQ,mBA+C5CrD,EAAOS,SAAW,mCAtDlBC,QACKC,OAAO,sBACPX,OAAOA,MAShB,WAEI,YAOA,SAAS0vC,GAAqBvrC,IAkD9BurC,EAAqBjvC,SAAW,OAvDhCC,QACKC,OAAO,mBACPJ,WAAW,uBAAwBmvC,MAgB5C,WAEI,YAOA,SAAS1vC,GAAOqC,GAEZA,EAAgCgB,QAAQ,eAiD5CrD,EAAOS,SAAW,mCAxDlBC,QACKC,OAAO,kBACPX,OAAOA,MAShB,WAEI,YAOA,SAAS2vC,GAAkB9rC,EAAYwZ,EAAYuyB,EAAYhsC,EAAU3C,EAASqI,EAAQvF,EAAeI,GAgCrG,QAASwQ,KAEL,IAAI,GAAIlM,GAAE,EAAGA,EAAErH,EAAGyuC,YAAYnnC,OAAQD,IACpC,GAAG5E,EAAW2D,KAAK+D,YAAcnK,EAAGyuC,YAAYpnC,GAAG5D,GAAI,CAErDzD,EAAG0uC,mBAAqB1uC,EAAGyuC,YAAYpnC,EACvC,OAKJrH,EAAG2uC,iBAAmB3uC,EAAG4uC,UAAUJ,EAAWK,qBASlD,QAASC,GAAcC,GAEnB9yB,EAAW8yB,GAAW3wB,SAM1B,QAAS4wB,WAEEnvC,GAAQ4I,eAAekB,YACvB9J,GAAQ4I,eAAerC,IAC9B,IAAIzC,GAAoBhB,EAAciB,IAAI,QAC1CD,GAAkB0I,YAClB5J,EAAW6J,gBAAkB,KAC7B7J,EAAW2D,KAAO,KAElB8B,EAAOgD,GAAG,wBAMd,QAAS+jC,GAAe/B,GAgBpB,GAdAltC,EAAG2uC,iBAAmBzB,EAcH,OAAdA,EAAKZ,KACV,CACI,GAAI4C,GAAU,qNASd,YAPA1sC,GAASuB,MACLkgB,SAAW,6GAA+GirB,EAAU,oBACpI/qC,UAAW,IACXD,SAAW,YACXoH,OAAW,aAOnBkjC,EAAWW,IAAIjC,EAAKZ,MAGxB,QAAS8C,GAAiBjlC,GAErBnK,EAAG0uC,mBAAmBjrC,IAAM0G,EAAW1G,KACxCzD,EAAG0uC,mBAAqBvkC,EAExBpH,EAAIqD,KAAKipC,gBAAgBzrC,KAAMH,GAAI0G,EAAW1G,IAC5C,SAASC,GAEPjB,EAAW2D,KAAK+D,WAAaA,EAAW1G,IAG1C,SAASC,OAWf,QAASqY,KAEL/b,EAAGmc,OAAOxL,YAAY,+CAnI1B,GAAI3Q,GAAKO,IAGTP,GAAGmc,OAAS7c,QAAQiM,QAAQ,QAE5BvL,EAAG4uC,WACCU,IACIntC,MAAe,UACfotC,YAAe,kBACfjD,KAAe,KACfkD,KAAe,OAIvBxvC,EAAGmK,WAAa1H,EAAW2D,KAAK+D,WAChCnK,EAAGyuC,YAAchsC,EAAWiN,QAAQ++B,YAGpCzuC,EAAG8uC,cAAgBA,EACnB9uC,EAAGgvC,OAASA,EACZhvC,EAAGivC,eAAiBA,EACpBjvC,EAAG+b,2BAA6BA,EAChC/b,EAAGovC,iBAAmBA,EAGtB77B,IAyBJg7B,EAAkBlvC,SAAW,aAAc,aAAc,aAAc,WAAY,UAAW,SAAU,gBAAiB,OAzDzHC,QACKC,OAAO,eACPJ,WAAW,oBAAqBovC,MA8IzC,WAEI,YAOA,SAAS3vC,MALTU,QACKC,OAAO,qBACPX,OAAOA,MAShB,WAEI,YAOA,SAAS6wC,GAAqB/sC,EAAQuF,GAmBlC,QAASynC,KAEL1vC,EAAGub,QAAUvb,EAAGub,OAnBpB,GAAIvb,GAAKO,IAGTP,GAAGmc,OAAS7c,QAAQiM,QAAQ,QAC5BvL,EAAGub,QAAS,EACZvb,EAAG2vC,iBACC74B,iBAAiB,GAIrB9W,EAAG0vC,yBAA2BA,EAa9BhtC,EAAO0F,IAAI,sBAAuB,WAE9BpI,EAAGmc,OAAOlJ,YAAY,iDA0B9Bw8B,EAAqBpwC,SAAW,SAAU,YA1D1CC,QACKC,OAAO,kBACPJ,WAAW,uBAAwBswC,MAoC5C,WAEI,YA4CA,SAAS7wC,GAAOiJ,GACdA,EAAc+nC,aAAaroC,KAAK,kBAmBlC3I,EAAOS,SAAW,iBA3DlBC,QACKC,OAAO,QAEJ,cACA,+BAGA,SAGA,WAGA,iBAGA,cAGA,kBAGA,YAMA,gBACA,eACA,eACA,iBACA,eACA,cACA,mBACA,UACA,WACDX,OAAOA,MAOlB,WAEI,YAOA,SAASixC,GAAentC,EAAQD,EAAY5C,EAASiwC,EAASC,EAAWj0B,EAAqB/Y,GAG1FN,EAAWiN,QAAUogC,EACrBrtC,EAAW6B,UAAYyrC,EAGvBj0B,EAAoB5Z,SAAS,YAC3BC,MAAQ,SACRC,OAAQ,EACRC,KAAM,oBAGR,KAAI,GAAIgF,GAAE,EAAEA,EAAEyoC,EAAQ9e,OAAO1pB,OAAQD,IAAK,CACxC,GAAIhG,IACFoC,GAAIqsC,EAAQ9e,OAAO3pB,GAAG5D,GACtBpB,KAAMytC,EAAQ9e,OAAO3pB,GAAGhF,KACxBY,KAAM6sC,EAAQ9e,OAAO3pB,GAAGpE,KAGtB5B,GAAMgB,OACRhB,EAAMgB,KAAO,qBAGfyZ,EAAoB5Z,SAAS,YAAcb,EAAMoC,IAC/CtB,MAAQd,EAAM4B,KACdb,OAAQiF,EACRhF,KAAMhB,EAAMgB,KACZvD,MAAO,eACPwD,aAAejB,MAAOA,EAAOE,aAAa,EAAOD,MAAM,KAI3DmB,EAAW2R,OAAO,uBAAwB,WAExC,GAAG3R,EAAWutC,cAAgBvtC,EAAWutC,aAAaC,QAAS,CAC7D,GAAIC,IACF1W,QAAQ,EAGP/2B,GAAWutC,aAAa7tC,QACzB+tC,EAAqB/tC,MAAQM,EAAWutC,aAAa7tC,MACrD+tC,EAAqBC,MAAQ1tC,EAAWutC,aAAaG,OAGvDr0B,EAAoB5Z,SAAS,WAAYguC,GAEtCztC,EAAWutC,aAAaI,eACzBt0B,EAAoB5Z,SAAS,QAAUs3B,QAAQ,IAC/C1d,EAAoB5Z,SAAS,YAAcs3B,QAAQ,IACnD1d,EAAoB5Z,SAAS,aAAes3B,QAAQ,IACpD1d,EAAoB5Z,SAAS,cAAgBs3B,QAAQ,IACrD1d,EAAoB5Z,SAAS,OAASs3B,QAAQ,MAE9C1d,EAAoB5Z,SAAS,QAAUs3B,QAAQ,IAC/C1d,EAAoB5Z,SAAS,YAAcs3B,QAAQ,IACnD1d,EAAoB5Z,SAAS,aAAes3B,QAAQ,IACpD1d,EAAoB5Z,SAAS,cAAgBs3B,QAAQ,IACrD1d,EAAoB5Z,SAAS,OAASs3B,QAAQ,SAGhD1d,GAAoB5Z,SAAS,QAAUs3B,QAAQ,IAC/C1d,EAAoB5Z,SAAS,YAAcs3B,QAAQ,IACnD1d,EAAoB5Z,SAAS,aAAes3B,QAAQ,IACpD1d,EAAoB5Z,SAAS,cAAgBs3B,QAAQ,IACrD1d,EAAoB5Z,SAAS,OAASs3B,QAAQ,IAC9C1d,EAAoB5Z,SAAS,YAAcs3B,QAAQ,MAQvD/2B,EAAW2R,OAAO,kBAAmB,WAChCvU,EAAQ4I,eAAekB,OAAuC,MAA9BlH,EAAW6J,iBAE5CvJ,EAAI3B,SAASivC,QAAQzsC,OACnB,SAAUF,GAERjB,EAAW6J,gBAAkB5I,EAC1BA,EAAS4sC,gBAAkB,EAC5Bx0B,EAAoB5Z,SAAS,aAC3BiuC,OACE5gB,QAAS7rB,EAAS4sC,gBAClBvP,MAAS,SAIbjlB,EAAoB5Z,SAAS,aAC3BiuC,MAAQ,QAId,SAAUzsC,GACRU,QAAQC,IAAIX,OAMpBoY,EAAoB5Z,SAAS,OAC3BC,MAAQ,MACRC,OAAQ,EACRC,KAAM,8BAERyZ,EAAoBjD,SAAS,aAC3B1W,MAAQ,YACRC,OAAQ,EACRC,KAAM,aACL,qCAGHK,EAAO0F,IAAI,6BAA8B,SAAUtF,GAE1CA,EAAMytC,YAAYC,MAAQ9tC,EAAO8tC,KAElC/tC,EAAWyZ,WAAW,4BA9DlC2zB,EAAexwC,SAAW,SAAU,aAAc,UAAW,UAAW,YAAa,sBAAuB,OA5D5GC,QACKC,OAAO,QACPJ,WAAW,iBAAkB0wC,MA8HtC,WAEI,YAOA,SAAS9nC,GAASyP,EAAS7X,EAAe8X,GAYtC,GANA9X,EAAc+gC,WAMTjpB,EAAWL,UAAU,+BAAiCI,EAAQE,WACnE,CACI,GAAIyE,GAAS7c,QAAQiM,QAAQ,OAC7B4Q,GAAOgF,KAAK,aAAa,GAMxB3J,EAAQE,YAETpY,QAAQiM,QAAQ,QAAQ6F,SAAS,YAMrC,IAAI62B,GAAczwB,EAAQ+vB,eAC1B,IAAKU,EACL,CACI,GAAIwI,GAAYxI,EAAYQ,QAAU,IAAMR,EAAYS,QAAU,IAAMT,EAAYW,EACpFtpC,SAAQiM,QAAQ,QAAQ6F,SAASq/B,IAuBzC1oC,EAAS1I,SAAW,UAAW,gBAAiB,cA7DhDC,QACKC,OAAO,YACP0J,IAAIlB,MAwCb,WAEI,YAOA,SAASnJ,GAAO8xC,EAAeC,EAAcx6B,EAAwBy6B,EAA4BC,EAAoBC,EAAUhD,GAG3H4C,EAAc9xC,QACVmyC,UAAU,IAIdJ,EAAaK,cAAa,GAG1B76B,EAAuBvX,QACnB4X,kBAAkB,IAItBy6B,OAAOp5B,QAAQq5B,QAAU,IACzBD,OAAOp5B,QAAQs5B,cAAgB,kBAC/BF,OAAOp5B,QAAQu5B,mBAAoB,EACnCH,OAAOp5B,QAAQw5B,aAAc,EAG7BT,EAA2BU,WAEvBC,EAAW,QACXC,UAAW,mCAIfX,EAAmBY,UAAU,2BACzBC,YAAa,4BAEjBb,EAAmBhC,kBAAkB,MACrCgC,EAAmBc,yBAAyB,YAG5Cb,EAASc,UAAU,aACf,YAAa,SAAUC,GAiBnB,MAfAA,GAAUC,UACL,OAAQ,UAAW,YAAa,KAAM,KAAM,UAGjDD,EAAUpwB,SACNswB,SAAqB,WACrBD,QAAqB,aACrBE,aAAqB,WACrBC,cAAqB,YACrBC,oBAAqB,SACrBhyB,SAAqB,GACrBiyB,WAAqB,eACrBC,WAAqB,gBAGlBP,KAKff,EAASc,UAAU,WACf,YAAa,SAAUS,GASnB,MAPAA,GAAQlqB,KAAKmqB,UAAY,mBACzBD,EAAQE,QAAQD,UAAY,qBAC5BD,EAAQG,UAAUF,UAAY,wBAC9BD,EAAQI,GAAGH,UAAY,4BACvBD,EAAQK,GAAGJ,UAAY,2BACvBD,EAAQM,MAAML,UAAY,oBAEnBD,KAKfvE,EAAmBlvC,QACfovC,yBAAmC,EACnCE,iCAAmC,EACnCD,4BAAmC,IApB3CrvC,EAAOS,SAAW,gBAAiB,eAAgB,yBAA0B,6BAA8B,qBAAsB,WAAY,sBA9D7IC,QACKC,OAAO,YACPX,OAAOA,MAoFhB,WAEI,YAOA,SAASmJ,GAAStF,EAAYwF,EAAUC,EAAQrI,EAASsI,EAAWyqC,GAEhEA,EAAKC,OAGL,IAAIC,GAAwBrwC,EAAW2F,IAAI,oBAAqB,SAAUtF,EAAOuF,EAASC,EAAUC,EAAWC,GAE3G/F,EAAWuG,iBAAkB,IAK7B6X,EAA0Bpe,EAAW2F,IAAI,sBAAuB,WAGlEH,EAAS,WAELxF,EAAWuG,iBAAkB,IAK9BvG,EAAW2D,OAG8B,GAAtC3D,EAAW2D,KAAKwC,mBAClBnG,EAAWutC,cACTC,SAAS,EACTG,eAAe,GAGbvnC,SAASC,QAAQrG,EAAW2D,KAAK2C,8BACnCtG,EAAWutC,cACTC,SAAS,EACTG,eAAe,GAGjB3tC,EAAWutC,aAAaC,SAAU,EAClCxtC,EAAWutC,aAAaI,eAAgB,EACxC3tC,EAAWutC,aAAa7tC,MAAQ,sBAChCM,EAAWutC,aAAaG,MAAQ,QAkCxC1tC,GAAW3D,MAAQoJ,EAGnBzF,EAAW2F,IAAI,WAAY,WAEvB0qC,IACAjyB,MAtBR9Y,EAAS1I,SAAW,aAAc,WAAY,SAAU,UAAW,YAAa,QA/DhFC,QACKC,OAAO,QACP0J,IAAIlB,MAwFb,WAEI,YAOA,SAASgrC,GAAYl0C,EAAgBm0C,EAAoBC,GAErDA,EAAkBC,WAAU,GAE5BF,EAAmBG,UAAU,SAY7B,IAAIvzC,EAEJN,SAAQub,UAAU,cAAc6iB,QAC5B,WAAY,SAAUC,GAElB/9B,EAAW+9B,IAKnB,IAAIf,GAAch9B,EAASgE,IAAI,gBAAkB,qBAE7CwvC,GACAC,oBACIC,KAAY,4CACZxB,QAAY,uDACZ93B,WAAY,8DAEhBu5B,sBACID,KAAY,8CACZxB,QAAY,yDACZ93B,WAAY,gEAEhBw5B,aACIF,KAAY,qCACZxB,QAAY,GACZ93B,WAAY,IAEhBy5B,oBACIH,KAAY,6CACZxB,QAAY,wDACZ93B,WAAY,IAMpBnb,GACKC,MAAM,OACH40C,YAAU,EACV10C,OACIwI,SACItI,YAAak0C,EAAQxW,GAAa0W,KAClCn0C,WAAa,wBAEjBw0C,eACIz0C,YAAak0C,EAAQxW,GAAakV,QAClC3yC,WAAa,2BAEjBy0C,kBACI10C,YAAak0C,EAAQxW,GAAa5iB,WAClC7a,WAAa,8BAEjB00C,kBACI30C,YAAa,mCACbC,WAAa,+BAGrBqC,SACEsuC,SAAA,cAAS,SAAUpuC,GAEjB,MAAOA,GAAYF,QAAQ,aAE7BuuC,WAAA,cAAW,SAASruC,GAElB,MAAOA,GAAYF,QAAQ,0BAtB3CuxC,EAAY1zC,SAAW,iBAAkB,qBAAsB,qBAhE/DC,QACKC,OAAO,QACPX,OAAOm0C,MA4FhB,WAEI,YAOA,SAASe,GAAgBr0C,EAAagD,EAAYC,EAAQkwC,EAAMlzC,EAAWG,EAAS8C,EAAeuF,EAAQ+H,GAEzG,GAAIjQ,GAAKO,IAETP,GAAG+zC,SAAW9jC,EAAU,GAAG9N,MAG3BnC,EAAGU,OAASjB,EAAYiB,OAGxBgC,EAAOsxC,UAGPtxC,EAAO0F,IAAI,YAAa,SAAS+H,GAC5BtQ,EAAQ4I,eAAekB,OAExBjK,EAAUqE,KACRrE,EAAU0L,QACPE,OAAOhM,QAAQiM,QAAQC,SAASC,OAChCJ,qBAAoB,GACpBlJ,MAAM,4CACN8B,YAAY,4CACZyH,UAAU,QACVC,GAAG,OACH0E,YAAYF,MAKrBzN,EAAO0F,IAAI,WAAY,SAAS6N,EAAGg+B,MASnCvxC,EAAO0F,IAAI,cAAe,WAGxB,GAAGvI,EAAQ4I,eAAekB,MAAO,OACxB9J,GAAQ4I,eAAekB,YACvB9J,GAAQ4I,eAAerC,IAC9B,IAAIzC,GAAoBhB,EAAciB,IAAI,QAC1CD,GAAkB0I,YAClB5J,EAAW6J,gBAAkB,KAC7B7J,EAAW2D,KAAO,KAClB1G,EAAUY,OAEV2P,EAAU,GAAG9N,MAAQnC,EAAG+zC,SACxB7rC,EAAOgD,GAAG,2BAIdxI,EAAO0F,IAAI,UAAW,cAItB1F,EAAO0F,IAAI,YAAa,cAC1B0rC,EAAgBz0C,SAAW,cAAe,aAAc,SAAU,OAAQ,YAAa,UAAW,gBAAiB,SAAU,aAjE7HC,QACKC,OAAO,QACPJ,WAAW,kBAAmB20C,MAoEvC,WAEI,YAEAx0C,SACKC,OAAO,WAIhB,WAEI,YAOA,SAASX,GAAOs1C,EAAcC,GAG5BD,EAAaE,KAAK,KAClBF,EAAaG,QAAQ,IAyDvBz1C,EAAOS,SAAW,eAAgB,qBAlElCC,QACKC,OAAO,QACPX,OAAOA,MAahB,WAEE,YAOA,SAAS01C,GAAe7xC,EAAY6Q,EAAIzT,EAASsI,GAE/C,OACEosC,QAAS,SAAU31C,GAMjB,MAJAA,GAAO41C,QAAU51C,EAAO41C,YACpB30C,EAAQ4I,eAAekB,QACzB/K,EAAO41C,QAAQC,cAAgB,UAAY50C,EAAQ4I,eAAekB,OAE7D/K,GAET8E,SAAU,SAAUA,GAOlB,MALwB,OAApBA,EAASyD,QAEXgB,EAAU7E,KAAK,UAGVI,GAAY4P,EAAGwN,KAAKpd,IAE7BgxC,cAAe,SAAUhxC,GAIvB,MAHwB,OAApBA,EAASyD,QACXgB,EAAU7E,KAAK,UAEVgQ,EAAGiO,OAAO7d,KAsCvB4wC,EAAej1C,SAAW,aAAc,KAAM,UAAW,aAnEzDC,QACGC,OAAO,QACPijB,QAAQ,iBAAkB8xB,MAiC/B,WAEI,YAOA,SAASK,GAAWC,EAAWnyC,GAmK3B,GAAIM,KA2HJ,OAvHCN,GAAWqB,OAAS,+BAIrBf,EAAI8xC,SAAW,YAEf9xC,EAAI+xC,IAAMF,EAAUnyC,EAAWqB,OAAS,kBAAmB,MAAQF,KAAOmxC,OAAO,EAAMjtB,OAAQ,SAC/F/kB,EAAI+xC,IAAIxwC,UAAYswC,EAAU7xC,EAAI8xC,SAAW,YAAa,MAAQjxC,KAAOmxC,OAAO,EAAMjtB,OAAQ,SAC9F/kB,EAAIgyB,UACFroB,KAAMkoC,EAAUnyC,EAAWqB,OAAS,uBAAwB,MAAQF,KAAOmxC,OAAO,EAAOjtB,OAAQ,SACjGxjB,UAAWswC,EAAU7xC,EAAI8xC,SAAW,qBAAsB,MAAQjxC,KAAOmxC,OAAO,EAAMjtB,OAAQ,UAGhG/kB,EAAIiyC,aAAeJ,EAAUnyC,EAAWqB,OAAS,2BAA4B,MAAQF,KAAOmxC,OAAO,EAAMjtB,OAAQ,SACjH/kB,EAAIm3B,MACFjV,SAAU2vB,EAAUnyC,EAAWqB,OAAS,sBAG1Cf,EAAI1B,OACFu8B,KAAMgX,EAAUnyC,EAAWqB,OAAS,aAAc,MAAQgtB,OAASikB,OAAO,EAAMjtB,OAAQ,MAAOmtB,SAAS,KACxG/e,QAAW0e,EAAUnyC,EAAWqB,OAAS,kBAAmBL,GAAI,QAAUG,KAAOmxC,OAAO,EAAMjtB,OAAQ,UAGxG/kB,EAAIqD,MACFqD,MAAOmrC,EAAUnyC,EAAWqB,OAAS,YACnC4F,MACEoe,OAAQ,OACR0sB,SACEU,eAAgB,wCAItB5lC,KAAMslC,EAAUnyC,EAAWqB,OAAS,uBAClCjB,QAAUilB,OAAQ,SAEpB7c,qBAAsB2pC,EAAUnyC,EAAWqB,OAAS,uCAClDjB,QAAUilB,OAAQ,SAEpB+T,qBAAsB+Y,EAAUnyC,EAAWqB,OAAS,uCAClDjB,QAAUilB,OAAQ,SAEpBqtB,QAASP,EAAUnyC,EAAWqB,OAAS,wBACvCyJ,gBAAiBqnC,EAAUnyC,EAAWqB,OAAS,8BAC/C8I,eAAgBgoC,EAAUnyC,EAAWqB,OAAS,6BAC9CurC,gBAAiBuF,EAAUnyC,EAAWqB,OAAS,8BAA+BL,GAAI,QAClF2xC,oBAAqBR,EAAUnyC,EAAWqB,OAAS,mCAAoCL,GAAI,QAC3F4L,aACEuuB,KAAMgX,EAAUnyC,EAAWqB,OAAS,kBAAmB,MAAQgtB,OAASikB,OAAO,EAAMjtB,OAAQ,MAAOmtB,SAAS,KAC7GzlC,IAAKolC,EAAUnyC,EAAWqB,OAAS,mBACnCwL,KAAMslC,EAAUnyC,EAAWqB,OAAS,uBAAwBL,GAAI,QAC9DZ,QAAUilB,OAAQ,SAEpButB,SAAQT,EAAUnyC,EAAWqB,OAAS,uBAAwBL,GAAI,QAClEwL,UAAS2lC,EAAUnyC,EAAWqB,OAAS,qCAAsCL,GAAI,QAC/EZ,QAAUilB,OAAQ,UAGtByR,OAAQqb,EAAUnyC,EAAWqB,OAAS,0BAA2B,MAAQgtB,OAASikB,OAAO,EAAMjtB,OAAQ,MAAOmtB,SAAS,KACvHzwB,OAAQowB,EAAUnyC,EAAWqB,OAAS,kCACtC4G,0BAA2BkqC,EAAUnyC,EAAWqB,OAAS,4CAA6CL,GAAI,SAG5GV,EAAI3B,UACFw8B,KAAMgX,EAAUnyC,EAAWqB,OAAS,gBAAiB,MAAQgtB,OAASikB,OAAO,EAAMjtB,OAAQ,MAAOmtB,SAAS,KAC3GzlC,IAAKolC,EAAUnyC,EAAWqB,OAAS,iBACnCwL,KAAMslC,EAAUnyC,EAAWqB,OAAS,qBAAsBL,GAAI,QAC5DZ,QAAUilB,OAAQ,SAEpBtkB,QAASoxC,EAAUnyC,EAAWqB,OAAS,qBAAsBL,GAAI,QAC/DZ,QACEilB,OAAQ,QACR0sB,SACEU,eAAgB,kCAItBG,SAAQT,EAAUnyC,EAAWqB,OAAS,qBAAsBL,GAAI,QAChE4sC,QAASuE,EAAUnyC,EAAWqB,OAAS,yBACvC0uB,SACEoL,KAAMgX,EAAUnyC,EAAWqB,OAAS,wBAAyB,MAAQgtB,OAASikB,OAAO,EAAOjtB,OAAQ,MAAOmtB,SAAS,KACpH/e,QAAS0e,EAAUnyC,EAAWqB,OAAS,6BAA8BL,GAAI,QAAUqtB,OAASikB,OAAO,EAAOjtB,OAAQ,SAClHtY,IAAKolC,EAAUnyC,EAAWqB,OAAS,yBACnCwL,KAAMslC,EAAUnyC,EAAWqB,OAAS,6BAA8BL,GAAI,QACpEZ,QAAUilB,OAAQ,SAEpByK,QAASqiB,EAAUnyC,EAAWqB,OAAS,wEAA0EnC,KAAM,QAASC,MAAO,SAAUiL,OAAQ,cAI7J9J,EAAIuC,YACFoH,KAAMkoC,EAAUnyC,EAAWqB,OAAS,yBAA0B,MAAQF,KAAOmxC,OAAO,EAAMjtB,OAAQ,SAClG8V,KAAMgX,EAAUnyC,EAAWqB,OAAS,kBAAmB,MAAQgtB,OAASikB,OAAO,EAAOjtB,OAAQ,MAAOmtB,SAAS,KAC9GvwC,MAAOkwC,EAAUnyC,EAAWqB,OAAS,gCAAkCY,MAAO,WAAaosB,OAASikB,OAAO,EAAOjtB,OAAQ,MAAOmtB,SAAS,KAC1I3lC,KAAMslC,EAAUnyC,EAAWqB,OAAS,uBAAwBL,GAAI,QAC9DZ,QAAUilB,OAAQ,SAEpBsc,KACE50B,IAAKolC,EAAUnyC,EAAWqB,OAAS,0BACnC85B,KAAMgX,EAAUnyC,EAAWqB,OAAS,0BACpCwL,KAAMslC,EAAUnyC,EAAWqB,OAAS,8BAA+BL,GAAI,QACrEZ,QAAUilB,OAAQ,UAGtBwc,QACE90B,IAAKolC,EAAUnyC,EAAWqB,OAAS,0BACnC85B,KAAMgX,EAAUnyC,EAAWqB,OAAS,0BACpCwL,KAAMslC,EAAUnyC,EAAWqB,OAAS,8BAA+BL,GAAI,QACrEZ,QAAUilB,OAAQ,UAGtByc,WACE/0B,IAAKolC,EAAUnyC,EAAWqB,OAAS,6BACnC85B,KAAMgX,EAAUnyC,EAAWqB,OAAS,6BACpCwL,KAAMslC,EAAUnyC,EAAWqB,OAAS,iCAAkCL,GAAI,QACxEZ,QAAUilB,OAAQ,WAKjB/kB,EA/NX4xC,EAAWt1C,SAAW,YAAa,cApEnCC,QACKC,OAAO,QACPijB,QAAQ,MAAOmyB,MAsSxB,WAEI,YASA,SAAS/1C,GAAOsC,IA8DhBtC,EAAOS,SAAW,+BArElBC,QACKC,OAAO,UACJ,wBAEHX,OAAOA,MAehB,WAEE,YAOA,SAASA,GAAOC,EAAgBoC,EAAiCC,GAG/DrC,EAAeC,MAAM,WACnBC,IAAW,OACXC,OACEC,eACEC,YAAa,wBACbC,WAAa,wBAGjBqC,WAEApC,UAAW,WACX2C,cAAc,EACdC,wBAAwB,IAMxBd,EAA4BgB,SAAS,OACnCC,MAAQ,MACRC,OAAQ,EACRC,KAAM,4BACNvD,MAAO,YAwCbF,EAAOS,SAAW,iBAAkB,kCAAmC,+BAtEvEC,QACGC,OAAO,cACPX,OAAOA,MAmCZ,WAEI,YAcA,SAASA,GAAOsC,IA2DhBtC,EAAOS,SAAW,+BAvElBC,QACKC,OAAO,aACJ,uBACA,iCACA,gCACA,sBACA,sBACA,0BAEHX,OAAOA,MAShBU,QAAQC,OAAO,QAAQ0J,KAAK,iBAAkB,SAASqsC,GAAiBA,EAAep1C,IAAI,mCAAmC,gDAC9Ho1C,EAAep1C,IAAI,qCAAqC,wMACxDo1C,EAAep1C,IAAI,6CAA6C,kTAChEo1C,EAAep1C,IAAI,8CAA8C,klBACjEo1C,EAAep1C,IAAI,4CAA4C,yrBAC/Do1C,EAAep1C,IAAI,4CAA4C;AAC/Do1C,EAAep1C,IAAI,kCAAkC,wwXACrDo1C,EAAep1C,IAAI,oCAAoC,+KACvDo1C,EAAep1C,IAAI,0CAA0C,qrDAC7Do1C,EAAep1C,IAAI,wBAAwB,ivUAC3Co1C,EAAep1C,IAAI,uCAAuC;AAC1Do1C,EAAep1C,IAAI,gCAAgC,k4LACnDo1C,EAAep1C,IAAI,kCAAkC;AACrDo1C,EAAep1C,IAAI,mCAAmC,kyDACtDo1C,EAAep1C,IAAI,yCAAyC,6eAC5Do1C,EAAep1C,IAAI,uDAAuD,4bAC1Eo1C,EAAep1C,IAAI,+DAA+D,6GAClFo1C,EAAep1C,IAAI,6DAA6D,qUAChFo1C,EAAep1C,IAAI,kDAAkD,m1PACrEo1C,EAAep1C,IAAI,8CAA8C,8hDACjEo1C,EAAep1C,IAAI,iDAAiD,y6EACpEo1C,EAAep1C,IAAI,kDAAkD,isBACrEo1C,EAAep1C,IAAI,4CAA4C,olDAC/Do1C,EAAep1C,IAAI,0DAA0D,qoHAC7Eo1C,EAAep1C,IAAI,6CAA6C,g8CAChEo1C,EAAep1C,IAAI,sCAAsC,2hBACzDo1C,EAAep1C,IAAI,sCAAsC,isBACzDo1C,EAAep1C,IAAI,sDAAsD,sxDACzEo1C,EAAep1C,IAAI,kCAAkC,koFACrDo1C,EAAep1C,IAAI,oDAAoD,0sDACvEo1C,EAAep1C,IAAI,wDAAwD;AAC3Eo1C,EAAep1C,IAAI,yDAAyD,mjGAC5Eo1C,EAAep1C,IAAI,uDAAuD,s+GAC1Eo1C,EAAep1C,IAAI,8DAA8D,4tDACjFo1C,EAAep1C,IAAI,4DAA4D,shFAC/Eo1C,EAAep1C,IAAI,gEAAgE,4iMACnFo1C,EAAep1C,IAAI,0DAA0D,oxCAC7Eo1C,EAAep1C,IAAI,mEAAmE,6ZACtFo1C,EAAep1C,IAAI,qEAAqE,4cACxFo1C,EAAep1C,IAAI,mEAAmE,kkBACtFo1C,EAAep1C,IAAI,mEAAmE,whBACtFo1C,EAAep1C,IAAI,mEAAmE,2UACtFo1C,EAAep1C,IAAI,mEAAmE,mYACtFo1C,EAAep1C,IAAI,mEAAmE,oRACtFo1C,EAAep1C,IAAI,mEAAmE,s6BACtFo1C,EAAep1C,IAAI,mEAAmE,8iBACtFo1C,EAAep1C,IAAI,mEAAmE,62BACtFo1C,EAAep1C,IAAI,yEAAyE,ymEAC5Fo1C,EAAep1C,IAAI,mDAAmD;AACtEo1C,EAAep1C,IAAI,2DAA2D,80NAC9Eo1C,EAAep1C,IAAI,+CAA+C,koMAClEo1C,EAAep1C,IAAI,qDAAqD","file":"scripts/app-ca127ba875.js","sourcesContent":["(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.ui.theme-colors', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider)\r\n {\r\n $stateProvider.state('app.ui_theme-colors', {\r\n url : '/ui/theme-colors',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/ui/theme-colors/theme-colors.html',\r\n controller : 'ThemeColorsController as vm'\r\n }\r\n },\r\n bodyClass: 'theme-colors'\r\n });\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.ui.theme-colors')\r\n .controller('CustomThemeDialogController', CustomThemeDialogController);\r\n\r\n /** @ngInject */\r\n function CustomThemeDialogController(fuseTheming, $mdDialog, fuseGenerator, $cookies, $window)\r\n {\r\n // Data\r\n var vm = this;\r\n vm.palettes = fuseTheming.getRegisteredPalettes();\r\n vm.themes = fuseTheming.getRegisteredThemes();\r\n\r\n // Delete Unnecessary hue value\r\n delete vm.palettes.grey['1000'];\r\n\r\n // Methods\r\n vm.rgba = fuseGenerator.rgba;\r\n vm.setTheme = setTheme;\r\n vm.closeDialog = closeDialog;\r\n\r\n //////////\r\n\r\n // If custom theme exist keep using it otherwise set default as a custom\r\n if ( !vm.themes.custom )\r\n {\r\n vm.theme = angular.copy(vm.themes['default'].colors);\r\n }\r\n else\r\n {\r\n vm.theme = vm.themes.custom.colors;\r\n }\r\n\r\n /**\r\n * Put custom theme into the cookies\r\n * and reload for generate styles\r\n */\r\n function setTheme()\r\n {\r\n $cookies.putObject('customTheme', vm.theme);\r\n $cookies.put('selectedTheme', 'custom');\r\n $window.location.reload();\r\n }\r\n\r\n /**\r\n * Close dialog\r\n */\r\n function closeDialog()\r\n {\r\n $mdDialog.hide();\r\n }\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.research', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.research', {\r\n url : '/research',\r\n params: {\r\n screener: null,\r\n sport: null,\r\n home: true,\r\n newScreener: false\r\n },\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/research/research.html',\r\n controller : 'ResearchController as vm'\r\n }\r\n },\r\n resolve: {\r\n ResearchData: function (apiResolver)\r\n {\r\n return apiResolver.resolve('research.data@get', { page: 1, limit: 10});\r\n },\r\n ScreenerData: function (apiResolver)\r\n {\r\n return apiResolver.resolve('screener.list@query');\r\n },\r\n ConstantsData: function (apiResolver)\r\n {\r\n return apiResolver.resolve('research.constants@get');\r\n }\r\n },\r\n bodyClass: 'research',\r\n authenticate: true,\r\n inactiveUserAccessible: false\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/main/research');\r\n\r\n // Navigation\r\n msNavigationServiceProvider.saveItem('home', {\r\n title : 'Home',\r\n weight: 1,\r\n icon: 'icon-home',\r\n state: 'app.research',\r\n stateParams: { home: true }\r\n });\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.research')\r\n .controller('ScreenerDialogController', ScreenerDialogController);\r\n\r\n /** @ngInject */\r\n function ScreenerDialogController($mdDialog, $mdToast, $rootScope, $scope, $cacheFactory, researchSettings, update, event, api)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.title = 'Save Screener';\r\n vm.researchSettings = researchSettings;\r\n vm.screenerForm = {};\r\n\r\n vm.screenerForm.name = researchSettings.name;\r\n vm.screenerForm.description = researchSettings.description;\r\n\r\n $scope.constants = $rootScope.constants;\r\n\r\n // Methods\r\n vm.saveScreener = saveScreener;\r\n vm.closeDialog = closeDialog;\r\n\r\n function saveScreener()\r\n {\r\n vm.researchSettings.name = vm.screenerForm.name;\r\n vm.researchSettings.description = vm.screenerForm.description;\r\n\r\n if(update) {\r\n\r\n var partialScreener = [\r\n { op: \"replace\", path: \"Name\", value: vm.screenerForm.name },\r\n { op: \"replace\", path: \"Description\", value: vm.screenerForm.description }\r\n ]\r\n\r\n api.screener.partial.update({ id: vm.researchSettings.id }, partialScreener,\r\n function (response) {\r\n var $httpDefaultCache = $cacheFactory.get('$http');\r\n $httpDefaultCache.remove($rootScope.apiURL + 'api/screeners');\r\n\r\n $mdDialog.hide(response);\r\n\r\n $mdToast.show(\r\n $mdToast.simple()\r\n .textContent('Screener Saved!')\r\n .position('top right')\r\n .hideDelay(3000)\r\n );\r\n\r\n },\r\n function (response) {\r\n console.log(response);\r\n $mdToast.show(\r\n $mdToast.simple()\r\n .textContent($rootScope.constants.errors.default)\r\n .position('top right')\r\n .hideDelay(3000)\r\n );\r\n }\r\n );\r\n }\r\n\r\n closeDialog();\r\n }\r\n\r\n function closeDialog()\r\n {\r\n $mdDialog.hide();\r\n }\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.papertrade', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.papertrade', {\r\n url : '/papertrade',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/papertrade/papertrades.html',\r\n controller : 'PapertradeController as vm'\r\n }\r\n },\r\n resolve: {\r\n PaperTradeData: function (apiResolver)\r\n {\r\n return apiResolver.resolve('papertrade.data@get');\r\n },\r\n PaperTradesList: function (apiResolver)\r\n {\r\n return apiResolver.resolve('papertrade.range@get', { range: 'all', page: 1, limit: 10});\r\n },\r\n ConstantsData: function (apiResolver)\r\n {\r\n return apiResolver.resolve('research.constants@get');\r\n }\r\n },\r\n bodyClass: 'papertrade',\r\n authenticate: true,\r\n inactiveUserAccessible: false\r\n });\r\n\r\n // Translation\r\n //$translatePartialLoaderProvider.addPart('app/pages/auth/profile');\r\n msNavigationServiceProvider.saveItem('papertrade', {\r\n title : 'Paper Trades',\r\n weight: 4,\r\n icon: 'icon-coin',\r\n state: 'app.papertrade',\r\n stateOpts: {\r\n reload: true\r\n }\r\n });\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.papertrade')\r\n .controller('PaperTradeDialogController', PaperTradeDialogController);\r\n\r\n /** @ngInject */\r\n function PaperTradeDialogController($rootScope, $scope, $mdDialog, $mdToast, $analytics, $cacheFactory, betTypes, spreadTeams, spreadWagerTypes, totalsWagerTypes, moneylineWagerTypes, marketGroupings, tradingBehaviors, wlUtil, event, api, papertrade, constants)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.title = 'Paper Trade';\r\n vm.match = papertrade.match;\r\n vm.constants = constants;\r\n\r\n vm.betTypes = [];\r\n //console.log(betTypes);\r\n\r\n for(var i=0;i');\r\n iElement.append(loadMoreEl);\r\n\r\n // Grab the scrollable element and store it in the controller for general use\r\n var scrollEl = angular.element('#content');\r\n MsTimelineCtrl.setScrollEl(scrollEl);\r\n\r\n // Threshold\r\n var threshold = 144;\r\n\r\n // Register onScroll event for the first time\r\n registerOnScroll();\r\n\r\n /**\r\n * onScroll Event\r\n */\r\n function onScroll()\r\n {\r\n if ( scrollEl.scrollTop() + scrollEl.height() + threshold > loadMoreEl.position().top )\r\n {\r\n // Show the loader\r\n loadMoreEl.addClass('show');\r\n\r\n // Unregister scroll event to prevent triggering the function over and over again\r\n unregisterOnScroll();\r\n\r\n // Trigger load more event\r\n scope.loadMore().then(\r\n // Success\r\n function ()\r\n {\r\n // Hide the loader\r\n loadMoreEl.removeClass('show');\r\n\r\n // Register the onScroll event again\r\n registerOnScroll();\r\n },\r\n\r\n // Error\r\n function ()\r\n {\r\n // Remove the loader completely\r\n loadMoreEl.remove();\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * onScroll event registerer\r\n */\r\n function registerOnScroll()\r\n {\r\n scrollEl.on('scroll', onScroll);\r\n }\r\n\r\n /**\r\n * onScroll event unregisterer\r\n */\r\n function unregisterOnScroll()\r\n {\r\n scrollEl.off('scroll', onScroll);\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n unregisterOnScroll();\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msTimelineItemDirective($timeout, $q)\r\n {\r\n return {\r\n scope : true,\r\n require: '^msTimeline',\r\n compile: function (tElement)\r\n {\r\n tElement.addClass('ms-timeline-item').addClass('hidden');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsTimelineCtrl)\r\n {\r\n var threshold = 72,\r\n itemLoaded = false,\r\n itemInViewport = false,\r\n scrollEl = MsTimelineCtrl.getScrollEl();\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Check if the timeline item has ms-card\r\n if ( iElement.find('ms-card') )\r\n {\r\n // If the ms-card template loaded...\r\n scope.$on('msCard::cardTemplateLoaded', function (event, args)\r\n {\r\n var cardEl = angular.element(args[0]);\r\n\r\n // Test the card to see if there is any image on it\r\n testForImage(cardEl).then(function ()\r\n {\r\n $timeout(function ()\r\n {\r\n itemLoaded = true;\r\n });\r\n });\r\n });\r\n }\r\n else\r\n {\r\n // Test the element to see if there is any image on it\r\n testForImage(iElement).then(function ()\r\n {\r\n $timeout(function ()\r\n {\r\n itemLoaded = true;\r\n });\r\n });\r\n }\r\n\r\n // Check if the loaded element also in the viewport\r\n scrollEl.on('scroll', testForVisibility);\r\n\r\n // Test for visibility for the first time without waiting for the scroll event\r\n testForVisibility();\r\n }\r\n\r\n // Item ready watcher\r\n var itemReadyWatcher = scope.$watch(\r\n function ()\r\n {\r\n return itemLoaded && itemInViewport;\r\n },\r\n function (current, old)\r\n {\r\n if ( angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n if ( current )\r\n {\r\n iElement.removeClass('hidden').addClass('animate');\r\n\r\n // Unbind itemReadyWatcher\r\n itemReadyWatcher();\r\n }\r\n }, true);\r\n\r\n /**\r\n * Test the given element for image\r\n *\r\n * @param element\r\n * @returns promise\r\n */\r\n function testForImage(element)\r\n {\r\n var deferred = $q.defer(),\r\n imgEl = element.find('img');\r\n\r\n if ( imgEl.length > 0 )\r\n {\r\n imgEl.on('load', function ()\r\n {\r\n deferred.resolve('Image is loaded');\r\n });\r\n }\r\n else\r\n {\r\n deferred.resolve('No images');\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Test the element for visibility\r\n */\r\n function testForVisibility()\r\n {\r\n if ( scrollEl.scrollTop() + scrollEl.height() > iElement.position().top + threshold )\r\n {\r\n $timeout(function ()\r\n {\r\n itemInViewport = true;\r\n });\r\n\r\n // Unbind the scroll event\r\n scrollEl.off('scroll', testForVisibility);\r\n }\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('match', matchDirective)\r\n .directive('marketvalue', marketvalueDirective);\r\n\r\n /** @ngInject */\r\n function matchDirective()\r\n {\r\n return {\r\n restrict : \"A\",\r\n require: 'ngModel',\r\n link: function(scope, elm, attrs, ctrl) {\r\n ctrl.$validators.match = function(modelValue) {\r\n if(modelValue === undefined) {\r\n modelValue = \"\";\r\n }\r\n return attrs.match === modelValue;\r\n };\r\n\r\n\r\n }\r\n };\r\n }\r\n\r\n function marketvalueDirective()\r\n {\r\n return {\r\n restrict : \"A\",\r\n require: 'ngModel',\r\n link: function(scope, elm, attrs, ctrl) {\r\n ctrl.$validators.marketvalue = function(modelValue) {\r\n if (attrs.oddsFormat == 0)\r\n {\r\n if (modelValue >= 0 && attrs.team == 0) {\r\n return false;\r\n }\r\n else if (modelValue <= 0 && attrs.team == 1) {\r\n return false;\r\n }\r\n else {\r\n return true;\r\n };\r\n }\r\n else\r\n {\r\n if (modelValue <= 0) {\r\n return false;\r\n }\r\n else {\r\n return true;\r\n };\r\n };\r\n };\r\n\r\n\r\n }\r\n };\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msSplashScreen', msSplashScreenDirective);\r\n\r\n /** @ngInject */\r\n function msSplashScreenDirective($animate)\r\n {\r\n return {\r\n restrict: 'E',\r\n link : function (scope, iElement)\r\n {\r\n var splashScreenRemoveEvent = scope.$on('msSplashScreen::remove', function ()\r\n {\r\n $animate.leave(iElement).then(function ()\r\n {\r\n // De-register scope event\r\n splashScreenRemoveEvent();\r\n\r\n // Null-ify everything else\r\n scope = iElement = null;\r\n });\r\n });\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msSidenavHelper', msSidenavHelperDirective);\r\n\r\n /** @ngInject */\r\n function msSidenavHelperDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^mdSidenav',\r\n link : function (scope, iElement, iAttrs, MdSidenavCtrl)\r\n {\r\n // Watch md-sidenav open & locked open statuses\r\n // and add class to the \".page-layout\" if only\r\n // the sidenav open and NOT locked open\r\n scope.$watch(function ()\r\n {\r\n return MdSidenavCtrl.isOpen() && !MdSidenavCtrl.isLockedOpen();\r\n }, function (current)\r\n {\r\n if ( angular.isUndefined(current) )\r\n {\r\n return;\r\n }\r\n\r\n iElement.parent().toggleClass('full-height', current);\r\n angular.element('html').toggleClass('sidenav-open', current);\r\n });\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msSearchBar', msSearchBarDirective);\r\n\r\n /** @ngInject */\r\n function msSearchBarDirective($document)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : true,\r\n templateUrl: 'app/core/directives/ms-search-bar/ms-search-bar.html',\r\n compile : function (tElement)\r\n {\r\n // Add class\r\n tElement.addClass('ms-search-bar');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n var expanderEl,\r\n collapserEl;\r\n\r\n // Initialize\r\n init();\r\n\r\n function init()\r\n {\r\n expanderEl = iElement.find('#ms-search-bar-expander');\r\n collapserEl = iElement.find('#ms-search-bar-collapser');\r\n\r\n expanderEl.on('click', expand);\r\n collapserEl.on('click', collapse);\r\n }\r\n\r\n /**\r\n * Expand\r\n */\r\n function expand()\r\n {\r\n iElement.addClass('expanded');\r\n\r\n // Esc key event\r\n $document.on('keyup', escKeyEvent);\r\n }\r\n\r\n /**\r\n * Collapse\r\n */\r\n function collapse()\r\n {\r\n iElement.removeClass('expanded');\r\n }\r\n\r\n /**\r\n * Escape key event\r\n *\r\n * @param e\r\n */\r\n function escKeyEvent(e)\r\n {\r\n if ( e.keyCode === 27 )\r\n {\r\n collapse();\r\n $document.off('keyup', escKeyEvent);\r\n }\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('msScrollConfig', msScrollConfigProvider)\r\n .directive('msScroll', msScrollDirective);\r\n\r\n /** @ngInject */\r\n function msScrollConfigProvider()\r\n {\r\n // Default configuration\r\n var defaultConfiguration = {\r\n wheelSpeed : 1,\r\n wheelPropagation : false,\r\n swipePropagation : true,\r\n minScrollbarLength : null,\r\n maxScrollbarLength : null,\r\n useBothWheelAxes : false,\r\n useKeyboard : true,\r\n suppressScrollX : false,\r\n suppressScrollY : false,\r\n scrollXMarginOffset : 0,\r\n scrollYMarginOffset : 0,\r\n stopPropagationOnClick: true\r\n };\r\n\r\n // Methods\r\n this.config = config;\r\n\r\n //////////\r\n\r\n /**\r\n * Extend default configuration with the given one\r\n *\r\n * @param configuration\r\n */\r\n function config(configuration)\r\n {\r\n defaultConfiguration = angular.extend({}, defaultConfiguration, configuration);\r\n }\r\n\r\n /**\r\n * Service\r\n */\r\n this.$get = function ()\r\n {\r\n var service = {\r\n getConfig: getConfig\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Return the config\r\n */\r\n function getConfig()\r\n {\r\n return defaultConfiguration;\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msScrollDirective($timeout, msScrollConfig, msUtils, fuseConfig)\r\n {\r\n return {\r\n restrict: 'AE',\r\n compile : function (tElement)\r\n {\r\n // Do not replace scrollbars if\r\n // 'disableCustomScrollbars' config enabled\r\n if ( fuseConfig.getConfig('disableCustomScrollbars') )\r\n {\r\n return;\r\n }\r\n\r\n // Do not replace scrollbars on mobile devices\r\n // if 'disableCustomScrollbarsOnMobile' config enabled\r\n if ( fuseConfig.getConfig('disableCustomScrollbarsOnMobile') && msUtils.isMobile() )\r\n {\r\n return;\r\n }\r\n\r\n // Add class\r\n tElement.addClass('ms-scroll');\r\n\r\n return function postLink(scope, iElement, iAttrs)\r\n {\r\n var options = {};\r\n\r\n // If options supplied, evaluate the given\r\n // value. This is because we don't want to\r\n // have an isolated scope but still be able\r\n // to use scope variables.\r\n // We don't want an isolated scope because\r\n // we should be able to use this everywhere\r\n // especially with other directives\r\n if ( iAttrs.msScroll )\r\n {\r\n options = scope.$eval(iAttrs.msScroll);\r\n }\r\n\r\n // Extend the given config with the ones from provider\r\n options = angular.extend({}, msScrollConfig.getConfig(), options);\r\n\r\n // Initialize the scrollbar\r\n $timeout(function ()\r\n {\r\n PerfectScrollbar.initialize(iElement[0], options);\r\n }, 0);\r\n\r\n // Update the scrollbar on element mouseenter\r\n iElement.on('mouseenter', updateScrollbar);\r\n\r\n // Watch scrollHeight and update\r\n // the scrollbar if it changes\r\n scope.$watch(function ()\r\n {\r\n return iElement.prop('scrollHeight');\r\n }, function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n updateScrollbar();\r\n });\r\n\r\n // Watch scrollWidth and update\r\n // the scrollbar if it changes\r\n scope.$watch(function ()\r\n {\r\n return iElement.prop('scrollWidth');\r\n }, function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n updateScrollbar();\r\n });\r\n\r\n /**\r\n * Update the scrollbar\r\n */\r\n function updateScrollbar()\r\n {\r\n PerfectScrollbar.update(iElement[0]);\r\n }\r\n\r\n // Cleanup on destroy\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.off('mouseenter');\r\n PerfectScrollbar.destroy(iElement[0]);\r\n });\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msResponsiveTable', msResponsiveTableDirective);\r\n\r\n /** @ngInject */\r\n function msResponsiveTableDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n link : function (scope, iElement)\r\n {\r\n // Wrap the table\r\n var wrapper = angular.element('
');\r\n iElement.after(wrapper);\r\n wrapper.append(iElement);\r\n\r\n //////////\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msRandomClass', msRandomClassDirective);\r\n\r\n /** @ngInject */\r\n function msRandomClassDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n scope : {\r\n msRandomClass: '='\r\n },\r\n link : function (scope, iElement)\r\n {\r\n var randomClass = scope.msRandomClass[Math.floor(Math.random() * (scope.msRandomClass.length))];\r\n iElement.addClass(randomClass);\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('msNavigationService', msNavigationServiceProvider)\r\n .controller('MsNavigationController', MsNavigationController)\r\n // Vertical\r\n .directive('msNavigation', msNavigationDirective)\r\n .controller('MsNavigationNodeController', MsNavigationNodeController)\r\n .directive('msNavigationNode', msNavigationNodeDirective)\r\n .directive('msNavigationItem', msNavigationItemDirective)\r\n //Horizontal\r\n .directive('msNavigationHorizontal', msNavigationHorizontalDirective)\r\n .controller('MsNavigationHorizontalNodeController', MsNavigationHorizontalNodeController)\r\n .directive('msNavigationHorizontalNode', msNavigationHorizontalNodeDirective)\r\n .directive('msNavigationHorizontalItem', msNavigationHorizontalItemDirective);\r\n\r\n /** @ngInject */\r\n function msNavigationServiceProvider()\r\n {\r\n // Inject $log service\r\n var $log = angular.injector(['ng']).get('$log');\r\n\r\n // Navigation array\r\n var navigation = [];\r\n\r\n var service = this;\r\n\r\n // Methods\r\n service.saveItem = saveItem;\r\n service.saveLink = saveLink;\r\n service.deleteItem = deleteItem;\r\n service.sortByWeight = sortByWeight;\r\n\r\n //////////\r\n\r\n function saveLink(path, item, link) {\r\n var parts = path.split('.');\r\n\r\n var id = parts[parts.length - 1];\r\n\r\n // Get the parent item from the parts\r\n var parent = _findOrCreateParent(parts);\r\n\r\n // Decide if we are going to update or create\r\n var updateItem = false;\r\n\r\n for ( var i = 0; i < parent.length; i++ )\r\n {\r\n if ( parent[i]._id === id )\r\n {\r\n updateItem = parent[i];\r\n\r\n break;\r\n }\r\n }\r\n\r\n // Update\r\n if ( updateItem )\r\n {\r\n angular.extend(updateItem, item);\r\n\r\n // Add proper href\r\n updateItem.href = link;\r\n }\r\n // Create\r\n else\r\n {\r\n // Create an empty children array in the item\r\n item.children = [];\r\n\r\n // Add the default weight if not provided or if it's not a number\r\n if ( angular.isUndefined(item.weight) || !angular.isNumber(item.weight) )\r\n {\r\n item.weight = 1;\r\n }\r\n\r\n // Add the item id\r\n item._id = id;\r\n\r\n // Add the item path\r\n item._path = path;\r\n\r\n // Add proper ui-sref\r\n item.href = link;\r\n\r\n // Push the item into the array\r\n parent.push(item);\r\n }\r\n }\r\n\r\n /**\r\n * Create or update the navigation item\r\n *\r\n * @param path\r\n * @param item\r\n */\r\n function saveItem(path, item)\r\n {\r\n if ( !angular.isString(path) )\r\n {\r\n $log.error('path must be a string (eg. `dashboard.project`)');\r\n return;\r\n }\r\n\r\n var parts = path.split('.');\r\n\r\n // Generate the object id from the parts\r\n var id = parts[parts.length - 1];\r\n\r\n // Get the parent item from the parts\r\n var parent = _findOrCreateParent(parts);\r\n\r\n // Decide if we are going to update or create\r\n var updateItem = false;\r\n\r\n for ( var i = 0; i < parent.length; i++ )\r\n {\r\n if ( parent[i]._id === id )\r\n {\r\n updateItem = parent[i];\r\n\r\n break;\r\n }\r\n }\r\n\r\n // Update\r\n if ( updateItem )\r\n {\r\n angular.extend(updateItem, item);\r\n\r\n // Add proper ui-sref\r\n updateItem.uisref = _getUiSref(updateItem);\r\n\r\n updateItem.uisrefopts = _getUiSrefOpts(updateItem);\r\n }\r\n // Create\r\n else\r\n {\r\n // Create an empty children array in the item\r\n item.children = [];\r\n\r\n // Add the default weight if not provided or if it's not a number\r\n if ( angular.isUndefined(item.weight) || !angular.isNumber(item.weight) )\r\n {\r\n item.weight = 1;\r\n }\r\n\r\n // Add the item id\r\n item._id = id;\r\n\r\n // Add the item path\r\n item._path = path;\r\n\r\n // Add proper ui-sref\r\n item.uisref = _getUiSref(item);\r\n\r\n item.uisrefopts = _getUiSrefOpts(item);\r\n\r\n // Push the item into the array\r\n parent.push(item);\r\n }\r\n }\r\n\r\n /**\r\n * Delete navigation item\r\n *\r\n * @param path\r\n */\r\n function deleteItem(path)\r\n {\r\n if ( !angular.isString(path) )\r\n {\r\n $log.error('path must be a string (eg. `dashboard.project`)');\r\n return;\r\n }\r\n\r\n // Locate the item by using given path\r\n var item = navigation,\r\n parts = path.split('.');\r\n\r\n for ( var p = 0; p < parts.length; p++ )\r\n {\r\n var id = parts[p];\r\n\r\n for ( var i = 0; i < item.length; i++ )\r\n {\r\n if ( item[i]._id === id )\r\n {\r\n // If we have a matching path,\r\n // we have found our object:\r\n // remove it.\r\n if ( item[i]._path === path )\r\n {\r\n item.splice(i, 1);\r\n return true;\r\n }\r\n\r\n // Otherwise grab the children of\r\n // the current item and continue\r\n item = item[i].children;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Sort the navigation items by their weights\r\n *\r\n * @param parent\r\n */\r\n function sortByWeight(parent)\r\n {\r\n // If parent not provided, sort the root items\r\n if ( !parent )\r\n {\r\n parent = navigation;\r\n parent.sort(_byWeight);\r\n }\r\n\r\n // Sort the children\r\n for ( var i = 0; i < parent.length; i++ )\r\n {\r\n var children = parent[i].children;\r\n\r\n if ( children.length > 1 )\r\n {\r\n children.sort(_byWeight);\r\n }\r\n\r\n if ( children.length > 0 )\r\n {\r\n sortByWeight(children);\r\n }\r\n }\r\n }\r\n\r\n /* ----------------- */\r\n /* Private Functions */\r\n /* ----------------- */\r\n\r\n /**\r\n * Find or create parent\r\n *\r\n * @param parts\r\n * @returns {Array|Boolean}\r\n * @private\r\n */\r\n function _findOrCreateParent(parts)\r\n {\r\n // Store the main navigation\r\n var parent = navigation;\r\n\r\n // If it's going to be a root item\r\n // return the navigation itself\r\n if ( parts.length === 1 )\r\n {\r\n return parent;\r\n }\r\n\r\n // Remove the last element from the parts as\r\n // we don't need that to figure out the parent\r\n parts.pop();\r\n\r\n // Find and return the parent\r\n for ( var i = 0; i < parts.length; i++ )\r\n {\r\n var _id = parts[i],\r\n createParent = true;\r\n\r\n for ( var p = 0; p < parent.length; p++ )\r\n {\r\n if ( parent[p]._id === _id )\r\n {\r\n parent = parent[p].children;\r\n createParent = false;\r\n\r\n break;\r\n }\r\n }\r\n\r\n // If there is no parent found, create one, push\r\n // it into the current parent and assign it as a\r\n // new parent\r\n if ( createParent )\r\n {\r\n var item = {\r\n _id : _id,\r\n _path : parts.join('.'),\r\n title : _id,\r\n weight : 1,\r\n children: []\r\n };\r\n\r\n parent.push(item);\r\n parent = item.children;\r\n }\r\n }\r\n\r\n return parent;\r\n }\r\n\r\n /**\r\n * Sort by weight\r\n *\r\n * @param x\r\n * @param y\r\n * @returns {number}\r\n * @private\r\n */\r\n function _byWeight(x, y)\r\n {\r\n return parseInt(x.weight) - parseInt(y.weight);\r\n }\r\n\r\n /**\r\n * Setup the ui-sref using state & state parameters\r\n *\r\n * @param item\r\n * @returns {string}\r\n * @private\r\n */\r\n function _getUiSref(item)\r\n {\r\n var uisref = '';\r\n\r\n if ( angular.isDefined(item.state) )\r\n {\r\n uisref = item.state;\r\n\r\n if ( angular.isDefined(item.stateParams) && angular.isObject(item.stateParams) )\r\n {\r\n uisref = uisref + '(' + JSON.stringify(item.stateParams) + ')';\r\n }\r\n }\r\n //console.log(uisref);\r\n return uisref;\r\n }\r\n\r\n function _getUiSrefOpts(item)\r\n {\r\n var uisrefopts = '';\r\n\r\n if ( angular.isDefined(item.state) )\r\n {\r\n uisrefopts = item.state;\r\n\r\n if ( angular.isDefined(item.stateOpts) && angular.isObject(item.stateOpts) )\r\n {\r\n uisrefopts = JSON.stringify(item.stateOpts);\r\n }\r\n }\r\n\r\n return uisrefopts;\r\n }\r\n\r\n /* ----------------- */\r\n /* Service */\r\n /* ----------------- */\r\n\r\n this.$get = function ()\r\n {\r\n var activeItem = null,\r\n navigationScope = null,\r\n folded = null,\r\n foldedOpen = null;\r\n\r\n var service = {\r\n saveItem : saveItem,\r\n saveLink : saveLink,\r\n deleteItem : deleteItem,\r\n sort : sortByWeight,\r\n setActiveItem : setActiveItem,\r\n getActiveItem : getActiveItem,\r\n getNavigationObject: getNavigationObject,\r\n setNavigationScope : setNavigationScope,\r\n setFolded : setFolded,\r\n getFolded : getFolded,\r\n setFoldedOpen : setFoldedOpen,\r\n getFoldedOpen : getFoldedOpen,\r\n toggleFolded : toggleFolded\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Set active item\r\n *\r\n * @param node\r\n * @param scope\r\n */\r\n function setActiveItem(node, scope)\r\n {\r\n activeItem = {\r\n node : node,\r\n scope: scope\r\n };\r\n }\r\n\r\n /**\r\n * Return active item\r\n */\r\n function getActiveItem()\r\n {\r\n return activeItem;\r\n }\r\n\r\n /**\r\n * Return navigation object\r\n *\r\n * @param root\r\n * @returns {Array}\r\n */\r\n function getNavigationObject(root)\r\n {\r\n if ( root )\r\n {\r\n for ( var i = 0; i < navigation.length; i++ )\r\n {\r\n if ( navigation[i]._id === root )\r\n {\r\n return [navigation[i]];\r\n }\r\n }\r\n }\r\n\r\n return navigation;\r\n }\r\n\r\n /**\r\n * Store navigation's scope for later use\r\n *\r\n * @param scope\r\n */\r\n function setNavigationScope(scope)\r\n {\r\n navigationScope = scope;\r\n }\r\n\r\n /**\r\n * Set folded status\r\n *\r\n * @param status\r\n */\r\n function setFolded(status)\r\n {\r\n folded = status;\r\n }\r\n\r\n /**\r\n * Return folded status\r\n *\r\n * @returns {*}\r\n */\r\n function getFolded()\r\n {\r\n return folded;\r\n }\r\n\r\n /**\r\n * Set folded open status\r\n *\r\n * @param status\r\n */\r\n function setFoldedOpen(status)\r\n {\r\n foldedOpen = status;\r\n }\r\n\r\n /**\r\n * Return folded open status\r\n *\r\n * @returns {*}\r\n */\r\n function getFoldedOpen()\r\n {\r\n return foldedOpen;\r\n }\r\n\r\n\r\n /**\r\n * Toggle fold on stored navigation's scope\r\n */\r\n function toggleFolded()\r\n {\r\n navigationScope.toggleFolded();\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function MsNavigationController($scope, msNavigationService)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n if ( $scope.root )\r\n {\r\n vm.navigation = msNavigationService.getNavigationObject($scope.root);\r\n }\r\n else\r\n {\r\n vm.navigation = msNavigationService.getNavigationObject();\r\n }\r\n\r\n // Methods\r\n vm.toggleHorizontalMobileMenu = toggleHorizontalMobileMenu;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Sort the navigation before doing anything else\r\n msNavigationService.sort();\r\n }\r\n\r\n /**\r\n * Toggle horizontal mobile menu\r\n */\r\n function toggleHorizontalMobileMenu()\r\n {\r\n angular.element('body').toggleClass('ms-navigation-horizontal-mobile-menu-active');\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationDirective($rootScope, $timeout, $mdSidenav, msNavigationService)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {\r\n folded: '=',\r\n root : '@'\r\n },\r\n controller : 'MsNavigationController as vm',\r\n templateUrl: 'app/core/directives/ms-navigation/templates/vertical.html',\r\n transclude : true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n var bodyEl = angular.element('body'),\r\n foldExpanderEl = angular.element('
'),\r\n foldCollapserEl = angular.element('
'),\r\n sidenav = $mdSidenav('navigation');\r\n\r\n // Store the navigation in the service for public access\r\n msNavigationService.setNavigationScope(scope);\r\n\r\n // Initialize\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Set the folded status for the first time.\r\n // First, we have to check if we have a folded\r\n // status available in the service already. This\r\n // will prevent navigation to act weird if we already\r\n // set the fold status, remove the navigation and\r\n // then re-initialize it, which happens if we\r\n // change to a view without a navigation and then\r\n // come back with history.back() function.\r\n\r\n // If the service didn't initialize before, set\r\n // the folded status from scope, otherwise we\r\n // won't touch anything because the folded status\r\n // already set in the service...\r\n if ( msNavigationService.getFolded() === null )\r\n {\r\n msNavigationService.setFolded(scope.folded);\r\n }\r\n\r\n if ( msNavigationService.getFolded() )\r\n {\r\n // Collapse everything.\r\n // This must be inside a $timeout because by the\r\n // time we call this, the 'msNavigation::collapse'\r\n // event listener is not registered yet. $timeout\r\n // will ensure that it will be called after it is\r\n // registered.\r\n $timeout(function ()\r\n {\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n });\r\n\r\n // Add class to the body\r\n bodyEl.addClass('ms-navigation-folded');\r\n\r\n // Set fold expander\r\n setFoldExpander();\r\n }\r\n }\r\n\r\n // Sidenav locked open status watcher\r\n scope.$watch(function ()\r\n {\r\n return sidenav.isLockedOpen();\r\n }, function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n var folded = msNavigationService.getFolded();\r\n\r\n if ( folded )\r\n {\r\n if ( current )\r\n {\r\n // Collapse everything\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n }\r\n else\r\n {\r\n // Expand the active one and its parents\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activeItem.scope.$emit('msNavigation::stateMatched');\r\n }\r\n }\r\n }\r\n });\r\n\r\n // Folded status watcher\r\n scope.$watch('folded', function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n setFolded(current);\r\n });\r\n\r\n /**\r\n * Set folded status\r\n *\r\n * @param folded\r\n */\r\n function setFolded(folded)\r\n {\r\n // Store folded status on the service for global access\r\n msNavigationService.setFolded(folded);\r\n\r\n if ( folded )\r\n {\r\n // Collapse everything\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n\r\n // Add class to the body\r\n bodyEl.addClass('ms-navigation-folded');\r\n\r\n // Set fold expander\r\n setFoldExpander();\r\n }\r\n else\r\n {\r\n // Expand the active one and its parents\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activeItem.scope.$emit('msNavigation::stateMatched');\r\n }\r\n\r\n // Remove body class\r\n bodyEl.removeClass('ms-navigation-folded ms-navigation-folded-open');\r\n\r\n // Remove fold collapser\r\n removeFoldCollapser();\r\n }\r\n }\r\n\r\n /**\r\n * Set fold expander\r\n */\r\n function setFoldExpander()\r\n {\r\n iElement.parent().append(foldExpanderEl);\r\n\r\n // Let everything settle for a moment\r\n // before registering the event listener\r\n $timeout(function ()\r\n {\r\n foldExpanderEl.on('mouseenter touchstart', onFoldExpanderHover);\r\n });\r\n }\r\n\r\n /**\r\n * Set fold collapser\r\n */\r\n function setFoldCollapser()\r\n {\r\n bodyEl.find('#main').append(foldCollapserEl);\r\n foldCollapserEl.on('mouseenter touchstart', onFoldCollapserHover);\r\n }\r\n\r\n /**\r\n * Remove fold collapser\r\n */\r\n function removeFoldCollapser()\r\n {\r\n foldCollapserEl.remove();\r\n }\r\n\r\n /**\r\n * onHover event of foldExpander\r\n */\r\n function onFoldExpanderHover(event)\r\n {\r\n if ( event )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n // Set folded open status\r\n msNavigationService.setFoldedOpen(true);\r\n\r\n // Expand the active one and its parents\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activeItem.scope.$emit('msNavigation::stateMatched');\r\n }\r\n\r\n // Add class to the body\r\n bodyEl.addClass('ms-navigation-folded-open');\r\n\r\n // Remove the fold opener\r\n foldExpanderEl.remove();\r\n\r\n // Set fold collapser\r\n setFoldCollapser();\r\n }\r\n\r\n /**\r\n * onHover event of foldCollapser\r\n */\r\n function onFoldCollapserHover(event)\r\n {\r\n if ( event )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n // Set folded open status\r\n msNavigationService.setFoldedOpen(false);\r\n\r\n // Collapse everything\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n\r\n // Remove body class\r\n bodyEl.removeClass('ms-navigation-folded-open');\r\n\r\n // Remove the fold collapser\r\n foldCollapserEl.remove();\r\n\r\n // Set fold expander\r\n setFoldExpander();\r\n }\r\n\r\n /**\r\n * Public access for toggling folded status externally\r\n */\r\n scope.toggleFolded = function ()\r\n {\r\n var folded = msNavigationService.getFolded();\r\n\r\n setFolded(!folded);\r\n };\r\n\r\n /**\r\n * On $stateChangeStart\r\n */\r\n scope.$on('$stateChangeStart', function ()\r\n {\r\n // Close the sidenav\r\n sidenav.close();\r\n\r\n // If navigation is folded open, close it\r\n if ( msNavigationService.getFolded() )\r\n {\r\n onFoldCollapserHover();\r\n }\r\n });\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n foldCollapserEl.off('mouseenter touchstart');\r\n foldExpanderEl.off('mouseenter touchstart');\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function MsNavigationNodeController($scope, $element, $rootScope, $animate, $state, $mdSidenav, msNavigationService)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.bodyEl = angular.element('body');\r\n vm.element = $element;\r\n vm.node = $scope.node;\r\n vm.hasChildren = undefined;\r\n vm.collapsed = undefined;\r\n vm.collapsable = undefined;\r\n vm.group = undefined;\r\n vm.animateHeightClass = 'animate-height';\r\n\r\n // Methods\r\n vm.toggleCollapsed = toggleCollapsed;\r\n vm.collapse = collapse;\r\n vm.expand = expand;\r\n vm.getClass = getClass;\r\n\r\n // console.log(vm.node)\r\n\r\n // force the sidenav closed. bug in fuse for mobile\r\n vm.hideVerticalMobileMenu = function() {\r\n $mdSidenav('navigation').toggle();\r\n };\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Setup the initial values\r\n\r\n // Has children?\r\n vm.hasChildren = vm.node.children.length > 0;\r\n\r\n // Is group?\r\n vm.group = !!(angular.isDefined(vm.node.group) && vm.node.group === true);\r\n\r\n // Is collapsable?\r\n if ( !vm.hasChildren || vm.group )\r\n {\r\n vm.collapsable = false;\r\n }\r\n else\r\n {\r\n vm.collapsable = !!(angular.isUndefined(vm.node.collapsable) || typeof vm.node.collapsable !== 'boolean' || vm.node.collapsable === true);\r\n }\r\n\r\n // Is collapsed?\r\n if ( !vm.collapsable )\r\n {\r\n vm.collapsed = false;\r\n }\r\n else\r\n {\r\n vm.collapsed = !!(angular.isUndefined(vm.node.collapsed) || typeof vm.node.collapsed !== 'boolean' || vm.node.collapsed === true);\r\n }\r\n\r\n // Expand all parents if we have a matching state or\r\n // the current state is a child of the node's state\r\n if ( vm.node.state === $state.current.name || $state.includes(vm.node.state) )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n $scope.$emit('msNavigation::stateMatched');\r\n\r\n // Also store the current active menu item\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n }\r\n\r\n $scope.$on('msNavigation::stateMatched', function ()\r\n {\r\n // Expand if the current scope is collapsable and is collapsed\r\n if ( vm.collapsable && vm.collapsed )\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.collapsed = false;\r\n });\r\n }\r\n });\r\n\r\n // Listen for collapse event\r\n $scope.$on('msNavigation::collapse', function (event, path)\r\n {\r\n if ( vm.collapsed || !vm.collapsable )\r\n {\r\n return;\r\n }\r\n\r\n // If there is no path defined, collapse\r\n if ( angular.isUndefined(path) )\r\n {\r\n vm.collapse();\r\n }\r\n // If there is a path defined, do not collapse\r\n // the items that are inside that path. This will\r\n // prevent parent items from collapsing\r\n else\r\n {\r\n var givenPathParts = path.split('.'),\r\n activePathParts = [];\r\n\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activePathParts = activeItem.node._path.split('.');\r\n }\r\n\r\n // Test for given path\r\n if ( givenPathParts.indexOf(vm.node._id) > -1 )\r\n {\r\n return;\r\n }\r\n\r\n // Test for active path\r\n if ( activePathParts.indexOf(vm.node._id) > -1 )\r\n {\r\n return;\r\n }\r\n\r\n vm.collapse();\r\n }\r\n });\r\n\r\n // Listen for $stateChangeSuccess event\r\n $scope.$on('$stateChangeSuccess', function ()\r\n {\r\n if ( vm.node.state === $state.current.name )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n // Update active item on state change\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n\r\n // Collapse everything except the one we're using\r\n $rootScope.$broadcast('msNavigation::collapse', vm.node._path);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Toggle collapsed\r\n */\r\n function toggleCollapsed()\r\n {\r\n if ( vm.collapsed )\r\n {\r\n vm.expand();\r\n }\r\n else\r\n {\r\n vm.collapse();\r\n }\r\n }\r\n\r\n /**\r\n * Collapse\r\n */\r\n function collapse()\r\n {\r\n // Grab the element that we are going to collapse\r\n var collapseEl = vm.element.children('ul');\r\n\r\n // Grab the height\r\n var height = collapseEl[0].offsetHeight;\r\n\r\n $scope.$evalAsync(function ()\r\n {\r\n // Set collapsed status\r\n vm.collapsed = true;\r\n\r\n // Add collapsing class to the node\r\n vm.element.addClass('collapsing');\r\n\r\n // Animate the height\r\n $animate.animate(collapseEl,\r\n {\r\n 'display': 'block',\r\n 'height' : height + 'px'\r\n },\r\n {\r\n 'height': '0px'\r\n },\r\n vm.animateHeightClass\r\n ).then(\r\n function ()\r\n {\r\n // Clear the inline styles after animation done\r\n collapseEl.css({\r\n 'display': '',\r\n 'height' : ''\r\n });\r\n\r\n // Clear collapsing class from the node\r\n vm.element.removeClass('collapsing');\r\n }\r\n );\r\n\r\n // Broadcast the collapse event so child items can also be collapsed\r\n $scope.$broadcast('msNavigation::collapse');\r\n });\r\n }\r\n\r\n /**\r\n * Expand\r\n */\r\n function expand()\r\n {\r\n // Grab the element that we are going to expand\r\n var expandEl = vm.element.children('ul');\r\n\r\n // Move the element out of the dom flow and\r\n // make it block so we can get its height\r\n expandEl.css({\r\n 'position' : 'absolute',\r\n 'visibility': 'hidden',\r\n 'display' : 'block',\r\n 'height' : 'auto'\r\n });\r\n\r\n // Grab the height\r\n var height = expandEl[0].offsetHeight + 1;\r\n\r\n // Reset the style modifications\r\n expandEl.css({\r\n 'position' : '',\r\n 'visibility': '',\r\n 'display' : '',\r\n 'height' : '',\r\n //'overflow-y': 'scroll'\r\n });\r\n\r\n $scope.$evalAsync(function ()\r\n {\r\n // Set collapsed status\r\n vm.collapsed = false;\r\n\r\n // Add expanding class to the node\r\n vm.element.addClass('expanding');\r\n\r\n // Animate the height\r\n $animate.animate(expandEl,\r\n {\r\n 'display': 'block',\r\n 'height' : '0px'\r\n },\r\n {\r\n 'height': height + 'px'\r\n },\r\n vm.animateHeightClass\r\n ).then(\r\n function ()\r\n {\r\n // Clear the inline styles after animation done\r\n expandEl.css({\r\n 'height': ''\r\n });\r\n\r\n // Clear expanding class from the node\r\n vm.element.removeClass('expanding');\r\n }\r\n );\r\n\r\n // If item expanded, broadcast the collapse event from rootScope so that the other expanded items\r\n // can be collapsed. This is necessary for keeping only one parent expanded at any time\r\n $rootScope.$broadcast('msNavigation::collapse', vm.node._path);\r\n });\r\n }\r\n\r\n /**\r\n * Return the class\r\n *\r\n * @returns {*}\r\n */\r\n function getClass()\r\n {\r\n return vm.node.class;\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationNodeDirective()\r\n {\r\n return {\r\n restrict : 'A',\r\n bindToController: {\r\n node: '=msNavigationNode'\r\n },\r\n controller : 'MsNavigationNodeController as vm',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-node');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationNodeCtrl)\r\n {\r\n // Add custom classes\r\n iElement.addClass(MsNavigationNodeCtrl.getClass());\r\n\r\n // Add group class if it's a group\r\n if ( MsNavigationNodeCtrl.group )\r\n {\r\n iElement.addClass('group');\r\n }\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationItemDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^msNavigationNode',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-item');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationNodeCtrl)\r\n {\r\n // If the item is collapsable...\r\n if ( MsNavigationNodeCtrl.collapsable )\r\n {\r\n iElement.on('click', MsNavigationNodeCtrl.toggleCollapsed);\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.off('click');\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationHorizontalDirective(msNavigationService)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {\r\n root: '@'\r\n },\r\n controller : 'MsNavigationController as vm',\r\n templateUrl: 'app/core/directives/ms-navigation/templates/horizontal.html',\r\n transclude : true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-horizontal');\r\n\r\n return function postLink(scope)\r\n {\r\n // Store the navigation in the service for public access\r\n msNavigationService.setNavigationScope(scope);\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function MsNavigationHorizontalNodeController($scope, $element, $rootScope, $state, msNavigationService)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.element = $element;\r\n vm.node = $scope.node;\r\n vm.hasChildren = undefined;\r\n vm.group = undefined;\r\n\r\n // Methods\r\n vm.getClass = getClass;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Setup the initial values\r\n\r\n // Is active\r\n vm.isActive = false;\r\n\r\n // Has children?\r\n vm.hasChildren = vm.node.children.length > 0;\r\n\r\n // Is group?\r\n vm.group = !!(angular.isDefined(vm.node.group) && vm.node.group === true);\r\n\r\n // Mark all parents as active if we have a matching state\r\n // or the current state is a child of the node's state\r\n if ( vm.node.state === $state.current.name || $state.includes(vm.node.state) )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n $scope.$emit('msNavigation::stateMatched');\r\n\r\n // Also store the current active menu item\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n }\r\n\r\n $scope.$on('msNavigation::stateMatched', function ()\r\n {\r\n // Mark as active if has children\r\n if ( vm.hasChildren )\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.isActive = true;\r\n });\r\n }\r\n });\r\n\r\n // Listen for clearActive event\r\n $scope.$on('msNavigation::clearActive', function ()\r\n {\r\n if ( !vm.hasChildren )\r\n {\r\n return;\r\n }\r\n\r\n var activePathParts = [];\r\n\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activePathParts = activeItem.node._path.split('.');\r\n }\r\n\r\n // Test for active path\r\n if ( activePathParts.indexOf(vm.node._id) > -1 )\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.isActive = true;\r\n });\r\n }\r\n else\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.isActive = false;\r\n });\r\n }\r\n\r\n });\r\n\r\n // Listen for $stateChangeSuccess event\r\n $scope.$on('$stateChangeSuccess', function ()\r\n {\r\n if ( vm.node.state === $state.current.name )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n // Update active item on state change\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n\r\n // Clear all active states everything except the one we're using\r\n $rootScope.$broadcast('msNavigation::clearActive');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Return the class\r\n *\r\n * @returns {*}\r\n */\r\n function getClass()\r\n {\r\n return vm.node.class;\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationHorizontalNodeDirective()\r\n {\r\n return {\r\n restrict : 'A',\r\n bindToController: {\r\n node: '=msNavigationHorizontalNode'\r\n },\r\n controller : 'MsNavigationHorizontalNodeController as vm',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-horizontal-node');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationHorizontalNodeCtrl)\r\n {\r\n // Add custom classes\r\n iElement.addClass(MsNavigationHorizontalNodeCtrl.getClass());\r\n\r\n // Add group class if it's a group\r\n if ( MsNavigationHorizontalNodeCtrl.group )\r\n {\r\n iElement.addClass('group');\r\n }\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationHorizontalItemDirective($mdMedia)\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^msNavigationHorizontalNode',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-horizontal-item');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationHorizontalNodeCtrl)\r\n {\r\n iElement.on('click', onClick);\r\n\r\n function onClick()\r\n {\r\n if ( !MsNavigationHorizontalNodeCtrl.hasChildren || $mdMedia('gt-md') )\r\n {\r\n return;\r\n }\r\n\r\n iElement.toggleClass('expanded');\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.off('click');\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('msNavFoldService', msNavFoldService)\r\n .directive('msNavIsFolded', msNavIsFoldedDirective)\r\n .controller('MsNavController', MsNavController)\r\n .directive('msNav', msNavDirective)\r\n .directive('msNavTitle', msNavTitleDirective)\r\n .directive('msNavButton', msNavButtonDirective)\r\n .directive('msNavToggle', msNavToggleDirective);\r\n\r\n /** @ngInject */\r\n function msNavFoldService()\r\n {\r\n var foldable = {};\r\n\r\n var service = {\r\n setFoldable : setFoldable,\r\n isNavFoldedOpen: isNavFoldedOpen,\r\n toggleFold : toggleFold,\r\n openFolded : openFolded,\r\n closeFolded : closeFolded\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Set the foldable\r\n *\r\n * @param scope\r\n * @param element\r\n */\r\n function setFoldable(scope, element)\r\n {\r\n foldable = {\r\n 'scope' : scope,\r\n 'element': element\r\n };\r\n }\r\n\r\n /**\r\n * Is folded open\r\n */\r\n function isNavFoldedOpen()\r\n {\r\n return foldable.scope.isNavFoldedOpen();\r\n }\r\n\r\n /**\r\n * Toggle fold\r\n */\r\n function toggleFold()\r\n {\r\n foldable.scope.toggleFold();\r\n }\r\n\r\n /**\r\n * Open folded navigation\r\n */\r\n function openFolded()\r\n {\r\n foldable.scope.openFolded();\r\n }\r\n\r\n /**\r\n * Close folded navigation\r\n */\r\n function closeFolded()\r\n {\r\n foldable.scope.closeFolded();\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavIsFoldedDirective($document, $rootScope, msNavFoldService)\r\n {\r\n return {\r\n restrict: 'A',\r\n link : function (scope, iElement, iAttrs)\r\n {\r\n var isFolded = (iAttrs.msNavIsFolded === 'true'),\r\n isFoldedOpen = false,\r\n body = angular.element($document[0].body),\r\n openOverlay = angular.element('
'),\r\n closeOverlay = angular.element('
'),\r\n sidenavEl = iElement.parent();\r\n\r\n // Initialize the service\r\n msNavFoldService.setFoldable(scope, iElement, isFolded);\r\n\r\n // Set the fold status for the first time\r\n if ( isFolded )\r\n {\r\n fold();\r\n }\r\n else\r\n {\r\n unfold();\r\n }\r\n\r\n /**\r\n * Is nav folded open\r\n */\r\n function isNavFoldedOpen()\r\n {\r\n return isFoldedOpen;\r\n }\r\n\r\n /**\r\n * Toggle fold\r\n */\r\n function toggleFold()\r\n {\r\n isFolded = !isFolded;\r\n\r\n if ( isFolded )\r\n {\r\n fold();\r\n }\r\n else\r\n {\r\n unfold();\r\n }\r\n }\r\n\r\n /**\r\n * Fold the navigation\r\n */\r\n function fold()\r\n {\r\n // Add classes\r\n body.addClass('ms-nav-folded');\r\n\r\n // Collapse everything and scroll to the top\r\n $rootScope.$broadcast('msNav::forceCollapse');\r\n iElement.scrollTop(0);\r\n\r\n // Append the openOverlay to the element\r\n sidenavEl.append(openOverlay);\r\n\r\n // Event listeners\r\n openOverlay.on('mouseenter touchstart', function (event)\r\n {\r\n openFolded(event);\r\n isFoldedOpen = true;\r\n });\r\n }\r\n\r\n /**\r\n * Open folded navigation\r\n */\r\n function openFolded(event)\r\n {\r\n if ( angular.isDefined(event) )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n body.addClass('ms-nav-folded-open');\r\n\r\n // Update the location\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n // Remove open overlay\r\n sidenavEl.find(openOverlay).remove();\r\n\r\n // Append close overlay and bind its events\r\n sidenavEl.parent().append(closeOverlay);\r\n closeOverlay.on('mouseenter touchstart', function (event)\r\n {\r\n closeFolded(event);\r\n isFoldedOpen = false;\r\n });\r\n }\r\n\r\n /**\r\n * Close folded navigation\r\n */\r\n function closeFolded(event)\r\n {\r\n if ( angular.isDefined(event) )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n // Collapse everything and scroll to the top\r\n $rootScope.$broadcast('msNav::forceCollapse');\r\n iElement.scrollTop(0);\r\n\r\n body.removeClass('ms-nav-folded-open');\r\n\r\n // Remove close overlay\r\n sidenavEl.parent().find(closeOverlay).remove();\r\n\r\n // Append open overlay and bind its events\r\n sidenavEl.append(openOverlay);\r\n openOverlay.on('mouseenter touchstart', function (event)\r\n {\r\n openFolded(event);\r\n isFoldedOpen = true;\r\n });\r\n }\r\n\r\n /**\r\n * Unfold the navigation\r\n */\r\n function unfold()\r\n {\r\n body.removeClass('ms-nav-folded ms-nav-folded-open');\r\n\r\n // Update the location\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n iElement.off('mouseenter mouseleave');\r\n }\r\n\r\n // Expose functions to the scope\r\n scope.toggleFold = toggleFold;\r\n scope.openFolded = openFolded;\r\n scope.closeFolded = closeFolded;\r\n scope.isNavFoldedOpen = isNavFoldedOpen;\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n openOverlay.off('mouseenter touchstart');\r\n closeOverlay.off('mouseenter touchstart');\r\n iElement.off('mouseenter mouseleave');\r\n });\r\n }\r\n };\r\n }\r\n\r\n\r\n /** @ngInject */\r\n function MsNavController()\r\n {\r\n var vm = this,\r\n disabled = false,\r\n toggleItems = [],\r\n lockedItems = [];\r\n\r\n // Data\r\n\r\n // Methods\r\n vm.isDisabled = isDisabled;\r\n vm.enable = enable;\r\n vm.disable = disable;\r\n vm.setToggleItem = setToggleItem;\r\n vm.getLockedItems = getLockedItems;\r\n vm.setLockedItem = setLockedItem;\r\n vm.clearLockedItems = clearLockedItems;\r\n\r\n //////////\r\n\r\n /**\r\n * Is navigation disabled\r\n *\r\n * @returns {boolean}\r\n */\r\n function isDisabled()\r\n {\r\n return disabled;\r\n }\r\n\r\n /**\r\n * Disable the navigation\r\n */\r\n function disable()\r\n {\r\n disabled = true;\r\n }\r\n\r\n /**\r\n * Enable the navigation\r\n */\r\n function enable()\r\n {\r\n disabled = false;\r\n }\r\n\r\n /**\r\n * Set toggle item\r\n *\r\n * @param element\r\n * @param scope\r\n */\r\n function setToggleItem(element, scope)\r\n {\r\n toggleItems.push({\r\n 'element': element,\r\n 'scope' : scope\r\n });\r\n }\r\n\r\n /**\r\n * Get locked items\r\n *\r\n * @returns {Array}\r\n */\r\n function getLockedItems()\r\n {\r\n return lockedItems;\r\n }\r\n\r\n /**\r\n * Set locked item\r\n *\r\n * @param element\r\n * @param scope\r\n */\r\n function setLockedItem(element, scope)\r\n {\r\n lockedItems.push({\r\n 'element': element,\r\n 'scope' : scope\r\n });\r\n }\r\n\r\n /**\r\n * Clear locked items list\r\n */\r\n function clearLockedItems()\r\n {\r\n lockedItems = [];\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavDirective($rootScope, $mdComponentRegistry, msNavFoldService)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {},\r\n controller: 'MsNavController',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-nav');\r\n\r\n return function postLink(scope)\r\n {\r\n // Update toggle status according to the ui-router current state\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n // Update toggles on state changes\r\n var stateChangeSuccessEvent = $rootScope.$on('$stateChangeSuccess', function ()\r\n {\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n // Close navigation sidenav on stateChangeSuccess\r\n $mdComponentRegistry.when('navigation').then(function (navigation)\r\n {\r\n navigation.close();\r\n\r\n if ( msNavFoldService.isNavFoldedOpen() )\r\n {\r\n msNavFoldService.closeFolded();\r\n }\r\n });\r\n });\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n stateChangeSuccessEvent();\r\n })\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavTitleDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-nav-title');\r\n\r\n return function postLink()\r\n {\r\n\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavButtonDirective()\r\n {\r\n return {\r\n restrict: 'AE',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-nav-button');\r\n\r\n return function postLink()\r\n {\r\n\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavToggleDirective($rootScope, $q, $animate, $state)\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^msNav',\r\n scope : true,\r\n compile : function (tElement, tAttrs)\r\n {\r\n tElement.addClass('ms-nav-toggle');\r\n\r\n // Add collapsed attr\r\n if ( angular.isUndefined(tAttrs.collapsed) )\r\n {\r\n tAttrs.collapsed = true;\r\n }\r\n\r\n tElement.attr('collapsed', tAttrs.collapsed);\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavCtrl)\r\n {\r\n var classes = {\r\n expanded : 'expanded',\r\n expandAnimation : 'expand-animation',\r\n collapseAnimation: 'collapse-animation'\r\n };\r\n\r\n // Store all related states\r\n var links = iElement.find('a');\r\n var states = [];\r\n var regExp = /\\(.*\\)/g;\r\n\r\n angular.forEach(links, function (link)\r\n {\r\n var state = angular.element(link).attr('ui-sref');\r\n\r\n if ( angular.isUndefined(state) )\r\n {\r\n return;\r\n }\r\n\r\n // Remove any parameter definition from the state name before storing it\r\n state = state.replace(regExp, '');\r\n\r\n states.push(state);\r\n });\r\n\r\n // Store toggle-able element and its scope in the main nav controller\r\n MsNavCtrl.setToggleItem(iElement, scope);\r\n\r\n // Click handler\r\n iElement.children('.ms-nav-button').on('click', toggle);\r\n\r\n // Toggle function\r\n function toggle()\r\n {\r\n // If navigation is disabled, do nothing...\r\n if ( MsNavCtrl.isDisabled() )\r\n {\r\n return;\r\n }\r\n\r\n // Disable the entire navigation to prevent spamming\r\n MsNavCtrl.disable();\r\n\r\n if ( isCollapsed() )\r\n {\r\n // Clear the locked items list\r\n MsNavCtrl.clearLockedItems();\r\n\r\n // Emit pushToLockedList event\r\n scope.$emit('msNav::pushToLockedList');\r\n\r\n // Collapse everything but locked items\r\n $rootScope.$broadcast('msNav::collapse');\r\n\r\n // Expand and then...\r\n expand().then(function ()\r\n {\r\n // Enable the entire navigation after animations completed\r\n MsNavCtrl.enable();\r\n });\r\n }\r\n else\r\n {\r\n // Collapse with all children\r\n scope.$broadcast('msNav::forceCollapse');\r\n }\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.children('.ms-nav-button').off('click');\r\n });\r\n\r\n /*---------------------*/\r\n /* Scope Events */\r\n /*---------------------*/\r\n\r\n /**\r\n * Collapse everything but locked items\r\n */\r\n scope.$on('msNav::collapse', function ()\r\n {\r\n // Only collapse toggles that are not locked\r\n var lockedItems = MsNavCtrl.getLockedItems();\r\n var locked = false;\r\n\r\n angular.forEach(lockedItems, function (lockedItem)\r\n {\r\n if ( angular.equals(lockedItem.scope, scope) )\r\n {\r\n locked = true;\r\n }\r\n });\r\n\r\n if ( locked )\r\n {\r\n return;\r\n }\r\n\r\n // Collapse and then...\r\n collapse().then(function ()\r\n {\r\n // Enable the entire navigation after animations completed\r\n MsNavCtrl.enable();\r\n });\r\n });\r\n\r\n /**\r\n * Collapse everything\r\n */\r\n scope.$on('msNav::forceCollapse', function ()\r\n {\r\n // Collapse and then...\r\n collapse().then(function ()\r\n {\r\n // Enable the entire navigation after animations completed\r\n MsNavCtrl.enable();\r\n });\r\n });\r\n\r\n /**\r\n * Expand toggles that match with the current states\r\n */\r\n scope.$on('msNav::expandMatchingToggles', function ()\r\n {\r\n var currentState = $state.current.name;\r\n var shouldExpand = false;\r\n\r\n angular.forEach(states, function (state)\r\n {\r\n if ( currentState === state )\r\n {\r\n shouldExpand = true;\r\n }\r\n });\r\n\r\n if ( shouldExpand )\r\n {\r\n expand();\r\n }\r\n else\r\n {\r\n collapse();\r\n }\r\n });\r\n\r\n /**\r\n * Add toggle to the locked list\r\n */\r\n scope.$on('msNav::pushToLockedList', function ()\r\n {\r\n // Set expanded item on main nav controller\r\n MsNavCtrl.setLockedItem(iElement, scope);\r\n });\r\n\r\n /*---------------------*/\r\n /* Internal functions */\r\n /*---------------------*/\r\n\r\n /**\r\n * Is element collapsed\r\n *\r\n * @returns {bool}\r\n */\r\n function isCollapsed()\r\n {\r\n return iElement.attr('collapsed') === 'true';\r\n }\r\n\r\n /**\r\n * Is element expanded\r\n *\r\n * @returns {bool}\r\n */\r\n function isExpanded()\r\n {\r\n return !isCollapsed();\r\n }\r\n\r\n /**\r\n * Expand the toggle\r\n *\r\n * @returns $promise\r\n */\r\n function expand()\r\n {\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // If the menu item is already expanded, do nothing..\r\n if ( isExpanded() )\r\n {\r\n // Reject the deferred object\r\n deferred.reject({'error': true});\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n // Set element attr\r\n iElement.attr('collapsed', false);\r\n\r\n // Grab the element to expand\r\n var elementToExpand = angular.element(iElement.find('ms-nav-toggle-items')[0]);\r\n\r\n // Move the element out of the dom flow and\r\n // make it block so we can get its height\r\n elementToExpand.css({\r\n 'position' : 'absolute',\r\n 'visibility': 'hidden',\r\n 'display' : 'block',\r\n 'height' : 'auto'\r\n });\r\n\r\n // Grab the height\r\n var height = elementToExpand[0].offsetHeight;\r\n\r\n // Reset the style modifications\r\n elementToExpand.css({\r\n 'position' : '',\r\n 'visibility': '',\r\n 'display' : '',\r\n 'height' : ''\r\n });\r\n\r\n // Animate the height\r\n scope.$evalAsync(function ()\r\n {\r\n $animate.animate(elementToExpand,\r\n {\r\n 'display': 'block',\r\n 'height' : '0px'\r\n },\r\n {\r\n 'height': height + 'px'\r\n },\r\n classes.expandAnimation\r\n ).then(\r\n function ()\r\n {\r\n // Add expanded class\r\n elementToExpand.addClass(classes.expanded);\r\n\r\n // Clear the inline styles after animation done\r\n elementToExpand.css({'height': ''});\r\n\r\n // Resolve the deferred object\r\n deferred.resolve({'success': true});\r\n }\r\n );\r\n });\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Collapse the toggle\r\n *\r\n * @returns $promise\r\n */\r\n function collapse()\r\n {\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // If the menu item is already collapsed, do nothing..\r\n if ( isCollapsed() )\r\n {\r\n // Reject the deferred object\r\n deferred.reject({'error': true});\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n // Set element attr\r\n iElement.attr('collapsed', true);\r\n\r\n // Grab the element to collapse\r\n var elementToCollapse = angular.element(iElement.find('ms-nav-toggle-items')[0]);\r\n\r\n // Grab the height\r\n var height = elementToCollapse[0].offsetHeight;\r\n\r\n // Animate the height\r\n scope.$evalAsync(function ()\r\n {\r\n $animate.animate(elementToCollapse,\r\n {\r\n 'height': height + 'px'\r\n },\r\n {\r\n 'height': '0px'\r\n },\r\n classes.collapseAnimation\r\n ).then(\r\n function ()\r\n {\r\n // Remove expanded class\r\n elementToCollapse.removeClass(classes.expanded);\r\n\r\n // Clear the inline styles after animation done\r\n elementToCollapse.css({\r\n 'display': '',\r\n 'height' : ''\r\n });\r\n\r\n // Resolve the deferred object\r\n deferred.resolve({'success': true});\r\n }\r\n );\r\n });\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsFormWizardController', MsFormWizardController)\r\n .directive('msFormWizard', msFormWizardDirective)\r\n .directive('msFormWizardForm', msFormWizardFormDirective);\r\n\r\n /** @ngInject */\r\n function MsFormWizardController()\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.forms = [];\r\n vm.selectedIndex = 0;\r\n\r\n // Methods\r\n vm.registerForm = registerForm;\r\n\r\n vm.previousStep = previousStep;\r\n vm.nextStep = nextStep;\r\n vm.isFirstStep = isFirstStep;\r\n vm.isLastStep = isLastStep;\r\n\r\n vm.currentStepInvalid = currentStepInvalid;\r\n vm.formsIncomplete = formsIncomplete;\r\n vm.resetForm = resetForm;\r\n\r\n vm.goToStep = goToStep;\r\n //////////\r\n\r\n /**\r\n * Register form\r\n *\r\n * @param form\r\n */\r\n function registerForm(form)\r\n {\r\n vm.forms.push(form);\r\n }\r\n\r\n /**\r\n * Go to previous step\r\n */\r\n function previousStep()\r\n {\r\n vm.selectedIndex--;\r\n }\r\n\r\n /**\r\n * Go to next step\r\n */\r\n function nextStep()\r\n {\r\n vm.selectedIndex++;\r\n }\r\n\r\n function goToStep(index)\r\n {\r\n if(index > vm.forms.length - 1) {\r\n console.log('index ' + index + ' is out of bounds');\r\n }\r\n vm.selectedIndex = index;\r\n }\r\n\r\n /**\r\n * Is first step?\r\n *\r\n * @returns {boolean}\r\n */\r\n function isFirstStep()\r\n {\r\n return vm.selectedIndex === 0;\r\n }\r\n\r\n /**\r\n * Is last step?\r\n *\r\n * @returns {boolean}\r\n */\r\n function isLastStep()\r\n {\r\n return vm.selectedIndex === vm.forms.length - 1;\r\n }\r\n\r\n\r\n /**\r\n * Is current step invalid?\r\n *\r\n * @returns {boolean|*}\r\n */\r\n function currentStepInvalid()\r\n {\r\n return angular.isDefined(vm.forms[vm.selectedIndex]) && vm.forms[vm.selectedIndex].$invalid;\r\n }\r\n\r\n /**\r\n * Check if there is any incomplete forms\r\n *\r\n * @returns {boolean}\r\n */\r\n function formsIncomplete()\r\n {\r\n for ( var x = 0; x < vm.forms.length; x++ )\r\n {\r\n if ( vm.forms[x].$invalid )\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Reset form\r\n */\r\n function resetForm()\r\n {\r\n // Go back to first step\r\n vm.selectedIndex = 0;\r\n\r\n // Make sure all the forms are back in the $pristine & $untouched status\r\n for ( var x = 0; x < vm.forms.length; x++ )\r\n {\r\n vm.forms[x].$setPristine();\r\n vm.forms[x].$setUntouched();\r\n }\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msFormWizardDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : true,\r\n controller: 'MsFormWizardController as msWizard',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-form-wizard');\r\n\r\n return function postLink()\r\n {\r\n\r\n };\r\n }\r\n }\r\n\r\n }\r\n\r\n /** @ngInject */\r\n function msFormWizardFormDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n require : ['form', '^msFormWizard'],\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-form-wizard-form');\r\n\r\n return function postLink(scope, iElement, iAttrs, ctrls)\r\n {\r\n var formCtrl = ctrls[0],\r\n MsFormWizardCtrl = ctrls[1];\r\n\r\n MsFormWizardCtrl.registerForm(formCtrl);\r\n }\r\n }\r\n }\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msCard', msCardDirective);\r\n\r\n /** @ngInject */\r\n function msCardDirective()\r\n {\r\n return {\r\n restrict: 'E',\r\n scope : {\r\n templatePath: '=template',\r\n card : '=ngModel'\r\n },\r\n template: '
',\r\n compile : function (tElement)\r\n {\r\n // Add class\r\n tElement.addClass('ms-card');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n // Methods\r\n scope.cardTemplateLoaded = cardTemplateLoaded;\r\n\r\n //////////\r\n\r\n /**\r\n * Emit cardTemplateLoaded event\r\n */\r\n function cardTemplateLoaded()\r\n {\r\n scope.$emit('msCard::cardTemplateLoaded', iElement);\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.pages.maintenance', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.pages_maintenance', {\r\n url : '/pages/maintenance',\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.pages_maintenance': {\r\n templateUrl: 'app/pages/maintenance/maintenance.html',\r\n controller : 'MaintenanceController as vm'\r\n }\r\n },\r\n bodyClass: 'maintenance',\r\n inactiveUserAccessible: false\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/pages/maintenance');\r\n\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.pages.maintenance')\r\n .controller('MaintenanceController', MaintenanceController);\r\n\r\n /** @ngInject */\r\n function MaintenanceController()\r\n {\r\n // Data\r\n\r\n // Methods\r\n\r\n //////////\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.screener', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.screener', {\r\n url : '/screener',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/screener/screeners.html',\r\n controller : 'ScreenerController as vm'\r\n }\r\n },\r\n resolve: {\r\n ScreenerData: function (apiResolver)\r\n {\r\n return apiResolver.resolve('screener.list@query');\r\n }\r\n },\r\n bodyClass: 'screener',\r\n authenticate: true,\r\n inactiveUserAccessible: false\r\n });\r\n\r\n // Translation\r\n //$translatePartialLoaderProvider.addPart('app/pages/auth/profile');\r\n msNavigationServiceProvider.saveItem('screeners', {\r\n title : 'My Screeners',\r\n weight: 3,\r\n icon: 'icon-binoculars',\r\n state: 'app.screener'\r\n });\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.screener')\r\n .controller('ScreenerController', ScreenerController);\r\n\r\n /** @ngInject */\r\n function ScreenerController($rootScope, ScreenerData, $location, $mdDialog, $mdToast, $analytics, $cacheFactory, wlUtil, api)\r\n {\r\n // Data\r\n var vm = this;\r\n vm.title = \"Screeners\";\r\n vm.screeners = ScreenerData;\r\n\r\n $rootScope.$watch('screenerSummary', function () {\r\n if ($rootScope.screenerSummary) {\r\n for (var i = 0; i < vm.screeners.length; i++) {\r\n var screenerID = vm.screeners[i].id;\r\n for (var j = 0; j < $rootScope.screenerSummary.screenerModels.length; j++) {\r\n if ($rootScope.screenerSummary.screenerModels[j].screener.id == screenerID) {\r\n vm.screeners[i].matchCount = $rootScope.screenerSummary.screenerModels[j].matchCount;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n // Methods\r\n vm.deleteScreener = deleteScreener;\r\n\r\n function deleteScreener(ev, screener)\r\n {\r\n var confirm = $mdDialog.confirm()\r\n .title('Delete Screener')\r\n .textContent('Are you sure you want to delete this screener?')\r\n .ariaLabel('Delete Screener')\r\n .targetEvent(ev)\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .ok('Yes')\r\n .cancel('No');\r\n\r\n $mdDialog.show(confirm).then(function() {\r\n api.screener.delete.remove({ id: screener.id },\r\n function(response)\r\n {\r\n var $httpDefaultCache = $cacheFactory.get('$http');\r\n $httpDefaultCache.remove($rootScope.apiURL + 'api/screeners');\r\n\r\n $analytics.eventTrack('deleted', { category: 'screener' });\r\n\r\n $mdToast.show(\r\n $mdToast.simple()\r\n .textContent('Screener Deleted!')\r\n .position('top right')\r\n .hideDelay(3000)\r\n );\r\n\r\n for(var i=0;i\r\n vm.sports = angular.copy($rootScope.appData.sports);\r\n // vm.sports.unshift({ id: null, name: \"All\" });\r\n\r\n vm.help = ConstantsData.help;\r\n vm.constants = ConstantsData;\r\n $scope.constants = $rootScope.constants;\r\n vm.isScreenLTESm = false;\r\n if($mdMedia('xs') || $mdMedia('sm')) {\r\n vm.isScreenLTESm = true;\r\n }\r\n\r\n vm.defaultMatchResultsTitle = vm.constants.matchResults.title;\r\n\r\n vm.tradingBehaviors = ResearchData.tradingBehaviors;\r\n //$scope.screener = {};\r\n vm.chartLine = {\r\n enabled: false,\r\n type: null\r\n };\r\n\r\n vm.allTournaments = {\r\n id: 0,\r\n name: 'All',\r\n label: 'All'\r\n };\r\n\r\n vm.alertLevels = ResearchData.alertLevels;\r\n vm.alertLevels.shift(); // removes normal level\r\n\r\n vm.betTypes = ResearchData.queryOddsTypes;\r\n vm.queryOperators = ResearchData.queryOperators;\r\n vm.mathOperators = ResearchData.mathOperators;\r\n vm.wagerTypes = ResearchData.wagerTypes;\r\n vm.spreadWagerTypes = ResearchData.spreadWagerTypes;\r\n vm.screeners = ScreenerData;\r\n\r\n $scope.selectedTradingBehavior = vm.tradingBehaviors[0];\r\n ResearchData.queryOperators.unshift({ id: null, name: \"Finished\" });\r\n\r\n vm.marketGroupings = ResearchData.marketGroupings;\r\n vm.noMarketGrouping = vm.marketGroupings[0];\r\n vm.marketGroupings.shift();\r\n $scope.selectedMarketGrouping = vm.marketGroupings[0];\r\n\r\n //$scope.marketGroupingClass = vm.marketGroupings[0].name.toLowerCase();\r\n\r\n //console.log(ResearchData);\r\n\r\n var alertMarketGroupings = angular.copy(vm.marketGroupings);\r\n $scope.alertMarketGroupings = alertMarketGroupings;\r\n\r\n $scope.selectedMatch = null;\r\n $scope.selectedMatchDataPoint = null;\r\n $scope.matchDetailColumns = [\"Market\"];\r\n\r\n // set the alert range labels\r\n for(var i=0;i<$scope.alertMarketGroupings.length;i++) {\r\n var rangeGroupLength = $scope.alertMarketGroupings[i].values.length / ResearchData.alertQueryRanges.length; // 6/2=3\r\n $scope.alertMarketGroupings[i].ranges = [];\r\n\r\n for(var j=0;j 0) {\r\n for(var i=0; i= this.criteria.limit) {\r\n this.endingRow = ((this.criteria.page - 1) * this.criteria.limit) + this.criteria.limit;\r\n if(this.endingRow > this.rowCount) {\r\n this.endingRow = this.rowCount;\r\n }\r\n } else {\r\n this.endingRow = this.rowCount;\r\n }\r\n this.pageCount = Math.ceil(this.rowCount / this.criteria.limit);\r\n this.paginator = new Array();\r\n if(this.rowCount > this.criteria.limit) {\r\n for(var i=0;i 0) {\r\n $scope.researchSettings.markets.rows[i].advancedSettingsVisible = true;\r\n }\r\n }\r\n\r\n $scope.upcomingMatches.criteria.preview = false;\r\n $scope.upcomingMatches.api = api.screener.matches.getById;\r\n $scope.upcomingMatches.refresh();\r\n } else { // first run\r\n resetHomeState();\r\n }\r\n }\r\n } else {\r\n vm.home = true;\r\n resetHomeState();\r\n }\r\n\r\n vm.originalResearchSettings = {};\r\n angular.copy($scope.researchSettings, vm.originalResearchSettings);\r\n\r\n if($stateParams.newScreener) {\r\n startNewScreenerWizard();\r\n }\r\n\r\n // check start times and disable paper trade button if started\r\n $interval(function() {\r\n var invalidateCache = false;\r\n for(var i=0;i<$scope.upcomingMatches.rows.length;i++) {\r\n //console.log($scope.upcomingMatches.rows[i].matchDate);\r\n if($scope.upcomingMatches.rows[i].matchStatus == 0) {\r\n var matchDateTimeUtc = moment.utc($scope.upcomingMatches.rows[i].matchDate);\r\n\r\n //console.log(matchDateTimeUtc.format() + ' | ' + moment().utc().format());\r\n //var currentTime = moment.utc().add(1, 'hours');\r\n if(moment.utc().isAfter(matchDateTimeUtc)) {\r\n $scope.upcomingMatches.rows[i].hasOdds = false;\r\n $scope.upcomingMatches.rows[i].inProgress = true;\r\n invalidateCache = true;\r\n }\r\n }\r\n }\r\n\r\n if(invalidateCache) {\r\n var $httpDefaultCache = $cacheFactory.get('$http');\r\n $httpDefaultCache.remove($rootScope.apiURL + 'api/app/researchdata');\r\n for(var i=0;i\r\n\r\n //\r\n // match methods\r\n vm.viewMatchDetail = viewMatchDetail;\r\n vm.closeMatchDetail = closeMatchDetail;\r\n vm.selectMatchBetType = selectMatchBetType;\r\n vm.drawTrendLine = graphItemClick;\r\n vm.selectChartDataPoint = selectChartDataPoint;\r\n vm.enableLineDrawing = enableLineDrawing;\r\n vm.disableLineDrawing = disableLineDrawing;\r\n vm.clearTrendLines = clearTrendLines;\r\n vm.clearGuideLines = clearGuideLines;\r\n vm.highlightChartCursor = highlightChartCursor;\r\n vm.unhighlightChartCursor = unhighlightChartCursor;\r\n vm.chartMouseMove = chartMouseMove;\r\n vm.loadNextMatch = loadNextMatch;\r\n vm.loadPreviousMatch = loadPreviousMatch;\r\n vm.isFirstMatch = isFirstMatch;\r\n vm.isLastMatch = isLastMatch;\r\n\r\n // screener methods\r\n vm.saveScreener = saveScreener;\r\n vm.saveAndRunScreener = saveAndRunScreener;\r\n vm.startNewScreenerWizard = startNewScreenerWizard;\r\n vm.editScreener = editScreener;\r\n vm.selectScreenerMarket = selectScreenerMarket;\r\n vm.previewScreener = previewScreener;\r\n vm.toggleScreenerAdvancedMarketSettings = toggleScreenerAdvancedMarketSettings;\r\n vm.addScreenerMarketQuery = addScreenerMarketQuery;\r\n vm.deleteScreenerMarketQuery = deleteScreenerMarketQuery;\r\n vm.addScreenerMarketQueryCondition = addScreenerMarketQueryCondition;\r\n vm.deleteScreenerMarketQueryCondition = deleteScreenerMarketQueryCondition;\r\n vm.addScreenerAlert = addScreenerAlert;\r\n vm.deleteScreenerAlert = deleteScreenerAlert;\r\n vm.screenerAlertOperatorSelected = screenerAlertOperatorSelected;\r\n vm.changeScreenerMarketGrouping = changeScreenerMarketGrouping;\r\n vm.exitScreenerWizard = exitScreenerWizard;\r\n vm.changeScreenerTradingBehavior = changeScreenerTradingBehavior;\r\n\r\n // results methods\r\n vm.changeResultsTradingBehavior = changeResultsTradingBehavior;\r\n vm.changeResultsMarketGrouping = changeResultsMarketGrouping;\r\n vm.getAlertLevel = wlUtil.getAlertLevel;\r\n vm.getTradingBehaviorIndicator = wlUtil.getTradingBehaviorIndicator;\r\n vm.getTotalsTradingBehaviorIndicator = wlUtil.getTotalsTradingBehaviorIndicator;\r\n vm.pageMatchResults = pageMatchResults;\r\n vm.toggleNoGrouping = toggleNoGrouping;\r\n vm.toggleNoGroupingRow = toggleNoGroupingRow;\r\n\r\n // dialog methods\r\n vm.openPaperTradeDialog = openPaperTradeDialog;\r\n vm.openScreenerDialog = openScreenerDialog;\r\n vm.openHelpDialog = openHelpDialog;\r\n vm.openDialog = openDialog;\r\n\r\n // misc methods\r\n vm.togglePanelContent = togglePanelContent;\r\n vm.goHome = goHome;\r\n vm.gotoScreeners = goToScreeners;\r\n //\r\n\r\n //\r\n angular.element($window).bind('orientationchange', function () {\r\n setIsScreenLTESm();\r\n });\r\n\r\n angular.element($window).bind('resize', function () {\r\n setIsScreenLTESm();\r\n });\r\n\r\n function setIsScreenLTESm() {\r\n if($mdMedia('xs') || $mdMedia('sm')) {\r\n vm.isScreenLTESm = true;\r\n } else {\r\n vm.isScreenLTESm = false;\r\n }\r\n }\r\n\r\n function loadMatch(match, betType, loadNewMatch)\r\n {\r\n //console.log(match);\r\n if (loadNewMatch === undefined) {\r\n loadNewMatch = true;\r\n if($scope.selectedMatch) {\r\n if($scope.selectedMatch.id == match.id) {\r\n loadNewMatch = false;\r\n }\r\n }\r\n }\r\n\r\n if(loadNewMatch) {\r\n $scope.selectedMatch = match;\r\n $scope.selectedMatch.betType = betType;\r\n\r\n loadMatchChart(betType, $scope.selectedMarketGrouping.values[$scope.selectedMarketGrouping.values.length - 1]);\r\n\r\n }\r\n }\r\n\r\n function loadMatchChart(betType, matchesBack)\r\n {\r\n $scope.selectedMatch.matchesBack = matchesBack;\r\n // @todo this can probably be optimized\r\n /* for (var i = 0; i < ResearchData.upcomingMatches.length; i++) {\r\n ResearchData.upcomingMatches[i].chartData = wlUtil.prepareMatchChartData(ResearchData.upcomingMatches[i], matchesBack, $scope.selectedTradingBehavior);\r\n }*/\r\n\r\n for (var i = 0; i < $scope.upcomingMatches.rows.length; i++) {\r\n $scope.upcomingMatches.rows[i].chartData = wlUtil.prepareMatchChartData($scope.upcomingMatches.rows[i], matchesBack, $scope.selectedTradingBehavior);\r\n }\r\n\r\n //console.log($scope.upcomingMatches.rows);\r\n\r\n $scope.matchChartOptions = {\r\n categoryField: \"matchesBack\",\r\n addClassNames: true,\r\n valueAxes: [{\r\n title: $scope.selectedMatch.chartData[betType].title,\r\n axisAlpha: 0,\r\n inside: true\r\n }],\r\n graphs: [],\r\n dataProvider: $scope.selectedMatch.chartData[betType].data,\r\n listeners: [{\r\n event: \"clickGraphItem\",\r\n method: graphItemClick\r\n }],\r\n startEffect: 'easeOutSine',\r\n allLabels: [{\r\n text: \"Study Period\",\r\n bold: true,\r\n y: 338,\r\n align: \"center\"\r\n }]\r\n };\r\n\r\n //console.log($scope.selectedMatch.chartData[betType].data);\r\n\r\n angular.copy($scope.selectedMatch.chartData[betType].graphs, $scope.matchChartOptions.graphs);\r\n\r\n $scope.matchChartOptions = wlUtil.serialChartOptionDefaults($scope.matchChartOptions);\r\n\r\n for(var i=0;i<$scope.matchChartOptions.graphs.length;i++) {\r\n if(betType == 'totals') {\r\n $scope.matchChartOptions.graphs[i].balloonFunction = formatTotalsChartBalloon;\r\n } else {\r\n $scope.matchChartOptions.graphs[i].balloonFunction = formatAtsMoneylineChartBalloon;\r\n }\r\n $scope.matchChartOptions.graphs[i].showHandOnHover = true;\r\n\r\n // hide balloon on small screens\r\n if(vm.isScreenLTESm)\r\n {\r\n $scope.matchChartOptions.graphs[i].showBalloon = false;\r\n }\r\n }\r\n\r\n //console.log(JSON.stringify($scope.matchChartOptions));\r\n }\r\n\r\n function viewMatchDetail(match, betType, index)\r\n {\r\n match.noGroupingVisible = false;\r\n loadMatch(match, betType);\r\n $scope.selectedMatch.selectedIndex = index;\r\n\r\n\r\n $('#results-widget').addClass('flipped');\r\n\r\n $location.hash('match-detail');\r\n $anchorScroll();\r\n\r\n }\r\n\r\n function closeMatchDetail()\r\n {\r\n $scope.selectedMatch = null;\r\n $('#results-widget').removeClass('flipped');\r\n resetChartLines('match-chart');\r\n AmCharts.charts = []; // clear chart so only a single chart is created. When window closes, its regenerated with new options\r\n }\r\n\r\n function selectMatchBetType(event, betType)\r\n {\r\n var activeRow = angular.element(event.target).parents('tr');\r\n // switch chart\r\n if(!activeRow.hasClass('active')) {\r\n $('#match-detail-wl-results-table tbody tr').removeClass('active');\r\n activeRow.addClass('active');\r\n $scope.selectedMatch.betType = betType;\r\n loadMatchChart(betType, $scope.selectedMarketGrouping.values[$scope.selectedMarketGrouping.values.length - 1]);\r\n }\r\n }\r\n\r\n function loadNextMatch()\r\n {\r\n var isLastMatch = vm.isLastMatch();\r\n if(!isLastMatch) {\r\n // check if the pagination needs to go to the next page\r\n if($scope.selectedMatch.selectedIndex == $scope.upcomingMatches.rows.length - 1) { // last row with this page data set\r\n // make call for next page of data\r\n $scope.upcomingMatches.criteria.page++;\r\n $scope.upcomingMatches.refresh(0);\r\n } else {\r\n var nextSelectedIndex = $scope.selectedMatch.selectedIndex + 1;\r\n loadMatchByIndex(nextSelectedIndex);\r\n }\r\n }\r\n\r\n resetChartLines('match-chart');\r\n }\r\n\r\n function loadPreviousMatch()\r\n {\r\n var isFirstMatch = vm.isFirstMatch();\r\n if(!isFirstMatch) {\r\n if($scope.selectedMatch.selectedIndex == 0) { // first row with this page data set\r\n // make call for previous page of data\r\n $scope.upcomingMatches.criteria.page--;\r\n $scope.upcomingMatches.refresh($scope.upcomingMatches.rows.length - 1);\r\n } else {\r\n var nextSelectedIndex = $scope.selectedMatch.selectedIndex - 1;\r\n loadMatchByIndex(nextSelectedIndex);\r\n }\r\n }\r\n resetChartLines('match-chart');\r\n }\r\n\r\n function loadMatchByIndex(index)\r\n {\r\n //console.log($scope.upcomingMatches.rows[index]);\r\n loadMatch($scope.upcomingMatches.rows[index], $scope.selectedMatch.betType);\r\n $scope.selectedMatch.selectedIndex = index;\r\n resetChartLines('match-chart');\r\n }\r\n\r\n function isFirstMatch()\r\n {\r\n if($scope.selectedMatch && $scope.upcomingMatches.rows.length > 0) {\r\n if($scope.upcomingMatches.criteria.page == 1 && $scope.selectedMatch.id == $scope.upcomingMatches.rows[0].id) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function isLastMatch()\r\n {\r\n if($scope.selectedMatch && $scope.upcomingMatches.rows.length > 0) {\r\n if($scope.upcomingMatches.criteria.page == $scope.upcomingMatches.pageCount && $scope.selectedMatch.id == $scope.upcomingMatches.rows[$scope.upcomingMatches.rows.length - 1].id) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n //\r\n function selectChartDataPoint($event, betType, matchesBack)\r\n {\r\n $event.stopPropagation();\r\n var activeRow = angular.element($event.target).parents('tr');\r\n // switch chart\r\n if(!activeRow.hasClass('active')) {\r\n $('#match-detail-wl-results-table tbody tr').removeClass('active');\r\n activeRow.addClass('active');\r\n }\r\n\r\n if($scope.selectedMatchDataPoint) {\r\n $scope.selectedMatchDataPoint.removeClass('active');\r\n }\r\n\r\n $scope.selectedMatchDataPoint = angular.element($event.target)\r\n $scope.selectedMatchDataPoint.addClass('active');\r\n loadMatchChart(betType, matchesBack);\r\n }\r\n\r\n function highlightChartCursor(event, category)\r\n {\r\n var rowElement = angular.element(event.target).parents('tr');\r\n if(rowElement.hasClass('active')) {\r\n var chart = getAmChartByID('matchChart');\r\n category = getSelectedMarketGroupingMatchLength() - (category - 1); // point is opposite of grid match values\r\n /*if(chart.chartCursor != undefined) {\r\n chart.chartCursor.showCursorAt(category);\r\n }*/\r\n }\r\n }\r\n\r\n function unhighlightChartCursor(event)\r\n {\r\n var rowElement = angular.element(event.target).parents('tr');\r\n if(rowElement.hasClass('active')) {\r\n var chart = getAmChartByID('matchChart');\r\n /* if(chart.chartCursor != undefined) {\r\n chart.chartCursor.hideCursor();\r\n }*/\r\n }\r\n }\r\n\r\n function formatAtsMoneylineChartBalloon(graphDataItem, graph)\r\n {\r\n var graphData = {\r\n value: graphDataItem.values.value,\r\n homeVolatility: graphDataItem.dataContext.homeVolatility,\r\n awayVolatility: graphDataItem.dataContext.awayVolatility,\r\n matchesBack: graphDataItem.dataContext.matchesBack\r\n }\r\n\r\n var divergence = Math.abs(graphDataItem.dataContext.homeVolatility - graphDataItem.dataContext.awayVolatility);\r\n var wolflineValue = divergence / (graph.data.length - (graphDataItem.dataContext.matchesBack - 1));\r\n\r\n var value = 'Price: ' + graphDataItem.values.value + '
';\r\n value += 'Divergence: ' + divergence + '
';\r\n value += 'Wolfline: ' + wlUtil.formatWolflineNumber(wolflineValue) + '';\r\n\r\n return value;\r\n }\r\n\r\n function formatTotalsChartBalloon(graphDataItem, graph)\r\n {\r\n var divergence = Math.abs(graphDataItem.dataContext.volatility - 0);\r\n var wolflineValue = graphDataItem.values.value / (graph.data.length - (graphDataItem.dataContext.matchesBack - 1));\r\n //console.log(wolflineValue);\r\n var value = 'Volatility: ' + graphDataItem.values.value + '
';\r\n value += 'Divergence: ' + divergence + '
';\r\n value += 'Wolfline: ' + wlUtil.formatWolflineNumber(wolflineValue) + '';\r\n\r\n return value;\r\n }\r\n\r\n function enableLineDrawing(type) {\r\n vm.chartLine.enabled = true;\r\n vm.chartLine.type = type;\r\n\r\n }\r\n\r\n function disableLineDrawing() {\r\n vm.chartLine.enabled = false;\r\n vm.chartLine.trendline = null;\r\n }\r\n\r\n function clearTrendLines(chartID) {\r\n var chart = getAmChartByID(chartID);\r\n if(chart) {\r\n chart.trendLines = [];\r\n chart.validateNow();\r\n } else {\r\n //console.log('chart with id ' + chartID + ' not found');\r\n }\r\n }\r\n\r\n function clearGuideLines(chartID)\r\n {\r\n var chart = getAmChartByID(chartID);\r\n console.log(chart.valueAxes[0].guides);\r\n if(chart) {\r\n chart.valueAxes[0].guides = [];\r\n chart.validateNow();\r\n }\r\n }\r\n\r\n function resetChartLines(chartID)\r\n {\r\n var chart = getAmChartByID(chartID);\r\n if(chart) {\r\n chart.trendLines = [];\r\n chart.valueAxes[0].guides = [];\r\n chart.validateNow();\r\n\r\n vm.chartLine.enabled = false;\r\n vm.chartLine.type = null;\r\n vm.chartLine.trendline = null;\r\n }\r\n }\r\n\r\n function graphItemClick(event)\r\n {\r\n //console.log(event.chart);\r\n if(vm.chartLine.enabled) {\r\n if(vm.chartLine.type == 'trendline') {\r\n if(vm.chartLine.trendline) { // second click\r\n vm.chartLine.trendline.finalCategory = event.item.category;\r\n vm.chartLine.trendline.finalValue = event.item.values.value;\r\n\r\n event.chart.addTrendLine(vm.chartLine.trendline);\r\n event.chart.validateNow();\r\n vm.chartLine.trendline = null;\r\n } else { // first click\r\n vm.chartLine.trendline = {\r\n initialCategory: event.item.category,\r\n initialValue: event.item.values.value,\r\n lineColor: '#000000',\r\n lineThickness: 2,\r\n offsetX: event.event.layerX,\r\n offsetY: event.event.layerY\r\n }\r\n // highlight the data point\r\n //console.log(event);\r\n var bullet = event.item.bulletGraphics.node;\r\n\r\n bullet.setAttribute(\"stroke\",\"#000000\");\r\n bullet.setAttribute(\"fill\",\"#000000\");\r\n }\r\n } else if(vm.chartLine.type == 'guide') {\r\n var guide = new AmCharts.Guide();\r\n guide.lineAlpha = 1;\r\n guide.value = event.item.values.value;\r\n guide.lineColor = \"#a01db0\";\r\n guide.lineThickness = 2;\r\n event.chart.valueAxes[0].addGuide(guide);\r\n event.chart.validateNow();\r\n }\r\n }\r\n }\r\n\r\n function chartMouseMove(event)\r\n {\r\n /*$('.jquery-line').remove();\r\n if(vm.chartLine.enabled && vm.chartLine.trendline) { // enable drawing from first point only from first click\r\n //console.log('x:' + event.offsetX + ' y:' + event.offsetY);\r\n\r\n if(event.offsetX > 1 && event.offsetY > 1) { // hovering over background grid causes the y to reset to 0 or 1 for some reason.\r\n $('#match-chart').line(vm.chartLine.trendline.offsetX, vm.chartLine.trendline.offsetY, event.offsetX - 10, event.offsetY, {color:\"black\", stroke: 2});\r\n }\r\n\r\n }*/\r\n }\r\n //
\r\n //
\r\n\r\n //\r\n function changeResultsMarketGrouping(grouping)\r\n {\r\n if(grouping.id != $scope.selectedMarketGrouping.id) {\r\n $scope.selectedMarketGrouping = grouping;\r\n\r\n if($scope.selectedMatch) {\r\n // change the chart data range\r\n loadMatchChart('ats', $scope.selectedMarketGrouping.values[$scope.selectedMarketGrouping.values.length - 1]);\r\n }\r\n }\r\n }\r\n\r\n function changeResultsTradingBehavior(behavior)\r\n {\r\n if($scope.selectedTradingBehavior.id != behavior.id) {\r\n $scope.selectedTradingBehavior = behavior;\r\n // update the chart if we are on the match detail\r\n if($scope.selectedMatch) {\r\n loadMatchChart($scope.selectedMatch.betType, $scope.selectedMatch.matchesBack);\r\n }\r\n }\r\n }\r\n\r\n function pageMatchResults(page)\r\n {\r\n $scope.upcomingMatches.criteria.page = page;\r\n $scope.upcomingMatches.refresh();\r\n\r\n $location.hash('results-widget');\r\n $anchorScroll();\r\n }\r\n\r\n function toggleNoGroupingRow(ev, match)\r\n {\r\n ev.stopPropagation();\r\n\r\n var parentRow = $(ev.currentTarget).parents('tr').prev();\r\n var noGroupingContainer = $('td .no-grouping-container', parentRow.next('.no-grouping-row'));\r\n\r\n var horizPadding = parseInt($('td:first', parentRow).css('padding-left').replace('px', '')) + parseInt($('td:last', parentRow).css('padding-right').replace('px', ''));\r\n noGroupingContainer.css({'width': parentRow.width() - horizPadding});\r\n\r\n // set the data\r\n if(noGroupingContainer.html() == '') {\r\n var noGroupingContent = $('
Odds
'+ $('td', parentRow).eq(4).html() + '
');\r\n\r\n for(var i=1;i' + i + '');\r\n $('tbody tr:first', noGroupingContent).append('' + $('td', parentRow).eq(i+4).html() + '');\r\n }\r\n\r\n noGroupingContainer.html(noGroupingContent);\r\n }\r\n\r\n if(noGroupingContainer.css('display') == 'block') {\r\n match.noGroupingVisible = false;\r\n noGroupingContainer.slideUp();\r\n\r\n } else {\r\n noGroupingContainer.slideDown();\r\n match.noGroupingVisible = true;\r\n }\r\n }\r\n\r\n function toggleNoGrouping(ev, match)\r\n {\r\n ev.stopPropagation();\r\n\r\n var parentContainer = $(ev.currentTarget).parents('.wolfline-table-container');\r\n var table = $('.wl-values-table', parentContainer);\r\n var className = $scope.selectedMarketGrouping.name.toLowerCase();\r\n\r\n if(table.hasClass(className)) {\r\n parentContainer.css({\r\n 'width': parentContainer.width(),\r\n 'overflow-x': 'scroll'\r\n });\r\n\r\n table.removeClass(className);\r\n match.noGroupingVisible = true;\r\n } else {\r\n table.addClass(className);\r\n parentContainer.css({\r\n 'width': '',\r\n 'overflow-x': ''\r\n });\r\n\r\n match.noGroupingVisible = false;\r\n }\r\n\r\n }\r\n //
\r\n\r\n //\r\n function openPaperTradeDialog(ev, match, betType)\r\n {\r\n ev.stopPropagation();\r\n\r\n $mdDialog.show({\r\n controller : 'PaperTradeDialogController',\r\n controllerAs : 'vm',\r\n templateUrl : 'app/main/papertrade/dialogs/papertrade/papertrade-dialog.html',\r\n parent : angular.element($document.body),\r\n targetEvent : ev,\r\n clickOutsideToClose: true,\r\n locals : {\r\n event: ev,\r\n betTypes: ResearchData.queryOddsTypes,\r\n spreadTeams: ResearchData.spreadTeams,\r\n spreadWagerTypes: ResearchData.wagerTypes,\r\n totalsWagerTypes: ResearchData.totalsWagerTypes,\r\n moneylineWagerTypes: ResearchData.wagerTypes,\r\n marketGroupings: vm.marketGroupings,\r\n tradingBehaviors: ResearchData.tradingBehaviors,\r\n papertrade: {\r\n match: match,\r\n marketGrouping: $scope.selectedMarketGrouping,\r\n oddsType: wlUtil.findById(ResearchData.queryOddsTypes, betType),\r\n tradingBehavior: $scope.selectedTradingBehavior\r\n },\r\n constants: vm.constants\r\n }\r\n });\r\n }\r\n\r\n function openScreenerDialog(ev)\r\n {\r\n console.log(\"open screener\");\r\n var update = false;\r\n if($scope.upcomingMatches.screener && $scope.upcomingMatches.screener.id) {\r\n update = true;\r\n }\r\n $mdDialog.show({\r\n controller : 'ScreenerDialogController',\r\n controllerAs : 'vm',\r\n templateUrl : 'app/main/research/dialogs/screener/screener-dialog.html',\r\n parent : angular.element($document.body),\r\n targetEvent : ev,\r\n clickOutsideToClose: true,\r\n locals : {\r\n event: ev,\r\n researchSettings: $scope.researchSettings,\r\n update: update\r\n }\r\n });\r\n }\r\n\r\n function openHelpDialog(ev, key)\r\n {\r\n $mdDialog.show(\r\n $mdDialog.alert()\r\n .htmlContent(vm.help[key])\r\n .ariaLabel('Help')\r\n .targetEvent(ev)\r\n .clickOutsideToClose(true)\r\n .ok('Close')\r\n );\r\n }\r\n\r\n function openDialog(ev, title, content)\r\n {\r\n\r\n $mdDialog.show(\r\n $mdDialog.alert()\r\n .htmlContent(content)\r\n .title(title)\r\n .ariaLabel('Dialog')\r\n .targetEvent(ev)\r\n .clickOutsideToClose(true)\r\n .ok('Close')\r\n );\r\n }\r\n //\r\n\r\n //\r\n function setDefaultResearchSettings(sport)\r\n {\r\n console.log(\"setDefaultResearchSettings\");\r\n if (sport === undefined) {\r\n sport = null;\r\n }\r\n\r\n $scope.researchSettings.markets.rows = [];\r\n $scope.researchSettings.markets.rows.push({\r\n sport: sport,\r\n advancedSettingsVisible: false,\r\n conditions:[]\r\n });\r\n\r\n $scope.researchSettings.alerts.rows = [];\r\n /*$scope.researchSettings.alerts.rows.push({\r\n betType: null,\r\n alertLevel: null,\r\n numberOfAlerts: null,\r\n operator: \">=\",\r\n range: null,\r\n conditionOperator: null\r\n });*/\r\n\r\n }\r\n\r\n function startNewScreenerWizard(ev)\r\n {\r\n console.log(\"startNewScreenerWizard\");\r\n // reset screener\r\n $scope.researchSettings.name = null;\r\n $scope.researchSettings.description = null;\r\n $scope.researchSettings.sport = null;\r\n $scope.researchSettings.tournament = null;\r\n $scope.researchSettings.wizard.enabled = true;\r\n $scope.researchSettings.wizard.editMode = true;\r\n $scope.researchSettings.matchResults.showResultsPanel = false;\r\n $scope.researchSettings.tradingBehavior = ResearchData.tradingBehaviors[0];\r\n $scope.researchSettings.marketGrouping = $scope.alertMarketGroupings[0];\r\n $scope.researchSettings.alerts.rows = [];\r\n $scope.researchSettings.markets.rows = [{\r\n sport: null,\r\n advancedSettingsVisible: false,\r\n conditions:[]\r\n }];\r\n }\r\n\r\n\r\n function editScreener(ev)\r\n {\r\n console.log(\"editScreener\");\r\n $scope.researchSettings.wizard.enabled = true;\r\n $scope.researchSettings.wizard.editMode = true;\r\n $scope.researchSettings.matchResults.showResultsPanel = false;\r\n }\r\n\r\n function selectScreenerMarket(ev, row, s)\r\n {\r\n console.log(\"selectScreenerMarket\");\r\n if(s.id == null) {\r\n $scope.researchSettings.markets.multiple = false; // disable the ability to add additional markets because its set to all markets\r\n // alert user if they already have multiple markets and have selected all\r\n if($scope.researchSettings.markets.rows.length > 1) {\r\n $mdDialog.show(\r\n $mdDialog.alert()\r\n .parent(angular.element(document.body))\r\n .clickOutsideToClose(true)\r\n .title('Warning')\r\n .textContent('You already have specific markets defined. Either remove your other markets or select a specific market.')\r\n .ariaLabel('Warning')\r\n .ok('OK')\r\n .targetEvent(ev)\r\n );\r\n }\r\n\r\n } else {\r\n row.sport = s;\r\n $scope.researchSettings.markets.multiple = true;\r\n\r\n // add all for tournaments\r\n if(row.sport.tournamentGroups.length > 0) {\r\n if(row.sport.tournamentGroups[0].id != 0) {\r\n row.sport.tournamentGroups.unshift(vm.allTournaments);\r\n }\r\n } else {\r\n row.sport.tournamentGroups.unshift(vm.allTournaments);\r\n }\r\n }\r\n }\r\n\r\n function loadScreener(screener, researchSettings)\r\n {\r\n console.log(\"loadScreener\");\r\n\r\n researchSettings.id = screener.id;\r\n researchSettings.name = screener.name;\r\n researchSettings.description = screener.description;\r\n researchSettings.tradingBehavior = wlUtil.lookupEnumObjectByID(screener.tradingBehavior, ResearchData.tradingBehaviors);\r\n researchSettings.marketGrouping = wlUtil.lookupEnumObjectByID(screener.marketGrouping, $scope.alertMarketGroupings);\r\n $scope.selectedTradingBehavior = researchSettings.tradingBehavior;\r\n\r\n //$scope.researchSettings.marketGrouping = wlUtil.lookupEnumObjectByID(screener.marketGrouping, $scope.alertMarketGroupings);\r\n $scope.selectedMarketGrouping = researchSettings.marketGrouping;\r\n\r\n for(var i=0;i 0) {\r\n for(var i=0;i 0) {\r\n\r\n for(var i=0;i<$scope.researchSettings.markets.rows.length; i++) {\r\n var row = $scope.researchSettings.markets.rows[i];\r\n var marketQuery = {\r\n conditions: []\r\n };\r\n\r\n if(row.sport) {\r\n marketQuery.sportID = row.sport.id;\r\n }\r\n\r\n if(row.tournament && row.tournament.id > 0) {\r\n marketQuery.tournamentGroupID = row.tournament.id;\r\n } else {\r\n marketQuery.tournamentGroupID = null;\r\n }\r\n\r\n if(row.conditions.length > 0) {\r\n for(var j=0;j 0) {\r\n\r\n for (var i = 0; i < $scope.researchSettings.alerts.rows.length; i++) {\r\n var row = $scope.researchSettings.alerts.rows[i];\r\n var alertQuery = {\r\n id: row.id,\r\n oddsType: row.betType.id,\r\n numberOfAlerts: row.numberOfAlerts,\r\n alertLevel: row.alertLevel.id,\r\n queryRange: row.range.id\r\n };\r\n\r\n if (row.conditionOperator) {\r\n alertQuery.conditionOperator = row.conditionOperator.id;\r\n }\r\n\r\n screener.alertQueries.push(alertQuery);\r\n }\r\n }\r\n\r\n //console.log(screener);\r\n\r\n return screener;\r\n }\r\n\r\n function saveScreener()\r\n {\r\n if($mdMedia('xs') || $mdMedia('sm')) {\r\n $location.hash('results-widget');\r\n $anchorScroll();\r\n }\r\n\r\n $scope.upcomingMatches.showLoading();\r\n $scope.researchSettings.matchResults.title = vm.defaultMatchResultsTitle;\r\n $scope.upcomingMatches.criteria.preview = false;\r\n $scope.researchSettings.matchResults.showResultsPanel = true;\r\n $scope.researchSettings.wizard.editMode = false;\r\n $scope.selectedMarketGrouping = $scope.researchSettings.marketGrouping;\r\n $scope.selectedTradingBehavior = $scope.researchSettings.tradingBehavior;\r\n $scope.upcomingMatches.criteria.page = 1;\r\n\r\n var screener = prepareScreenerFromResearchSettings();\r\n\r\n var $httpDefaultCache = $cacheFactory.get('$http');\r\n\r\n if($scope.upcomingMatches.screener.id) { // update screener\r\n\r\n screener.id = $scope.upcomingMatches.screener.id;\r\n\r\n $httpDefaultCache.remove($rootScope.apiURL + 'api/screeners');\r\n $httpDefaultCache.remove($rootScope.apiURL + 'api/screeners/' + screener.id);\r\n\r\n api.screener.matches.edit.update({ id: screener.id }, screener,\r\n function(response)\r\n {\r\n $scope.upcomingMatches.hideLoading();\r\n $scope.upcomingMatches.setUpcomingMatches(response.matches, response.matchCount);\r\n $scope.researchSettings.wizard.enabled = true;\r\n $scope.researchSettings.wizard.editMode = false;\r\n $rootScope.screenerSummary = null;\r\n\r\n if($mdMedia('xs') || $mdMedia('sm')) {\r\n $location.hash('results-widget');\r\n $anchorScroll();\r\n }\r\n\r\n },\r\n function(response)\r\n {\r\n $mdToast.show(\r\n $mdToast.simple()\r\n .textContent($rootScope.constants.errors.default)\r\n .position('top right')\r\n .hideDelay(3000)\r\n );\r\n //console.log(response);\r\n $rootScope.loadingProgress = false;\r\n $scope.researchSettings.wizard.searching = false;\r\n }\r\n );\r\n\r\n } else { // new screener\r\n api.screener.matches.add.save(screener,\r\n function (response) {\r\n\r\n $httpDefaultCache.remove($rootScope.apiURL + 'api/screeners');\r\n //\r\n $scope.upcomingMatches.screener.id = response.screener.id;\r\n\r\n $mdDialog.hide(response.screener); // @todo not sure why this is here.\r\n\r\n $scope.upcomingMatches.hideLoading();\r\n $scope.upcomingMatches.setUpcomingMatches(response.matches, response.matchCount);\r\n\r\n $rootScope.screenerSummary = null; // reset the call to get the screener count\r\n //console.log('get new screener summary');\r\n if($mdMedia('xs') || $mdMedia('sm')) {\r\n $location.hash('results-widget');\r\n $anchorScroll();\r\n }\r\n\r\n },\r\n function (response) {\r\n //console.log(response);\r\n $rootScope.loadingProgress = false;\r\n $scope.researchSettings.wizard.searching = false;\r\n }\r\n );\r\n }\r\n }\r\n\r\n function previewScreener()\r\n {\r\n $scope.researchSettings.matchResults.title = vm.constants.matchResults.previewTitle;\r\n $scope.upcomingMatches.criteria.preview = true;\r\n $scope.upcomingMatches.api = api.screener.matches.preview;\r\n $scope.researchSettings.wizard.searching = true;\r\n $scope.researchSettings.matchResults.showResultsPanel = true;\r\n $scope.upcomingMatches.criteria.page = 1;\r\n\r\n var screener = prepareScreenerFromResearchSettings();\r\n if(screener.name) {\r\n screener.name += \" (Preview)\";\r\n } else {\r\n screener.name = \"Preview\";\r\n }\r\n\r\n $scope.selectedMarketGrouping = $scope.researchSettings.marketGrouping;\r\n $scope.selectedTradingBehavior = $scope.researchSettings.tradingBehavior;\r\n\r\n $scope.upcomingMatches.refresh();\r\n\r\n $analytics.eventTrack('previewed', { category: 'screener' });\r\n }\r\n\r\n function changeScreenerTradingBehavior(behavior)\r\n {\r\n if($scope.researchSettings.tradingBehavior.id != behavior.id) {\r\n $scope.researchSettings.tradingBehavior = behavior;\r\n }\r\n }\r\n\r\n function toggleScreenerAdvancedMarketSettings(row)\r\n {\r\n if(row.advancedSettingsVisible) {\r\n row.advancedSettingsVisible = false;\r\n row.conditions = [];\r\n } else {\r\n row.advancedSettingsVisible = true;\r\n if(row.conditions.length == 0) {\r\n row.conditions.push({\r\n betType: null,\r\n operator: null,\r\n value: null,\r\n wagerType: null\r\n });\r\n }\r\n }\r\n }\r\n\r\n function addScreenerMarketQuery()\r\n {\r\n $scope.researchSettings.markets.rows.push({\r\n sport: null,\r\n advancedSettingsVisible: false,\r\n conditions: []\r\n });\r\n }\r\n\r\n function deleteScreenerMarketQuery(index)\r\n {\r\n $scope.researchSettings.markets.rows.splice(index, 1);\r\n }\r\n\r\n function addScreenerMarketQueryCondition(row)\r\n {\r\n row.conditions.push({\r\n betType: null,\r\n operator: null,\r\n value: null,\r\n wagerType: null\r\n });\r\n }\r\n\r\n function foo(row, index)\r\n {\r\n console.log(index);\r\n console.log(row);\r\n }\r\n\r\n function deleteScreenerMarketQueryCondition(row, index)\r\n {\r\n row.conditions.splice(index, 1);\r\n if(row.conditions.length == 0) {\r\n row.advancedSettingsVisible = false;\r\n }\r\n }\r\n\r\n function addScreenerAlert()\r\n {\r\n $scope.researchSettings.alerts.rows.push({\r\n betType: null,\r\n alertLevel: null,\r\n numberOfAlerts: null,\r\n operator: \">=\",\r\n range: null,\r\n conditionOperator: null\r\n });\r\n }\r\n\r\n function deleteScreenerAlert(index)\r\n {\r\n $scope.researchSettings.alerts.rows.splice(index, 1);\r\n if($scope.researchSettings.alerts.rows.length > 0) {\r\n $scope.researchSettings.alerts.rows[$scope.researchSettings.alerts.rows.length - 1].conditionOperator = null; // remove the last condition operator\r\n }\r\n }\r\n\r\n function screenerAlertOperatorSelected(index, operator, ranges)\r\n {\r\n //console.log('index: ' + index + ' market queries:' + vm.marketForm.conditions.length);\r\n if(index == ($scope.researchSettings.alerts.rows.length - 1)) { // last record\r\n if(operator.id != null) {\r\n // add another record\r\n $scope.researchSettings.alerts.rows.push({\r\n betType: null,\r\n alertLevel: null,\r\n numberOfAlerts: null,\r\n operator: \">=\",\r\n range: null,\r\n conditionOperator: null\r\n });\r\n }\r\n } else if(index < ($scope.researchSettings.alerts.rows.length - 1) && operator.id == null) {\r\n // remove all the items below\r\n var nextIndex = (index + 1);\r\n var numOfItems = ($scope.researchSettings.alerts.rows.length - 1) - index;\r\n $scope.researchSettings.alerts.rows.splice(nextIndex, numOfItems);\r\n }\r\n }\r\n\r\n function changeScreenerMarketGrouping(grouping)\r\n {\r\n if(grouping.id != $scope.researchSettings.marketGrouping.id) {\r\n $scope.researchSettings.marketGrouping = grouping;\r\n // clear all old alerts\r\n $scope.researchSettings.alerts.rows = [];\r\n }\r\n }\r\n\r\n function deleteScreenerMarketQuery(ev, index)\r\n {\r\n\r\n var confirm = $mdDialog.confirm()\r\n .title('Delete Market')\r\n .textContent('Are you sure you want to delete this market?')\r\n .ariaLabel('Delete Market')\r\n .targetEvent(ev)\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .ok('Yes')\r\n .cancel('No');\r\n\r\n $mdDialog.show(confirm).then(function() {\r\n $scope.researchSettings.markets.rows.splice(index, 1);\r\n }, function() {\r\n });\r\n }\r\n\r\n function exitScreenerWizard(ev, callback)\r\n {\r\n var confirm = $mdDialog.confirm()\r\n .title('Exit Screener')\r\n .textContent('Are you sure you want to close your current screener?')\r\n .ariaLabel('Exit Screener')\r\n .targetEvent(ev)\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .ok('Yes')\r\n .cancel('No');\r\n\r\n $mdDialog.show(confirm).then(function() {\r\n callback(ev);\r\n }, function() {\r\n\r\n });\r\n\r\n }\r\n //\r\n\r\n //\r\n /*function checkResearchSettingsChanged()\r\n {\r\n if(!angular.equals(vm.originalResearchSettings, $scope.researchSettings)) {\r\n vm.researchSettingsChanged = true;\r\n }\r\n\r\n // check the arrays too\r\n if(!vm.researchSettingsChanged) {\r\n if(vm.originalResearchSettings.markets.rows.length == $scope.researchSettings.markets.rows.length) {\r\n for(var i=0;i<$scope.researchSettings.markets.rows.length;i++) {\r\n if(!angular.equals(vm.originalResearchSettings.markets.rows[i], $scope.researchSettings.markets.rows[i])) {\r\n vm.researchSettingsChanged = true;\r\n break;\r\n }\r\n }\r\n } else {\r\n vm.researchSettingsChanged = true;\r\n }\r\n }\r\n\r\n if(!vm.researchSettingsChanged) {\r\n if (vm.originalResearchSettings.alerts.rows.length == $scope.researchSettings.alerts.rows.length) {\r\n for (var i = 0; i < $scope.researchSettings.alerts.rows.length; i++) {\r\n if (!angular.equals(vm.originalResearchSettings.alerts.rows[i], $scope.researchSettings.alerts.rows[i])) {\r\n vm.researchSettingsChanged = true;\r\n break;\r\n }\r\n }\r\n } else {\r\n vm.researchSettingsChanged = true;\r\n }\r\n }\r\n }*/\r\n\r\n function getAmChartByID(id)\r\n {\r\n var allCharts = AmCharts.charts;\r\n for (var i = 0; i < allCharts.length; i++) {\r\n if(allCharts[i].div) {\r\n if (id == allCharts[i].div.id) {\r\n return allCharts[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n function togglePanelContent(event)\r\n {\r\n var target = angular.element(event.target);\r\n var panel = $(target).parents('.wl-panel');\r\n panel.toggleClass('collapsed');\r\n\r\n }\r\n\r\n function getSelectedMarketGroupingMatchLength()\r\n {\r\n return $scope.selectedMarketGrouping.values[$scope.selectedMarketGrouping.values.length - 1];\r\n }\r\n\r\n function goHome()\r\n {\r\n $state.go(\"app.research\", { home: true, newScreener: false, screener: null });\r\n }\r\n\r\n function goToScreeners()\r\n {\r\n $state.go(\"app.screener\");\r\n }\r\n\r\n function resetHomeState()\r\n {\r\n setDefaultResearchSettings();\r\n if (ResearchData.matches.length > 0) {\r\n $scope.upcomingMatches.init(ResearchData.matches, ResearchData.matchCount);\r\n }\r\n }\r\n //\r\n }\r\n})();\r\n\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.papertrade')\r\n .controller('PapertradeController', PapertradeController);\r\n\r\n /** @ngInject */\r\n function PapertradeController($rootScope, $scope, api, $mdDialog, $mdMedia, $mdToast, $document, $analytics, $cacheFactory, wlUtil, PaperTradeData, PaperTradesList, ConstantsData)\r\n {\r\n // Data\r\n var vm = this;\r\n vm.title = \"Paper Trades\";\r\n vm.paperTradesList = PaperTradesList;\r\n vm.papertrades = PaperTradesList.paperTrades;\r\n vm.paperTradeData = PaperTradeData;\r\n vm.constants = ConstantsData;\r\n vm.isScreenLTESm = false;\r\n vm.loadingPaperTrades = false;\r\n\r\n vm.reportRanges = [\r\n {\r\n key: \"all\",\r\n name: \"All\"\r\n },\r\n {\r\n key: \"today\",\r\n name: \"Today\"\r\n },\r\n {\r\n key: \"week\",\r\n name: \"This week\"\r\n },\r\n {\r\n key: \"month\",\r\n name: \"This month\"\r\n },\r\n {\r\n key: \"year\",\r\n name: \"This year\"\r\n }\r\n ];\r\n\r\n vm.criteria = {\r\n limit: 10,\r\n page: 1,\r\n range: vm.reportRanges[0]\r\n };\r\n\r\n\r\n vm.paginator = new Array();\r\n setPaginator();\r\n\r\n if($mdMedia('xs') || $mdMedia('sm')) {\r\n vm.isScreenLTESm = true;\r\n }\r\n\r\n setPaperTradesOddsType();\r\n setPaperTradesSpreadInfo();\r\n\r\n //console.log(vm.papertrades);\r\n //console.log($rootScope.appData.matchStatuses);\r\n\r\n vm.tradeTotals = {\r\n volume: 0,\r\n earned: 0\r\n };\r\n\r\n vm.tradeTotals.volume = vm.paperTradesList.totalVolume;\r\n vm.tradeTotals.earned = vm.paperTradesList.totalEarned;\r\n\r\n // Methods\r\n vm.getMatchStatusById = getMatchStatusById;\r\n vm.editPaperTrade = editPaperTrade;\r\n vm.getAlertLevel = wlUtil.getAlertLevel;\r\n vm.getPaperTrades = getPaperTrades;\r\n vm.getPaperTradesByRange = getPaperTradesByRange;\r\n vm.togglePaperTradeWolfline = togglePaperTradeWolfline;\r\n vm.refreshPaperTrades = refreshPaperTrades;\r\n vm.pagePaperTradeResults = pagePaperTradeResults;\r\n vm.changeCriteriaLimit = changeCriteriaLimit;\r\n vm.getTradingBehaviorIndicator = wlUtil.getTradingBehaviorIndicator;\r\n vm.getTotalsTradingBehaviorIndicator = wlUtil.getTotalsTradingBehaviorIndicator;\r\n\r\n function editPaperTrade(ev, papertrade)\r\n {\r\n $mdDialog.show({\r\n controller : 'PaperTradeDialogController',\r\n controllerAs : 'vm',\r\n templateUrl : 'app/main/papertrade/dialogs/papertrade/papertrade-dialog.html',\r\n parent : angular.element($document.body),\r\n targetEvent : ev,\r\n clickOutsideToClose: true,\r\n locals : {\r\n event: ev,\r\n betTypes: PaperTradeData.oddsTypes,\r\n spreadTeams: PaperTradeData.spreadTeams,\r\n spreadWagerTypes: PaperTradeData.spreadWagerTypes,\r\n totalsWagerTypes: PaperTradeData.totalsWagerTypes,\r\n moneylineWagerTypes: PaperTradeData.wagerTypes,\r\n marketGroupings: PaperTradeData.marketGroupings,\r\n tradingBehaviors: PaperTradeData.tradingBehaviors,\r\n papertrade: papertrade,\r\n constants: ConstantsData\r\n }\r\n });\r\n }\r\n\r\n function changeCriteriaLimit(limit) {\r\n vm.criteria.page = 1;\r\n vm.criteria.limit = limit;\r\n getPaperTrades();\r\n }\r\n\r\n function getPaperTrades()\r\n {\r\n //console.log(vm.criteria);\r\n vm.loadingPaperTrades = true;\r\n api.papertrade.range.get({ range: vm.criteria.range.key, page: vm.criteria.page, limit: vm.criteria.limit },\r\n function(response)\r\n {\r\n //console.log(response);\r\n vm.paperTradesList = response;\r\n vm.papertrades = response.paperTrades;\r\n setPaperTradesOddsType();\r\n setPaperTradesSpreadInfo();\r\n setPaginator();\r\n vm.tradeTotals.volume = response.totalVolume;\r\n vm.tradeTotals.earned = response.totalEarned;\r\n vm.loadingPaperTrades = false;\r\n },\r\n function(response)\r\n {\r\n $mdToast.show(\r\n $mdToast.simple()\r\n .textContent($rootScope.constants.errors.default)\r\n .position('top right')\r\n .hideDelay(3000)\r\n );\r\n vm.loadingPaperTrades = false;\r\n }\r\n );\r\n\r\n }\r\n\r\n function getPaperTradesByRange(range)\r\n {\r\n vm.criteria.page = 1;\r\n vm.criteria.range = range;\r\n vm.tradeTotals.volume = null;\r\n vm.tradeTotals.earned = null;\r\n getPaperTrades();\r\n }\r\n\r\n function setPaginator() {\r\n //console.log(vm.paperTradesList);\r\n //console.log(vm.criteria);\r\n vm.paginator = new Array();\r\n if(vm.paperTradesList.paperTradeCount > vm.criteria.limit) {\r\n\r\n var pageCount = Math.ceil(vm.paperTradesList.paperTradeCount / vm.criteria.limit);\r\n for(var i=0;i< pageCount;i++) {\r\n vm.paginator.push({ active: false, page: (i + 1) })\r\n }\r\n\r\n }\r\n }\r\n\r\n function setPaperTradesOddsType()\r\n {\r\n //console.log(vm.papertrades);\r\n for(var i=0;i 1) {\r\n vm.step--;\r\n }\r\n }\r\n\r\n function nextStep()\r\n {\r\n vm.step++;\r\n }\r\n\r\n function test()\r\n {\r\n console.log(vm.selectedSubscription)\r\n console.log(vm.selectedSubscriptionID)\r\n\r\n if(vm.existingCreditCard != null && vm.selectedSubscriptionID != null)\r\n {\r\n console.log(vm.subscriptions)\r\n // vm.selectedSubscription = vm.subscriptions.find(x => x.id === vm.selectedSubscriptionID)\r\n console.log(vm.selectedSubscription)\r\n\r\n return true\r\n }\r\n else{\r\n return false\r\n }\r\n }\r\n\r\n function reviewCheckout()\r\n {\r\n // vm.cart.creditCardID = vm.existingCreditCard.id;\r\n // vm.cart.creditCard = vm.existingCreditCard;\r\n vm.cart.items = [];\r\n // vm.selectedSubscription = vm.subscriptions.find(x => x.id === vm.selectedSubscriptionID)\r\n\r\n vm.selectedSubscription = vm.subscriptions.find(function(x){\r\n return x.id == vm.selectedSubscriptionID\r\n });\r\n\r\n vm.cart.items.push(vm.selectedSubscription);\r\n vm.cart.update();\r\n\r\n sessionStorage.selectedSubscription = JSON.stringify(vm.selectedSubscription);\r\n\r\n nextStep();\r\n }\r\n\r\n $scope.checkoutRedirect = function(paypalSubscriptionID) {\r\n // console.log(paypalSubscriptionID)\r\n var profileInfo = {\r\n email: $rootScope.user.email,\r\n timezone: $rootScope.user.timezone,\r\n paypalSubscriptionID: paypalSubscriptionID,\r\n subscriptionStatus: 0\r\n };\r\n //save to user\r\n api.user.editSubscriptionPlan.update(profileInfo,\r\n function(response)\r\n {\r\n // console.log('success')\r\n // console.log(response)\r\n // console.log('logout')\r\n\r\n delete $window.sessionStorage.token;\r\n delete $window.sessionStorage.user;\r\n var $httpDefaultCache = $cacheFactory.get('$http');\r\n $httpDefaultCache.removeAll();\r\n $rootScope.screenerSummary = null;\r\n $rootScope.user = null;\r\n\r\n $state.go(\"app.pages_auth_login\");\r\n },\r\n function(response)\r\n {\r\n // console.log('error')\r\n // console.log(response)\r\n }\r\n );\r\n // $state.go(\"app.research\");\r\n }\r\n\r\n function useNewCreditCard()\r\n {\r\n vm.selectedSubscription = vm.subscriptions.find(function(x){\r\n return x.id == vm.selectedSubscriptionID\r\n });\r\n vm.cart.items = [];\r\n vm.cart.items.push(vm.selectedSubscription);\r\n vm.cart.update();\r\n\r\n vm.cart.creditCardID = null;\r\n vm.cart.creditCard = {\r\n description: vm.creditCardForm.description,\r\n firstName: vm.creditCardForm.firstName,\r\n lastName: vm.creditCardForm.lastName,\r\n company: vm.creditCardForm.company,\r\n billingAddress: {\r\n streetAddress: vm.creditCardForm.address1,\r\n streetAddress2: vm.creditCardForm.address2,\r\n city: vm.creditCardForm.city,\r\n province: vm.creditCardForm.province,\r\n postalCode: vm.creditCardForm.postalCode,\r\n countryID: vm.creditCardForm.country.id\r\n },\r\n cardType: vm.creditCardForm.cardType.id,\r\n expirationMonth: vm.creditCardForm.cardExpirationMonth,\r\n expirationYear: vm.creditCardForm.cardExpirationYear,\r\n cardNumber: vm.creditCardForm.cardNumber,\r\n cardCvv: vm.creditCardForm.cardCvv,\r\n userID: $rootScope.user.id,\r\n default: vm.creditCardForm.defaultCard,\r\n lastFour: vm.creditCardForm.cardNumber.substr(vm.creditCardForm.cardNumber.length - 4, 4)\r\n };\r\n\r\n nextStep();\r\n }\r\n\r\n function checkout()\r\n {\r\n var productIds = [];\r\n\r\n for(var i=0;i');\r\n\r\n // Panel open status\r\n scope.panelOpen = scope.panelOpen || false;\r\n\r\n /**\r\n * Toggle options panel\r\n */\r\n function toggleOptionsPanel()\r\n {\r\n if ( scope.panelOpen )\r\n {\r\n closeOptionsPanel();\r\n }\r\n else\r\n {\r\n openOptionsPanel();\r\n }\r\n }\r\n\r\n function openOptionsPanel()\r\n {\r\n // Set panelOpen status\r\n scope.panelOpen = true;\r\n\r\n // Add open class\r\n iElement.addClass('open');\r\n\r\n // Append the backdrop\r\n bodyEl.append(backdropEl);\r\n\r\n // Register the event\r\n backdropEl.on('click touch', closeOptionsPanel);\r\n }\r\n\r\n /**\r\n * Close options panel\r\n */\r\n function closeOptionsPanel()\r\n {\r\n // Set panelOpen status\r\n scope.panelOpen = false;\r\n\r\n // Remove open class\r\n iElement.removeClass('open');\r\n\r\n // De-register the event\r\n backdropEl.off('click touch', closeOptionsPanel);\r\n\r\n // Remove the backdrop\r\n backdropEl.remove();\r\n }\r\n\r\n // Expose the toggle function\r\n scope.toggleOptionsPanel = toggleOptionsPanel;\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('fuseTheming', fuseThemingProvider);\r\n\r\n /** @ngInject */\r\n function fuseThemingProvider()\r\n {\r\n // Inject Cookies Service\r\n var $cookies;\r\n\r\n angular.injector(['ngCookies']).invoke([\r\n '$cookies', function (_$cookies)\r\n {\r\n $cookies = _$cookies;\r\n }\r\n ]);\r\n\r\n // Inject $log service\r\n var $log = angular.injector(['ng']).get('$log');\r\n\r\n var registeredPalettes,\r\n registeredThemes;\r\n\r\n // Methods\r\n this.setRegisteredPalettes = setRegisteredPalettes;\r\n this.setRegisteredThemes = setRegisteredThemes;\r\n\r\n //////////\r\n\r\n /**\r\n * Set registered palettes\r\n *\r\n * @param _registeredPalettes\r\n */\r\n function setRegisteredPalettes(_registeredPalettes)\r\n {\r\n registeredPalettes = _registeredPalettes;\r\n }\r\n\r\n /**\r\n * Set registered themes\r\n *\r\n * @param _registeredThemes\r\n */\r\n function setRegisteredThemes(_registeredThemes)\r\n {\r\n registeredThemes = _registeredThemes;\r\n }\r\n\r\n /**\r\n * Service\r\n */\r\n this.$get = function ()\r\n {\r\n var service = {\r\n getRegisteredPalettes: getRegisteredPalettes,\r\n getRegisteredThemes : getRegisteredThemes,\r\n setActiveTheme : setActiveTheme,\r\n setThemesList : setThemesList,\r\n themes : {\r\n list : {},\r\n active: {\r\n 'name' : '',\r\n 'theme': {}\r\n }\r\n }\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Get registered palettes\r\n *\r\n * @returns {*}\r\n */\r\n function getRegisteredPalettes()\r\n {\r\n return registeredPalettes;\r\n }\r\n\r\n /**\r\n * Get registered themes\r\n *\r\n * @returns {*}\r\n */\r\n function getRegisteredThemes()\r\n {\r\n return registeredThemes;\r\n }\r\n\r\n /**\r\n * Set active theme\r\n *\r\n * @param themeName\r\n */\r\n function setActiveTheme(themeName)\r\n {\r\n // If theme does not exist, fallback to the default theme\r\n if ( angular.isUndefined(service.themes.list[themeName]) )\r\n {\r\n // If there is no theme called \"default\"...\r\n if ( angular.isUndefined(service.themes.list.default) )\r\n {\r\n $log.error('You must have at least one theme named \"default\"');\r\n return;\r\n }\r\n\r\n $log.warn('The theme \"' + themeName + '\" does not exist! Falling back to the \"default\" theme.');\r\n\r\n // Otherwise set theme to default theme\r\n service.themes.active.name = 'default';\r\n service.themes.active.theme = service.themes.list.default;\r\n $cookies.put('selectedTheme', service.themes.active.name);\r\n\r\n return;\r\n }\r\n\r\n service.themes.active.name = themeName;\r\n service.themes.active.theme = service.themes.list[themeName];\r\n $cookies.put('selectedTheme', themeName);\r\n }\r\n\r\n /**\r\n * Set available themes list\r\n *\r\n * @param themeList\r\n */\r\n function setThemesList(themeList)\r\n {\r\n service.themes.list = themeList;\r\n }\r\n };\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($mdThemingProvider, fusePalettes, fuseThemes, fuseThemingProvider)\r\n {\r\n // Inject Cookies Service\r\n var $cookies;\r\n angular.injector(['ngCookies']).invoke([\r\n '$cookies', function (_$cookies)\r\n {\r\n $cookies = _$cookies;\r\n }\r\n ]);\r\n\r\n // Check if custom theme exist in cookies\r\n var customTheme = $cookies.getObject('customTheme');\r\n if ( customTheme )\r\n {\r\n fuseThemes['custom'] = customTheme;\r\n }\r\n\r\n $mdThemingProvider.alwaysWatchTheme(true);\r\n\r\n // Define custom palettes\r\n angular.forEach(fusePalettes, function (palette)\r\n {\r\n $mdThemingProvider.definePalette(palette.name, palette.options);\r\n });\r\n\r\n // Register custom themes\r\n angular.forEach(fuseThemes, function (theme, themeName)\r\n {\r\n $mdThemingProvider.theme(themeName)\r\n .primaryPalette(theme.primary.name, theme.primary.hues)\r\n .accentPalette(theme.accent.name, theme.accent.hues)\r\n .warnPalette(theme.warn.name, theme.warn.hues)\r\n .backgroundPalette(theme.background.name, theme.background.hues);\r\n });\r\n\r\n // Store generated PALETTES and THEMES objects from $mdThemingProvider\r\n // in our custom provider, so we can inject them into other areas\r\n fuseThemingProvider.setRegisteredPalettes($mdThemingProvider._PALETTES);\r\n fuseThemingProvider.setRegisteredThemes($mdThemingProvider._THEMES);\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n var fuseThemes = {\r\n 'default' : {\"primary\":{\"name\":\"fuse-pale-blue\",\"hues\":{\"default\":\"700\",\"hue-1\":\"500\",\"hue-2\":\"600\",\"hue-3\":\"400\"}},\"accent\":{\"name\":\"indigo\",\"hues\":{\"default\":\"600\",\"hue-1\":\"400\",\"hue-2\":\"700\",\"hue-3\":\"A100\"}},\"warn\":{\"name\":\"red\",\"hues\":{\"default\":\"500\",\"hue-1\":\"300\",\"hue-2\":\"800\",\"hue-3\":\"A100\"}},\"background\":{\"name\":\"grey\",\"hues\":{\"default\":\"A100\",\"hue-1\":\"100\",\"hue-2\":\"50\",\"hue-3\":\"300\"}}},\r\n 'pink': {\r\n primary : {\r\n name: 'blue-grey',\r\n hues: {\r\n 'default': '800',\r\n 'hue-1' : '600',\r\n 'hue-2' : '400',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n accent : {\r\n name: 'pink',\r\n hues: {\r\n 'default': '400',\r\n 'hue-1' : '300',\r\n 'hue-2' : '600',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n warn : {name: 'blue'},\r\n background: {\r\n name: 'grey',\r\n hues: {\r\n 'default': 'A100',\r\n 'hue-1' : '100',\r\n 'hue-2' : '50',\r\n 'hue-3' : '300'\r\n }\r\n }\r\n },\r\n 'teal' : {\r\n primary : {\r\n name: 'fuse-blue',\r\n hues: {\r\n 'default': '900',\r\n 'hue-1' : '600',\r\n 'hue-2' : '500',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n accent : {\r\n name: 'teal',\r\n hues: {\r\n 'default': '500',\r\n 'hue-1' : '400',\r\n 'hue-2' : '600',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n warn : {name: 'deep-orange'},\r\n background: {\r\n name: 'grey',\r\n hues: {\r\n 'default': 'A100',\r\n 'hue-1' : '100',\r\n 'hue-2' : '50',\r\n 'hue-3' : '300'\r\n }\r\n }\r\n }\r\n };\r\n\r\n angular\r\n .module('app.core')\r\n .constant('fuseThemes', fuseThemes);\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n var fusePalettes = [\r\n {\r\n name: 'fuse-blue',\r\n options: {\r\n '50': '#ebf1fa',\r\n '100': '#c2d4ef',\r\n '200': '#9ab8e5',\r\n '300': '#78a0dc',\r\n '400': '#5688d3',\r\n '500': '#3470ca',\r\n '600': '#2e62b1',\r\n '700': '#275498',\r\n '800': '#21467e',\r\n '900': '#1a3865',\r\n 'A100': '#c2d4ef',\r\n 'A200': '#9ab8e5',\r\n 'A400': '#5688d3',\r\n 'A700': '#275498',\r\n 'contrastDefaultColor': 'light',\r\n 'contrastDarkColors': '50 100 200 A100',\r\n 'contrastStrongLightColors': '300 400'\r\n }\r\n },\r\n {\r\n name: 'fuse-pale-blue',\r\n options: {\r\n '50': '#ececee',\r\n '100': '#c5c6cb',\r\n '200': '#9ea1a9',\r\n '300': '#7d818c',\r\n '400': '#5c616f',\r\n '500': '#3c4252',\r\n '600': '#353a48',\r\n '700': '#2d323e',\r\n '800': '#262933',\r\n '900': '#1e2129',\r\n 'A100': '#c5c6cb',\r\n 'A200': '#9ea1a9',\r\n 'A400': '#5c616f',\r\n 'A700': '#2d323e',\r\n 'contrastDefaultColor': 'light',\r\n 'contrastDarkColors': '50 100 200 A100',\r\n 'contrastStrongLightColors': '300 400'\r\n }\r\n }\r\n ];\r\n\r\n angular\r\n .module('app.core')\r\n .constant('fusePalettes', fusePalettes);\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('fuseGenerator', fuseGeneratorService);\r\n\r\n /** @ngInject */\r\n function fuseGeneratorService($cookies, $log, fuseTheming)\r\n {\r\n // Storage for simplified themes object\r\n var themes = {};\r\n\r\n var service = {\r\n generate: generate,\r\n rgba : rgba\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Generate less variables for each theme from theme's\r\n * palette by using material color naming conventions\r\n */\r\n function generate()\r\n {\r\n var registeredThemes = fuseTheming.getRegisteredThemes();\r\n var registeredPalettes = fuseTheming.getRegisteredPalettes();\r\n\r\n // First, create a simplified object that stores\r\n // all registered themes and their colors\r\n\r\n // Iterate through registered themes\r\n angular.forEach(registeredThemes, function (registeredTheme)\r\n {\r\n themes[registeredTheme.name] = {};\r\n\r\n // Iterate through color types (primary, accent, warn & background)\r\n angular.forEach(registeredTheme.colors, function (colorType, colorTypeName)\r\n {\r\n themes[registeredTheme.name][colorTypeName] = {\r\n 'name' : colorType.name,\r\n 'levels': {\r\n 'default': {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues.default].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 4)\r\n },\r\n 'hue1' : {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 4)\r\n },\r\n 'hue2' : {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 4)\r\n },\r\n 'hue3' : {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 4)\r\n }\r\n }\r\n };\r\n });\r\n });\r\n\r\n // Process themes one more time and then store them in the service for external use\r\n processAndStoreThemes(themes);\r\n\r\n // Iterate through simplified themes\r\n // object and create style variables\r\n var styleVars = {};\r\n\r\n // Iterate through registered themes\r\n angular.forEach(themes, function (theme, themeName)\r\n {\r\n styleVars = {};\r\n styleVars['@themeName'] = themeName;\r\n\r\n // Iterate through color types (primary, accent, warn & background)\r\n angular.forEach(theme, function (colorTypes, colorTypeName)\r\n {\r\n // Iterate through color levels (default, hue1, hue2 & hue3)\r\n angular.forEach(colorTypes.levels, function (colors, colorLevelName)\r\n {\r\n // Iterate through color name (color, contrast1, contrast2, contrast3 & contrast4)\r\n angular.forEach(colors, function (color, colorName)\r\n {\r\n styleVars['@' + colorTypeName + ucfirst(colorLevelName) + ucfirst(colorName)] = color;\r\n });\r\n });\r\n });\r\n\r\n // Render styles\r\n render(styleVars);\r\n });\r\n }\r\n\r\n // ---------------------------\r\n // INTERNAL HELPER FUNCTIONS\r\n // ---------------------------\r\n\r\n /**\r\n * Process and store themes for global use\r\n *\r\n * @param _themes\r\n */\r\n function processAndStoreThemes(_themes)\r\n {\r\n // Here we will go through every registered theme one more time\r\n // and try to simplify their objects as much as possible for\r\n // easier access to their properties.\r\n var themes = angular.copy(_themes);\r\n\r\n // Iterate through themes\r\n angular.forEach(themes, function (theme)\r\n {\r\n // Iterate through color types (primary, accent, warn & background)\r\n angular.forEach(theme, function (colorType, colorTypeName)\r\n {\r\n theme[colorTypeName] = colorType.levels;\r\n theme[colorTypeName].color = colorType.levels.default.color;\r\n theme[colorTypeName].contrast1 = colorType.levels.default.contrast1;\r\n theme[colorTypeName].contrast2 = colorType.levels.default.contrast2;\r\n theme[colorTypeName].contrast3 = colorType.levels.default.contrast3;\r\n theme[colorTypeName].contrast4 = colorType.levels.default.contrast4;\r\n delete theme[colorTypeName].default;\r\n });\r\n });\r\n\r\n // Store themes and set selected theme for the first time\r\n fuseTheming.setThemesList(themes);\r\n\r\n // Remember selected theme.\r\n var selectedTheme = $cookies.get('selectedTheme');\r\n\r\n if ( selectedTheme )\r\n {\r\n fuseTheming.setActiveTheme(selectedTheme);\r\n }\r\n else\r\n {\r\n fuseTheming.setActiveTheme('default');\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Render css files\r\n *\r\n * @param styleVars\r\n */\r\n function render(styleVars)\r\n {\r\n var cssTemplate = '[md-theme=\"@themeName\"] a {\\n color: @accentDefaultColor;\\n}\\n\\n[md-theme=\"@themeName\"] .secondary-text,\\n[md-theme=\"@themeName\"] .icon {\\n color: @backgroundDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .hint-text,\\n[md-theme=\"@themeName\"] .disabled-text {\\n color: @backgroundDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .fade-text,\\n[md-theme=\"@themeName\"] .divider {\\n color: @backgroundDefaultContrast4;\\n}\\n\\n/* Primary */\\n[md-theme=\"@themeName\"] .md-primary-bg {\\n background-color: @primaryDefaultColor;\\n color: @primaryDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg .icon {\\n color: @primaryDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg .disabled-text {\\n color: @primaryDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg .divider {\\n color: @primaryDefaultContrast4;\\n}\\n\\n/* Primary, Hue-1 */\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 {\\n background-color: @primaryHue1Color;\\n color: @primaryHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .icon {\\n color: @primaryHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .disabled-text {\\n color: @primaryHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .divider {\\n color: @primaryHue1Contrast4;\\n}\\n\\n/* Primary, Hue-2 */\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 {\\n background-color: @primaryHue2Color;\\n color: @primaryHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .icon {\\n color: @primaryHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .disabled-text {\\n color: @primaryHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .divider {\\n color: @primaryHue2Contrast4;\\n}\\n\\n/* Primary, Hue-3 */\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 {\\n background-color: @primaryHue3Color;\\n color: @primaryHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .icon {\\n color: @primaryHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .disabled-text {\\n color: @primaryHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .divider {\\n color: @primaryHue3Contrast4;\\n}\\n\\n/* Primary foreground */\\n[md-theme=\"@themeName\"] .md-primary-fg {\\n color: @primaryDefaultColor !important;\\n}\\n\\n/* Primary foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-primary-fg.md-hue-1 {\\n color: @primaryHue1Color !important;\\n}\\n\\n/* Primary foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-primary-fg.md-hue-2 {\\n color: @primaryHue2Color !important;\\n}\\n\\n/* Primary foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-primary-fg.md-hue-3 {\\n color: @primaryHue3Color !important;\\n}\\n\\n\\n/* Accent */\\n[md-theme=\"@themeName\"] .md-accent-border {\\n border:solid 1px @accentDefaultColor !important;\\n}\\n[md-theme=\"@themeName\"] .md-accent-bg {\\n background-color: @accentDefaultColor;\\n color: @accentDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg .icon {\\n color: @accentDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg .disabled-text {\\n color: @accentDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg .divider {\\n color: @accentDefaultContrast4;\\n}\\n\\n/* Accent, Hue-1 */\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 {\\n background-color: @accentHue1Color;\\n color: @accentHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .icon {\\n color: @accentHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .disabled-text {\\n color: @accentHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .divider {\\n color: @accentHue1Contrast4;\\n}\\n\\n/* Accent, Hue-2 */\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 {\\n background-color: @accentHue2Color;\\n color: @accentHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .icon {\\n color: @accentHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .disabled-text {\\n color: @accentHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .divider {\\n color: @accentHue2Contrast4;\\n}\\n\\n/* Accent, Hue-3 */\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 {\\n background-color: @accentHue3Color;\\n color: @accentHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .icon {\\n color: @accentHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .disabled-text {\\n color: @accentHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .divider {\\n color: @accentHue3Contrast4;\\n}\\n\\n/* Accent foreground */\\n[md-theme=\"@themeName\"] .md-accent-fg {\\n color: @accentDefaultColor !important;\\n}\\n\\n/* Accent foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-accent-fg.md-hue-1 {\\n color: @accentHue1Color !important;\\n}\\n\\n/* Accent foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-accent-fg.md-hue-2 {\\n color: @accentHue2Color !important;\\n}\\n\\n/* Accent foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-accent-fg.md-hue-3 {\\n color: @accentHue3Color !important;\\n}\\n\\n\\n/* Warn */\\n[md-theme=\"@themeName\"] .md-warn-bg {\\n background-color: @warnDefaultColor;\\n color: @warnDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg .icon {\\n color: @warnDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg .disabled-text {\\n color: @warnDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg .divider {\\n color: @warnDefaultContrast4;\\n}\\n\\n/* Warn, Hue-1 */\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 {\\n background-color: @warnHue1Color;\\n color: @warnHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .icon {\\n color: @warnHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .disabled-text {\\n color: @warnHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .divider {\\n color: @warnHue1Contrast4;\\n}\\n\\n/* Warn, Hue-2 */\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 {\\n background-color: @warnHue2Color;\\n color: @warnHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .icon {\\n color: @warnHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .disabled-text {\\n color: @warnHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .divider {\\n color: @warnHue2Contrast4;\\n}\\n\\n/* Warn, Hue-3 */\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 {\\n background-color: @warnHue3Color;\\n color: @warnHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .icon {\\n color: @warnHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .disabled-text {\\n color: @warnHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .divider {\\n color: @warnHue3Contrast4;\\n}\\n\\n/* Warn foreground */\\n[md-theme=\"@themeName\"] .md-warn-fg {\\n color: @warnDefaultColor !important;\\n}\\n\\n/* Warn foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-warn-fg.md-hue-1 {\\n color: @warnHue1Color !important;\\n}\\n\\n/* Warn foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-warn-fg.md-hue-2 {\\n color: @warnHue2Color !important;\\n}\\n\\n/* Warn foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-warn-fg.md-hue-3 {\\n color: @warnHue3Color !important;\\n}\\n\\n/* Background */\\n[md-theme=\"@themeName\"] .md-background-bg {\\n background-color: @backgroundDefaultColor;\\n color: @backgroundDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg .icon {\\n color: @backgroundDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg .disabled-text {\\n color: @backgroundDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg .divider {\\n color: @backgroundDefaultContrast4;\\n}\\n\\n/* Background, Hue-1 */\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 {\\n background-color: @backgroundHue1Color;\\n color: @backgroundHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .icon {\\n color: @backgroundHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .disabled-text {\\n color: @backgroundHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .divider {\\n color: @backgroundHue1Contrast4;\\n}\\n\\n/* Background, Hue-2 */\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 {\\n background-color: @backgroundHue2Color;\\n color: @backgroundHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .icon {\\n color: @backgroundHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .disabled-text {\\n color: @backgroundHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .divider {\\n color: @backgroundHue2Contrast4;\\n}\\n\\n/* Background, Hue-3 */\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 {\\n background-color: @backgroundHue3Color;\\n color: @backgroundHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .icon {\\n color: @backgroundHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .disabled-text {\\n color: @backgroundHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .divider {\\n color: @backgroundHue3Contrast4;\\n}\\n\\n/* Background foreground */\\n[md-theme=\"@themeName\"] .md-background-fg {\\n color: @backgroundDefaultColor !important;\\n}\\n\\n/* Background foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-background-fg.md-hue-1 {\\n color: @backgroundHue1Color !important;\\n}\\n\\n/* Background foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-background-fg.md-hue-2 {\\n color: @backgroundHue2Color !important;\\n}\\n\\n/* Background foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-background-fg.md-hue-3 {\\n color: @backgroundHue3Color !important;\\n}';\r\n\r\n var regex = new RegExp(Object.keys(styleVars).join('|'), 'gi');\r\n var css = cssTemplate.replace(regex, function (matched)\r\n {\r\n return styleVars[matched];\r\n });\r\n\r\n var headEl = angular.element('head');\r\n var styleEl = angular.element('');\r\n styleEl.html(css);\r\n headEl.append(styleEl);\r\n }\r\n\r\n /**\r\n * Convert color array to rgb/rgba\r\n * Also apply contrasts if needed\r\n *\r\n * @param color\r\n * @param _contrastLevel\r\n * @returns {string}\r\n */\r\n function rgba(color, _contrastLevel)\r\n {\r\n var contrastLevel = _contrastLevel || false;\r\n\r\n // Convert 255,255,255,0.XX to 255,255,255\r\n // According to Google's Material design specs, white primary\r\n // text must have opacity of 1 and we will fix that here\r\n // because Angular Material doesn't care about that spec\r\n if ( color.length === 4 && color[0] === 255 && color[1] === 255 && color[2] === 255 )\r\n {\r\n color.splice(3, 4);\r\n }\r\n\r\n // If contrast level provided, apply it to the current color\r\n if ( contrastLevel )\r\n {\r\n color = applyContrast(color, contrastLevel);\r\n }\r\n\r\n // Convert color array to color string (rgb/rgba)\r\n if ( color.length === 3 )\r\n {\r\n return 'rgb(' + color.join(',') + ')';\r\n }\r\n else if ( color.length === 4 )\r\n {\r\n return 'rgba(' + color.join(',') + ')';\r\n }\r\n else\r\n {\r\n $log.error('Invalid number of arguments supplied in the color array: ' + color.length + '\\n' + 'The array must have 3 or 4 colors.');\r\n }\r\n }\r\n\r\n /**\r\n * Apply given contrast level to the given color\r\n *\r\n * @param color\r\n * @param contrastLevel\r\n */\r\n function applyContrast(color, contrastLevel)\r\n {\r\n var contrastLevels = {\r\n 'white': {\r\n '1': '1',\r\n '2': '0.7',\r\n '3': '0.3',\r\n '4': '0.12'\r\n },\r\n 'black': {\r\n '1': '0.87',\r\n '2': '0.54',\r\n '3': '0.26',\r\n '4': '0.12'\r\n }\r\n };\r\n\r\n // If white\r\n if ( color[0] === 255 && color[1] === 255 && color[2] === 255 )\r\n {\r\n color[3] = contrastLevels.white[contrastLevel];\r\n }\r\n // If black\r\n else if ( color[0] === 0 && color[1] === 0, color[2] === 0 )\r\n {\r\n color[3] = contrastLevels.black[contrastLevel];\r\n }\r\n\r\n return color;\r\n }\r\n\r\n /**\r\n * Uppercase first\r\n */\r\n function ucfirst(string)\r\n {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n }\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('wlUtil', wlUtil);\r\n\r\n /** @ngInject */\r\n function wlUtil($window, $mdMedia)\r\n {\r\n var service = {\r\n serialChartOptionDefaults: serialChartOptionDefaults,\r\n prepareMatchChartData: prepareMatchChartData,\r\n getAlertLevel: getAlertLevel,\r\n getAlertLevelByWolfline: getAlertLevelByWolfline,\r\n getMarketQueryColumns: getMarketQueryColumns,\r\n getAlertQueryColumns: getAlertQueryColumns,\r\n lookupEnumObjectByID: lookupEnumObjectByID,\r\n formatWolflineNumber: formatWolflineNumber,\r\n sumPropertyOfObjectArray: sumPropertyOfObjectArray,\r\n findById: findById,\r\n findBy: findBy,\r\n getTradingBehaviorIndicator: getTradingBehaviorIndicator,\r\n getTotalsTradingBehaviorIndicator: getTotalsTradingBehaviorIndicator,\r\n createNewScreenerName: createNewScreenerName,\r\n convertAmericanPriceToDecimal: convertAmericanPriceToDecimal,\r\n convertDecimalPriceToAmerican: convertDecimalPriceToAmerican\r\n };\r\n\r\n var greenLineColor = \"#5fb503\";\r\n var redLineColor = \"#FF0707\";\r\n\r\n return service;\r\n\r\n function serialChartOptionDefaults(options) {\r\n\r\n var defaultOptions = {\r\n type: \"serial\",\r\n pathToImages: '/bower_components/amcharts/dist/amcharts/images/',\r\n legend: {\r\n enabled: true\r\n },\r\n chartScrollbar: {\r\n enabled: false,\r\n },\r\n chartCursor: {\r\n cursorAlpha: 1,\r\n zoomable: false\r\n },\r\n categoryAxis: {\r\n gridPosition: \"start\",\r\n parseDates: false,\r\n axisAlpha: 0\r\n },\r\n balloon: {\r\n textAlign: \"left\"\r\n }\r\n\r\n };\r\n\r\n for(var i=0; i= 0) {\r\n chartData.totals.graphs[0].lineColor = greenLineColor;\r\n } else {\r\n chartData.totals.graphs[0].lineColor = redLineColor ;\r\n }\r\n\r\n //console.log(atsLineColors);\r\n //console.log(marketingGroup);\r\n //console.log(chartData);\r\n return chartData;\r\n }\r\n\r\n function getMatchVolatilityData(match, numberOfGames)\r\n {\r\n var data = {\r\n ats: [],\r\n totals: [],\r\n moneyline: []\r\n };\r\n\r\n if(match.homeCompetitorResults.length > 0 && match.awayCompetitorResults.length > 0) {\r\n var homeData = match.homeCompetitorResults.slice(0, numberOfGames).reverse(); // get the oldest match first\r\n var awayData = match.awayCompetitorResults.slice(0, numberOfGames).reverse();\r\n\r\n var matchesBack;\r\n for(var i=0; i= .80 && n <= 1.19 || n <= -.80 && n >= -1.19) {\r\n alert = 'low';\r\n } else if(n > 1.19 && n <= 1.59 || n < -1.19 && n >= -1.59) {\r\n alert = 'medium';\r\n } else if(n > 1.59 && n <= 2 || n < -1.59 && n >= -2) {\r\n alert = 'high';\r\n }\r\n\r\n return alert;\r\n }\r\n\r\n function getMarketQueryColumns()\r\n {\r\n var columns = [\r\n { title: 'Sport' },\r\n { title: 'League' },\r\n { title: 'Odds' }\r\n ];\r\n\r\n return columns;\r\n }\r\n\r\n function getAlertQueryColumns()\r\n {\r\n var columns = [\r\n {title: 'Odds'},\r\n {title: 'Alert'},\r\n {title: 'Range'},\r\n {title: 'Operator'}\r\n ];\r\n\r\n return columns;\r\n }\r\n\r\n function lookupEnumObjectByID(id, objects)\r\n {\r\n for(var i=0;i lastVolatilityRecord.awayVolatility) {\r\n indicator = 'A';\r\n } else if(lastVolatilityRecord.homeVolatility == lastVolatilityRecord.awayVolatility) {\r\n indicator = '-';\r\n } else {\r\n indicator = 'H';\r\n }\r\n } else { // momentum trading\r\n if(lastVolatilityRecord.homeVolatility > lastVolatilityRecord.awayVolatility) {\r\n indicator = 'H';\r\n } else if(lastVolatilityRecord.homeVolatility == lastVolatilityRecord.awayVolatility) {\r\n indicator = '-';\r\n } else {\r\n indicator = 'A';\r\n }\r\n }\r\n\r\n\r\n return indicator;\r\n }\r\n\r\n function getTotalsTradingBehaviorIndicator(value, tradingBehavior)\r\n {\r\n var indicator = '';\r\n value = parseFloat(value);\r\n\r\n if(tradingBehavior.id == 0) { // correction trading\r\n\r\n if (value > 0) {\r\n indicator = 'U';\r\n } else if(value === 0) {\r\n indicator = '-';\r\n } else {\r\n indicator = 'O';\r\n }\r\n } else { // momentum trading\r\n if (value > 0) {\r\n indicator = 'O';\r\n } else if(value === 0) {\r\n indicator = '-';\r\n } else {\r\n indicator = 'U';\r\n }\r\n }\r\n\r\n //console.log(value + ' ' + indicator);\r\n return indicator;\r\n }\r\n\r\n function createNewScreenerName(screeners, name, increment)\r\n {\r\n if (increment === undefined || increment === null) {\r\n increment = 0;\r\n }\r\n\r\n if(increment > 0) {\r\n var lastSuffix = ' (' + (increment - 1) + ')';\r\n var newSuffix = ' (' + increment + ')';\r\n if(name.indexOf(lastSuffix) >= 0) {\r\n name.replace(lastSuffix, newSuffix);\r\n } else {\r\n name += newSuffix;\r\n }\r\n }\r\n for(var i=0;i 0) {\r\n price = (price / 100) + 1;\r\n } else if(price < 0) {\r\n price = (100 / Math.abs(price)) + 1;\r\n } else {\r\n return price; // 0\r\n }\r\n\r\n return price.toFixed(2);\r\n }\r\n }\r\n\r\n function convertDecimalPriceToAmerican(price)\r\n {\r\n if(price) {\r\n price = parseFloat(price);\r\n if(price >= 2) {\r\n price = (price - 1) * 100;\r\n } else {\r\n price = -100/(price - 1);\r\n }\r\n\r\n return Math.round(price);\r\n\r\n }\r\n }\r\n }\r\n}());\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('msUtils', msUtils);\r\n\r\n /** @ngInject */\r\n function msUtils($window)\r\n {\r\n // Private variables\r\n var mobileDetect = new MobileDetect($window.navigator.userAgent),\r\n browserInfo = null;\r\n\r\n var service = {\r\n exists : exists,\r\n detectBrowser: detectBrowser,\r\n guidGenerator: guidGenerator,\r\n isMobile : isMobile,\r\n toggleInArray: toggleInArray\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Check if item exists in a list\r\n *\r\n * @param item\r\n * @param list\r\n * @returns {boolean}\r\n */\r\n function exists(item, list)\r\n {\r\n return list.indexOf(item) > -1;\r\n }\r\n\r\n /**\r\n * Returns browser information\r\n * from user agent data\r\n *\r\n * Found at http://www.quirksmode.org/js/detect.html\r\n * but modified and updated to fit for our needs\r\n */\r\n function detectBrowser()\r\n {\r\n // If we already tested, do not test again\r\n if ( browserInfo )\r\n {\r\n return browserInfo;\r\n }\r\n\r\n var browserData = [\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : \"Edge\",\r\n versionSearch: \"Edge\",\r\n identity : \"Edge\"\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString: \"Chrome\",\r\n identity : \"Chrome\"\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : \"OmniWeb\",\r\n versionSearch: \"OmniWeb/\",\r\n identity : \"OmniWeb\"\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString : \"Apple\",\r\n versionSearch: \"Version\",\r\n identity : \"Safari\"\r\n },\r\n {\r\n prop : $window.opera,\r\n identity: \"Opera\"\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString: \"iCab\",\r\n identity : \"iCab\"\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString: \"KDE\",\r\n identity : \"Konqueror\"\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString: \"Firefox\",\r\n identity : \"Firefox\"\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString: \"Camino\",\r\n identity : \"Camino\"\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString: \"Netscape\",\r\n identity : \"Netscape\"\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : \"MSIE\",\r\n identity : \"Explorer\",\r\n versionSearch: \"MSIE\"\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : \"Trident/7\",\r\n identity : \"Explorer\",\r\n versionSearch: \"rv\"\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : \"Gecko\",\r\n identity : \"Mozilla\",\r\n versionSearch: \"rv\"\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : \"Mozilla\",\r\n identity : \"Netscape\",\r\n versionSearch: \"Mozilla\"\r\n }\r\n ];\r\n\r\n var osData = [\r\n {\r\n string : $window.navigator.platform,\r\n subString: \"Win\",\r\n identity : \"Windows\"\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: \"Mac\",\r\n identity : \"Mac\"\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: \"Linux\",\r\n identity : \"Linux\"\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: \"iPhone\",\r\n identity : \"iPhone\"\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: \"iPod\",\r\n identity : \"iPod\"\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: \"iPad\",\r\n identity : \"iPad\"\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: \"Android\",\r\n identity : \"Android\"\r\n }\r\n ];\r\n\r\n var versionSearchString = '';\r\n\r\n function searchString(data)\r\n {\r\n for ( var i = 0; i < data.length; i++ )\r\n {\r\n var dataString = data[i].string;\r\n var dataProp = data[i].prop;\r\n\r\n versionSearchString = data[i].versionSearch || data[i].identity;\r\n\r\n if ( dataString )\r\n {\r\n if ( dataString.indexOf(data[i].subString) != -1 )\r\n {\r\n return data[i].identity;\r\n\r\n }\r\n }\r\n else if ( dataProp )\r\n {\r\n return data[i].identity;\r\n }\r\n }\r\n }\r\n\r\n function searchVersion(dataString)\r\n {\r\n var index = dataString.indexOf(versionSearchString);\r\n\r\n if ( index == -1 )\r\n {\r\n return;\r\n }\r\n\r\n return parseInt(dataString.substring(index + versionSearchString.length + 1));\r\n }\r\n\r\n var browser = searchString(browserData) || \"unknown-browser\";\r\n var version = searchVersion($window.navigator.userAgent) || searchVersion($window.navigator.appVersion) || \"unknown-version\";\r\n var os = searchString(osData) || \"unknown-os\";\r\n\r\n // Prepare and store the object\r\n browser = browser.toLowerCase();\r\n version = browser + '-' + version;\r\n os = os.toLowerCase();\r\n\r\n browserInfo = {\r\n browser: browser,\r\n version: version,\r\n os : os\r\n };\r\n\r\n return browserInfo;\r\n }\r\n\r\n /**\r\n * Generates a globally unique id\r\n *\r\n * @returns {*}\r\n */\r\n function guidGenerator()\r\n {\r\n var S4 = function ()\r\n {\r\n return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);\r\n };\r\n return (S4() + S4() + S4() + S4() + S4() + S4());\r\n }\r\n\r\n /**\r\n * Return if current device is a\r\n * mobile device or not\r\n */\r\n function isMobile()\r\n {\r\n return mobileDetect.mobile();\r\n }\r\n\r\n /**\r\n * Toggle in array (push or splice)\r\n *\r\n * @param item\r\n * @param array\r\n */\r\n function toggleInArray(item, array)\r\n {\r\n if ( array.indexOf(item) == -1 )\r\n {\r\n array.push(item);\r\n }\r\n else\r\n {\r\n array.splice(array.indexOf(item), 1);\r\n }\r\n }\r\n }\r\n}());\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('apiResolver', apiResolverService);\r\n\r\n /** @ngInject */\r\n function apiResolverService($q, $log, api)\r\n {\r\n var service = {\r\n resolve: resolve\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n /**\r\n * Resolve api\r\n * @param action\r\n * @param parameters\r\n */\r\n function resolve(action, parameters)\r\n {\r\n var actionParts = action.split('@'),\r\n resource = actionParts[0],\r\n method = actionParts[1],\r\n params = parameters || {};\r\n\r\n if ( !resource || !method )\r\n {\r\n $log.error('apiResolver.resolve requires correct action parameter (ResourceName@methodName)');\r\n return false;\r\n }\r\n\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // Get the correct api object from api service\r\n var apiObject = getApiObject(resource);\r\n\r\n if ( !apiObject )\r\n {\r\n $log.error('Resource \"' + resource + '\" is not defined in the api service!');\r\n deferred.reject('Resource \"' + resource + '\" is not defined in the api service!');\r\n }\r\n else\r\n {\r\n apiObject[method](params,\r\n\r\n // Success\r\n function (response)\r\n {\r\n deferred.resolve(response);\r\n },\r\n\r\n // Error\r\n function (response)\r\n {\r\n deferred.reject(response);\r\n }\r\n );\r\n }\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Get correct api object\r\n *\r\n * @param resource\r\n * @returns {*}\r\n */\r\n function getApiObject(resource)\r\n {\r\n // Split the resource in case if we have a dot notated object\r\n var resourceParts = resource.split('.'),\r\n apiObject = api;\r\n\r\n // Loop through the resource parts and go all the way through\r\n // the api object and return the correct one\r\n for ( var l = 0; l < resourceParts.length; l++ )\r\n {\r\n if ( angular.isUndefined(apiObject[resourceParts[l]]) )\r\n {\r\n $log.error('Resource part \"' + resourceParts[l] + '\" is not defined!');\r\n apiObject = false;\r\n break;\r\n }\r\n\r\n apiObject = apiObject[resourceParts[l]];\r\n }\r\n\r\n if ( !apiObject )\r\n {\r\n return false;\r\n }\r\n\r\n return apiObject;\r\n }\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('wolflineNumberAlert', wolflineNumberAlertFilter)\r\n .filter('toWolflineNumber', toWolflineNumberFilter)\r\n .filter('formatOdds', formatOddsFilter);\r\n\r\n function toWolflineNumberFilter()\r\n {\r\n return function(decimal)\r\n {\r\n if (decimal !== undefined || decimal !== null) {\r\n if (decimal != 0) {\r\n decimal = decimal.toFixed(2);\r\n if (decimal.charAt(0) == '0') {\r\n decimal = decimal.substr(1, decimal.length - 1);\r\n }\r\n }\r\n\r\n return decimal;\r\n }\r\n\r\n }\r\n }\r\n\r\n function wolflineNumberAlertFilter()\r\n {\r\n return function(n)\r\n {\r\n var alert = '';\r\n switch(n) {\r\n case 1:\r\n alert = 'low';\r\n break;\r\n case 2:\r\n alert = 'medium';\r\n break;\r\n case 3:\r\n alert = 'high';\r\n break;\r\n }\r\n return alert;\r\n }\r\n }\r\n\r\n function formatOddsFilter()\r\n {\r\n\r\n\r\n return function(price, type)\r\n {\r\n if(price) {\r\n price = parseFloat(price);\r\n if(price > 1) {\r\n if (type == 0) { // odds come in as decimal so convert if american/0\r\n if (price >= 2) {\r\n price = (price - 1) * 100;\r\n } else {\r\n price = -100 / (price - 1);\r\n }\r\n\r\n price = Math.round(price);\r\n if (price > 0) {\r\n price = '+' + price;\r\n }\r\n\r\n return price;\r\n } else {\r\n price = price.toFixed(3);\r\n }\r\n } else {\r\n\r\n price = null;\r\n }\r\n }\r\n\r\n return price;\r\n }\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('filterByTags', filterByTags)\r\n .filter('filterSingleByTags', filterSingleByTags);\r\n\r\n /** @ngInject */\r\n function filterByTags()\r\n {\r\n return function (items, tags)\r\n {\r\n if ( items.length === 0 || tags.length === 0 )\r\n {\r\n return items;\r\n }\r\n\r\n var filtered = [];\r\n\r\n items.forEach(function (item)\r\n {\r\n var match = tags.every(function (tag)\r\n {\r\n var tagExists = false;\r\n\r\n item.tags.forEach(function (itemTag)\r\n {\r\n if ( itemTag.name === tag.name )\r\n {\r\n tagExists = true;\r\n return;\r\n }\r\n });\r\n\r\n return tagExists;\r\n });\r\n\r\n if ( match )\r\n {\r\n filtered.push(item);\r\n }\r\n });\r\n\r\n return filtered;\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function filterSingleByTags()\r\n {\r\n return function (itemTags, tags)\r\n {\r\n if ( itemTags.length === 0 || tags.length === 0 )\r\n {\r\n return;\r\n }\r\n\r\n if ( itemTags.length < tags.length )\r\n {\r\n return [];\r\n }\r\n\r\n var filtered = [];\r\n\r\n var match = tags.every(function (tag)\r\n {\r\n var tagExists = false;\r\n\r\n itemTags.forEach(function (itemTag)\r\n {\r\n if ( itemTag.name === tag.name )\r\n {\r\n tagExists = true;\r\n return;\r\n }\r\n });\r\n\r\n return tagExists;\r\n });\r\n\r\n if ( match )\r\n {\r\n filtered.push(itemTags);\r\n }\r\n\r\n return filtered;\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('toTrusted', toTrustedFilter)\r\n .filter('htmlToPlaintext', htmlToPlainTextFilter)\r\n .filter('nospace', nospaceFilter)\r\n .filter('humanizeDoc', humanizeDocFilter)\r\n .filter('reverseArray', reverseArrayFilter)\r\n .filter('formatDate', formatDateFilter)\r\n .filter('log', logFilter)\r\n .filter('isEmptyObject', isEmptyObjectFilter)\r\n .filter('emptyToText', emptyToTextFilter)\r\n .filter('toMoney', toMoneyFilter)\r\n .filter('truncate', truncate);\r\n\r\n /** @ngInject */\r\n function toTrustedFilter($sce)\r\n {\r\n return function (value)\r\n {\r\n return $sce.trustAsHtml(value);\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function htmlToPlainTextFilter()\r\n {\r\n return function (text)\r\n {\r\n return String(text).replace(/<[^>]+>/gm, '');\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function nospaceFilter()\r\n {\r\n return function (value)\r\n {\r\n return (!value) ? '' : value.replace(/ /g, '');\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function humanizeDocFilter()\r\n {\r\n return function (doc)\r\n {\r\n if ( !doc )\r\n {\r\n return;\r\n }\r\n if ( doc.type === 'directive' )\r\n {\r\n return doc.name.replace(/([A-Z])/g, function ($1)\r\n {\r\n return '-' + $1.toLowerCase();\r\n });\r\n }\r\n return doc.label || doc.name;\r\n };\r\n }\r\n\r\n function reverseArrayFilter()\r\n {\r\n return function(a)\r\n {\r\n if(a) {\r\n if(a.length > 0) {\r\n return a.slice().reverse();\r\n } else {\r\n return a;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function formatDateFilter()\r\n {\r\n return function(dateString, timezone, format)\r\n {\r\n if(format === undefined || format === null) {\r\n format = \"MM-DD-YYYY hh:mmA\";\r\n }\r\n if(dateString && timezone) {\r\n return moment.utc(dateString).tz(timezone).format(format);\r\n }\r\n\r\n }\r\n }\r\n\r\n function logFilter()\r\n {\r\n return function(obj)\r\n {\r\n console.log(obj);\r\n }\r\n }\r\n\r\n function isEmptyObjectFilter() {\r\n return function(obj) {\r\n if(Object.keys(obj).length > 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n\r\n }\r\n }\r\n\r\n function emptyToTextFilter()\r\n {\r\n return function(val, emptyText)\r\n {\r\n if(val === undefined || val === null || val == '') {\r\n return emptyText;\r\n }\r\n\r\n return val;\r\n }\r\n }\r\n\r\n function toMoneyFilter()\r\n {\r\n return function(val)\r\n {\r\n if(val != null) {\r\n val = val.toFixed(2).replace(/(\\d)(?=(\\d{3})+\\.)/g, '$1,');\r\n }\r\n\r\n return val;\r\n }\r\n }\r\n\r\n function truncate()\r\n {\r\n return function(val, length, textAfter)\r\n {\r\n val = val.substring(0, length);\r\n if(textAfter !== undefined && textAfter !== null) {\r\n val += textAfter;\r\n }\r\n\r\n return val;\r\n }\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('odds', oddsDirective);\r\n\r\n /** @ngInject */\r\n function oddsDirective()\r\n {\r\n return {\r\n require:'ngModel',\r\n link:function (scope, elm, attrs, ctrl) {\r\n\r\n var oddsFormat = parseInt(attrs['oddsFormat']) || 0;\r\n var betType = parseInt(attrs['betType']) || 0;\r\n //console.log(oddsFormat);\r\n //console.log(betType);\r\n //console.log(attrs);\r\n\r\n ctrl.$formatters.unshift(function (price) {\r\n if(price && betType == 2) {\r\n\r\n price = parseFloat(price);\r\n if(price > 1) {\r\n if (oddsFormat == 0) { // odds come in as decimal so convert if american/0\r\n if (price >= 2) {\r\n price = (price - 1) * 100;\r\n } else {\r\n price = -100 / (price - 1);\r\n }\r\n\r\n price = Math.round(price);\r\n if (price > 0) {\r\n price = price;\r\n }\r\n\r\n return price;\r\n\r\n //return Math.abs(price);\r\n } else {\r\n price = price.toFixed(3);\r\n }\r\n } else {\r\n price = null;\r\n }\r\n }\r\n return price;\r\n });\r\n }\r\n };\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('hljs', hljsDirective);\r\n\r\n /** @ngInject */\r\n function hljsDirective($timeout, $q, $interpolate)\r\n {\r\n return {\r\n restrict: 'EA',\r\n compile : function (tElement, tAttrs)\r\n {\r\n var code;\r\n //No attribute? code is the content\r\n if ( !tAttrs.code )\r\n {\r\n code = tElement.html();\r\n tElement.empty();\r\n }\r\n\r\n return function (scope, iElement, iAttrs)\r\n {\r\n if ( iAttrs.code )\r\n {\r\n // Attribute? code is the evaluation\r\n code = scope.$eval(iAttrs.code);\r\n }\r\n var shouldInterpolate = scope.$eval(iAttrs.shouldInterpolate);\r\n\r\n $q.when(code).then(function (code)\r\n {\r\n if ( code )\r\n {\r\n if ( shouldInterpolate )\r\n {\r\n code = $interpolate(code)(scope);\r\n }\r\n\r\n var contentParent = angular.element(\r\n '
'\r\n );\r\n\r\n iElement.append(contentParent);\r\n\r\n // Defer highlighting 1-frame to prevent GA interference...\r\n $timeout(function ()\r\n {\r\n render(code, contentParent);\r\n }, 34, false);\r\n }\r\n });\r\n\r\n function render(contents, parent)\r\n {\r\n var codeElement = parent.find('code');\r\n var lines = contents.split('\\n');\r\n\r\n // Remove empty lines\r\n lines = lines.filter(function (line)\r\n {\r\n return line.trim().length;\r\n });\r\n\r\n // Make it so each line starts at 0 whitespace\r\n var firstLineWhitespace = lines[0].match(/^\\s*/)[0];\r\n var startingWhitespaceRegex = new RegExp('^' + firstLineWhitespace);\r\n\r\n lines = lines.map(function (line)\r\n {\r\n return line\r\n .replace(startingWhitespaceRegex, '')\r\n .replace(/\\s+$/, '');\r\n });\r\n\r\n var highlightedCode = hljs.highlight(iAttrs.language || iAttrs.lang, lines.join('\\n'), true);\r\n highlightedCode.value = highlightedCode.value\r\n .replace(/=\"\"<\\/span>/gi, '')\r\n .replace('', '')\r\n .replace('', '');\r\n codeElement.append(highlightedCode.value).addClass('highlight');\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('amchart', amchartDirective);\r\n\r\n /** @ngInject */\r\n function amchartDirective($q)\r\n {\r\n return {\r\n restrict: 'E',\r\n scope : {\r\n options: '=',\r\n height: '@',\r\n width: '@'\r\n },\r\n template: '
',\r\n link: function ($scope, $el) {\r\n var id = $el[0].id;// try to use existing outer id to create new id\r\n\r\n if (!id){//generate a UUID\r\n var guid = function guid() {\r\n function s4() {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n }\r\n\r\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' +\r\n s4() + '-' + s4() + s4() + s4();\r\n };\r\n id = guid();\r\n }\r\n\r\n $el.attr('id', id);\r\n var chart;\r\n\r\n $q.when($scope.options).then(function(options){\r\n // we can't render a chart without any data\r\n var chart;\r\n if (options.dataProvider) {\r\n var renderChart = function (amChartOptions) {\r\n var o = amChartOptions || options;\r\n\r\n // set height and width\r\n var height = $scope.height || '100%';\r\n var width = $scope.width || '100%';\r\n\r\n $el.css({\r\n 'height': height,\r\n 'width': width\r\n });\r\n\r\n AmCharts.baseHref = true;\r\n chart = AmCharts.makeChart(id, o);\r\n\r\n };\r\n\r\n renderChart();\r\n\r\n $scope.$watch('options', function() {\r\n //console.log('options changed');\r\n chart.clear();\r\n renderChart($scope.options);\r\n });\r\n }\r\n });\r\n\r\n\r\n }\r\n };\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('fuseConfig', fuseConfigProvider);\r\n\r\n /** @ngInject */\r\n function fuseConfigProvider()\r\n {\r\n // Default configuration\r\n var fuseConfiguration = {\r\n 'disableCustomScrollbars' : false,\r\n 'disableMdInkRippleOnMobile' : true,\r\n 'disableCustomScrollbarsOnMobile': true\r\n };\r\n\r\n // Methods\r\n this.config = config;\r\n\r\n //////////\r\n\r\n /**\r\n * Extend default configuration with the given one\r\n *\r\n * @param configuration\r\n */\r\n function config(configuration)\r\n {\r\n fuseConfiguration = angular.extend({}, fuseConfiguration, configuration);\r\n }\r\n\r\n /**\r\n * Service\r\n */\r\n this.$get = function ()\r\n {\r\n var service = {\r\n getConfig: getConfig,\r\n setConfig: setConfig\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Returns a config value\r\n */\r\n function getConfig(configName)\r\n {\r\n if ( angular.isUndefined(fuseConfiguration[configName]) )\r\n {\r\n return false;\r\n }\r\n\r\n return fuseConfiguration[configName];\r\n }\r\n\r\n /**\r\n * Creates or updates config object\r\n *\r\n * @param configName\r\n * @param configValue\r\n */\r\n function setConfig(configName, configValue)\r\n {\r\n fuseConfiguration[configName] = configValue;\r\n }\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.quick-panel', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($translatePartialLoaderProvider)\r\n {\r\n $translatePartialLoaderProvider.addPart('app/quick-panel');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.quick-panel')\r\n .controller('QuickPanelController', QuickPanelController);\r\n\r\n /** @ngInject */\r\n function QuickPanelController(api)\r\n {\r\n var vm = this;\r\n\r\n\r\n\r\n // Methods\r\n\r\n //////////\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.toolbar', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($translatePartialLoaderProvider)\r\n {\r\n $translatePartialLoaderProvider.addPart('app/toolbar');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.toolbar')\r\n .controller('ToolbarController', ToolbarController);\r\n\r\n /** @ngInject */\r\n function ToolbarController($rootScope, $mdSidenav, $translate, $mdToast, $window, $state, $cacheFactory, api)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.bodyEl = angular.element('body');\r\n\r\n vm.languages = {\r\n en: {\r\n 'title' : 'English',\r\n 'translation': 'TOOLBAR.ENGLISH',\r\n 'code' : 'en',\r\n 'flag' : 'us'\r\n }\r\n };\r\n\r\n vm.oddsFormat = $rootScope.user.oddsFormat;\r\n vm.oddsFormats = $rootScope.appData.oddsFormats;\r\n\r\n // Methods\r\n vm.toggleSidenav = toggleSidenav;\r\n vm.logout = logout;\r\n vm.changeLanguage = changeLanguage;\r\n vm.toggleHorizontalMobileMenu = toggleHorizontalMobileMenu;\r\n vm.changeOddsFormat = changeOddsFormat;\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n for(var i=0; i
' + message + '
',\r\n hideDelay: 7000,\r\n position : 'top right',\r\n parent : '#content'\r\n });\r\n\r\n return;\r\n }\r\n\r\n // Change the language\r\n $translate.use(lang.code);\r\n }\r\n\r\n function changeOddsFormat(oddsFormat)\r\n {\r\n if(vm.selectedOddsFormat.id != oddsFormat.id) {\r\n vm.selectedOddsFormat = oddsFormat;\r\n\r\n api.user.set_odds_format.get({ id: oddsFormat.id },\r\n function(response)\r\n {\r\n $rootScope.user.oddsFormat = oddsFormat.id;\r\n // not necessary to display confirmation\r\n },\r\n function(response)\r\n {\r\n //console.log(response);\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Toggle horizontal mobile menu\r\n */\r\n function toggleHorizontalMobileMenu()\r\n {\r\n vm.bodyEl.toggleClass('ms-navigation-horizontal-mobile-menu-active');\r\n }\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.navigation', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config()\r\n {\r\n \r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.navigation')\r\n .controller('NavigationController', NavigationController);\r\n\r\n /** @ngInject */\r\n function NavigationController($scope, $timeout)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.bodyEl = angular.element('body');\r\n vm.folded = false;\r\n vm.msScrollOptions = {\r\n suppressScrollX: true\r\n };\r\n\r\n // Methods\r\n vm.toggleMsNavigationFolded = toggleMsNavigationFolded;\r\n\r\n //////////\r\n\r\n /**\r\n * Toggle folded status\r\n */\r\n function toggleMsNavigationFolded()\r\n {\r\n vm.folded = !vm.folded;\r\n }\r\n\r\n // Close the mobile menu on $stateChangeSuccess\r\n $scope.$on('$stateChangeSuccess', function ()\r\n {\r\n vm.bodyEl.removeClass('ms-navigation-horizontal-mobile-menu-active');\r\n });\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n /**\r\n * Main module of the Fuse\r\n */\r\n angular\r\n .module('fuse', [\r\n // analytics\r\n 'angulartics',\r\n 'angulartics.google.analytics',\r\n\r\n // idle logout\r\n 'ngIdle',\r\n\r\n // Core\r\n 'app.core',\r\n\r\n // Navigation\r\n 'app.navigation',\r\n\r\n // Toolbar\r\n 'app.toolbar',\r\n\r\n // Quick panel\r\n 'app.quick-panel',\r\n\r\n // Pages\r\n 'app.pages',\r\n\r\n //'angular-storage',\r\n //'angular-jwt',\r\n\r\n // Wolfline\r\n 'app.dashboard',\r\n 'app.research',\r\n 'app.screener',\r\n 'app.papertrade',\r\n 'app.checkout',\r\n 'app.profile',\r\n 'app.orderhistory',\r\n 'app.faq',\r\n 'app.ui'\r\n ]).config(config);\r\n\r\n function config($httpProvider) {\r\n $httpProvider.interceptors.push('apiInterceptor');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .controller('MainController', MainController);\r\n\r\n /** @ngInject */\r\n function MainController($scope, $rootScope, $window, AppData, Constants, msNavigationService, api)\r\n {\r\n // Data\r\n $rootScope.appData = AppData;\r\n $rootScope.constants = Constants;\r\n //////////\r\n\r\n msNavigationService.saveItem('research', {\r\n title : 'Sports',\r\n weight: 2,\r\n icon: 'icon-trending-up'\r\n });\r\n\r\n for(var i=0;i 0) {\r\n msNavigationService.saveItem('screeners', {\r\n badge : {\r\n content: response.totalMatchCount,\r\n color : 'red'\r\n }\r\n });\r\n } else {\r\n msNavigationService.saveItem('screeners', {\r\n badge : null\r\n });\r\n }\r\n },\r\n function (response) {\r\n console.log(response);\r\n }\r\n );\r\n }\r\n });\r\n\r\n msNavigationService.saveItem('faq', {\r\n title : 'FAQ',\r\n weight: 6,\r\n icon: 'icon-question-mark-circle'\r\n });\r\n msNavigationService.saveLink('affiliate', {\r\n title : 'Affiliate',\r\n weight: 6,\r\n icon: 'icon-cash'\r\n }, 'https://affiliate.thewolfline.com');\r\n\r\n // Remove the splash screen\r\n $scope.$on('$viewContentAnimationEnded', function (event)\r\n {\r\n if ( event.targetScope.$id === $scope.$id )\r\n {\r\n $rootScope.$broadcast('msSplashScreen::remove');\r\n }\r\n });\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .run(runBlock);\r\n\r\n /** @ngInject */\r\n function runBlock(msUtils, fuseGenerator, fuseConfig)\r\n {\r\n /**\r\n * Generate extra classes based on registered themes so we\r\n * can use same colors with non-angular-material elements\r\n */\r\n fuseGenerator.generate();\r\n\r\n /**\r\n * Disable md-ink-ripple effects on mobile\r\n * if 'disableMdInkRippleOnMobile' config enabled\r\n */\r\n if ( fuseConfig.getConfig('disableMdInkRippleOnMobile') && msUtils.isMobile() )\r\n {\r\n var bodyEl = angular.element('body');\r\n bodyEl.attr('md-no-ink', true);\r\n }\r\n\r\n /**\r\n * Put isMobile() to the html as a class\r\n */\r\n if ( msUtils.isMobile() )\r\n {\r\n angular.element('html').addClass('is-mobile');\r\n }\r\n\r\n /**\r\n * Put browser information to the html as a class\r\n */\r\n var browserInfo = msUtils.detectBrowser();\r\n if ( browserInfo )\r\n {\r\n var htmlClass = browserInfo.browser + ' ' + browserInfo.version + ' ' + browserInfo.os;\r\n angular.element('html').addClass(htmlClass);\r\n }\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($ariaProvider, $logProvider, msScrollConfigProvider, uiGmapGoogleMapApiProvider, $translateProvider, $provide, fuseConfigProvider)\r\n {\r\n // ng-aria configuration\r\n $ariaProvider.config({\r\n tabindex: false\r\n });\r\n\r\n // Enable debug logging\r\n $logProvider.debugEnabled(true);\r\n\r\n // msScroll configuration\r\n msScrollConfigProvider.config({\r\n wheelPropagation: true\r\n });\r\n\r\n // toastr configuration\r\n toastr.options.timeOut = 3000;\r\n toastr.options.positionClass = 'toast-top-right';\r\n toastr.options.preventDuplicates = true;\r\n toastr.options.progressBar = true;\r\n\r\n // uiGmapgoogle-maps configuration\r\n uiGmapGoogleMapApiProvider.configure({\r\n // key: 'your api key',\r\n v : '3.exp',\r\n libraries: 'weather,geometry,visualization'\r\n });\r\n\r\n // angular-translate configuration\r\n $translateProvider.useLoader('$translatePartialLoader', {\r\n urlTemplate: '{part}/i18n/{lang}.json'\r\n });\r\n $translateProvider.preferredLanguage('en');\r\n $translateProvider.useSanitizeValueStrategy('sanitize');\r\n\r\n // Text Angular options\r\n $provide.decorator('taOptions', [\r\n '$delegate', function (taOptions)\r\n {\r\n taOptions.toolbar = [\r\n ['bold', 'italics', 'underline', 'ul', 'ol', 'quote']\r\n ];\r\n\r\n taOptions.classes = {\r\n focussed : 'focussed',\r\n toolbar : 'ta-toolbar',\r\n toolbarGroup : 'ta-group',\r\n toolbarButton : 'md-button',\r\n toolbarButtonActive: 'active',\r\n disabled : '',\r\n textEditor : 'form-control',\r\n htmlEditor : 'form-control'\r\n };\r\n\r\n return taOptions;\r\n }\r\n ]);\r\n\r\n // Text Angular tools\r\n $provide.decorator('taTools', [\r\n '$delegate', function (taTools)\r\n {\r\n taTools.bold.iconclass = 'icon-format-bold';\r\n taTools.italics.iconclass = 'icon-format-italic';\r\n taTools.underline.iconclass = 'icon-format-underline';\r\n taTools.ul.iconclass = 'icon-format-list-bulleted';\r\n taTools.ol.iconclass = 'icon-format-list-numbers';\r\n taTools.quote.iconclass = 'icon-format-quote';\r\n\r\n return taTools;\r\n }\r\n ]);\r\n\r\n // Fuse theme configurations\r\n fuseConfigProvider.config({\r\n 'disableCustomScrollbars' : false,\r\n 'disableCustomScrollbarsOnMobile': true,\r\n 'disableMdInkRippleOnMobile' : true\r\n });\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .run(runBlock);\r\n\r\n /** @ngInject */\r\n function runBlock($rootScope, $timeout, $state, $window, $location, Idle)\r\n {\r\n Idle.watch();\r\n\r\n // Activate loading indicator\r\n var stateChangeStartEvent = $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams)\r\n {\r\n $rootScope.loadingProgress = true;\r\n\r\n });\r\n\r\n // De-activate loading indicator\r\n var stateChangeSuccessEvent = $rootScope.$on('$stateChangeSuccess', function ()\r\n {\r\n\r\n $timeout(function ()\r\n {\r\n $rootScope.loadingProgress = false;\r\n });\r\n\r\n //console.log($rootScope.user);\r\n\r\n if($rootScope.user) {\r\n //if($rootScope.user.subscriptionStatus == 0 || ($rootScope.user.subscriptionStatus == 1 && moment().isBefore($rootScope.user.subscriptionExpirationDate))) {\r\n // if(moment().isBefore($rootScope.user.subscriptionExpirationDate)) {\r\n if ($rootScope.user.subscriptionStatus == 0){\r\n $rootScope.checkoutMenu = {\r\n visible: false,\r\n hideAllOthers: false\r\n };\r\n } else {\r\n if (moment().isAfter($rootScope.user.subscriptionExpirationDate)){\r\n $rootScope.checkoutMenu = {\r\n visible: true,\r\n hideAllOthers: false\r\n };\r\n \r\n $rootScope.checkoutMenu.visible = true;\r\n $rootScope.checkoutMenu.hideAllOthers = true;\r\n $rootScope.checkoutMenu.title = \"Continue Membership\";\r\n $rootScope.checkoutMenu.badge = null;\r\n }\r\n // console.log($rootScope.user)\r\n // if($rootScope.user.subscriptionStatus == 3) { // trial\r\n\r\n // var expirationDate = moment($rootScope.user.subscriptionExpirationDate, 'MM/DD/YYYY');\r\n // var daysLeft = expirationDate.diff(moment.utc(), 'days');\r\n\r\n // $rootScope.checkoutMenu.title = \"Extend Trial\";\r\n // var badgeContent = daysLeft + 1;\r\n // if(daysLeft == 1) {\r\n // badgeContent += ' day left!';\r\n // } else {\r\n // badgeContent += ' days left!';\r\n // }\r\n\r\n // $rootScope.checkoutMenu.badge = {\r\n // content: badgeContent,\r\n // color : 'red'\r\n // };\r\n // $rootScope.checkoutMenu.hideAllOthers = true;\r\n\r\n // } else {\r\n\r\n // $rootScope.checkoutMenu.hideAllOthers = true;\r\n // $rootScope.checkoutMenu.title = \"Continue Membership\";\r\n // $rootScope.checkoutMenu.badge = null;\r\n // }\r\n }\r\n }\r\n\r\n });\r\n\r\n // Store state in the root scope for easy access\r\n $rootScope.state = $state;\r\n\r\n // Cleanup\r\n $rootScope.$on('$destroy', function ()\r\n {\r\n stateChangeStartEvent();\r\n stateChangeSuccessEvent();\r\n });\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .config(routeConfig);\r\n\r\n /** @ngInject */\r\n function routeConfig($stateProvider, $urlRouterProvider, $locationProvider)\r\n {\r\n $locationProvider.html5Mode(true);\r\n\r\n $urlRouterProvider.otherwise('/login');\r\n\r\n /**\r\n * Layout Style Switcher\r\n *\r\n * This code is here for demonstration purposes.\r\n * If you don't need to switch between the layout\r\n * styles like in the demo, you can set one manually by\r\n * typing the template urls into the `State definitions`\r\n * area and remove this code\r\n */\r\n // Inject $cookies\r\n var $cookies;\r\n\r\n angular.injector(['ngCookies']).invoke([\r\n '$cookies', function (_$cookies)\r\n {\r\n $cookies = _$cookies;\r\n }\r\n ]);\r\n\r\n // Get active layout\r\n var layoutStyle = $cookies.get('layoutStyle') || 'verticalNavigation';\r\n\r\n var layouts = {\r\n verticalNavigation : {\r\n main : 'app/core/layouts/vertical-navigation.html',\r\n toolbar : 'app/toolbar/layouts/vertical-navigation/toolbar.html',\r\n navigation: 'app/navigation/layouts/vertical-navigation/navigation.html'\r\n },\r\n horizontalNavigation: {\r\n main : 'app/core/layouts/horizontal-navigation.html',\r\n toolbar : 'app/toolbar/layouts/horizontal-navigation/toolbar.html',\r\n navigation: 'app/navigation/layouts/horizontal-navigation/navigation.html'\r\n },\r\n contentOnly : {\r\n main : 'app/core/layouts/content-only.html',\r\n toolbar : '',\r\n navigation: ''\r\n },\r\n contentWithToolbar : {\r\n main : 'app/core/layouts/content-with-toolbar.html',\r\n toolbar : 'app/toolbar/layouts/content-with-toolbar/toolbar.html',\r\n navigation: ''\r\n }\r\n };\r\n // END - Layout Style Switcher\r\n\r\n // State definitions\r\n $stateProvider\r\n .state('app', {\r\n abstract: true,\r\n views : {\r\n 'main@' : {\r\n templateUrl: layouts[layoutStyle].main,\r\n controller : 'MainController as vm'\r\n },\r\n 'toolbar@app' : {\r\n templateUrl: layouts[layoutStyle].toolbar,\r\n controller : 'ToolbarController as vm'\r\n },\r\n 'navigation@app': {\r\n templateUrl: layouts[layoutStyle].navigation,\r\n controller : 'NavigationController as vm'\r\n },\r\n 'quickPanel@app': {\r\n templateUrl: 'app/quick-panel/quick-panel.html',\r\n controller : 'QuickPanelController as vm'\r\n }\r\n },\r\n resolve: {\r\n AppData: function (apiResolver)\r\n {\r\n return apiResolver.resolve('app@get');\r\n },\r\n Constants: function(apiResolver)\r\n {\r\n return apiResolver.resolve('app.constants@get');\r\n }\r\n }\r\n });\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .controller('IndexController', IndexController);\r\n\r\n /** @ngInject */\r\n function IndexController(fuseTheming, $rootScope, $scope, Idle, $mdDialog, $window, $cacheFactory, $state, $document)\r\n {\r\n var vm = this;\r\n\r\n vm.docTitle = $document[0].title;\r\n\r\n // Data\r\n vm.themes = fuseTheming.themes;\r\n //////////\r\n\r\n $scope.events = [];\r\n\r\n\r\n $scope.$on('IdleStart', function(ev) {\r\n if($window.sessionStorage.token) {\r\n // the user appears to have gone idle\r\n $mdDialog.show(\r\n $mdDialog.alert()\r\n .parent(angular.element(document.body))\r\n .clickOutsideToClose(true)\r\n .title('You will be logged out in for inactivity')\r\n .textContent('Would you like to continue your session?')\r\n .ariaLabel('Idle')\r\n .ok('Yes')\r\n .targetEvent(ev)\r\n );\r\n }\r\n });\r\n\r\n $scope.$on('IdleWarn', function(e, countdown) {\r\n // follows after the IdleStart event, but includes a countdown until the user is considered timed out\r\n // the countdown arg is the number of seconds remaining until then.\r\n // you can change the title or display a warning dialog from here.\r\n // you can let them resume their session by calling Idle.watch()\r\n //alert('login timeout');\r\n\r\n });\r\n\r\n $scope.$on('IdleTimeout', function() {\r\n // the user has timed out (meaning idleDuration + timeout has passed without any activity)\r\n // this is where you'd log them\r\n if($window.sessionStorage.token) {\r\n delete $window.sessionStorage.token;\r\n delete $window.sessionStorage.user;\r\n var $httpDefaultCache = $cacheFactory.get('$http');\r\n $httpDefaultCache.removeAll();\r\n $rootScope.screenerSummary = null;\r\n $rootScope.user = null;\r\n $mdDialog.hide();\r\n // change title back after countdown\r\n $document[0].title = vm.docTitle;\r\n $state.go(\"app.pages_auth_login\");\r\n }\r\n });\r\n\r\n $scope.$on('IdleEnd', function() {\r\n // the user has come back from AFK and is doing stuff. if you are warning them, you can use this to hide the dialog\r\n });\r\n\r\n $scope.$on('Keepalive', function() {\r\n // do something to keep the user's session alive\r\n });\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse');\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config(IdleProvider, KeepaliveProvider)\r\n {\r\n // configure Idle settings\r\n IdleProvider.idle(900); // in seconds\r\n IdleProvider.timeout(60); // in seconds\r\n //KeepaliveProvider.interval(2); // in seconds\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .factory('apiInterceptor', apiInterceptor);\r\n\r\n /** @ngInject */\r\n function apiInterceptor($rootScope, $q, $window, $location)\r\n {\r\n return {\r\n request: function (config) {\r\n //console.log(config);\r\n config.headers = config.headers || {};\r\n if ($window.sessionStorage.token) {\r\n config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;\r\n }\r\n return config;\r\n },\r\n response: function (response) {\r\n //console.log(response);\r\n if (response.status === 401) {\r\n // @todo setup refresh tokens\r\n $location.path('/login');\r\n\r\n }\r\n return response || $q.when(response);\r\n },\r\n responseError: function (response) {\r\n if (response.status === 401) {\r\n $location.path('/login');\r\n }\r\n return $q.reject(response);\r\n }\r\n };\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .factory('api', apiService);\r\n\r\n /** @ngInject */\r\n function apiService($resource, $rootScope)\r\n {\r\n /**\r\n * You can use this service to define your API urls. The \"api\" service\r\n * is designed to work in parallel with \"apiResolver\" service which you can\r\n * find in the \"app/core/services/api-resolver.service.js\" file.\r\n *\r\n * You can structure your API urls whatever the way you want to structure them.\r\n * You can either use very simple definitions, or you can use multi-dimensional\r\n * objects.\r\n *\r\n * Here's a very simple API url definition example:\r\n *\r\n * api.getBlogList = $resource('http://api.example.com/getBlogList');\r\n *\r\n * While this is a perfectly valid $resource definition, most of the time you will\r\n * find yourself in a more complex situation where you want url parameters:\r\n *\r\n * api.getBlogById = $resource('http://api.example.com/blog/:id', {id: '@id'});\r\n *\r\n * You can also define your custom methods. Custom method definitions allows you to\r\n * add hardcoded parameters to your API calls that you want them to be sent every\r\n * time you make that API call:\r\n *\r\n * api.getBlogById = $resource('http://api.example.com/blog/:id', {id: '@id'}, {\r\n * 'getFromHomeCategory' : {method: 'GET', params: {blogCategory: 'home'}}\r\n * });\r\n *\r\n * In addition to these definitions, you can also create multi-dimensional objects.\r\n * They are nothing to do with the $resource object, it's just a more convenient\r\n * way that we have created for you to packing your related API urls together:\r\n *\r\n * api.blog = {\r\n * list : $resource('http://api.example.com/blog);\r\n * getById : $resource('http://api.example.com/blog/:id', {id: '@id'});\r\n * getByDate: $resource('http://api.example.com/blog/:date', {id: '@date'},\r\n * 'get': {method: 'GET', params: {getByDate: true}}\r\n * );\r\n * }\r\n *\r\n * If you look at the last example from above, we overrode the 'get' method to put a\r\n * hardcoded parameter. Now every time we make the \"getByDate\" call, the {getByDate: true}\r\n * object will also be sent along with whatever data we are sending.\r\n *\r\n * All the above methods are using standard $resource service. You can learn more about\r\n * it at: https://docs.angularjs.org/api/ngResource/service/$resource\r\n *\r\n * -----\r\n *\r\n * After you defined your API urls, you can use them in Controllers, Services and even\r\n * in the UIRouter state definitions.\r\n *\r\n * If we use the last example from above, you can do an API call in your Controllers and\r\n * Services like this:\r\n *\r\n * function MyController (api)\r\n * {\r\n * // Get the blog list\r\n * api.blog.list.get({},\r\n *\r\n * // Success\r\n * function (response)\r\n * {\r\n * console.log(response);\r\n * },\r\n *\r\n * // Error\r\n * function (response)\r\n * {\r\n * console.error(response);\r\n * }\r\n * );\r\n *\r\n * // Get the blog with the id of 3\r\n * var id = 3;\r\n * api.blog.getById.get({'id': id},\r\n *\r\n * // Success\r\n * function (response)\r\n * {\r\n * console.log(response);\r\n * },\r\n *\r\n * // Error\r\n * function (response)\r\n * {\r\n * console.error(response);\r\n * }\r\n * );\r\n *\r\n * // Get the blog with the date by using custom defined method\r\n * var date = 112314232132;\r\n * api.blog.getByDate.get({'date': date},\r\n *\r\n * // Success\r\n * function (response)\r\n * {\r\n * console.log(response);\r\n * },\r\n *\r\n * // Error\r\n * function (response)\r\n * {\r\n * console.error(response);\r\n * }\r\n * );\r\n * }\r\n *\r\n * Because we are directly using $resource service, all your API calls will return a\r\n * $promise object.\r\n *\r\n * --\r\n *\r\n * If you want to do the same calls in your UI Router state definitions, you need to use\r\n * \"apiResolver\" service we have prepared for you:\r\n *\r\n * $stateProvider.state('app.blog', {\r\n * url : '/blog',\r\n * views : {\r\n * 'content@app': {\r\n * templateUrl: 'app/main/apps/blog/blog.html',\r\n * controller : 'BlogController as vm'\r\n * }\r\n * },\r\n * resolve : {\r\n * Blog: function (apiResolver)\r\n * {\r\n * return apiResolver.resolve('blog.list@get');\r\n * }\r\n * }\r\n * });\r\n *\r\n * You can even use parameters with apiResolver service:\r\n *\r\n * $stateProvider.state('app.blog.show', {\r\n * url : '/blog/:id',\r\n * views : {\r\n * 'content@app': {\r\n * templateUrl: 'app/main/apps/blog/blog.html',\r\n * controller : 'BlogController as vm'\r\n * }\r\n * },\r\n * resolve : {\r\n * Blog: function (apiResolver, $stateParams)\r\n * {\r\n * return apiResolver.resolve('blog.getById@get', {'id': $stateParams.id);\r\n * }\r\n * }\r\n * });\r\n *\r\n * And the \"Blog\" object will be available in your BlogController:\r\n *\r\n * function BlogController(Blog)\r\n * {\r\n * var vm = this;\r\n *\r\n * // Data\r\n * vm.blog = Blog;\r\n *\r\n * ...\r\n * }\r\n */\r\n\r\n var api = {};\r\n\r\n //$rootScope.apiURL = 'http://api.wolfline.localhost/';\r\n // $rootScope.apiURL = 'http://localhost:56519/';\r\n $rootScope.apiURL = 'https://api.thewolfline.com/';\r\n // $rootScope.apiURL = 'https://stagingapi.thewolfline.com/';\r\n\r\n // Base Url\r\n api.basePath = 'app/data/'; \r\n\r\n api.app = $resource($rootScope.apiURL + 'api/app/appdata', null, { get: { cache: true, method: 'GET' } });\r\n api.app.constants = $resource(api.basePath + 'data.json', null, { get: { cache: true, method: 'GET' } });\r\n api.research = {\r\n data: $resource($rootScope.apiURL + 'api/app/researchdata', null, { get: { cache: false, method: 'GET' } }),\r\n constants: $resource(api.basePath + 'research/data.json', null, { get: { cache: true, method: 'GET' } })\r\n };\r\n\r\n api.subscription = $resource($rootScope.apiURL + 'api/productsubscriptions', null, { get: { cache: true, method: 'GET' } });\r\n api.cart = {\r\n checkout: $resource($rootScope.apiURL + 'api/cart/checkout')\r\n };\r\n\r\n api.sport = {\r\n list: $resource($rootScope.apiURL + 'api/sports', null, { query: { cache: true, method: 'GET', isArray: true } }),\r\n getById : $resource($rootScope.apiURL + 'api/sports/:id', {id: '@id'}, { get: { cache: true, method: 'GET' } })\r\n };\r\n\r\n api.user = {\r\n login: $resource($rootScope.apiURL + 'token', {}, {\r\n save: {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n }\r\n }\r\n }),\r\n edit: $resource($rootScope.apiURL + 'api/account/edit', {}, {\r\n update: { method: 'PUT' }\r\n }),\r\n editSubscriptionInfo: $resource($rootScope.apiURL + 'api/account/editSubscriptionInfo', {}, {\r\n update: { method: 'PUT' }\r\n }),\r\n editSubscriptionPlan: $resource($rootScope.apiURL + 'api/account/editSubscriptionPlan', {}, {\r\n update: { method: 'PUT' }\r\n }),\r\n profile: $resource($rootScope.apiURL + 'api/account/userinfo'),\r\n forgot_password: $resource($rootScope.apiURL + 'api/account/forgotpassword'),\r\n reset_password: $resource($rootScope.apiURL + 'api/account/resetpassword'),\r\n set_odds_format: $resource($rootScope.apiURL + 'api/account/oddsformat/:id', {id: '@id'}),\r\n set_alert_frequency: $resource($rootScope.apiURL + 'api/account/alert/frequency/:id', {id: '@id'}),\r\n credit_card: {\r\n list: $resource($rootScope.apiURL + 'api/creditcards', null, { query: { cache: true, method: 'GET', isArray: true } }),\r\n add: $resource($rootScope.apiURL + 'api/creditcards'),\r\n edit: $resource($rootScope.apiURL + 'api/creditcards/:id', {id: '@id'}, {\r\n update: { method: 'PUT' }\r\n }),\r\n delete: $resource($rootScope.apiURL + 'api/creditcards/:id', {id: '@id'}),\r\n default: $resource($rootScope.apiURL + 'api/account/defaultcreditcard/:id', {id: '@id'}, {\r\n update: { method: 'PUT' }\r\n })\r\n },\r\n orders: $resource($rootScope.apiURL + 'api/paymenttransactions', null, { query: { cache: true, method: 'GET', isArray: true } }),\r\n cancel: $resource($rootScope.apiURL + 'api/account/cancelsubscription'),\r\n paypalSubscriptionDetails: $resource($rootScope.apiURL + 'api/account/PayPalSubcriptionDetails/:id', {id: '@id'}),\r\n };\r\n\r\n api.screener = {\r\n list: $resource($rootScope.apiURL + 'api/screeners', null, { query: { cache: true, method: 'GET', isArray: true } }),\r\n add: $resource($rootScope.apiURL + 'api/screeners'),\r\n edit: $resource($rootScope.apiURL + 'api/screeners/:id', {id: '@id'}, {\r\n update: { method: 'PUT' }\r\n }),\r\n partial: $resource($rootScope.apiURL + 'api/screeners/:id', {id: '@id'}, {\r\n update: {\r\n method: 'PATCH',\r\n headers: {\r\n 'Content-Type': 'application/json-patch+json'\r\n }\r\n }\r\n }),\r\n delete: $resource($rootScope.apiURL + 'api/screeners/:id', {id: '@id'}),\r\n summary: $resource($rootScope.apiURL + 'api/screeners/summary'),\r\n matches: {\r\n list: $resource($rootScope.apiURL + 'api/screeners/matches', null, { query: { cache: false, method: 'GET', isArray: true } }),\r\n getById: $resource($rootScope.apiURL + 'api/screeners/matches/:id', {id: '@id'}, { query: { cache: false, method: 'GET' } }),\r\n add: $resource($rootScope.apiURL + 'api/screeners/matches'),\r\n edit: $resource($rootScope.apiURL + 'api/screeners/matches/:id', {id: '@id'}, {\r\n update: { method: 'PUT' }\r\n }),\r\n preview: $resource($rootScope.apiURL + 'api/screeners/matches/preview?page=:page&limit=:limit&search=:search', { page: '@page', limit: '@limit', search: '@search' }),\r\n }\r\n };\r\n\r\n api.papertrade = {\r\n data: $resource($rootScope.apiURL + 'api/app/papertradedata', null, { get: { cache: true, method: 'GET' } }),\r\n list: $resource($rootScope.apiURL + 'api/papertrades', null, { query: { cache: false, method: 'GET', isArray: true } }),\r\n range: $resource($rootScope.apiURL + 'api/papertrades/range/:range', { range: '@range'}, { query: { cache: false, method: 'GET', isArray: true } }),\r\n edit: $resource($rootScope.apiURL + 'api/papertrades/:id', {id: '@id'}, {\r\n update: { method: 'PUT' }\r\n }),\r\n ats: {\r\n add: $resource($rootScope.apiURL + 'api/papertrades/spread'),\r\n list: $resource($rootScope.apiURL + 'api/papertrades/spread'),\r\n edit: $resource($rootScope.apiURL + 'api/papertrades/spread/:id', {id: '@id'}, {\r\n update: { method: 'PUT' }\r\n })\r\n },\r\n totals: {\r\n add: $resource($rootScope.apiURL + 'api/papertrades/totals'),\r\n list: $resource($rootScope.apiURL + 'api/papertrades/totals'),\r\n edit: $resource($rootScope.apiURL + 'api/papertrades/totals/:id', {id: '@id'}, {\r\n update: { method: 'PUT' }\r\n })\r\n },\r\n moneyline: {\r\n add: $resource($rootScope.apiURL + 'api/papertrades/moneyline'),\r\n list: $resource($rootScope.apiURL + 'api/papertrades/moneyline'),\r\n edit: $resource($rootScope.apiURL + 'api/papertrades/moneyline/:id', {id: '@id'}, {\r\n update: { method: 'PUT' }\r\n })\r\n }\r\n };\r\n\r\n return api;\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.ui', [\r\n 'app.ui.theme-colors'\r\n ])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config(msNavigationServiceProvider)\r\n {\r\n // Navigation\r\n /*msNavigationServiceProvider.saveItem('theme-colors', {\r\n title: 'Theme Colors',\r\n icon : 'icon-palette-advanced',\r\n state: 'app.ui_theme-colors',\r\n weight: 10\r\n });*/\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.faq', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.faq', {\r\n url : '/faq',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/faq/faq.html',\r\n controller : 'FaqController as vm'\r\n }\r\n },\r\n resolve: {\r\n },\r\n bodyClass: 'checkout',\r\n authenticate: true,\r\n inactiveUserAccessible: true\r\n });\r\n\r\n // Translation\r\n //$translatePartialLoaderProvider.addPart('app/pages/auth/profile');\r\n\r\n msNavigationServiceProvider.saveItem('faq', {\r\n title : 'FAQ',\r\n weight: 6,\r\n icon: 'icon-question-mark-circle',\r\n state: 'app.faq'\r\n });\r\n\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.pages', [\r\n 'app.pages.auth.login',\r\n 'app.pages.auth.forgot-password',\r\n 'app.pages.auth.reset-password',\r\n 'app.pages.error-404',\r\n 'app.pages.error-500',\r\n 'app.pages.maintenance'\r\n ])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config(msNavigationServiceProvider)\r\n {\r\n\r\n }\r\n})();\r\n\nangular.module(\"fuse\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"app/quick-panel/quick-panel.html\",\"Quick panel content\");\n$templateCache.put(\"app/core/layouts/content-only.html\",\"
\");\n$templateCache.put(\"app/core/layouts/content-with-toolbar.html\",\"
\");\n$templateCache.put(\"app/core/layouts/horizontal-navigation.html\",\"
\");\n$templateCache.put(\"app/core/layouts/vertical-navigation.html\",\"
\");\n$templateCache.put(\"app/core/theme-options/theme-options.html\",\"
Layout Style:
Vertical NavigationHorizontal NavigationContent OnlyContent with Toolbar
Layout Mode:
BoxedWide
Color Palette:
{{themeName}}
\");\n$templateCache.put(\"app/main/checkout/checkout.html\",\"
{{vm.title}}
Your account will expireexpired on {{user.subscriptionExpirationDate| date:\\'MM/dd/yyyy\\'}}
{{vm.earlyBirdSubscription.name}}
{{vm.earlyBirdSubscription.shortDescription}}
$
{{vm.earlyBirdSubscription.price | number: 2}}
per month
1\\\">for {{vm.montlySubscription.periodInMonths}} months
{{vm.montlySubscription.name}}
{{vm.montlySubscription.shortDescription}}
$
{{vm.montlySubscription.price | number: 2}}
per month
1\\\">for {{vm.montlySubscription.periodInMonths}} months
{{vm.yearlySubscription.name}}
{{vm.yearlySubscription.shortDescription}}
$
{{vm.yearlySubscription.price | number: 2}}
per month
1\\\">for {{vm.yearlySubscription.periodInMonths}} months
{{vm.earlyBirdSubscription.name}}
{{vm.earlyBirdSubscription.shortDescription}}

${{vm.earlyBirdSubscription.price | number: 2}} per month 1\\\">for {{vm.earlyBirdSubscription.periodInMonths}} months

{{vm.montlySubscription.name}}
{{vm.montlySubscription.shortDescription}}

${{vm.montlySubscription.price | number: 2}} per month 1\\\">for {{vm.montlySubscription.periodInMonths}} months

{{vm.yearlySubscription.name}}
{{vm.yearlySubscription.shortDescription}}

${{vm.yearlySubscription.price | number: 2}} per month 1\\\">for {{vm.yearlySubscription.periodInMonths}} months

Checkout
ProductDescriptionPrice
{{item.name}}{{item.shortDescription}}${{item.price | number: 2}}
Tax${{vm.cart.tax | number: 2}}
Total${{vm.cart.total | number: 2}}
Back

Thank you for your payment!

Get Started

\");\n$templateCache.put(\"app/main/dashboard/dashboard.html\",\"
Dashboard
\");\n$templateCache.put(\"app/main/orderhistory/orderhistory.html\",\"
{{vm.title}}
0\\\" class=\\\"simple\\\">
Order NumberCredit CardItemTotal AmountDate
{{order.authorizeNetID}}{{order.creditCard.description}}
XXXX-{{order.creditCard.lastFour}}
Exp. {{order.creditCard.expirationMonth}}/{{order.creditCard.expirationYear}}
{{order.productSubscription.name}}${{order.totalAmount.toFixed(2)}}{{order.created|formatDate: user.timezone}}

{{order.productSubscription.name}}

Order #: {{order.authorizeNetID}}

{{order.creditCard.description}} (XXXX-{{order.creditCard.lastFour}})
Exp. {{order.creditCard.expirationMonth}}/{{order.creditCard.expirationYear}}
Total: ${{order.totalAmount.toFixed(2)}}
Date: {{order.created|formatDate: user.timezone}}

No Orders Found
\");\n$templateCache.put(\"app/main/faq/faq.html\",\"
{{vm.title}}
1

Which is better, \\\"momentum\\\" or \\\"correction\\\"?

One is not necessarily better than the other. Different situations call for different styles. A correction trade is a trading method of buying low and selling high. A momentum trade is a trading method of buying high and selling low.

Some examples of less liquid markets/sectors/leagues that tend to trade with momentum longer term and correct later are NHL, MLB, smaller CBB conference totals/volatility, Nippon Baseball League. While some examples of markets/sectors/leagues that tend to trade with momentum shorter term and correct sooner are NFL, CFB, NBA, larger CBB conferences and believe it or not, WNBA. This is consistent with any other form of quantitative financial market trading. Different sectors/asset classes have different volatilities and must be artistically traded accordingly

2

Are the colors more important or the time it shows indicators?

All sports betting markets are short term irrational and long term rational. Colored Alerts in the short term are not as significant as they are in the longer term (farther back in time or to the right). The hotter the color the more significant, the further back in time the more significant, the significance is the probability of mispricing. The number of alerts also makes a difference.

3

Why are moneylines alerted so often?

Because the Moneyline products only represent straight up wins/losses of the two halves of the relationship that have had moneyline markets made on them historically. This is a \\\"probability bet\\\" just like \\\"In the money\\\" or \\\"out of the money\\\" options. ML is not a 50/50 market minus the \\\"juice\\\" like the binary markets are (\\\"spread\\\" and \\\"totals\\\"). The market irrationality has to go somewhere. In moneyline, that irrationality probability occurs in the market probability and NOT in the market \\\"barrier numbers\\\"/\\\"strike price\\\"

4

Why are moneylines different?

TheWolfLine moneyline indicators and alerts quantify and represent in a graduated color format of extremes the probability of irrationality of the market price in the probability of the particular relationship being skewed based on if the same exact fundamental \\\"game\\\" were to be played an infinite number of times. Thus representing theoretical market edge. TWL can never endorse using technical drawings (eg support and resistance) in ML, puckline, runline, etc BUT if that works for you, then do it.

5

Do the markets work the same for all sports?

No, each market works a bit differently and each sport/league trades differently, just like each sector in finance has it\\'s own nuance.
More Liquid Markets: Markets/sports that typically gather more volume/handle thereby having a TENDENCY for the relationships to correct earlier and trade in a narrower/less volatile range (eg utility stock sector/NFL spread).
Less Liquid Markets: Markets/sports that typically gather less volume/handle thereby having a TENDENCY for the relationships to correct later and trade in a wider/more volatile range (eg small cap biotech stock sector/MLB totals).

A potential “shortcut” to determine the tendency for a sport/league/sector to be “more liquid” or “less liquid” is to check the television ratings. When television ratings are higher, then the sector/league will tend to behave as “more liquid”. When television ratings are lower, then the sector/league will tend to behave as “less liquid”.

6

What is Wolfline and how does it help with sports betting?

At TheWolfLine.com, we use our patented technology to supply proprietary market analysis to trade sports markets like a Wall Street Pro! TheWolfLine.com can teach you to trade sports just like professional traders and hedge fund managers trade stocks, options, and futures!

7

Do you offer picks?

No, The Wolfline does not offer picks. We provide quantitative and technical analysis tools for our users to \\\"be your own expert.\\\" All of the Wolfline data is completely objective with no subjectivity whatsoever, eg Power Rankings.

8

Should I bet the red alerts?

TheWolfLine users “bet” whatever they are comfortable with based on their personal risk tolerance and confidence interval. A \\\"red alert\\\" simply represents extreme probability of market irrationality in the study period. Nothing else. Significance of alerts strengthen when:

  1. Alerts are hotter.
  2. Higher Number of Alerts.
  3. Alerts are further to the right of the grid.

9

Why is there only one line on the totals chart?

TheWolfLine quantitatively measures the probability of irrational market skew over time. That answers the question \\\"how do I tell what is irrationally cheap to be bought or irrationally expensive to be sold\\\". \\\"Totals\\\"/volatility are an aggregated measure of the relationship and that is represented as a divergence from zero over time. \\\"Totals\\\" does not care about the price or probability of the relationship, only the amount of scoring relative to market implied expected amount of scoring. Same as buying/selling volatility in options markets. Supply and demand.

Totals charts are a combined performance for both teams in the selected time frame (periods/games back). If both teams go over in a game there is an uptick of 2, both under downtick of 2, sideways ticks one over, one under or both push, like a market being unchanged.

10

Are there a minimum number of Support or Resistance points that you like to see to dig deeper into a given matchup?

No, The bigger point here is the further back in time the support or resistance is, the more significant. The levels of significance for price action and volatility action represent inflection points where market perception of price/volatility became too high/low relative to value and subsequent realized price/volatility. Support and resistance can occur at straight horizontal levels or along trendlines. Levels become more significant the more times they are touched (tested), when periods between the touching (testing) of the level is longer and when the level is higher on the y axis for resistance or lower on the y axis for support. The charts are the quantified and graphically displayed history of the collective behavioral economics of the market regarding the asset(s) of the relationship in question.

11

How do the alerts work and what does it mean?

TheWolfLine indicators are calculated by historical closing market prices relative to realized prices/performance over time. These indicators are put into a bivariate/joint probability distribution over time. The indicators are assigned to alert colors that represent standard deviations into the self evident accepted color graduation of levels of extremity. In absolute values, Gray = 0.00-0.79, yellow = 0.80-1.19, orange = 1.20-1.59 and red = 1.60-2.00. The indicators can never be higher than 2.00 (absolute value) regardless of sample study size. The max study period of 24 periods was determined by years of research and development/data collection that proved that the finite stanzas of study period end at that point and then the serial behavior of the market \\\"starts over.\\\" So somewhere between 6 gray boxes and 6 red boxes, in the default grids, the \\\"moneyball moment\\\" is identified. This is the subjective \\\"art\\\" of TWL interpretation and practical application by the user.

12

Do you use alerts, or a number of other indicators when considering making a bet?

There are no set rules, each bettor will have his or her own criteria and trading method. One may find a stronger level of confidence with multiple factors such as a particular alert pattern, indicators, or support/resistance levels.

13

What is the minimum divergence, between two teams that would have you consider a possible bet?

While the smaller the divergence (difference in performance on charts) the smaller the indicator will be with alerts starting at .80. There may be other factors such as support and/or resistance that would indicate a possible play.

14

What if the line moves, should I cancel my bet? Meaning...if I was +4 and now it\\'s only +3.5 or +3, is it still ok to bet?

We would encourage all users to shop for their best execution price. Just because the execution price may move, doesn\\'t mean the price you purchased won\\'t still win. Keep in mind all TheWolfLine data is pegged off of the historical realized prices relative to the historical market implied closing prices.

\");\n$templateCache.put(\"app/main/papertrade/papertrades.html\",\"
{{vm.title}}
Net Profit/Loss
{{range.name}}
Volume
{{ vm.tradeTotals.volume|toMoney }} WolfBucksTM
Profit/Loss Balance
{{ vm.tradeTotals.earned|toMoney }} WolfBucksTM 0\\\" class=\\\"green-fg\\\">{{ vm.tradeTotals.earned|toMoney }} WolfBucksTM {{ vm.tradeTotals.earned|toMoney }} WolfBucksTM
Refresh Paper Trades

Loading...please wait

Sorry, no paper trades were found.

0 && !vm.loadingPaperTrades\\\" flex=\\\"\\\">

Match Date: {{ pt.match.matchDate|formatDate: user.timezone}}

0\\\" class=\\\"text-boxed green-bg white-fg\\\">Won {{pt.tradeResult|toMoney }} WolfBucksTM {{pt.tradeResult|toMoney}} WolfBucksTM Lost {{pt.wagerAmount|toMoney }} WolfBucksTM

{{ pt.wagerAmount|toMoney }} WolfBucksTM

1\\\" class=\\\"mt-8\\\">{{vm.getMatchStatusById(pt.match.matchStatus).label}}

A pt.match.finalScore.homeValue}\\\">({{ pt.match.finalScore.awayValue }}) {{ pt.match.awayCompetitor.name }}
H pt.match.finalScore.awayValue}\\\">({{ pt.match.finalScore.homeValue }}) {{ pt.match.homeCompetitor.name }}
A {{ pt.match.awayCompetitor.name }}
H {{ pt.match.homeCompetitor.name }}

{{pt.oddsType.name}}: {{pt.trade.team.name}} -{{pt.odds.marketPrice}} +{{pt.odds.marketPrice}} 1\\\">({{pt.trade.juice|formatOdds:user.oddsFormat}}) {{pt.oddsType.name}}: Over {{pt.odds.marketPrice}} ({{pt.odds.overJuicePrice|formatOdds:user.oddsFormat}}) Under {{pt.odds.marketPrice}} ({{pt.odds.underJuicePrice|formatOdds:user.oddsFormat}}) {{pt.oddsType.name}}: ({{pt.odds.homeMarketPrice|formatOdds:user.oddsFormat}}{{pt.odds.awayMarketPrice|formatOdds:user.oddsFormat}})
{{ pt.match.homeCompetitor.name }} to win {{ pt.match.awayCompetitor.name }} to win

Match DateTrade AmountCompetitorsTrade TypeTrade
{{ pt.match.matchDate|formatDate: user.timezone}}{{ pt.wagerAmount|toMoney }} WolfBucksTM 0\\\" class=\\\"text-boxed green-bg white-fg\\\">Won {{pt.tradeResult|toMoney}} WolfBucksTM {{pt.tradeResult|toMoney}} WolfBucksTM Lost {{pt.wagerAmount|toMoney}} WolfBucksTM

1\\\" class=\\\"mt-8\\\">{{vm.getMatchStatusById(pt.match.matchStatus).label}}

A pt.match.finalScore.homeValue}\\\">({{ pt.match.finalScore.awayValue }}) {{ pt.match.awayCompetitor.name }}
H pt.match.finalScore.awayValue}\\\">({{ pt.match.finalScore.homeValue }}) {{ pt.match.homeCompetitor.name }}
A {{ pt.match.awayCompetitor.name }}
H {{ pt.match.homeCompetitor.name }}
{{pt.oddsType.name}}{{pt.trade.team.name}}
-{{pt.odds.marketPrice}} +{{pt.odds.marketPrice}} 1\\\">({{pt.trade.juice|formatOdds:user.oddsFormat}})
Over {{pt.odds.marketPrice}}
{{pt.odds.overJuicePrice|formatOdds:user.oddsFormat}}
Under {{pt.odds.marketPrice}}
{{pt.odds.underJuicePrice|formatOdds:user.oddsFormat}}
{{ pt.match.homeCompetitor.name }}
{{pt.odds.homeMarketPrice|formatOdds:user.oddsFormat}}
{{ pt.match.awayCompetitor.name }}
{{pt.odds.awayMarketPrice|formatOdds:user.oddsFormat}}
\");\n$templateCache.put(\"app/main/profile/profile.html\",\"

{{ vm.user.firstName }} {{ vm.user.lastName }}

{{ vm.title }}
{{constants.errors.required}}
{{constants.errors.required}}
{{t.countryName}}/{{t.comment}}
{{constants.errors.required}}
{{f.label}}
{{constants.errors.required}}
Password do not match
SAVE

No PayPal Subscription Found

You don\\'t have a PayPal Subscription. Please purchase a new subscriotion below by clicking "Checkout".

Current Subscription: {{vm.userProductInfo.productName}}

{{vm.userProductInfo.firstName}} {{vm.userProductInfo.lastName}}
{{vm.userProductInfo.productSubscriptionID}}
Exp: {{vm.userProductInfo.subscriptionExpirationDate | date:\\'MM/dd/yyyy\\'}}
Checkout
Cancel Account

Your account is set to expire on {{$root.user.subscriptionExpirationDate}}.

Re-enable Account
\");\n$templateCache.put(\"app/main/research/research.html\",\"
{{vm.constants.welcome.title}}

{{vm.constants.welcome.subTitle}}

{{vm.constants.welcome.content}}

{{vm.constants.screener.newButtonTitle}}{{vm.constants.screener.newButtonTitle}} 0\\\" class=\\\"md-raised md-primary\\\" ui-sref=\\\"app.screener()\\\">{{vm.constants.screener.existingButtonTitle}}
{{vm.constants.screener.newButtonTitle}} {{vm.constants.tooltips.editScreenerName}}{{researchSettings.description}}{{researchSettings.name}} {{researchSettings.name|truncate:15:\\'...\\'}}
{{vm.constants.screener.newButtonTitle}}{{vm.constants.screener.existingButtonTitle}}{{vm.constants.tooltips.exitScreener}}
1 {{vm.constants.screener.wizard.step1.title}}

{{vm.constants.screener.wizard.step1.title}}

{{vm.constants.screener.wizard.step1.content}}

1 && !$first\\\">
{{s.name}}
{{constants.errors.required}}
{{vm.constants.screener.wizard.step1.hints.market}}
{{t.name}}
Advanced
{{b.name}}
{{constants.errors.required}}
{{t.label}}
{{constants.errors.required}}
{{o.value}}
{{constants.errors.required}}
{{constants.errors.required}}
{{constants.errors.positiveNumber}}
{{constants.errors.negativeNumber}}
{{constants.errors.positiveNumber}}
{{vm.constants.screener.wizard.step1.hints.tradeTypes.spread}}
{{vm.constants.screener.wizard.step1.hints.tradeTypes.totals}}
{{vm.constants.screener.wizard.step1.hints.tradeTypes.moneyline}}
Delete
{{vm.constants.tooltips.addMarketCondition}}
{{vm.constants.tooltips.addMarket}}
2 {{vm.constants.screener.wizard.step2.title}}

{{vm.constants.screener.wizard.step2.title}}

{{vm.constants.screener.wizard.step2.content}}

{{g.label}}
{{vm.constants.tooltips.help}}
{{b.label}}
{{vm.constants.tooltips.help}}
{{vm.constants.screener.wizard.step2.buttons.addAlert}}{{vm.constants.tooltips.help}}
{{b.name}}
{{constants.errors.required}}
{{a.name}}
{{constants.errors.required}}
>=
{{i}}
{{constants.errors.required}}
{{r.label}}
{{constants.errors.required}}
{{o.name}}
{{vm.constants.tooltips.help}}
Delete
3 {{vm.constants.screener.wizard.step3.title}}

{{vm.constants.screener.wizard.step3.title}}

{{vm.constants.screener.wizard.navigation.labels.previous}}
{{vm.constants.screener.wizard.navigation.labels.preview}}{{vm.constants.screener.wizard.navigation.labels.next}}{{vm.constants.screener.wizard.navigation.labels.run}}
{{vm.constants.screener.wizard.navigation.labels.preview}}{{vm.constants.screener.wizard.navigation.labels.run}}
{{researchSettings.matchResults.title}}
{{selectedTradingBehavior.label}}{{vm.constants.tooltips.tradingBehavior}}{{b.label}}{{vm.constants.tooltips.help}}{{selectedMarketGrouping.label}}{{vm.constants.tooltips.marketGrouping}}{{g.label}}{{vm.constants.tooltips.help}}

Loading...please wait

{{vm.constants.matchResults.legend.alerts.low}}
{{vm.constants.matchResults.legend.alerts.medium}}
{{vm.constants.matchResults.legend.alerts.high}}
{{vm.constants.tooltips.help}}
H {{vm.constants.matchResults.legend.home}}
A {{vm.constants.matchResults.legend.away}}
O {{vm.constants.matchResults.legend.over}}
U {{vm.constants.matchResults.legend.under}}
{{vm.constants.matchResults.legend.periodsBack}}

{{vm.constants.matchResults.noResults}}

0\\\" id=\\\"upcoming-matches-lt-lg\\\" flex=\\\"\\\">

A {{row.awayCompetitor.name}}
H {{row.homeCompetitor.name}}

{{row.sport.name}} ({{row.tournament.name}}) * - {{row.matchDate|formatDate: user.timezone}} In Progress

View Detail
Market{{$index + 1}} SP
0 || row.inProgress\\\" class=\\\"md-fab md-mini btn-papertrade\\\" ng-click=\\\"vm.openPaperTradeDialog($event, row, 0)\\\" aria-label=\\\"Add Paper Trade\\\" style=\\\"display: flex; align-items: center; justify-content: center;\\\">{{vm.constants.matchResults.paperTrade.btnLabel}}
{{vm.constants.matchResults.tabs.ats.shortTitle}}
{{d.displayValue}} {{vm.getTradingBehaviorIndicator(row, ($index + 1), selectedTradingBehavior, \\'ats\\')}}
0 || row.inProgress\\\" class=\\\"md-fab md-mini btn-papertrade\\\" ng-click=\\\"vm.openPaperTradeDialog($event, row, 1)\\\" aria-label=\\\"Add Paper Trade\\\" style=\\\"display: flex; align-items: center; justify-content: center;\\\">{{vm.constants.matchResults.paperTrade.btnLabel}}
{{vm.constants.matchResults.tabs.totals.shortTitle}}
{{d.displayValue}} {{vm.getTotalsTradingBehaviorIndicator(d.value, selectedTradingBehavior)}}
0 || row.inProgress\\\" class=\\\"md-fab md-mini btn-papertrade\\\" ng-click=\\\"vm.openPaperTradeDialog($event, row, 2)\\\" aria-label=\\\"Add Paper Trade\\\" style=\\\"display: flex; align-items: center; justify-content: center;\\\">{{vm.constants.matchResults.paperTrade.btnLabel}}
{{vm.constants.matchResults.tabs.moneyline.shortTitle}}
{{d.displayValue}} {{vm.getTradingBehaviorIndicator(row, ($index + 1), selectedTradingBehavior, \\'moneyline\\')}}
{{vm.constants.matchResults.buttons.showAllPeriods}}{{vm.constants.matchResults.buttons.hideAllPeriods}}
{{vm.constants.matchResults.legend.alerts.low}}
{{vm.constants.matchResults.legend.alerts.medium}}
{{vm.constants.matchResults.legend.alerts.high}}
{{vm.constants.tooltips.help}}
H {{vm.constants.matchResults.legend.home}}
A {{vm.constants.matchResults.legend.away}}
O {{vm.constants.matchResults.legend.over}}
U {{vm.constants.matchResults.legend.under}}
{{vm.constants.matchResults.legend.periodsBack}}

{{vm.constants.matchResults.noResults}}

0\\\">
{{column.title}}
{{vm.constants.matchResults.paperTrade.btnLabel}} {{vm.constants.matchResults.paperTrade.btnLabelDisabled}}{{row.matchDate|formatDate: user.timezone}}
In Progress
{{row.sport.name}}
{{row.tournament.tournamentGroup.name}}{{vm.constants.tooltips.asianBet}}
A{{vm.constants.matchResults.legend.away}}
{{row.awayCompetitor.name}}
H{{vm.constants.matchResults.legend.home}}
{{row.homeCompetitor.name}}
{{vm.constants.matchResults.tabs.ats.title}}
{{vm.constants.matchResults.tabs.totals.title}}
{{vm.constants.matchResults.tabs.moneyline.title}}
{{row.matchWolfline.data.ats[(row.matchWolfline.data.ats.length - 1) - $index].displayValue}} {{vm.getTradingBehaviorIndicator(row, ($index + 1), selectedTradingBehavior, \\'ats\\')}}
{{row.matchWolfline.data.totals[(row.matchWolfline.data.totals.length - 1) - $index].displayValue}} {{vm.getTotalsTradingBehaviorIndicator(row.matchWolfline.data.totals[(row.matchWolfline.data.totals.length - 1) - $index].value, selectedTradingBehavior)}}
{{row.matchWolfline.data.moneyline[(row.matchWolfline.data.moneyline.length - 1) - $index].displayValue}} {{vm.getTradingBehaviorIndicator(row, ($index + 1), selectedTradingBehavior, \\'moneyline\\')}}
{{vm.constants.matchResults.buttons.showAllPeriods}}
{{vm.constants.matchResults.buttons.hideAllPeriods}}
0\\\" layout=\\\"row\\\">
{{upcomingMatches.startingRow}} to {{upcomingMatches.endingRow}} of {{upcomingMatches.rowCount}} matches
{{vm.constants.matchResults.buttons.previousMatch}}{{vm.constants.matchResults.buttons.nextMatch}}
{{ selectedMatch.awayCompetitor.name }} @
{{ selectedMatch.homeCompetitor.name }}
{{selectedMatch.matchDate|formatDate: user.timezone}} In Progress
{{selectedTradingBehavior.label}}{{vm.constants.tooltips.tradingBehavior}}{{b.label}}{{vm.constants.tooltips.help}}{{selectedMarketGrouping.label}}{{selectedMarketGrouping.label}}:{{vm.constants.tooltips.marketGrouping}}{{g.label}}{{vm.constants.tooltips.help}}{{vm.constants.tooltips.closeMatch}}

Loading...please wait

{{vm.constants.matchResults.team}}{{vm.constants.betTypes.ats}}{{vm.constants.betTypes.moneyline}}{{vm.constants.betTypes.totals}}
A 
{{ selectedMatch.awayCompetitor.name }}
+-{{selectedMatch.spreadOdds.marketPrice}} {{selectedMatch.spreadOdds.awayJuicePrice|formatOdds:user.oddsFormat}} 0\\\">N/A{{selectedMatch.moneylineOdds.awayMarketPrice|formatOdds:user.oddsFormat}} 0\\\">N/AOver {{selectedMatch.totalsOdds.marketPrice}}
{{selectedMatch.totalsOdds.overJuicePrice|formatOdds:user.oddsFormat}}
0\\\">N/A
Under {{selectedMatch.totalsOdds.marketPrice}}
{{selectedMatch.totalsOdds.underJuicePrice|formatOdds:user.oddsFormat}}
0\\\">N/A
H 
{{ selectedMatch.homeCompetitor.name }}
+-{{selectedMatch.spreadOdds.marketPrice}} {{selectedMatch.spreadOdds.homeJuicePrice|formatOdds:user.oddsFormat}} 0\\\">N/A{{selectedMatch.moneylineOdds.homeMarketPrice|formatOdds:user.oddsFormat}} 0\\\">N/A
{{vm.constants.matchResults.legend.alerts.low}}
{{vm.constants.matchResults.legend.alerts.medium}}
{{vm.constants.matchResults.legend.alerts.high}}
{{vm.constants.tooltips.help}}
H {{vm.constants.matchResults.legend.home}}
A {{vm.constants.matchResults.legend.away}}
O {{vm.constants.matchResults.legend.over}}
U {{vm.constants.matchResults.legend.under}}
{{vm.constants.matchResults.legend.periodsBack}}
{{column}}
0 || selectedMatch.inProgress\\\" class=\\\"md-fab md-mini btn-papertrade\\\" ng-click=\\\"vm.openPaperTradeDialog($event, selectedMatch, 0)\\\" aria-label=\\\"{{vm.constants.matchResults.paperTrade.btnLabel}}\\\" style=\\\"display: flex; align-items: center; justify-content: center;\\\">{{vm.constants.matchResults.paperTrade.btnLabel}} 0\\\">{{vm.constants.matchResults.paperTrade.btnLabelDisabled}}
{{vm.constants.betTypes.ats}}
{{vm.constants.tooltips.asianBet}}{{vm.constants.tooltips.asianBet}}
{{d.displayValue}} {{vm.getTradingBehaviorIndicator(selectedMatch, ($index + 1), selectedTradingBehavior, \\'ats\\')}}
0 || selectedMatch.inProgress\\\" class=\\\"md-fab md-mini btn-papertrade\\\" ng-click=\\\"vm.openPaperTradeDialog($event, selectedMatch, 1)\\\" aria-label=\\\"Add Paper Trade\\\" style=\\\"display: flex; align-items: center; justify-content: center;\\\">{{vm.constants.matchResults.paperTrade.btnLabel}} 0\\\">{{vm.constants.matchResults.paperTrade.btnLabelDisabled}}
{{vm.constants.betTypes.totals}}
{{vm.constants.tooltips.asianBet}}
{{d.displayValue}} {{vm.getTotalsTradingBehaviorIndicator(d.value, selectedTradingBehavior)}}
0 || selectedMatch.inProgress\\\" class=\\\"md-fab md-mini btn-papertrade\\\" ng-click=\\\"vm.openPaperTradeDialog($event, selectedMatch, 1)\\\" aria-label=\\\"Add Paper Trade\\\" style=\\\"display: flex; align-items: center; justify-content: center;\\\">{{vm.constants.matchResults.paperTrade.btnLabel}} 0\\\">{{vm.constants.matchResults.paperTrade.btnLabelDisabled}}
{{vm.constants.betTypes.moneyline}}
{{d.displayValue}} {{vm.getTradingBehaviorIndicator(selectedMatch, ($index + 1), selectedTradingBehavior, \\'moneyline\\')}}
{{vm.constants.matchResults.buttons.showAllPeriods}}{{vm.constants.matchResults.buttons.hideAllPeriods}}
{{vm.constants.matchResults.chart.instructions}} {{vm.chartLine.type}}.
{{vm.constants.matchResults.chart.controlsLabel}} {{vm.constants.tooltips.supportResistance}}{{vm.constants.tooltips.trendline}} {{vm.constants.tooltips.clearTrendlines}}{{vm.constants.tooltips.done}} {{vm.constants.tooltips.clearGuides}}{{vm.constants.tooltips.done}}?{{vm.constants.tooltips.help}}
\");\n$templateCache.put(\"app/main/screener/screeners.html\",\"
{{vm.title}}
Add Screener

No screeners found.

0\\\" flex=\\\"\\\">

{{s.matchCount}} {{ s.name }}

Created on {{ s.created|formatDate: user.timezone }}

{{ s.description }}

Edit/ViewDelete
\");\n$templateCache.put(\"app/pages/maintenance/maintenance.html\",\"
Closed for scheduled maintenance!
We\\'re sorry for the inconvenience.
Please check back later.
\");\n$templateCache.put(\"app/core/directives/ms-search-bar/ms-search-bar.html\",\"
\");\n$templateCache.put(\"app/navigation/layouts/horizontal-navigation/navigation.html\",\"
\");\n$templateCache.put(\"app/navigation/layouts/vertical-navigation/navigation.html\",\"\\\"The\");\n$templateCache.put(\"app/main/profile/dialogs/creditcard-dialog.html\",\"
{{vm.title}}
{{constants.errors.required}}
{{constants.errors.required}}
{{constants.errors.required}}
{{constants.errors.required}}
{{constants.errors.required}}
{{constants.errors.required}}
{{constants.errors.required}}
{{c.name}}
{{constants.errors.required}}
{{c.label}}
{{constants.errors.required}}
{{constants.errors.required}}
{{constants.errors.creditCardLength}}
{{constants.errors.creditCardLength}}
{{constants.errors.required}}
{{constants.errors.monthLength}}
{{constants.errors.monthLength}}
{{constants.errors.monthRange}}
{{constants.errors.monthRange}}
2 digit month
{{constants.errors.required}}
{{constants.errors.yearLength}}
{{constants.errors.yearLength}}
{{constants.errors.yearPast}}
{{constants.errors.yearRange}}
4 digit year
{{constants.errors.required}}
{{constants.errors.creditCardCvvLength}}
{{constants.errors.creditCardCvvLength}}
Use this card for future payments
SAVE
\");\n$templateCache.put(\"app/main/papertrade/includes/paginator.html\",\"
{{l}}
= vm.paginator.length\\\" ng-click=\\\"vm.pagePaperTradeResults(vm.criteria.page + 1)\\\">
Page {{vm.criteria.page}} of {{vm.paginator.length}}
Previous Page
= vm.paginator.length\\\" ng-click=\\\"vm.pagePaperTradeResults(vm.criteria.page + 1)\\\" aria-label=\\\"Next Page\\\">Next Page
\");\n$templateCache.put(\"app/main/papertrade/includes/wolflineData.html\",\"
Show Wolfline
{{ pt.marketGrouping.label }}{{vm.constants.tooltips.tradingBehavior}} {{ pt.tradingBehavior.label }}{{vm.constants.tooltips.marketGrouping}}
Market
{{ $index + 1 }} SP
{{ pt.oddsType.name }}{{d.displayValue}} {{vm.getTradingBehaviorIndicator(pt.match, ($index + 1), pt.tradingBehavior, \\'ats\\')}}{{d.displayValue}} {{vm.getTotalsTradingBehaviorIndicator(d.value, pt.tradingBehavior)}}{{d.displayValue}} {{vm.getTradingBehaviorIndicator(pt.match, ($index + 1), pt.tradingBehavior, \\'moneyline\\')}}
Hide Wolfline
\");\n$templateCache.put(\"app/main/research/includes/matchSearchForm.html\",\"
\");\n$templateCache.put(\"app/main/research/includes/paginator.html\",\"
Previous Page
= upcomingMatches.paginator.length\\\" ng-click=\\\"vm.pageMatchResults(upcomingMatches.criteria.page + 1)\\\" aria-label=\\\"Next Page\\\">Next Page
\");\n$templateCache.put(\"app/main/research/includes/researchSettingsSummary.html\",\"
{{researchSettings.tradingBehavior.label}}{{vm.constants.tooltips.tradingBehavior}} {{researchSettings.marketGrouping.label}}{{vm.constants.tooltips.marketGrouping}}

{{vm.constants.screener.markets.noMarkets}}

0\\\" flex=\\\"\\\">
{{vm.constants.screener.markets.title}}
{{column.title}}
{{ row.sport.name }}{{ row.tournament.name }} All
0\\\" ng-repeat=\\\"c in row.conditions\\\">{{ c.betType.name }} (Favorite)(Underdog) {{ c.operator.value }} -+{{ c.value }}{{c.value|formatOdds:user.oddsFormat}} {{ c.conditionOperator.name }} {{ c.wagerType.name}} AND
All
{{vm.constants.screener.alerts.title}}
0\\\" ng-repeat=\\\"row in researchSettings.alerts.rows\\\">
{{column.title}}
{{ row.betType.name }}>= {{ row.numberOfAlerts }}{{ row.range.label }}{{ row.conditionOperator.name }}

{{vm.constants.screener.alerts.noAlerts}}

{{vm.constants.screener.saveScreenerButtonTitle}}
\");\n$templateCache.put(\"app/main/ui/theme-colors/theme-colors.html\",\"
USER INTERFACE
Theme Colors
Create Your Own Theme!
\");\n$templateCache.put(\"app/pages/errors/500/error-500.html\",\"
500
Well, you broke the internet!
Just kidding, looks like we have an internal issue, please try again in couple minutes
Report this problem
\");\n$templateCache.put(\"app/pages/errors/404/error-404.html\",\"
404
Sorry but we couldn’t find the page you are looking for
Go back to dashboard
\");\n$templateCache.put(\"app/pages/auth/forgot-password/forgot-password.html\",\"
\\\"The
Recover your password
Email field is required
Email must be a valid e-mail address
SEND RESET LINK
\");\n$templateCache.put(\"app/pages/auth/login/login.html\",\"
\\\"The
This application cannot be used with private browsing or a browser that does not support local storage.
Log in to your account
Email field is required
Email must be a valid e-mail address
Password field is required
LOG IN
\");\n$templateCache.put(\"app/pages/auth/reset-password/reset-password.html\",\"
\\\"The
Reset your password
Password field is required
Password field must be at least 6 characters
{{ vm.serverErrorMessage }}
Password (Confirm) field is required
Password do not match
RESET MY PASSWORD
\");\n$templateCache.put(\"app/toolbar/layouts/content-with-toolbar/toolbar.html\",\"
F FUSE
{{ user.FirstName }} {{ user.LastName }}
My ProfileInbox{{vm.userStatus.title}}{{status.title}}Logout
{{vm.selectedLanguage.code}}
{{lang.title}}
\");\n$templateCache.put(\"app/toolbar/layouts/horizontal-navigation/toolbar.html\",\"
F FUSE
{{ user.firstName }} {{ user.lastName }}
My ProfileInboxLogout
{{vm.selectedLanguage.code}}
{{lang.title}}
\");\n$templateCache.put(\"app/toolbar/layouts/vertical-navigation/toolbar.html\",\"
{{vm.selectedOddsFormat.label}}
{{oddsFormat.label}}
{{ user.firstName }} {{ user.lastName }}
My ProfileOrder HistoryLogout
1\\\">
{{vm.selectedLanguage.code}}
{{lang.title}}
\");\n$templateCache.put(\"app/core/directives/ms-navigation/templates/horizontal.html\",\"
\");\n$templateCache.put(\"app/core/directives/ms-navigation/templates/vertical.html\",\"
\");\n$templateCache.put(\"app/main/papertrade/dialogs/papertrade/papertrade-dialog.html\",\"
{{vm.title}}
{{ vm.match.awayCompetitor.name }} @ {{ vm.match.homeCompetitor.name }}
Match Date: {{vm.match.matchDate|formatDate: vm.user.timezone}}
{{vm.constants.matchResults.team}}{{vm.constants.betTypes.ats}}{{vm.constants.betTypes.moneyline}}{{vm.constants.betTypes.totals}}
A 
{{ vm.match.awayCompetitor.name }}
-+{{vm.match.spreadOdds.marketPrice}} ({{vm.match.spreadOdds.awayJuicePrice|formatOdds:vm.user.oddsFormat}}) 0\\\">N/A{{vm.match.moneylineOdds.awayMarketPrice|formatOdds:vm.user.oddsFormat}} 0\\\">N/AOver {{vm.match.totalsOdds.marketPrice}}
{{vm.match.totalsOdds.overJuicePrice|formatOdds:vm.user.oddsFormat}}
0\\\">N/A
Under {{vm.match.totalsOdds.marketPrice}}
{{vm.match.totalsOdds.underJuicePrice|formatOdds:vm.user.oddsFormat}}
0\\\">N/A
H 
{{ vm.match.homeCompetitor.name }}
-+{{vm.match.spreadOdds.marketPrice}} ({{vm.match.spreadOdds.homeJuicePrice|formatOdds:vm.user.oddsFormat}}) 0\\\">N/A{{vm.match.moneylineOdds.homeMarketPrice|formatOdds:vm.user.oddsFormat}} 0\\\">N/A
{{b.name}}
{{constants.errors.required}}
{{constants.errors.required}}
{{constants.errors.positiveNumber}}
{{constants.errors.maxNumberError}} {{constants.errors.maxTradeValue}}
{{w.label}}
{{constants.errors.required}}
{{w.label}}
{{constants.errors.required}}
{{w.label}}
{{constants.errors.required}}
SAVE
\");\n$templateCache.put(\"app/main/research/dialogs/screener/screener-dialog.html\",\"
{{vm.title}}
{{constants.errors.required}}
SAVE
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-1/template-1.html\",\"
\\\"{{card.media.image.alt}}\\\"
{{card.title}}
{{card.subtitle}}
{{card.text}}
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-10/template-10.html\",\"
{{card.title}}
{{card.subtitle}}
\\\"{{card.media.image.alt}}\\\"
{{card.text}}
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-2/template-2.html\",\"
\\\"{{card.avatar.alt}}\\\"
{{card.title}}
{{card.subtitle}}
\\\"{{card.media.image.alt}}\\\"
{{card.text}}
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-3/template-3.html\",\"
{{card.title}}
{{card.subtitle}}
{{card.cta}}
\\\"{{card.media.image.alt}}\\\"
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-4/template-4.html\",\"
{{card.title}}
{{card.text}}
\\\"{{card.media.image.alt}}\\\"
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-5/template-5.html\",\"
{{card.title}}
{{card.event}}
\\\"{{card.media.image.alt}}\\\"
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-6/template-6.html\",\"
{{card.subtitle}}
{{card.title}}
{{card.text}}
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-7/template-7.html\",\"
{{card.title}}
{{card.subtitle}}
{{card.text}}
\\\"{{card.media.image.alt}}\\\"
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-8/template-8.html\",\"
\\\"{{card.media.image.alt}}\\\"
{{card.title}}
{{card.subtitle}}
{{card.button1}}{{card.button2}}
{{card.text}}
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-9/template-9.html\",\"
\\\"{{card.avatar.alt}}\\\"
{{card.title}}
{{card.subtitle}}
{{card.text}}
\\\"{{card.media.image.alt}}\\\"
\");\n$templateCache.put(\"app/main/ui/theme-colors/dialogs/custom-theme/custom-theme-dialog.html\",\"

Custom Theme Generator

{{type}}

{{palette}}
{{hue}}

To make this theme permanent, copy the below code and add it into the \\\"fuseThemes\\\" object in \\\"core/theming/fuse-themes.constant.js\\\" file. You can also replace the \\\"CUSTOM_THEME_NAME\\\" with your theme name.

Set Theme
\");\n$templateCache.put(\"app/main/ui/theme-colors/tabs/accent/accent.html\",\"
Default
{{vm.themes.active.theme.accent.color}}
.md-accent-bg
Primary Text
{{vm.themes.active.theme.accent.contrast1}}
.md-accent-bg
Secondary Text / Icon
{{vm.themes.active.theme.accent.contrast2}}
.md-accent-bg .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.accent.contrast3}}
.md-accent-bg .hint-text
Fade Text / Divider
{{vm.themes.active.theme.accent.contrast4}}
.md-accent-bg .divider
As foreground color
{{vm.themes.active.theme.accent.color}}
.md-accent-fg
Hue 1
{{vm.themes.active.theme.accent.hue1.color}}
.md-accent-bg .md-hue-1
Primary Text
{{vm.themes.active.theme.accent.hue1.contrast1}}
.md-accent-bg
Secondary Text / Icon
{{vm.themes.active.theme.accent.hue1.contrast2}}
.md-accent-bg .md-hue-1 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.accent.hue1.contrast3}}
.md-accent-bg .md-hue-1 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.accent.hue1.contrast4}}
.md-accent-bg .md-hue-1 .divider
As foreground color
{{vm.themes.active.theme.accent.hue1.color}}
.md-accent-fg
Hue 2
{{vm.themes.active.theme.accent.hue2.color}}
.md-accent-bg .md-hue-2
Primary Text
{{vm.themes.active.theme.accent.hue2.contrast1}}
.md-accent-bg
Secondary Text / Icon
{{vm.themes.active.theme.accent.hue2.contrast2}}
.md-accent-bg .md-hue-2 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.accent.hue2.contrast3}}
.md-accent-bg .md-hue-2 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.accent.hue2.contrast4}}
.md-accent-bg .md-hue-2 .divider
As foreground color
{{vm.themes.active.theme.accent.hue2.color}}
.md-accent-fg
Hue 3
{{vm.themes.active.theme.accent.hue3.color}}
.md-accent-bg .md-hue-3
Primary Text
{{vm.themes.active.theme.accent.hue3.contrast1}}
.md-accent-bg
Secondary Text / Icon
{{vm.themes.active.theme.accent.hue3.contrast2}}
.md-accent-bg .md-hue-3 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.accent.hue3.contrast3}}
.md-accent-bg .md-hue-3 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.accent.hue3.contrast4}}
.md-accent-bg .md-hue-3 .divider
As foreground color
{{vm.themes.active.theme.accent.hue3.color}}
.md-accent-fg
\");\n$templateCache.put(\"app/main/ui/theme-colors/tabs/background/background.html\",\"
Default
{{vm.themes.active.theme.background.color}}
.md-background-bg
Primary Text
{{vm.themes.active.theme.background.contrast1}}
.md-background-bg
Secondary Text / Icon
{{vm.themes.active.theme.background.contrast2}}
.md-background-bg .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.background.contrast3}}
.md-background-bg .hint-text
Fade Text / Divider
{{vm.themes.active.theme.background.contrast4}}
.md-background-bg .divider
As foreground color
{{vm.themes.active.theme.background.color}}
.md-background-fg
Hue 1
{{vm.themes.active.theme.background.hue1.color}}
.md-background-bg .md-hue-1
Primary Text
{{vm.themes.active.theme.background.hue1.contrast1}}
.md-background-bg
Secondary Text / Icon
{{vm.themes.active.theme.background.hue1.contrast2}}
.md-background-bg .md-hue-1 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.background.hue1.contrast3}}
.md-background-bg .md-hue-1 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.background.hue1.contrast4}}
.md-background-bg .md-hue-1 .divider
As foreground color
{{vm.themes.active.theme.background.hue1.color}}
.md-background-fg
Hue 2
{{vm.themes.active.theme.background.hue2.color}}
.md-background-bg .md-hue-2
Primary Text
{{vm.themes.active.theme.background.hue2.contrast1}}
.md-background-bg
Secondary Text / Icon
{{vm.themes.active.theme.background.hue2.contrast2}}
.md-background-bg .md-hue-2 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.background.hue2.contrast3}}
.md-background-bg .md-hue-2 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.background.hue2.contrast4}}
.md-background-bg .md-hue-2 .divider
As foreground color
{{vm.themes.active.theme.background.hue2.color}}
.md-background-fg
Hue 3
{{vm.themes.active.theme.background.hue3.color}}
.md-background-bg .md-hue-3
Primary Text
{{vm.themes.active.theme.background.hue3.contrast1}}
.md-background-bg
Secondary Text / Icon
{{vm.themes.active.theme.background.hue3.contrast2}}
.md-background-bg .md-hue-3 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.background.hue3.contrast3}}
.md-background-bg .md-hue-3 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.background.hue3.contrast4}}
.md-background-bg .md-hue-3 .divider
As foreground color
{{vm.themes.active.theme.background.hue3.color}}
.md-background-fg
\");\n$templateCache.put(\"app/main/ui/theme-colors/tabs/warn/warn.html\",\"
Default
{{vm.themes.active.theme.warn.color}}
.md-warn-bg
Primary Text
{{vm.themes.active.theme.warn.contrast1}}
.md-warn-bg
Secondary Text / Icon
{{vm.themes.active.theme.warn.contrast2}}
.md-warn-bg .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.warn.contrast3}}
.md-warn-bg .hint-text
Fade Text / Divider
{{vm.themes.active.theme.warn.contrast4}}
.md-warn-bg .divider
As foreground color
{{vm.themes.active.theme.warn.color}}
.md-warn-fg
Hue 1
{{vm.themes.active.theme.warn.hue1.color}}
.md-warn-bg .md-hue-1
Primary Text
{{vm.themes.active.theme.warn.hue1.contrast1}}
.md-warn-bg
Secondary Text / Icon
{{vm.themes.active.theme.warn.hue1.contrast2}}
.md-warn-bg .md-hue-1 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.warn.hue1.contrast3}}
.md-warn-bg .md-hue-1 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.warn.hue1.contrast4}}
.md-warn-bg .md-hue-1 .divider
As foreground color
{{vm.themes.active.theme.warn.hue1.color}}
.md-warn-fg
Hue 2
{{vm.themes.active.theme.warn.hue2.color}}
.md-warn-bg .md-hue-2
Primary Text
{{vm.themes.active.theme.warn.hue2.contrast1}}
.md-warn-bg
Secondary Text / Icon
{{vm.themes.active.theme.warn.hue2.contrast2}}
.md-warn-bg .md-hue-2 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.warn.hue2.contrast3}}
.md-warn-bg .md-hue-2 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.warn.hue2.contrast4}}
.md-warn-bg .md-hue-2 .divider
As foreground color
{{vm.themes.active.theme.warn.hue2.color}}
.md-warn-fg
Hue 3
{{vm.themes.active.theme.warn.hue3.color}}
.md-warn-bg .md-hue-3
Primary Text
{{vm.themes.active.theme.warn.hue3.contrast1}}
.md-warn-bg
Secondary Text / Icon
{{vm.themes.active.theme.warn.hue3.contrast2}}
.md-warn-bg .md-hue-3 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.warn.hue3.contrast3}}
.md-warn-bg .md-hue-3 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.warn.hue3.contrast4}}
.md-warn-bg .md-hue-3 .divider
As foreground color
{{vm.themes.active.theme.warn.hue3.color}}
.md-warn-fg
\");\n$templateCache.put(\"app/main/ui/theme-colors/tabs/primary/primary.html\",\"
Default
{{vm.themes.active.theme.primary.color}}
.md-primary-bg
Primary Text
{{vm.themes.active.theme.primary.contrast1}}
.md-primary-bg
Secondary Text / Icon
{{vm.themes.active.theme.primary.contrast2}}
.md-primary-bg .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.primary.contrast3}}
.md-primary-bg .hint-text
Fade Text / Divider
{{vm.themes.active.theme.primary.contrast4}}
.md-primary-bg .divider
As foreground color
{{vm.themes.active.theme.primary.color}}
.md-primary-fg
Hue 1
{{vm.themes.active.theme.primary.hue1.color}}
.md-primary-bg .md-hue-1
Primary Text
{{vm.themes.active.theme.primary.hue1.contrast1}}
.md-primary-bg
Secondary Text / Icon
{{vm.themes.active.theme.primary.hue1.contrast2}}
.md-primary-bg .md-hue-1 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.primary.hue1.contrast3}}
.md-primary-bg .md-hue-1 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.primary.hue1.contrast4}}
.md-primary-bg .md-hue-1 .divider
As foreground color
{{vm.themes.active.theme.primary.hue1.color}}
.md-primary-fg
Hue 2
{{vm.themes.active.theme.primary.hue2.color}}
.md-primary-bg .md-hue-2
Primary Text
{{vm.themes.active.theme.primary.hue2.contrast1}}
.md-primary-bg
Secondary Text / Icon
{{vm.themes.active.theme.primary.hue2.contrast2}}
.md-primary-bg .md-hue-2 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.primary.hue2.contrast3}}
.md-primary-bg .md-hue-2 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.primary.hue2.contrast4}}
.md-primary-bg .md-hue-2 .divider
As foreground color
{{vm.themes.active.theme.primary.hue2.color}}
.md-primary-fg
Hue 3
{{vm.themes.active.theme.primary.hue3.color}}
.md-primary-bg .md-hue-3
Primary Text
{{vm.themes.active.theme.primary.hue3.contrast1}}
.md-primary-bg
Secondary Text / Icon
{{vm.themes.active.theme.primary.hue3.contrast2}}
.md-primary-bg .md-hue-3 .secondary-text
Hint Text / Disabled Text
{{vm.themes.active.theme.primary.hue3.contrast3}}
.md-primary-bg .md-hue-3 .hint-text
Fade Text / Divider
{{vm.themes.active.theme.primary.hue3.contrast4}}
.md-primary-bg .md-hue-3 .divider
As foreground color
{{vm.themes.active.theme.primary.hue3.color}}
.md-primary-fg
\");}]);"],"sourceRoot":"/source/"}